scripts/irve_bornes_recharge/index.py

68 lines
2.3 KiB
Python
Raw Normal View History

2024-08-06 16:52:37 +02:00
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)