]> AND Private Git Repository - predictops.git/blob - data/origins/integration_scripts/sdis25_integration.py
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
New version now drived by config files
[predictops.git] / data / origins / integration_scripts / sdis25_integration.py
1 '''
2 The objective of this script is to collect the csv/xls files from
3 various different extractions from SDIS25, and to produce a canonical
4 csv file such that each row contains only relevant and nomalized data.
5
6  - files provided by the SDIS25 are located in data/origins/original_files.
7    They present various problems :
8        - for some years, locations are not in the listing of interventions.
9          So we must use a second file for these years
10        - for the beginning/end of interventions, sometimes years are written
11          with 2 digits, and sometimes with 4. Seconds are sometimes provided,
12          sometimes not.
13        - We have numerous columns for the types of interventions, more or less
14          coherent, with spelling errors...
15
16  - The produced csv file is located in data/targets/sdis25/interventions.csv
17        - Its columns are : intervention ID, location (x and y in Lambert projection),
18          normalized start and end time of intervention, and type of intervention
19        - Two sets of types can be considered : {'accouchement', 'feu', 'suicide',
20          'route', 'noyade', 'autre'}, based on "Raison de sortie", or {'SAP', 'INC'
21          'OD'}, based on "Raison de sortie REG1". To switch between the two sets of
22          types, just change the constant TYPE_COLUMN below.
23
24 '''
25
26
27 from csv import DictReader, DictWriter
28 from logging import getLogger
29 from logging.config import fileConfig
30 from os import listdir
31 from pathlib import Path
32 from xlrd import open_workbook
33 from datetime import datetime
34
35 import pathlib
36
37 TYPE_COLUMN = "Raison de sortie REG1"
38 #TYPE_COLUMN = "Raison de sortie"
39
40 RAISONS_FEU = ['CHAUDIERE SURCHAUFFE PAVILLON',
41  'DIVERS FEUX',
42  'FEU  DE 2 ROUES',
43  'FEU BAT. AGRICOLE AVEC ANIMAUX',
44  "FEU CAGE D'ESCALIER IMMEUBLE",
45  'FEU CAVE  OU SOUS SOL IMMEUBLE',
46  'FEU COMBLE, TOITURE IMMEUBLE',
47  "FEU D'APPARTEMENT AVEC VICTIME",
48  "FEU D'APPARTEMENT DANS IMMEUBLE",
49  "FEU D'APPARTEMENT DANS IMMEUBLE AVEC VICTIME",
50  "FEU D'APPARTEMENT IMMEUBLE",
51  "FEU D'ATELIER",
52  "FEU D'ELECTROMENAGER IMMEUBLE",
53  "FEU D'ELECTROMENAGER PAVILLON",
54  "FEU D'ELECTROMENAGER/INSTALLATION ELECTRIQUE DANS IMMEUBLE",
55  "FEU D'ELECTROMENAGER/INSTALLATION ELECTRIQUE HABITATION",
56  "FEU D'ENGIN AGRICOLE",
57  "FEU D'ENGIN AGRICOLE OU T.P.",
58  "FEU D'ENGIN AGRICOLE OU TP",
59  "FEU D'ENGIN T.P.",
60  "FEU D'ENSEIGNE LUMINEUSE",
61  "FEU D'ENTREPOT",
62  "FEU D'EXPLOITATION AGRICOLE",
63  "FEU D'HABITATION ISOLEE AVEC VICTIME",
64  "FEU D'HABITATION MITOYENNE",
65  "FEU D'HABITATION MITOYENNE AVEC VICTIME",
66  "FEU D'IMMEUBLE",
67  "FEU D'INSTALLATION ELECTRIQUE",
68  "FEU D'USINE",
69  "FEU DANS CAGE D'ESCALIER DANS IMMEUBLE",
70  'FEU DANS ETABLISSEMENT INDUSTRIEL',
71  'FEU DANS PARKING SOUTERRAIN',
72  'FEU DANS UN ERP',
73  'FEU DANS UN ERP AVEC LOCAUX A SOMMEIL',
74  'FEU DANS UN ERP AVEC PUBLIC',
75  'FEU DANS UN ERP ETABLISSEMENT DE SANTE',
76  'FEU DANS UN ERP SANS PUBLIC',
77  'FEU DANS UN PAVILLON',
78  "FEU D'AVION TERRAIN D'AVIATION",
79  'FEU DE 2 ROUES',
80  'FEU DE 2 VL OU PLUS',
81  'FEU DE BATEAU SANS PASSAGER',
82  'FEU DE BATEAU SANS PASSAGERS',
83  'FEU DE BATIMENT AGRICOLE',
84  'FEU DE BATIMENT AGRICOLE AVEC HABITATION',
85  'FEU DE BATIMENT AGRICOLE SANS HABITATION',
86  'FEU DE BENNE A ORDURES',
87  'FEU DE BUS',
88  'FEU DE BUS AVEC VICTIMES',
89  'FEU DE CAMION',
90  'FEU DE CAMION AVEC TMD',
91  'FEU DE CAMPING-CAR / CARAVANE',
92  'FEU DE CARAVANE',
93  'FEU DE CARAVANE, CAMPING CAR',
94  'FEU DE CAVE OU SOUS-SOL DANS IMMEUBLE',
95  'FEU DE CHAUDIERE DANS HABITATION',
96  'FEU DE CHAUFFERIE DANS IMMEUBLE',
97  'FEU DE CHAUFFERIE PAVILLON',
98  'FEU DE CHEMINEE DANS HABITATION',
99  'FEU DE CHEMINEE DANS IMMEUBLE',
100  'FEU DE CHEMINEE IMMEUBLE',
101  'FEU DE CHEMINEE PAVILLON',
102  'FEU DE COMBLES/TOITURE DANS IMMEUBLE',
103  'FEU DE CUISINE IMMEUBLE',
104  'FEU DE CUISINE PAVILLON',
105  'FEU DE DECHARGE',
106  'FEU DE DEPOT DE BOIS, PAPIER..',
107  "FEU DE DEPOT D'HYDROCARBURE",
108  'FEU DE FORET',
109  'FEU DE FRICHE, BROUSSAILLES OU FOIN EN BORD DE ROUTE',
110  'FEU DE FRICHE, BROUSSAILLES OU FOIN INACCESSIBLE',
111  'FEU DE GARAGE',
112  'FEU DE HAIE OU DE BOSQUET',
113  'FEU DE JOINT DE DILATATION',
114  'FEU DE LOCAL ARTISANAL',
115  'FEU DE LOCAL DE STOCKAGE',
116  'FEU DE LOCAL POUBELLE DANS IMMEUBLE',
117  'FEU DE LOCAUX INDUSTRIELS',
118  'FEU DE LOCOMOTIVE DIESEL',
119  'FEU DE MACHINE AGRICOLE',
120  'FEU DE MAGASIN',
121  'FEU DE MAGASIN SANS PUBLIC',
122  'FEU DE MENUISERIE',
123  'FEU DE MOBILIER URBAIN SUR VP / EN EXTERIEUR',
124  'FEU DE PAVILLON',
125  'FEU DE PAVILLON AVEC VICTIME',
126  'FEU DE PL',
127  'FEU DE PL AVEC TMD',
128  'FEU DE POUBELLE',
129  'FEU DE POUBELLE OU LOCAL POUBELLE SUR VP / EN EXTERIEUR',
130  'FEU DE RESTAURANT AVEC PUBLIC',
131  'FEU DE RESTAURANT SANS PUBLIC',
132  'FEU DE SILO',
133  'FEU DE SITE DE STOCKAGE/ENTREPOT',
134  'FEU DE SOUS BOIS',
135  'FEU DE STATION SERVICE MAGASIN',
136  'FEU DE TAS DE PAILLE',
137  'FEU DE TRAIN',
138  'FEU DE TRAIN DE VOYAGEURS',
139  'FEU DE TRAMWAY',
140  'FEU DE TRANSFORMATEUR',
141  'FEU DE VEHICULE AU GPL',
142  'FEU DE VEHICULE SEUL',
143  'FEU DE VL',
144  'FEU DE VOITURE, PETIT UTILITAI',
145  'FEU ERP SOINS AVEC PUBLIC',
146  'FEU ERP SOMMEIL AVEC PUBLIC',
147  'FEU FRICHE, CHAUME, BROUSSAILL',
148  'FEU JOINT DILATATION IMMEUBLE',
149  'FEU LOCAL POUBELLES IMMEUBLE',
150  'FEU PARC STATIONNEMENT IMMEUBL',
151  'FEU PAVILLON CAVE, SOUS SOL',
152  'FEU PAVILLON COMBLE TOITURE',
153  'FEU PAVILLON GARAGE INDIVIDUEL',
154  'FEU PLUSIEURS VEHICULES',
155  'FEU SANS INDICATION',
156  "FEU SUR AIRE D'ACCUEIL DES GENS DU VOYAGE",
157  'FEU SUR CHAINE DE FABRICATION',
158  'FEU SUR LA VOIE PUBLIQUE',
159  'FEU SUR VP / EN EXTERIEUR AVEC RISQUE DE PROPAGATION',
160  'FEU VEHICULE PARC SOUTERRAIN',
161  'FEUX AUTRES TYPES',
162  "FEUX D'ORDURES",
163  'FEUX DANS APPARTEMENT',
164  'FEUX DANS BATIMENT HABITATION',
165  'FEUX DANS CAVE OU SOUS SOL',
166  'FEUX DANS IMMEUBLE',
167  'FEUX DANS PAVILLON',
168  'FEUX DANS UN E.R.P.',
169  'FEUX DE LOCAUX INDUSTRIELS',
170  "FEUX D'ENTREPOTS, DOCKS",
171  'FEUX DE PAVILLON',
172  'FEU DE TRAIN DE MARCHANDISES',
173  'FEUX DE VEGETAUX',
174  'FEUX DE VEHICULE',
175  'FEUX ELECTRIQUES',
176  'FEUX SUR VOIE PUBLIQUE',
177  'FOURRAGE EN SURCHAUFFE',
178  'FUMEE ANORM. DANS BAT. AGRICOL',
179  'FUMEE ANORMALE DANS ENTREPOT',
180  'FUMEE ANORMALE DANS ENTREPRISE',
181  'FUMEE ANORMALE DANS UN E.R.P.',
182  'FUMEE ANORMALE ERP AVEC PUBLIC',
183  'FUMEE ANORMALE ERP SANS PUBLIC',
184  'FUMEE ANORMALE IMMEUBLE',
185  'FUMEE ANORMALE PAVILLON',
186  'INCENDIE',
187  "MENACE D'INCENDIE",
188  'RELEVE FEUX',
189  'REPRISE DE FEU',
190  "RISQUES D'INCENDIE"]
191
192 RAISONS_ROUTE = ['ACCIDENT PL OU ENGIN LOURD',
193  'ACCIDENTS ROUTIERS',
194  'ACCIDENT TRAIN / PIETON OU CYCLISTE',
195  'ACCIDENT TRAIN / VEHICULE',
196  'ACCIDENT VL / PL',
197  'ACCIDENT VL / VL',
198  'ACCIDENT VL SEULE',
199  'ACCIDENTS DE 2 ROUES',
200  'ACCIDENTS TRANSPORTS COLLECT',
201  'ASSISTANCE AUX NAUFRAGES DE LA ROUTE',
202  'AVP 2 ROUES/BUS SANS INCARCERE',
203  'AVP 2 ROUES / PIETON OU CYCLISTE',
204  'AVP 2 ROUES / VEHICULE',
205  'AVP 2 ROUES SEUL',
206  'AVP 2 ROUES/ PL SANS INCARCERE',
207  'AVP 2 ROUES/ VL AVEC INCARCERE',
208  'AVP 2 ROUES/ VL SANS INCARCERE',
209  'AVP 2 VL OU PLUS',
210  'AVP 2 VL OU PLUS AVEC INCARCEREE',
211  'AVP AVEC VEHICULE TMD RCH',
212  'AVP BUS / PIETON OU CYCLISTE',
213  'AVP BUS AVEC PASSAGERS / VEHICULE',
214  'AVP BUS SANS INCARCERE',
215  'AVP BUS SANS PASSAGER',
216  'AVP BUS SANS PASSAGER / VEHICULE',
217  'AVP BUS SEUL AVEC PASSAGERS',
218  'AVP BUS SEUL SANS PASSAGER',
219  'AVP CHUTE DE 2 ROUES',
220  'AVP NBX VEHICULES AVEC BUS',
221  'AVP NOMBREUX VEHICULES',
222  'AVP NOMBREUX VEHICULES/CARAMBOLAGE',
223  'AVP PIETON / 2 ROUES',
224  'AVP PIETON / AUTRE',
225  'AVP PIETON / VL AVEC INCARCERE',
226  'AVP PIETON / VL SANS INCARCERE',
227  'AVP PIETON/ BUS SANS INCARCERE',
228  'AVP PL / AUTRE VEHICULE',
229  'AVP PL / AUTRE VEHICULE AVEC INCARCEREE',
230  'AVP PL / PIETON OU CYCLISTE',
231  'AVP PL OU ENGIN AVEC INCARCERE',
232  'AVP PL OU ENGIN AVEC TMD',
233  'AVP PL OU ENGIN CONTRE .....',
234  'AVP PL OU ENGIN SANS INCARCERE',
235  'AVP PL OU ENGIN SUIVI DE FEU',
236  'AVP PL OU ENGIN TOMBE EN RAVIN',
237  'AVP PL SEUL',
238  'AVP PL SEUL AVEC INCARCEREE',
239  'AVP TRAMWAY/PIETON OU CYCLISTE',
240  'AVP TRAMWAY/VEHICULE',
241  "AVP VEHICULE TOMBÉ DANS L'EAU",
242  'AVP VEHICULE TOMBÉ DANS UN RAVIN',
243  'AVP VL / PIETON OU CYCLISTE',
244  'AVP VL / PL AVEC INCARCERE',
245  'AVP VL / PL SANS INCARCERE',
246  'AVP VL / PL SANS INDICATION',
247  'AVP VL / VL AVEC INCARCERE',
248  'AVP VL / VL SANS INCARCERE',
249  'AVP VL / VL SANS INDICATION',
250  'AVP VL / VL TOMBEE EN RAVIN',
251  'AVP VL SEUL',
252  'AVP VL SEUL AVEC INCARCEREE',
253  'AVP VL SEULE AVEC INCARCERE',
254  'AVP VL SEULE SANS INCARCERE',
255  'AVP VL SEULE SANS INDICATION',
256  'AVP VL SEULE SUIVI DE FEU',
257  "AVP VL SEULE TOMBEE DANS L'EAU",
258  'AVP VL SEULE TOMBEE EN RAVIN',
259  'COLLISION TRAIN / PIETON',
260  'COLLISION TRAIN/VL']
261
262 RAISONS_SUICIDE = ['AUTRE TENTATIVE DE SUICIDE',
263  'AUTRE TS AVEC RISQUE IMMINENT',
264  'MENACE DE DEFENESTRATION',
265  'PENDAISON',
266  'PERSONNE DEPRESSIVE',
267  'T.S. MEDICAMENTEUSE',
268  'T.S. PAR ARME A FEU',
269  'TENTATIVE DE SUICIDE',
270  'TS AU GAZ',
271  'TS PAR ARME A FEU',
272  'TS PAR CHUTE EN MILIEU NATUREL',
273  'TS PAR DEFENESTRATION',
274  'TS PAR HEMORRAGIE',
275  'TS PAR IMV',
276  'TS PAR LE FEU OU FEU SUR UNE PERSONNE',
277  'TS PAR NOYADE']
278
279 RAISONS_NOYADE = ['NOYADE',
280  "NOYADE COURS D'EAU",
281  'NOYADE OU MENACE DE NOYADE EN MILIEU NATUREL',
282  'NOYADE PISCINE',
283  'NOYADE PISCINE OU DOMICILE',
284  "RECHERCHE PERSONNE DANS L'EAU",
285  'REPECHAGE DE CADAVRE']
286
287 RAISONS_ACCOUCHEMENT = ['ACCOUCHEMENT IMMINENT OU EN COURS',
288  'FEMME EN COUCHE',
289  'SAP FEMME ENCEINTE LIEU PRIVE OU PROTEGE',
290  'SAP FEMME ENCEINTE LIEU PRIVE OU PROTEGE DEMANDE DU 15',
291  'SAP FEMME ENCEINTE SUR VP OU LIEU PUBLIC NON PROTEGE']
292
293 RAISONS_AUTRE = ['ACC DE VELO TOUT TERRAIN',
294  'ACC ESCALADE',
295  'ACC PARAPENTE DELTA',
296  'ACC RANDONNEE TERRESTRE',
297  'ACC SKI DE DESCENTE',
298  'ACC SKI DE FOND',
299  'ACCIDENT',
300  'ACCIDENT AERIEN',
301  "ACCIDENT AERIEN - CRASH D'AERONEF",
302  'ACCIDENT AERIEN - ULM / PLANEUR',
303  'ACCIDENT AVEC ARME A FEU OU ARME BLANCHE',
304  'ACCIDENT DE BUCHERONNAGE',
305  'ACCIDENT DE CHASSE',
306  'ACCIDENT DE LOISIRS',
307  'ACCIDENT DE SPELEOLOGIE',
308  'ACCIDENT DE SPORT',
309  'ACCIDENT DE TRAVAIL',
310  'ACCIDENT DE VOL LIBRE (PARAPENTE, PARACHUTE, DELTAPLANE)',
311  'ACCIDENT DIVERS',
312  'ACCIDENT SUR DOMAINE SKIABLE',
313  'ACCIDENT TMD AVEC RADIOELEMENT',
314  'ACCIDENT TRAIN DE VOYAGEURS',
315  'ALARME INCENDIE DANS UN ERP',
316  'ALARME INCENDIE DS ENTREPRISE',
317  'ALERTE A LA BOMBE',
318  'ALERTE MOTIVEE AVP',
319  'ALERTE MOTIVEE INC',
320  'ALERTE MOTIVEE OD',
321  'ALERTE MOTIVEE RTN',
322  'ALERTE MOTIVEE SAP',
323  'ALTERATION DE LA CONSCIENCE',
324  'ANIMAL BLESSE',
325  'ANIMAL EN DIVAGATION',
326  'ANIMAUX',
327  'ARBRE MENACANT DE TOMBER',
328  'ARRET CARDIO VENTILATOIRE',
329  'ARRET CARDIO-RESPIRATOIRE',
330  'ASPHYXIE',
331  'ASSECHEMENT',
332  'ASSECHEMENT AVEC OUVERTURE DE PORTE',
333  'ASSISTANCE A AMBULANCIER PRIVE',
334  'ASSISTANCE A PERSONNE',
335  'ASSISTANCE A PERSONNE DOM',
336  'ASSISTANCE A PERSONNE LIEU PUBLIC',
337  'ASSISTANCE A PERSONNE VP',
338  'ASSISTANCE AUX VOYAGEURS BLOQUES SUR VOIE SNCF',
339  'AUTRE ACCIDENT',
340  'AUTRE PLAIE',
341  'AUTRE TRAUMATISME',
342  'AUTRE TRAUMATISME GRAVE',
343  'AUTRES',
344  'AUTRES ACCIDENTS',
345  'AUTRES RAISONS DE SORTIES',
346  'AUTRES OPERATIONS DIVERSES',
347  'AUTRE VOL DRAGON 25',
348  'BATEAU MENAC COULER NOMB PERS',
349  'BATEAU MENACANT DE COULER',
350  'BATEAU MENACANT DE COULER AVEC PASSAGERS',
351  'BATEAU MENACANT DE COULER SANS PASSAGER',
352  'BATEAU MENAC COULER + SAUV',
353  'BATIMENT MENACANT RUINE',
354  'BLESSE',
355  'BLESSE GRAVE',
356  'BRULE',
357  'BRULURE',
358  'BRULURE CHIMIQUE',
359  'BRULURE THERMIQUE',
360  "CAPTURE D'ANIMAUX",
361  'CHAUDIERE SURCHAUFFE IMMEUBLE',
362  'CHEMINEE MENACANT DE TOMBER',
363  'CHUTE AVION CIVIL MOYEN',
364  'CHUTE DE GRANDE HAUTEUR',
365  'CHUTE DE PIETON',
366  'CHUTE ULM DELTAPLANE PARAPENTE',
367  "CIRCONSTANCES PARTICULIERES DE L'URGENCE (TOUS MILIEUX)",
368  'COL BATEAU/BATEAU, AUTRES',
369  'COLLISION 2 TRAINS VOYAGEURS',
370  'COLLISIONFERROVIAIRE',
371  'COMPRESSION DE MEMBRES',
372  'COULEE DE BOUE',
373  'DECLENCHEMENT ALARME INCENDIE DANS UN ERP',
374  'DECLENCHEMENT ALARME INCENDIE DANS UNE ENTREPRISE',
375  'DECLENCHEMENT DETECT. INCENDIE',
376  'DECLENCHEMENT INTEMPESTIF DETECTEUR DE FUMEE / DAAF / CO',
377  'DECLENCHEMENT/DETECTION DE PORTIQUE RADIOACTIF',
378  'DECOUVERTE DE MUNITION / ENGIN DE GUERRE',
379  'DECOUVERTE DE PLIS ET COLIS SUSPECTS',
380  'DECOUVERTE DE SOURCE RADIOACTIVE',
381  'DEFENESTRATION',
382  'DEGAGEMENT DE PERSONNES',
383  'DEGAGEMENT DE VP',
384  'DEGAGEMENTS DE PERSONNES',
385  "DESTRUCTION D'HYMENOPTERES",
386  "DESTRUCTION D'HYMENOPTERES PAYANTE",
387  "DESTRUCTION D'INSECTES",
388  'DETRESSE RESPIRATOIRE',
389  'DIFFICULTE RESPIRATOIRE',
390  'DOULEUR THORACIQUE LIEU PRIVE OU PROTEGE',
391  'DOULEUR THORACIQUE LIEU PRIVE OU PROTEGE DEMANDE DU 15',
392  'DOULEUR THORACIQUE SUR VP OU LIEU PUBLIC NON PROTEGE',
393  'ECOULEMENT DE LIQ. INFLAMMABLE',
394  'ECOULEMENT DE LIQ. TOX/CORRO.',
395  'ECOULEMENT DE LIQUIDE',
396  'ECRASEMENT DE MEMBRE OU DU TRONC',
397  'ECRASEMENT DE MEMBRES',
398  'EFF BATIMENT AVEC VICTIMES',
399  'EFFONDREMENT DE BATIMENT',
400  'EFFONDREMENT DE TERRAIN',
401  'EFFONDREMENT ROCHEUX',
402  'EFFONDREMENT STRUCTURE / TRIBUNE / PODIUM',
403  'ELECTRISATION OU FOUDROIEMENT',
404  'EMISSION DE GAZ',
405  'EMISSION DE GAZ INFLAM/ EXPLO',
406  'EMISSION DE GAZ TOXI/CORRO',
407  'ENSEVELISSEMENT',
408  'EPANDAGE DE SOLIDE',
409  'EPANDAGE DE SOLIDES MD',
410  'EPANDAGE SOLIDES',
411  'EPUISEMENT',
412  'EPUISEMENT < 50 M3',
413  'EPUISEMENT > 50 M3',
414  'EVENEMENTS SOCIAUX',
415  'EXERCICE DEPARTEMENTAL',
416  'EXPLOSIO ERP AVEC VICTIMES',
417  'EXPLOSION DANS UN BATIMENT INDUSTRIEL OU AGRICOLE',
418  'EXPLOSION DANS UN ERP',
419  'EXPLOSION DANS UN IMMEUBLE',
420  'EXPLOSION DANS UN PAVILLON',
421  'EXPLOSION DANS UNE HABITATION',
422  'EXPLOSION ENGIN DE GUERRE',
423  'EXPLOSION ENGIN DE GUERRE, ENGIN EXPLOSIF',
424  'EXPLOSION INDUSTRIE SANS MD',
425  'EXPLOSION SANS INDICATION',
426  'FAUSSE ALERTE',
427  "FEU D'HABITATION ISOLEE",
428  "FUITE D'EAU",
429  "FUITE D'EAU OUVERTURE PORTE",
430  'FUITE DE CARBURANT',
431  'FUITE DE GAZ',
432  'FUITE DE GAZ DANS UN BATIMENT',
433  'FUITE DE GAZ DANS UN BATIMENT/PGR',
434  'FUITE DE GAZ SUR VP',
435  'FUITE DE GAZ SUR VP/PGR',
436  'FUITE DE PRODUIT DANGEREUX / POLLUTION AQUATIQUE',
437  "FUITE DE PRODUIT DANGEREUX / POLLUTION DE L'AIR",
438  'FUITE DE PRODUIT DANGEREUX / POLLUTION TERRESTRE',
439  'HEMORRAGIE ABONDANTE',
440  'HEMORRAGIE GRAVE EXTERIORISEE OU EXTERNE',
441  'INCONSCIENCE AVEREE',
442  'INGESTION DE MEDICAMENT',
443  'INGESTION DE PRODUIT TOXIQUE',
444  "INHALATION D'UN CORPS ETRANGER",
445  'INNONDATION',
446  'INONDATION',
447  'INTERVENTION ANNULEE PAR LE CODIS',
448  'INTOX. ALIMENTAIRE',
449  'INTOX. GAZ DE VILLE, CO, ECHAP',
450  'INTOXICATION',
451  'INTOXICATION COLLECTIVE ALIMENTAIRE',
452  'INTOXICATION COLLECTIVE AUTRE (CO, GAZ, PRODUIT TOXIQUE)',
453  'INTOXICATION INDIVIDUELLE (CO, GAZ, PRODUIT TOXIQUE)',
454  'LAC ARRACHEE OU TOMBEE AU SOL',
455  'LESION DU RACHIS',
456  'MALADE LIEU PRIVE OU PROTEGE',
457  'MALADE LIEU PRIVE OU PROTEGE DEMANDE DU 15',
458  'MALAISE',
459  'MALAISE LIEU PRIVE OU PROTEGE',
460  'MALAISE LIEU PRIVE OU PROTEGE DEMANDE DU 15',
461  'MALAISE SUR VP OU LIEU PUBLIC NON PROTEGE',
462  'MANOEUVRE GROUPEMENT',
463  "MENACE D'EXPLOSION",
464  'MENACE DE POLLUTION',
465  'MENACE EXPLOSION DANS BATIMENT',
466  'MENACE EXPLOSION DANS ERP',
467  'MENACE RADIOACTIVE',
468  'MENACES DIVERSES',
469  'MISSION EQUIPE SPECIALISEE',
470  'MISSION SANITAIRE URGENTE',
471  'MOUVEMENT DE TERRAIN / EBOULEMENT',
472  'NOMBREUSES VICTIMES',
473  'Non renseigné',
474  'OBJET MENACANT DE TOMBER',
475  'ODEUR DE GAZ',
476  'ODEUR DE SOLVANT / EMANATION DE VAPEUR',
477  'OPERATIONS DIVERSES',
478  'OUVERTURE DE PORTE',
479  'OUVERTURE DE PORTE > R+2',
480  'OUVERTURE DE PORTE DEMANDE DU 15',
481  'OUVERTURE DE PORTE R+2 MAX',
482  'OUVERTURE DE PORTE URGENTE',
483  'PERS BLOQUEE DANS ASCENSEUR',
484  'PERS REPOND PAS APPELS > R+2',
485  'PERS REPOND PAS APPELS R+2 MAX',
486  'PERS REPOND PAS AUX APPELS',
487  'PERS TOMBEE DS CAGE ASCENSEUR',
488  'PERS. ELECTROCUTE - ELECTRISE',
489  'PERSONNE BLOQUEE DANS UN ASCENSEUR',
490  'PERSONNE COINCEE NON BLESSEE',
491  "PERSONNE EN ETAT D'EBRIETE",
492  'PERSONNE ENSEVELIE',
493  'PERSONNE IMMOLEE',
494  'PERSONNE NE REPONDANT PAS AUX APPELS',
495  'PERSONNE RESTANT A TERRE SUITE A CHUTE DE GRANDE HAUTEUR',
496  'PERSONNE RESTANT A TERRE SUITE A CHUTE DE SA HAUTEUR',
497  'PERSONNE SOUS UN TRAIN',
498  'PERSONNE SUPPOSEE SOUS EMPRISE DE DROGUE/ALCOOL NON BLESSEE',
499  'PLAIE / TRAUMA IMPORTANT LIEU PRIVE OU PROTEGE',
500  'PLAIE / TRAUMA IMPORTANT LIEU PRIVE OU PROTEGE DEMANDE DU 15',
501  'PLAIE / TRAUMA IMPORTANT SUR VP OU LIEU PUBLIC NON PROTEGE',
502  'PLAIE / TRAUMA LEGER LIEU PRIVE OU PROTEGE',
503  'PLAIE / TRAUMA LEGER LIEU PRIVE OU PROTEGE DEMANDE DU 15',
504  'PLAIE / TRAUMA LEGER SUR VP OU LIEU PUBLIC NON PROTEGE',
505  'PLAIE PAR ARME A FEU',
506  'PLAIE PAR ARME BLANCHE',
507  'POTEAU MENACANT DE TOMBER',
508  'PROMPT-SECOURS AVEC OUVERTURE DE PORTE',
509  'PROTECTION DE BIENS',
510  'PROTECTION DE BIENS DIVERS',
511  'PROTECTIONS DE BIENS',
512  "RECHERCHE D'OBJET DANS L'EAU",
513  'RECHERCHE DE PERSONNE EGAREE',
514  'RECHERCHE DE PERSONNE EGAREE EN DANGER',
515  "RECHERCHE D'OBJET",
516  'RECHERCHES DIVERSES',
517  'RECHERCHE SOURCE RADIOACTIVE',
518  "RECHERCHE VEHICULE DANS L'EAU",
519  'RECONNAISSANCE',
520  'RECONNAISSANCE AVP SUITE APPEL E-CALL',
521  'RECONNAISSANCE GRIMP',
522  'RECONNAISSANCE OPERATIONS DIVERSES',
523  'RECONNAISSANCE RAD',
524  'RECONNAISSANCE RCH',
525  'RECONNAISSANCE SAL',
526  'RECONNAISSANCE SDE',
527  'RECOUVERTURE OPERATIONNELLE',
528  'REGULARISATION CRSS',
529  'RELEVAGE DE PERSONNE A DOMICILE',
530  'RELEVAGE PERSONNE A DOMICILE',
531  'RENFORT ASTEINTE CSP',
532  'RENFORT ASTREINTE CSP',
533  'RENFORT BRANCARDAGE',
534  'RENFORT BRANCARDAGE DEMANDE DU 15',
535  'RENFORT EXTRA-DEPARTEMENTAL',
536  'REQUISITION',
537  'RISQUES NATURELS',
538  'RISQUES PARTICULIERS',
539  'RIXE OU VIOLENCE AVEC ARME A FEU',
540  'RIXE OU VIOLENCE AVEC ARME A FEU OU ARME BLANCHE',
541  'RIXE OU VIOLENCE AVEC ARME BLANCHE',
542  'RIXE OU VIOLENCE SANS ARME',
543  'SAP EN MILIEU INACCESSIBLE OU PERILLEUX',
544  'SAP LIEU PRIVE OU PROTEGE HORS DEMANDE DU 15',
545  'SAP SUR DEMANDE DU SAMU HORS DEPARTS REFLEXES',
546  'SAUV. EN MILIEU SOUTERRAIN',
547  'SAUVETAGE ANIMAL',
548  "SAUVETAGE D'ANIMAL",
549  'SAUVETAGE EN HAUTEUR',
550  'SAUVETAGES PARTICULIERS',
551  'SECOURS A PERSONNE',
552  'SECOURS A PERSONNES',
553  'SECOURS PARTICULIERS',
554  'SECTION COMPLETE DE MEMBRE',
555  'SERVICE DE SECURITE',
556  "SITUATION D'URGENCE",
557  'SORTIE DIVERSES',
558  'SSO PROGRAMME',
559  'STRANGULATION',
560  'TEMPETES/ORAGES',
561  'TRANSPORT INTER-HOSPITALIER NON URGENT',
562  'TRANSPORT INTER-HOSPITALIER URGENT',
563  "TRAVAUX OU MISSIONS SUBAQUATIQUE D'URGENCE",
564  'TROUBLES DE LA CONSCIENCE',
565  'TUILES MENACANT DE TOMBER',
566  'VOL DE RECONNAISSANCE']
567
568
569 if TYPE_COLUMN == "Raison de sortie":
570     RAISONS = {'accouchement': RAISONS_ACCOUCHEMENT,
571                'feu': RAISONS_FEU,
572                'suicide': RAISONS_SUICIDE,
573                'route': RAISONS_ROUTE,
574                'noyade': RAISONS_NOYADE,
575                'autre': RAISONS_AUTRE}
576 else:
577     RAISONS = {'SAP': ['SAP', 'AVP'],
578                'INC': ['INC'],
579                'OD': ['OD', 'RTN', 'NOPS', 'NR', 'DRAGON 25']}
580
581
582
583
584 fileConfig((Path.cwd() / 'config') / 'logging.cfg')
585 logger = getLogger()
586
587 logger.info("SDIS25 data integration")
588 DATA_REP = pathlib.Path(__file__).parent.parent / "original_files" / "sdis25"
589
590 logger.info("Integration of locations for 2012-2018 interventions")
591 dict_interv = {}
592 for file in listdir(DATA_REP):
593     if 'xls' in file:
594         wb = open_workbook(DATA_REP / file)
595         for sheet_name in wb.sheet_names():
596             ws = wb.sheet_by_name(sheet_name)
597             for row in range(1, ws.nrows):
598                 dict_interv[ws.cell_value(row, 0)] = {
599                     'x': ws.cell_value(row, 1),
600                     'y': ws.cell_value(row, 2),
601                 }
602
603 logger.info("Integration of timestamps for 2012-2018 interventions")
604 for year in range(2012, 2019):
605     with open(DATA_REP / (str(year)+'.csv'), "r") as f:
606         reader = DictReader(f, delimiter='£')
607         for row in reader:
608             if year not in [2015, 2018]:
609                 dict_interv[row['N° intervention']]['start'] =\
610                     datetime.strptime(row['Début'], '%d/%m/%Y %H:%M:%S').strftime('%d/%m/%Y %H:%M:00')
611                 dict_interv[row['N° intervention']]['end'] =\
612                     datetime.strptime(row['Fin'], '%d/%m/%Y %H:%M:%S').strftime('%d/%m/%Y %H:%M:00')
613             elif year == 2015:
614                 dict_interv[row['N° intervention']]['start'] =\
615                     datetime.strptime(row['Début'], '%d/%m/%y %H:%M').strftime('%d/%m/%Y %H:%M:00')
616                 dict_interv[row['N° intervention']]['end'] =\
617                     datetime.strptime(row['Fin'], '%d/%m/%y %H:%M').strftime('%d/%m/%Y %H:%M:00')
618             else:
619                 dict_interv[row['N° intervention']]['start'] =\
620                     datetime.strptime(row['Début'], '%d/%m/%Y %H:%M').strftime('%d/%m/%Y %H:%M:00')
621                 dict_interv[row['N° intervention']]['end'] =\
622                     datetime.strptime(row['Fin'], '%d/%m/%Y %H:%M').strftime('%d/%m/%Y %H:%M:00')
623             dict_interv[row['N° intervention']]['type'] =\
624             [k for k in RAISONS if row[TYPE_COLUMN] in RAISONS[k]][0]
625
626
627 logger.info("Integration of information for 2006-2011+2019 interventions")
628 for year in list(range(2006, 2012))+[2019]:
629     with open(DATA_REP / (str(year)+'.csv'), "r") as f:
630         reader = DictReader(f, delimiter='£')
631         for row in reader:
632             dict_interv[row['N° intervention']] = {
633                 'x' : row['Coord X'].replace('-',''),
634                 'y' : row['Coord Y'].replace('-',''),
635                 'start' : datetime.strptime(row['Début'], '%d/%m/%Y %H:%M').strftime('%d/%m/%Y %H:%M:00'),
636                 'end' : datetime.strptime(row['Fin'], '%d/%m/%Y %H:%M').strftime('%d/%m/%Y %H:%M:00'),
637                 'type' : [k for k in RAISONS if row[TYPE_COLUMN] in RAISONS[k]][0],
638             }
639
640
641 logger.info("Integration of barracks information, only for 2012-2017")
642 dict_centre = {}
643 for year in range(2012, 2018):
644     with open(DATA_REP / ('SortiesEngins'+str(year)+'.csv'), "r") as f:
645         reader = DictReader(f, delimiter=',')
646         for row in reader:
647             if row['N° intervention'] not in dict_centre:
648                 dict_centre[row['N° intervention']] = [row['Centre']]
649             else:
650                 dict_centre[row['N° intervention']].append(row['Centre'])
651
652
653 logger.info("Save in CSV file")
654 DATA_REP = pathlib.Path(__file__).parent.parent.parent / "targets" / "sdis25"
655
656 with open(DATA_REP / 'interventions.csv', mode='w') as f:
657     fieldnames = ['ID', 'centre', 'x', 'y', 'start', 'end', 'type']
658     writer = DictWriter(f, fieldnames=fieldnames)
659     writer.writeheader()
660     for k in sorted(dict_interv):
661         if k in dict_centre:
662             for l in dict_centre[k]:
663                 writer.writerow({'ID':k, 'centre': l, **dict_interv[k]})
664         else:
665             writer.writerow({'ID':k, 'centre': '', **dict_interv[k]})