irve concours des bras cassés start
This commit is contained in:
parent
7bb3ca841e
commit
ce92dcacb0
|
@ -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.
|
|
@ -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)
|
Loading…
Reference in New Issue