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)