Skip to content
Snippets Groups Projects
Commit 55931d13 authored by kendrick herzberg's avatar kendrick herzberg
Browse files

remove file

parent b0c4e382
No related branches found
No related tags found
No related merge requests found
%% Cell type:code id:d60999c6-2ae5-430b-934c-a95d309a496c tags:
``` python
import zipfile
import os
import xml.etree.ElementTree as ET
import csv
import time
from urllib.request import urlretrieve
from datetime import date
from calendar import monthrange
import pandas as pd
import requests
```
%% Cell type:code id:bbf067e2-95d6-4375-93f2-41ef842893b0 tags:
``` python
#recupération des bases de donnée sur le site du gouvernement.
def recuperation_xml(date_debut,date_fin):
for date in range(date_debut, date_fin +1, 1):
directory_to_extract_to = os.path.join("unzip_file")
path_to_zip_file = os.path.join("zip_file",f"PrixCarburants_annuel_{date}.zip")
urlretrieve(f"https://donnees.roulez-eco.fr/opendata/annee/{date}", path_to_zip_file)
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
zip_ref.extractall(directory_to_extract_to)
#recuperation_xml(2007,2021)
```
%% Cell type:code id:6c27528f-fbbd-4c34-86fe-a904c8181f77 tags:
``` python
# utilisation de l'API de adress.data.gouv.fr pour passer de la latitude et longitude, au citycode
def citycode_from_lat_long(longitude,latitude):
url = f"https://api-adresse.data.gouv.fr/reverse/?lon={longitude}&lat={latitude}"
response = requests.get(url)
contenu = response.json()
features = contenu['features']
if len(features) == 0:
return None
else:
citycode = contenu['features'][0]['properties']['citycode']
return citycode
```
%% Cell type:code id:d67ca228-3db6-446b-bcac-f1efafd129f6 tags:
``` python
# passage du citycode au code du departement
def code_departement_from_citycode(citycode):
if citycode[ : 2] >= '97':
code_departement = citycode[ : 3]
else:
code_departement = citycode[ : 2]
return code_departement
```
%% Cell type:code id:e8b5e2f4-2095-4c8f-a11d-d11de4cff76c tags:
``` python
# passage du code postal au code du departement
def code_departement_from_code_postal(code_postal):
if code_postal == '99999':
return None
elif code_postal[ : 2] >= '97':
code_departement = code_postal[ : 3]
elif code_postal[ : 3] in ["200","201"] :
code_departement = "2A"
elif code_postal[ : 3] in ["202","206"]:
code_departement = "2B"
else:
code_departement = code_postal[ : 2]
return code_departement
```
%% Cell type:code id:64a0d8fc-649a-4710-839e-416706a5f712 tags:
``` python
# passage du code du departement au code région en utilisant l'API Métadonnées - V1 de l'INSEE
# documentation à API nomenclatures géographiques Insee
# attention, la clé doit être réactualisé tous les 7 jours...
# l'API est limité à 30 requêtes par minute
def code_region_from_code_departement(code_departement,date):
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer 82590123-79ba-3b05-ad0c-fdfe657eaf7a', #Le changement est ici
}
params = {
'date': date,
}
response = requests.get(f'https://api.insee.fr/metadonnees/V1/geo/departement/{code_departement}/ascendants', params=params, headers=headers)
contenu = response.json()
time.sleep(2.1)
if isinstance(contenu,dict):
print(contenu)
return contenu[0]['code']
```
%% Cell type:code id:c5f67bd6-5cf9-4e09-a587-f4b2454f4618 tags:
``` python
#Les APIs sont relativement fragile, il arrive qu'il y ai des erreurs 500 ou 502.
#Dans le cas là if faut supprimer l'année qui était en train de boucler de "prix_by_region".
#Il faut ensuite recommencer la boucle à partir de cette date.
def debug_if_error_500(date_debut,date_fin):
for region, prix_by_carburant in prix_by_region.items():
for carburant,prix_by_annee in prix_by_carburant.items():
for annee in range(date_debut,date_fin+1):
if annee in prix_by_annee:
del prix_by_annee[annee]
debug_if_error_500(2013,2013)
```
%% Cell type:code id:14979ff2-770a-4a6c-8780-13a76a98512a tags:
``` python
tree = ET.parse('unzip_file/PrixCarburants_annuel_2021.xml')
pdv_liste = tree.getroot()
```
%% Cell type:code id:bb42e6c2-f9e8-49da-a372-88b9b869993b tags:
``` python
citycode_lat_long = {}
prix_by_region = {}
```
%% Cell type:code id:b8a5473c-902a-4d1f-9318-ad52e425cf3e tags:
``` python
#prix_by_region
```
%% Cell type:code id:2cd9550a-5c9b-4787-a372-d4f8309eaf9d tags:
``` python
#boucle principale, qui récupére les données des fichiers XML,
#trouve le code région de chaque station,
#récupère les données importantes, dont le prix par jour, par carburant, par station,
#fait la moyenne par jour
for annee in range(2007,2022):
print(annee)
tree = ET.parse(f'unzip_file/PrixCarburants_annuel_{annee}.xml')
pdv_liste = tree.getroot()
date = f'{annee}-01-01'
region = {}
for pdv in pdv_liste:
longitude = pdv.attrib.get('longitude')
latitude = pdv.attrib.get('latitude')
citycode = None
if latitude and longitude:
lat_long = f"{latitude},{longitude}"
citycode = citycode_lat_long.get(lat_long)
if citycode is None:
citycode = citycode_from_lat_long(float(longitude)/100000,float(latitude)/100000)
if citycode is not None:
citycode_lat_long[lat_long] = citycode
code_departement = (
code_departement_from_code_postal(pdv.attrib['cp'])
if citycode is None
else code_departement_from_citycode(citycode)
)
if code_departement is None:
print('code_departement is None')
continue
code_region = region.get(code_departement)
if code_region is None:
code_region = code_region_from_code_departement(code_departement,date)
region[code_departement]= code_region
for prix_element in pdv:
if prix_element.tag != 'prix':
continue
if prix_element.attrib.get('maj') is None:
continue
if prix_element.attrib.get('nom') is None:
continue
if prix_element.attrib.get('valeur') is None:
continue
prix_by_carburant = prix_by_region.setdefault(code_region,{})
# prix_by_carburant = prix_by_region.get(code_region)
# if prix_by_carburant is None:
# prix_by_carburant = prix_by_region[code_region] = {}
if 'T' in prix_element.attrib['maj']:
date_prix = prix_element.attrib['maj'].split('T')[0]
else:
date_prix = prix_element.attrib['maj'].split(' ')[0]
annee_prix, mois_prix, jour_prix = date_prix.split('-')
annee_prix, mois_prix, jour_prix = int(annee_prix), int(mois_prix), int(jour_prix)
prix_by_annee = prix_by_carburant.setdefault(prix_element.attrib['nom'],{})
prix_by_mois = prix_by_annee.setdefault(annee_prix,{})
prix_by_jour = prix_by_mois.setdefault(mois_prix,{})
prix_by_station = prix_by_jour.setdefault(jour_prix,{})
prix_by_station[pdv.attrib['id']] = prix_element.attrib['valeur']
for region, prix_by_carburant in prix_by_region.items():
stations = set()
prix_by_carburant = prix_by_region[region]
for carburant,prix_by_annee in prix_by_carburant.items():
dernier_prix_par_station = {}
prix_by_mois = prix_by_annee[annee]
for mois in range(1,13):
prix_by_jour = prix_by_mois.setdefault(mois,{})
dernier_jour = monthrange(annee, mois)[1]
for jour in range(1,dernier_jour+1):
prix_by_station = prix_by_jour.get(jour)
stations = stations.union(prix_by_station.keys())
for station in stations:
prix = prix_by_station.get(station)
if prix is None:
prix_by_station[station] = dernier_prix_par_station.get(station)
else:
dernier_prix_par_station[station] = prix
for region, prix_by_carburant in prix_by_region.items():
for carburant, prix_by_annee in prix_by_carburant.items():
prix_by_mois = prix_by_annee[annee]
for annee, prix_by_mois in prix_by_annee.items():
for mois, prix_by_jour in prix_by_mois.items():
for jour, prix_by_station in prix_by_jour.items():
count = 0
total = 0
for station, prix in prix_by_station.items():
if prix is not None:
total += float(prix)
count += 1
prix_by_jour[jour] = round(total / count, 2) if count > 0 else None
for region, prix_by_carburant in prix_by_region.items():
for carburant,prix_by_annee in prix_by_carburant.items():
prix_by_mois = prix_by_annee[annee]
count_annee = 0
total_annee = 0
for mois,prix_by_jour in prix_by_mois.items():
count_mois = 0
total_mois = 0
for jour, prix in prix_by_jour.items():
if prix is not None:
count_mois += 1
total_mois += prix
count_annee += 1
total_annee += prix
if count_mois == 0:
prix_by_mois[mois] = None
else:
prix_by_mois[mois] = round(total_mois / count_mois,2)
if count_annee == 0:
prix_by_mois['moyenne'] = None
else:
prix_by_mois['moyenne'] = round(total_annee / count_annee,2)
```
%% Output
2007
%% Cell type:code id:0f26bf8a-397d-4522-8409-f9f4681ce870 tags:
``` python
#Lisse le dictionnaire "prix_by_region".
liste_prix_mensuel=[]
liste_prix_annuel=[]
for region, prix_by_carburant in prix_by_region.items():
for carburant,prix_by_annee in prix_by_carburant.items():
for annee,prix_by_mois in prix_by_annee.items():
for mois,prix in prix_by_mois.items():
if prix_by_mois.values == 'moyenne':
pass
prix_region_mensuel = {
"region": region,
"carburant": carburant,
"annee": annee,
"mois": mois,
"prix_moyen": prix,
}
liste_prix_mensuel.append(prix_region_mensuel)
```
%% Cell type:code id:8a712431-90ff-42bb-9449-3f89bbaf2a15 tags:
``` python
#créer la dataframe "prix_mensuel_final.csv"
df = pd.DataFrame.from_dict(liste_prix_mensuel)
indexNames = df[ df['mois'] == 'moyenne' ].index
df.drop(indexNames , inplace=True)
df.reset_index(drop = True, inplace = True)
df['prix_moyen'] = round(df['prix_moyen'] * 0.001,2)
df.to_csv (r'prix_mensuel_final.csv', index = False, header=True)
```
%% Cell type:code id:0803570e-3b2c-4f0d-bc8b-aa34a3f6dfa6 tags:
``` python
#créer la dataframe "prix_annuel_final.csv"
df = pd.DataFrame.from_dict(liste_prix_mensuel)
indexNames = df[ df['mois'] != 'moyenne' ].index
df.drop(indexNames , inplace=True)
df.reset_index(drop = True, inplace = True)
df.drop(columns=['mois'],inplace=True)
df['prix_moyen'] = round(df['prix_moyen'] * 0.001,2)
df.to_csv (r'prix_annuel_final.csv', index = False, header=True)
```
%% Cell type:code id:b7816857-8629-4f2a-b49f-3b4ca0c9fc16 tags:
``` python
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment