68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
|
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)
|