diff --git a/opendata/doc.yml b/opendata/doc.yml index 1f7101b0..a6fe6a0b 100644 --- a/opendata/doc.yml +++ b/opendata/doc.yml @@ -96,6 +96,12 @@ components: maximum: 360 description: Direction du vent, en degrés example: 42 + vent_direction_categorie: + type: string + nullable: true + description: Nom de la direction du vent. La direction nord-est est par exemple comprise entre 22,5 degrés et 67,5 degrés. + example: nord + enum: [nord, nord-est, est, sud-est, sud, sud-ouest, ouest, nord-ouest] vent_force: type: number format: int32 diff --git a/opendata/sql/schema.sql b/opendata/sql/schema.sql index 7ded85e5..49095f6f 100644 --- a/opendata/sql/schema.sql +++ b/opendata/sql/schema.sql @@ -17,6 +17,7 @@ CREATE TABLE public.operations ( "latitude" numeric(7, 4), "longitude" numeric(7, 4), "vent_direction" smallint, + "vent_direction_categorie" varchar(10), "vent_force" smallint, "mer_force" smallint, "date_heure_reception_alerte" timestamp with time zone not null, diff --git a/opendata/tests/files/expected_operations.csv b/opendata/tests/files/expected_operations.csv index ee64049d..f1ac8344 100644 --- a/opendata/tests/files/expected_operations.csv +++ b/opendata/tests/files/expected_operations.csv @@ -1,10 +1,10 @@ -operation_id,type_operation,pourquoi_alerte,moyen_alerte,qui_alerte,categorie_qui_alerte,cross,departement,est_metropolitain,evenement,categorie_evenement,autorite,seconde_autorite,zone_responsabilite,latitude,longitude,vent_direction,vent_force,mer_force,date_heure_reception_alerte,date_heure_fin_operation,numero_sitrep,cross_sitrep,fuseau_horaire --90465,DIV,,Téléphone fixe,SAMU,Autorité civile française à terre,Étel,Morbihan,True,Transport sanitaire île-continent,Accidents individuels à personnes,Préfet maritime,Préfet maritime,Eaux territoriales,47.6443,-3.4468,253,3,4,2018-01-30T09:22:00Z,2018-01-30T20:44:00Z,112,Étel 2018/112,Europe/Paris --90341,SAR,,Balise de détresse,CROSS / MRCC,Autorité civile française à terre,Étel,Morbihan,True,Toutes fausses alertes,Fausses alertes,Préfet maritime,Préfet maritime,Port et accès,47.4983,-3.0967,289,5,4,2018-02-01T05:57:00Z,2018-02-01T09:10:00Z,121,Étel 2018/121,Europe/Paris --90340,SAR,,Balise de détresse,CROSS / MRCC,Autorité civile française à terre,Étel,Charente-Maritime,True,Toutes fausses alertes,Fausses alertes,Préfet maritime,Préfet maritime,Port et accès,45.9283,-1.3967,299,5,5,2018-01-22T15:04:00Z,2018-01-22T17:06:00Z,85,Étel 2018/85,Europe/Paris --90339,SAR,,Téléphone mobile à terre,CODIS / SDIS / CTA,Autorité civile française à terre,Étel,Vendée,True,Sans avarie inexpérience,Autres affaires nécessitant opération,Préfet maritime,Préfet maritime,Eaux territoriales,46.8842,-2.169,44,4,4,2018-02-04T14:05:00Z,2018-02-04T15:02:00Z,142,Étel 2018/142,Europe/Paris --90105,DIV,,Téléphone mobile à terre,Témoin,Organisme ou personne privée,Corse,Corse-du-Sud,True,Rupture de mouillage,Autres affaires nécessitant opération,Préfet maritime,Préfet maritime,Eaux territoriales,41.6083,9.3417,290,4,4,2018-01-03T12:32:00Z,2018-01-05T07:35:00Z,3,Corse 2018/3,Europe/Paris --89955,MAS,,VHF phonie,Navire impliqué,Navire à la mer,Étel,Loire-Atlantique,True,Avarie du système de propulsion,Avaries non suivies d'accident navire,Préfet maritime,Préfet maritime,Eaux territoriales,46.9333,-3,81,5,4,2018-01-08T18:57:00Z,2018-01-09T01:00:00Z,36,Étel 2018/36,Europe/Paris -3319950489,,Événement reconnu,VHF,Navire impliqué,Navire à la mer,Corse,,,Sans avarie en dérive,Autres affaires nécessitant opération,CROSS ou sous-CROSS,CROSS ou sous-CROSS,Responsabilité française,,,45,6,5,1995-12-30T16:19:00Z,1995-12-31T21:00:00Z,489,Corse 1995/489,Europe/Paris -4220020128,,Événement reconnu,Téléphone à terre,CORG / Gendarmerie nationale,Autorité militaire française à terre,La Réunion,,,Autre événement,Autres affaires nécessitant opération,CROSS ou sous-CROSS,CROSS ou sous-CROSS,Responsabilité étrangère,,,,,,2002-06-18T18:24:00Z,2002-06-19T12:00:00Z,128,La Réunion 2002/128,Indian/Reunion -6220010002,,Inquiétude,VHF,Navire impliqué,Navire à la mer,Nouvelle-Calédonie,Nouvelle-Calédonie,False,Plongée avec bouteille,Avaries non suivies d'accident navire,CROSS ou sous-CROSS,CROSS ou sous-CROSS,Eaux territoriales,,,220,3,3,2001-01-09T05:00:00Z,2001-01-09T07:25:00Z,2,Nouvelle-Calédonie 2001/2,Pacific/Noumea +operation_id,type_operation,pourquoi_alerte,moyen_alerte,qui_alerte,categorie_qui_alerte,cross,departement,est_metropolitain,evenement,categorie_evenement,autorite,seconde_autorite,zone_responsabilite,latitude,longitude,vent_direction,vent_direction_categorie,vent_force,mer_force,date_heure_reception_alerte,date_heure_fin_operation,numero_sitrep,cross_sitrep,fuseau_horaire +-90465,DIV,,Téléphone fixe,SAMU,Autorité civile française à terre,Étel,Morbihan,True,Transport sanitaire île-continent,Accidents individuels à personnes,Préfet maritime,Préfet maritime,Eaux territoriales,47.6443,-3.4468,253,ouest,3,4,2018-01-30T09:22:00Z,2018-01-30T20:44:00Z,112,Étel 2018/112,Europe/Paris +-90341,SAR,,Balise de détresse,CROSS / MRCC,Autorité civile française à terre,Étel,Morbihan,True,Toutes fausses alertes,Fausses alertes,Préfet maritime,Préfet maritime,Port et accès,47.4983,-3.0967,289,ouest,5,4,2018-02-01T05:57:00Z,2018-02-01T09:10:00Z,121,Étel 2018/121,Europe/Paris +-90340,SAR,,Balise de détresse,CROSS / MRCC,Autorité civile française à terre,Étel,Charente-Maritime,True,Toutes fausses alertes,Fausses alertes,Préfet maritime,Préfet maritime,Port et accès,45.9283,-1.3967,299,nord-ouest,5,5,2018-01-22T15:04:00Z,2018-01-22T17:06:00Z,85,Étel 2018/85,Europe/Paris +-90339,SAR,,Téléphone mobile à terre,CODIS / SDIS / CTA,Autorité civile française à terre,Étel,Vendée,True,Sans avarie inexpérience,Autres affaires nécessitant opération,Préfet maritime,Préfet maritime,Eaux territoriales,46.8842,-2.169,44,nord-est,4,4,2018-02-04T14:05:00Z,2018-02-04T15:02:00Z,142,Étel 2018/142,Europe/Paris +-90105,DIV,,Téléphone mobile à terre,Témoin,Organisme ou personne privée,Corse,Corse-du-Sud,True,Rupture de mouillage,Autres affaires nécessitant opération,Préfet maritime,Préfet maritime,Eaux territoriales,41.6083,9.3417,290,ouest,4,4,2018-01-03T12:32:00Z,2018-01-05T07:35:00Z,3,Corse 2018/3,Europe/Paris +-89955,MAS,,VHF phonie,Navire impliqué,Navire à la mer,Étel,Loire-Atlantique,True,Avarie du système de propulsion,Avaries non suivies d'accident navire,Préfet maritime,Préfet maritime,Eaux territoriales,46.9333,-3,81,est,5,4,2018-01-08T18:57:00Z,2018-01-09T01:00:00Z,36,Étel 2018/36,Europe/Paris +3319950489,,Événement reconnu,VHF,Navire impliqué,Navire à la mer,Corse,,,Sans avarie en dérive,Autres affaires nécessitant opération,CROSS ou sous-CROSS,CROSS ou sous-CROSS,Responsabilité française,,,45,nord-est,6,5,1995-12-30T16:19:00Z,1995-12-31T21:00:00Z,489,Corse 1995/489,Europe/Paris +4220020128,,Événement reconnu,Téléphone à terre,CORG / Gendarmerie nationale,Autorité militaire française à terre,La Réunion,,,Autre événement,Autres affaires nécessitant opération,CROSS ou sous-CROSS,CROSS ou sous-CROSS,Responsabilité étrangère,,,,,,,2002-06-18T18:24:00Z,2002-06-19T12:00:00Z,128,La Réunion 2002/128,Indian/Reunion +6220010002,,Inquiétude,VHF,Navire impliqué,Navire à la mer,Nouvelle-Calédonie,Nouvelle-Calédonie,False,Plongée avec bouteille,Avaries non suivies d'accident navire,CROSS ou sous-CROSS,CROSS ou sous-CROSS,Eaux territoriales,,,220,sud-ouest,3,3,2001-01-09T05:00:00Z,2001-01-09T07:25:00Z,2,Nouvelle-Calédonie 2001/2,Pacific/Noumea diff --git a/opendata/transformers/operations.py b/opendata/transformers/operations.py index df91a506..80fb4cae 100644 --- a/opendata/transformers/operations.py +++ b/opendata/transformers/operations.py @@ -19,6 +19,11 @@ def transform(self, output): df['fuseau_horaire'] = self.fuseau_horaire(df.cross) df.insert(1, 'type_operation', self.type_operation(df.pourquoi_alerte)) df['pourquoi_alerte'] = self.pourquoi_alerte(df.pourquoi_alerte) + df.insert( + loc=df.columns.get_loc('vent_direction') + 1, + column='vent_direction_categorie', + value=self.vent_direction_categorie(df.vent_direction) + ) df['evenement'].replace( to_replace='Plongée en bouteille', value='Plongée avec bouteille', @@ -34,6 +39,15 @@ def transform(self, output): self.to_csv(df, output) + def vent_direction_categorie(self, series): + bins = [0, 22.5, 67.5, 112.5, 157.5, 202.5, 247.5, 292.5, 337.5, np.inf] + labels = [ + 'nord', 'nord-est', 'est', 'sud-est', 'sud', + 'sud-ouest', 'ouest', 'nord-ouest', 'nord2' + ] + return pd.cut(series, bins=bins, labels=labels) \ + .replace('nord2', 'nord') + def numero_sitrep(self, row): if pd.isna(row['numero_sitrep']): # If operation_id: 2120050002