<jupyter_start><jupyter_text>TP2 - Le prix du carburant en France--Tous les jeux de données sont issus de la page https://www.prix-carburants.gouv.fr/rubrique/opendata/, ce sont de vraies données datant de 2018 sur les prix de l'essence en France.Pour le côté pratique, j'ai réduit la base de données à 500 stations d'essence, et j'ai extrait des données .xml un .csv. Il est disponible à l'adresse suivante:https://raw.githubusercontent.com/llesoil/modelisation_des_problemes_scientifiques-/master/7.pandas_matplotlib/prix_essence.csvSi vous souhaitez travailler sur toute la France, j'ouvrirai un dépôt le jour du TP. La correction sera faite sur la France, mais le code donné est valable sur le jeu réduit également.<jupyter_code>import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>1) À l'aide de la librairie pandas, importez le jeu de données dans ce notebook. Pour la version réduite :<jupyter_code>prix = pd.read_table(filepath_or_buffer = "https://raw.githubusercontent.com/llesoil/modelisation_des_problemes_scientifiques-/master/7.pandas_matplotlib/prix_essence.csv", # l'adresse du fichier
              header = 0, # noms de variables en ligne 1
              delimiter =',') # délimiteur, ici la virgule pour un csv
prix.head()<jupyter_output><empty_output><jupyter_text>Pour la version complète : (remplacer l'adresse locale par l'adresse de votre csv)<jupyter_code>prix = pd.read_table(open("C:\\Users\llesoil\Documents\cours\python\prix_essence_total.csv","r"), 
              delimiter = ',')
prix.head()<jupyter_output><empty_output><jupyter_text>On s'intéresse à la station Total de Bourg-en-Bresse (aux coordonnées 46.20114 5.19791). Son identifiant est le '1000001'.  2) a-] Extraire du jeu importé toutes les lignes concernant cette station.Pensez à utiliser la fonction where de numpy, et .iloc[] de pandas<jupyter_code>premStation = prix.iloc[np.where(prix['IdStation']==1000001)]
premStation.head()<jupyter_output><empty_output><jupyter_text>2) b-] Quel est le prix moyen du carburant dans cette station?<jupyter_code>print("La valeur du carburant pour 1000 litres vaut", np.mean(premStation['Valeur1000L']),"euros.")<jupyter_output>La valeur du carburant pour 1000 litres vaut 1478.6764705882354 euros.<jupyter_text>2) c-] Cette station est -elle plus ou moins chère que la moyenne?<jupyter_code>print("En moyenne, la valeur du carburant pour 1000 litres vaut", np.mean(prix['Valeur1000L']),"euros.")<jupyter_output>En moyenne, la valeur du carburant pour 1000 litres vaut 1463.1892257045536 euros.<jupyter_text>Elle est plus chère que la moyenne, d'environ 26 euros pour 1000 litres.  3) Créez une variable valeur1L, correspondant au prix par litreOn pourra utiliser la fonction assign de pandas<jupyter_code>prix = prix.assign(Valeur1L = prix['Valeur1000L']/1000)
prix.head()<jupyter_output><empty_output><jupyter_text>4) En moyenne, quel est le carburant le plus cher en France en 2018? Au contraire, quel est le moins cher?Quel est celui qui varie le plus au fil du temps?On pourra utiliser la fonction groupby de pandas.<jupyter_code>prix.groupby(['Nom']).mean()['Valeur1L']<jupyter_output><empty_output><jupyter_text>Le sans-plomb 98 est le plus cher en France. Le E85 est le moins cher.<jupyter_code>prix.groupby(['Nom']).std()['Valeur1L']<jupyter_output><empty_output><jupyter_text>Le E85 est celui dont les prix varient le plus, avec 8.3 centimes de variation au litre.  5) Affichez un boxplot des prix par type de carburants.Indication: fonction boxplot de seaborn.<jupyter_code>plt.figure(figsize=(4,8))
plt.ylim(0.5,2)
sns.boxplot(x = "Nom", y = "Valeur1L", data = prix)
plt.show()<jupyter_output><empty_output><jupyter_text>Si vous ne vous sentez pas à l'aise, regardez la correction des questions 6) a-] b-] c-] d-] et passez directement à la question 6)e-]. 6) Évolution du prix du carburant en 2018 6) a-] Créez une fonction qui récupère le mois dans la variable Date<jupyter_code>def extractionMois(date):
    return(str(date)[5:7])

extractionMois("2018-01-06T12:20:27")<jupyter_output><empty_output><jupyter_text>6) b-] Créez une variable mois dans le dataframe contenant le mois associé à chaque date<jupyter_code>prix = prix.assign(mois = [*map(extractionMois, prix['Date'])])
prix.head()<jupyter_output><empty_output><jupyter_text>6) c-] Créez ensuite le tableau des moyennes de prix mensuelles par carburantEn colonnes les mois, en lignes les types de carburants<jupyter_code>data = prix.groupby(['Nom','mois']).mean()['Valeur1L'] # on fait la moyenne par carburant et par mois
nomCarburant = np.array(data.index.levels[0]) # le tableau des noms de carburant
mois = np.array(data.index.levels[1])[1:11] # les mois
res = pd.DataFrame(np.array(data).reshape(6,10), columns = mois).set_index(nomCarburant)
res
prix.groupby(['Nom','mois']).mean()<jupyter_output><empty_output><jupyter_text>6) d-] Puis affichez les courbes d'évolution des prix moyens au cours des mois de l'année 2018<jupyter_code>plt.figure(figsize=(8,8))

indiceMois = range(1,len(mois)+1)
for i in range(len(nomCarburant)):
    tab = np.array(res.iloc[i])
    plt.scatter(indiceMois, tab)
    plt.plot(indiceMois, tab)
plt.legend(res.index)
plt.xticks(indiceMois)
plt.ylabel("Prix moyen (en euros)")
plt.xlabel("Mois")
plt.title("Évolution des prix du carburant en France au cours de l'année 2018")
plt.show()<jupyter_output><empty_output><jupyter_text>6) e-] Compte-tenu des courbes, quand pensez vous que le gazole dépassera le E10? Même question pour le SP98. Si la tendance actuelle se confirme, le gazole dépassera le E10 et le SP95 d'ici décembre. Et il faudra sans doute attendre février-mars 2019 pour qu'il dépasse le SP98. Les informations concernant les stations sont référencées dans le .csv à l'adresse suivante:https://raw.githubusercontent.com/llesoil/modelisation_des_problemes_scientifiques-/master/7.pandas_matplotlib/station_essence_total.csv 7) a-] Importez la table<jupyter_code>data7a = pd.read_table("https://raw.githubusercontent.com/llesoil/modelisation_des_problemes_scientifiques-/master/7.pandas_matplotlib/station_essence_total.csv", 
              delimiter = ',')
data7a.head()<jupyter_output><empty_output><jupyter_text>7) b-] Calculez le prix moyen par station, et stocker le résultat sus la forme d'une tableAvant, enlevez les valeurs manquantes de la variable Valeur1L à l'aide des fonctions invert et isnan de numpy.<jupyter_code>prix = prix.iloc[np.where(np.invert(np.isnan(prix['Valeur1L'])))]

data7b = pd.DataFrame(prix.groupby("IdStation").mean()["Valeur1L"])
data7b.head()<jupyter_output><empty_output><jupyter_text>7) c-] Créez une table station, jointure des tables créées respectivement en 7)a-] et en 7) b-]La clef de jointure, commune aux deux tables, est l'identifiant des stations. On pourra utiliser join de pandas.<jupyter_code>station = data7b.join(data7a.set_index("IdStation"))

station.head()<jupyter_output><empty_output><jupyter_text>8) Transformez la variable Valeur1L en variable qualitative à quatre classes en raisonnant de la manière suivante:- prix très bas  en-dessous du premier quartile- prix assez bas  entre le premier quartile et la médiane- prix assez fort  entre la médiane et le troisième quartile- prix très fort  supérieur au troisième quartile<jupyter_code>def prixQuali(nom):
    table = station[nom]
    q1, med, q3 = np.percentile(table,25),np.percentile(table,50),np.percentile(table,75)
    return np.array(['Très bas'*int(k<=q1) + 
                     'Assez bas'*int(k>q1 and k <=med) + 
                     'Assez haut'*int(k>med and k <q3) + 
                     'Haut'*int(k>=q3) for k in table])

station["prix"] = prixQuali('Valeur1L')
station.head()<jupyter_output><empty_output><jupyter_text>9) Vaut-il mieux acheter son carburant sur route ou sur autoroute?La variable typeRoute vaut "A" pour autoroute et "R" pour route. On pourra faire un tableau de contingence entre typeRoute et la variable créée en 8).<jupyter_code>pd.crosstab(station["TypeRoute"], station["prix"])<jupyter_output><empty_output><jupyter_text>Les prix sont homogènes sur les routes. Sur les autoroutes, ils sont plutôt plus hauts.  10) Le département le plus cher de France 10) a-] Créez une variable dep, qui contiendra le numéro de département de la station<jupyter_code>def depart(cp):
    dep = ''
    if cp < 10000: # quand le 0 est manquant, pour les département en 01,02,03
        dep='0'+ str(int(cp/1000))
    else:
        dep=''+ str(int(cp/1000))
    return dep

station["dep"] = [*map(depart,station["CodePostal"])]
station.head()<jupyter_output><empty_output><jupyter_text>10) b-] Selon la base de données, dans quel département paye-t-on le plus cher?<jupyter_code>np.argmax(station.groupby("dep").mean()["Valeur1L"])<jupyter_output><empty_output><jupyter_text>12) Affichez sur une carte les dix stations les moins chères de France en bleu, puis les dix stations les plus chères de France en rouge.Pour les coordonnées, la latitude et la longitude doivent être divisées par $10^5$. On pourra utiliser le module cartopy. On isole d'abord les stations<jupyter_code>triPrix = station.groupby("IdStation").mean().sort_values(["Valeur1L"], ascending=True)

moinsChere = triPrix.iloc[0:10]
plusChere = triPrix.iloc[len(triPrix)-10:len(triPrix)]
moinsChere,plusChere<jupyter_output><empty_output><jupyter_text>Puis on les affiche<jupyter_code>import cartopy

plt.figure(figsize=(10,10))
ax = plt.axes(projection=cartopy.crs.PlateCarree())

ax.add_feature(cartopy.feature.LAND, color = "white")
ax.add_feature(cartopy.feature.OCEAN, color="lightblue")
ax.add_feature(cartopy.feature.COASTLINE)
ax.add_feature(cartopy.feature.BORDERS, linestyle=':')

ax.set_extent([-5, 8.5, 42, 52])

for i in range(10):
    moins = moinsChere.iloc[i]
    plus = plusChere.iloc[i]
    
    plt.scatter(moins['Long']/100000,moins['Lat']/100000, color="blue")
    plt.scatter(plus['Long']/100000,plus['Lat']/100000, color="red")
    

plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11298364579178301, 'fraction_numerical': 0.031112883925009972, 'mean_word_length': 5.672654690618763, 'pattern_counts': {'":': 0, '<': 95, '<?xml version=': 0, '>': 94, 'https://': 5, 'lorem ipsum': 0, 'www.': 1, 'xml': 1}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '23', 'dir': 'jupyter-structured-clean-dedup', 'id': '534730', 'license': 'MIT', 'n_tokens_mistral': 3874, 'n_tokens_neox': 3683, 'n_words': 964, 'path': '7.pandas_matplotlib/Correction TP2 - Le prix du carburant en France.ipynb', 'repo_name': 'llesoil/modelisation_des_problemes_scientifiques-', 'size': '10028'}