Questions séance 6 février 2023#

Links: notebook, html, PDF, python, slides, GitHub

numpy#

Le code suivant calcule un pivot de Gauss. Toutes les boucles sont écrites en python. Saurez-vous remplacer une boucle par l’addition de deux vecteurs ?

import numpy

def pivot_gauss(m):
    n = m.copy()
    for i in range(1, m.shape[0]):
        j0 = i
        while j0 < m.shape[0] and m[j0, i-1] == 0:
            j0 += 1
        for j in range(j0, m.shape[0]):
            coef = - m[j, i-1] / m[i-1, i-1]
            for k in range(i-1, m.shape[1]):
                m[j, k] += coef * m[i-1, k]
    return m


m = numpy.random.rand(4, 4)
piv = pivot_gauss(m)
piv * (numpy.abs(piv) > 1e-10)
array([[ 0.2870116 ,  0.23255199,  0.99778275,  0.3723715 ],
       [ 0.        ,  0.25707083,  0.03938638,  0.24588584],
       [ 0.        ,  0.        , -0.44074443, -0.02428594],
       [ 0.        ,  0.        ,  0.        , -0.14912591]])

La correction est ici Pivot de gauss avec numpy.

pandas#

On récupère la distribution d’énergie depuis open.data.gouv.fr Demandes de valeurs foncières. On doit calculer la part de la consommation résidentielle pour l’année 2021 rapportée à la consommation totale pour chaque département, opérateur et filière.

columns = [
    "annee",  # filtre
    "operateur",  # groupe
    "filiere",  # groupe
    "code_departement",  # groupe
    "libelle_departement",  # groupe
    "consoa",  # somme, consommation agricuture
    "consoi",  # somme, consommation industrie
    "consot",  # somme, consommation tertiaire
    "consor",  # somme, consommation résidentielle
    "consona",  # somme, consommation inconnue
    "consototale",  # somme, consommation totale
]
import pandas
df = pandas.read_csv("https://www.data.gouv.fr/fr/datasets/r/e455db41-28c2-419d-bdf1-d44635fdc97e", sep=";")
df.head(2).T
0 1
operateur Enedis Enedis
annee 2011 2011
filiere Electricité Electricité
consoa 26490.69 25747.9
pdla 334 373
nombre_maille_secretisees_a 0 0
indquala 0.957 0.976
consoi 838010.71 426364.02
pdli 633 553
nombre_maille_secretisees_i 0 0
indquali 0.959 0.954
consot 515742.32 430434.21
pdlt 2069 1813
nombre_maille_secretisees_t 0 0
indqualt 0.938 0.935
consor 1472026.6 1130822.23
pdlr 259239 219826
nombre_maille_secretisees_r 2 0
indqualr 0.301 0.285
consona 3010.34 3822.28
pdlna 44 47
nombre_maille_secretisees_na 0 0
indqualna 0.568 0.871
code_departement 02 03
libelle_departement Aisne Allier
code_region 32 84
libelle_region Hauts-de-France Auvergne-Rhône-Alpes
id_filiere 100 100
geom NaN NaN
consototale 2855280.66 2017190.64
keys = ["libelle_departement", "filiere", "operateur"]
gr = df[df.annee == 2021][keys + ["consor", "consototale"]].groupby(keys).sum()
gr["ratio"] = gr["consor"] / gr["consototale"]
gr
consor consototale ratio
libelle_departement filiere operateur
Ain Electricité Enedis 1.827582e+06 4.202821e+06 0.434847
RTE 0.000000e+00 1.969394e+06 0.000000
Régie Services Energie 3.518367e+04 6.491954e+04 0.541958
Gaz GRDF 1.117960e+06 2.821584e+06 0.396217
GRT Gaz 0.000000e+00 8.626914e+05 0.000000
... ... ... ... ... ...
Yvelines Electricité Gazelec de Péronne 0.000000e+00 4.330700e+01 0.000000
RTE 0.000000e+00 1.269762e+06 0.000000
SICAE ELY 6.668413e+04 1.105667e+05 0.603112
Gaz GRDF 4.521896e+06 7.957519e+06 0.568255
GRT Gaz 0.000000e+00 1.462693e+06 0.000000

569 rows × 3 columns

un problème docteur#

On récupère un fichier contenant des données agrégées par année. Si rien ne vous paraît suspect, tant mieux, sinon il faudra dire pourquoi.

import pandas

df = pandas.read_csv("seance_6_fevrier.csv")
agg = df.groupby("annee").sum()
agg
conso
annee
2010 5818.296372
2011 6042.792132
2012 5956.360936
2013 5856.246799
2014 6123.335790
2015 2886.124028
2016 5832.216522
2017 6126.836683
2018 6458.576942
2019 6148.858956

Avec un dessin, c’est plus clair. 2015 pose problème.

agg.plot(figsize=(12, 4));
../_images/seance_6_fevrier_12_0.png
df[df.annee == 2015]
annee conso
5 2015 NaN
9 2015 5.683071
11 2015 NaN
18 2015 NaN
33 2015 2.433315
... ... ...
9980 2015 6.430573
9982 2015 1.900968
9985 2015 NaN
9989 2015 5.669566
9998 2015 5.216038

1024 rows × 2 columns

Il semble y avoir des valeurs manquantes. Vérifions.

import numpy
df["miss"] = df.conso.isna().astype(numpy.int64)
df.groupby("annee").sum()
conso miss
annee
2010 5818.296372 0
2011 6042.792132 0
2012 5956.360936 0
2013 5856.246799 0
2014 6123.335790 0
2015 2886.124028 519
2016 5832.216522 0
2017 6126.836683 0
2018 6458.576942 0
2019 6148.858956 0

L’année 2015 contient des valeurs manquantes, les autres années non.