From ce92dcacb03323b55feb18a1512896e73a3fd1a3 Mon Sep 17 00:00:00 2001 From: Tykayn Date: Tue, 6 Aug 2024 16:52:37 +0200 Subject: [PATCH] =?UTF-8?q?irve=20concours=20des=20bras=20cass=C3=A9s=20st?= =?UTF-8?q?art?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- irve_bornes_recharge/README.md | 18 +++++++++ irve_bornes_recharge/index.py | 68 ++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 irve_bornes_recharge/README.md create mode 100644 irve_bornes_recharge/index.py diff --git a/irve_bornes_recharge/README.md b/irve_bornes_recharge/README.md new file mode 100644 index 00000000..87c2bd6f --- /dev/null +++ b/irve_bornes_recharge/README.md @@ -0,0 +1,18 @@ +# Trophée des bras cassés de l'open data IRVE + +Ce script récupère les données IRVE et classe les opérateurs selon le grand nombre de défaut dans leur ensemble de données. + +Chaque donnée en mauvaise qualité fait gagner des points de mauvaise qualité aux opérateurs, les grands gagnants sont déterminés ainsi: + +médaille de bronze: élongation des genoux de la donnée. +médaille d'argent: épic flumble en berçant les données près du mur. +médaille d'or: double fracture ouverte des bras avec hémorragie interne. + +On a également une liste des mauvais points pour chacun des opérateurs. + +## Calcul des mauvaises qualités +On y trouve le nombre de points de recharge par opérateur, le nombre de points pour la mauvaise qualité calculé ainsi: + +- Une ligne n'ayant rien dans une des colonnes "id_pdc_itinerance", "telephone_operateur" fait gagner 1 point. +- Un texte dans "telephone_operateur" fait gagner 2 points. +- Si une ligne a les mêmes coordonnées géographiques qu'une autre, on gagne 3 points pour l'opérateur. \ No newline at end of file diff --git a/irve_bornes_recharge/index.py b/irve_bornes_recharge/index.py new file mode 100644 index 00000000..084a29c3 --- /dev/null +++ b/irve_bornes_recharge/index.py @@ -0,0 +1,68 @@ +import geojson +import pandas as pd +import dash +import dash_table +import requests +from dash.dash_table.Format import Group +import dash_html_components as html +import os + +# Vérifier si le fichier local existe +local_file = "irve.geojson" +if not os.path.exists(local_file): + # Télécharger les données geojson si le fichier local n'existe pas + url = "https://www.data.gouv.fr/fr/datasets/r/7eee8f09-5d1b-4f48-a304-5e99e8da1e26" + response = requests.get(url) + with open(local_file, 'w') as f: + f.write(response.text) + +# Ouvrir le fichier local pour la suite du script +with open(local_file, 'r') as f: + data = geojson.load(f) + +# Convertir les données geojson en DataFrame pandas +df = pd.DataFrame(data['features']) + + +# Calcul des mauvaises qualités +def calcul_mauvaise_qualite(df): + df['mauvaise_qualite'] = 0 + + # Une ligne n'ayant rien dans une des colonnes "id_pdc_itinerance", "telephone_operateur" fait gagner 1 point + df.loc[(df['properties']['id_pdc_itinerance'] == '') | ( + df['properties']['telephone_operateur'] == ''), 'mauvaise_qualite'] += 1 + + # Un texte dans "telephone_operateur" fait gagner 2 points + df.loc[df['properties']['telephone_operateur'].str.contains(r'\D'), 'mauvaise_qualite'] += 2 + + # Si une ligne a les mêmes coordonnées géographiques qu'une autre, on gagne 3 points pour l'opérateur + df['coordinates'] = df['geometry']['coordinates'].apply(lambda x: tuple(x)) + df['duplicated'] = df.duplicated(subset='coordinates', keep=False) + df.loc[df['duplicated'], 'mauvaise_qualite'] += 3 + + return df + + +df = calcul_mauvaise_qualite(df) + +# Compter les mauvaises qualités par opérateur +operator_counts = df.groupby(df['properties']['nom_amenageur'])['mauvaise_qualite'].sum().reset_index() +operator_counts.columns = ['nom_amenageur', 'nbre_mauvaise_qualite'] + +# Ajouter le nombre de points de recharge par opérateur +operator_counts['nbre_pdc'] = df.groupby('properties')['nom_amenageur'].size().values + +# Créer le tableau de bord +app = dash.Dash(__name__) + +app.layout = html.Div([ + html.H1('Trophées de bras cassés de l\'open data'), + dash_table.DataTable( + id='table', + columns=[{'name': i, 'id': i} for i in operator_counts.columns], + data=operator_counts.to_dict('records') + ) +]) + +if __name__ == '__main__': + app.run_server(debug=True) \ No newline at end of file