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.
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
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));
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.