irve concours des bras cassés start

This commit is contained in:
Tykayn 2024-08-06 16:52:37 +02:00 committed by tykayn
parent 7bb3ca841e
commit ce92dcacb0
2 changed files with 86 additions and 0 deletions

View File

@ -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.

View File

@ -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)