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.
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,
13 - We have numerous columns for the types of interventions, more or less
14 coherent, with spelling errors...
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.
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
37 TYPE_COLUMN = "Raison de sortie REG1"
38 #TYPE_COLUMN = "Raison de sortie"
40 RAISONS_FEU = ['CHAUDIERE SURCHAUFFE PAVILLON',
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",
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",
60 "FEU D'ENSEIGNE LUMINEUSE",
62 "FEU D'EXPLOITATION AGRICOLE",
63 "FEU D'HABITATION ISOLEE AVEC VICTIME",
64 "FEU D'HABITATION MITOYENNE",
65 "FEU D'HABITATION MITOYENNE AVEC VICTIME",
67 "FEU D'INSTALLATION ELECTRIQUE",
69 "FEU DANS CAGE D'ESCALIER DANS IMMEUBLE",
70 'FEU DANS ETABLISSEMENT INDUSTRIEL',
71 'FEU DANS PARKING SOUTERRAIN',
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",
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',
88 'FEU DE BUS AVEC VICTIMES',
90 'FEU DE CAMION AVEC TMD',
91 'FEU DE CAMPING-CAR / 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',
106 'FEU DE DEPOT DE BOIS, PAPIER..',
107 "FEU DE DEPOT D'HYDROCARBURE",
109 'FEU DE FRICHE, BROUSSAILLES OU FOIN EN BORD DE ROUTE',
110 'FEU DE FRICHE, BROUSSAILLES OU FOIN INACCESSIBLE',
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',
121 'FEU DE MAGASIN SANS PUBLIC',
123 'FEU DE MOBILIER URBAIN SUR VP / EN EXTERIEUR',
125 'FEU DE PAVILLON AVEC VICTIME',
127 'FEU DE PL AVEC TMD',
129 'FEU DE POUBELLE OU LOCAL POUBELLE SUR VP / EN EXTERIEUR',
130 'FEU DE RESTAURANT AVEC PUBLIC',
131 'FEU DE RESTAURANT SANS PUBLIC',
133 'FEU DE SITE DE STOCKAGE/ENTREPOT',
135 'FEU DE STATION SERVICE MAGASIN',
136 'FEU DE TAS DE PAILLE',
138 'FEU DE TRAIN DE VOYAGEURS',
140 'FEU DE TRANSFORMATEUR',
141 'FEU DE VEHICULE AU GPL',
142 'FEU DE VEHICULE SEUL',
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',
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",
172 'FEU DE TRAIN DE MARCHANDISES',
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',
190 "RISQUES D'INCENDIE"]
192 RAISONS_ROUTE = ['ACCIDENT PL OU ENGIN LOURD',
193 'ACCIDENTS ROUTIERS',
194 'ACCIDENT TRAIN / PIETON OU CYCLISTE',
195 'ACCIDENT TRAIN / VEHICULE',
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',
206 'AVP 2 ROUES/ PL SANS INCARCERE',
207 'AVP 2 ROUES/ VL AVEC INCARCERE',
208 'AVP 2 ROUES/ VL SANS INCARCERE',
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',
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',
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']
262 RAISONS_SUICIDE = ['AUTRE TENTATIVE DE SUICIDE',
263 'AUTRE TS AVEC RISQUE IMMINENT',
264 'MENACE DE DEFENESTRATION',
266 'PERSONNE DEPRESSIVE',
267 'T.S. MEDICAMENTEUSE',
268 'T.S. PAR ARME A FEU',
269 'TENTATIVE DE SUICIDE',
272 'TS PAR CHUTE EN MILIEU NATUREL',
273 'TS PAR DEFENESTRATION',
276 'TS PAR LE FEU OU FEU SUR UNE PERSONNE',
279 RAISONS_NOYADE = ['NOYADE',
280 "NOYADE COURS D'EAU",
281 'NOYADE OU MENACE DE NOYADE EN MILIEU NATUREL',
283 'NOYADE PISCINE OU DOMICILE',
284 "RECHERCHE PERSONNE DANS L'EAU",
285 'REPECHAGE DE CADAVRE']
287 RAISONS_ACCOUCHEMENT = ['ACCOUCHEMENT IMMINENT OU EN COURS',
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']
293 RAISONS_AUTRE = ['ACC DE VELO TOUT TERRAIN',
295 'ACC PARAPENTE DELTA',
296 'ACC RANDONNEE TERRESTRE',
297 'ACC SKI DE DESCENTE',
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',
309 'ACCIDENT DE TRAVAIL',
310 'ACCIDENT DE VOL LIBRE (PARAPENTE, PARACHUTE, DELTAPLANE)',
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',
318 'ALERTE MOTIVEE AVP',
319 'ALERTE MOTIVEE INC',
321 'ALERTE MOTIVEE RTN',
322 'ALERTE MOTIVEE SAP',
323 'ALTERATION DE LA CONSCIENCE',
325 'ANIMAL EN DIVAGATION',
327 'ARBRE MENACANT DE TOMBER',
328 'ARRET CARDIO VENTILATOIRE',
329 'ARRET CARDIO-RESPIRATOIRE',
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',
342 'AUTRE TRAUMATISME GRAVE',
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',
361 'CHAUDIERE SURCHAUFFE IMMEUBLE',
362 'CHEMINEE MENACANT DE TOMBER',
363 'CHUTE AVION CIVIL MOYEN',
364 'CHUTE DE GRANDE HAUTEUR',
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',
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',
382 'DEGAGEMENT DE PERSONNES',
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',
405 'EMISSION DE GAZ INFLAM/ EXPLO',
406 'EMISSION DE GAZ TOXI/CORRO',
408 'EPANDAGE DE SOLIDE',
409 'EPANDAGE DE SOLIDES MD',
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',
427 "FEU D'HABITATION ISOLEE",
429 "FUITE D'EAU OUVERTURE PORTE",
430 'FUITE DE CARBURANT',
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",
447 'INTERVENTION ANNULEE PAR LE CODIS',
448 'INTOX. ALIMENTAIRE',
449 'INTOX. GAZ DE VILLE, CO, ECHAP',
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',
456 'MALADE LIEU PRIVE OU PROTEGE',
457 'MALADE LIEU PRIVE OU PROTEGE DEMANDE DU 15',
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',
469 'MISSION EQUIPE SPECIALISEE',
470 'MISSION SANITAIRE URGENTE',
471 'MOUVEMENT DE TERRAIN / EBOULEMENT',
472 'NOMBREUSES VICTIMES',
474 'OBJET MENACANT DE TOMBER',
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',
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',
516 'RECHERCHES DIVERSES',
517 'RECHERCHE SOURCE RADIOACTIVE',
518 "RECHERCHE VEHICULE DANS L'EAU",
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',
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',
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",
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']
569 if TYPE_COLUMN == "Raison de sortie":
570 RAISONS = {'accouchement': RAISONS_ACCOUCHEMENT,
572 'suicide': RAISONS_SUICIDE,
573 'route': RAISONS_ROUTE,
574 'noyade': RAISONS_NOYADE,
575 'autre': RAISONS_AUTRE}
577 RAISONS = {'SAP': ['SAP', 'AVP'],
579 'OD': ['OD', 'RTN', 'NOPS', 'NR', 'DRAGON 25']}
584 fileConfig((Path.cwd() / 'config') / 'logging.cfg')
587 logger.info("SDIS25 data integration")
588 DATA_REP = pathlib.Path(__file__).parent.parent / "original_files" / "sdis25"
590 logger.info("Integration of locations for 2012-2018 interventions")
592 for file in listdir(DATA_REP):
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),
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='£')
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')
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')
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]
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='£')
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],
641 logger.info("Integration of barracks information, only for 2012-2017")
643 for year in range(2012, 2018):
644 with open(DATA_REP / ('SortiesEngins'+str(year)+'.csv'), "r") as f:
645 reader = DictReader(f, delimiter=',')
647 if row['N° intervention'] not in dict_centre:
648 dict_centre[row['N° intervention']] = [row['Centre']]
650 dict_centre[row['N° intervention']].append(row['Centre'])
653 logger.info("Save in CSV file")
654 DATA_REP = pathlib.Path(__file__).parent.parent.parent / "targets" / "sdis25"
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)
660 for k in sorted(dict_interv):
662 for l in dict_centre[k]:
663 writer.writerow({'ID':k, 'centre': l, **dict_interv[k]})
665 writer.writerow({'ID':k, 'centre': '', **dict_interv[k]})