10.3. Guide pratique : Auditer une facture d’energie avec Python
Ce guide explique comment utiliser les modeles Facture de la bibliotheque
EnergySystemModels pour verifier et auditer une facture d’electricite ou
de gaz, que ce soit en France (TURPE, ATR) ou en Algerie (Sonalgaz).
Nouveaute v20260408001
Chaque calculateur produit desormais des DataFrames auditables (Option B) qui detaillent chaque ligne de calcul avec : la formule utilisee, les entrees, les coefficients et le resultat. L’objectif est de pouvoir controler chaque composante d’une facture.
Structure universelle d’une facture d’energie
+---------------------------------------------------------------+
| FACTURE D'ENERGIE |
+---------------------------------------------------------------+
| |
| 1. FOURNITURE (molecule) = kWh x prix/kWh |
| - Electricite : par poste horaire (Pointe, HPH, HCH...) |
| - Gaz : prix fixe ou indexe (molecule) |
| + Certificats de capacite, ARENH, ENR |
| |
| 2. ACHEMINEMENT (reseau) = composantes fixes |
| + variables |
| - Electricite : TURPE (CG+CC+CS+CMDPS+CACS) |
| - Gaz : ATRD (distribution) + ATRT (transport) |
| |
| 3. TAXES ET CONTRIBUTIONS |
| - CTA (contribution tarifaire acheminement) |
| - TICFE/CSPE (electricite) ou Accise/TICGN (gaz) |
| - TVA : 5,5% sur fixe + 20% sur variable (France) |
| ou 19% (Algerie) |
| |
+---------------------------------------------------------------+
| TOTAL HTVA = Fourniture + Acheminement + Taxes |
| TOTAL TTC = HTVA + TVA |
+---------------------------------------------------------------+
Conversion d’unites
Unite |
Conversion |
Usage |
|---|---|---|
1 thermie (th) |
= 1,163 kWh = 0,001163 MWh |
Gaz naturel en Algerie (Sonalgaz) |
1 MWh |
= 1 000 kWh |
Standard international |
1 m3(n) gaz |
x PCS (~11,5 kWh/m3) = kWh |
Conversion volume → energie (France) |
cDA/kWh |
= centimes de Dinar par kWh |
Tarif Sonalgaz (diviser par 100 pour DA/kWh) |
Principe general
Chaque calculateur produit plusieurs DataFrames par section :
DataFrame |
Contenu |
|---|---|
|
Parametres contractuels : tension, tarif, puissances souscrites, periode |
|
Detail de la fourniture d’energie : kWh x prix par poste horaire, capacite, ARENH |
|
Detail du TURPE (France elec) : CG, CC, CS fixe/variable, CMDPS, CACS |
|
Detail ATRT (France gaz) : TCS, TCR, TCL, compensation stockage |
|
Detail ATRD (France gaz) : fixe, capacite, variable |
|
Taxes et contributions : CTA, TICFE/CSPE, TICGN, TVA |
|
Synthese : HT, TTC, couts unitaires EUR/MWh |
Colonnes standard de chaque DataFrame :
Colonne |
Role |
|---|---|
Ligne |
Description du poste de calcul |
Formule |
Equation utilisee (ex: |
Entree(s) |
Valeurs d’entree formatees (ex: |
Coefficient |
Taux ou coefficient utilise + source (ex: |
Resultat |
Montant calcule |
Annuel |
Projection annuelle (si applicable) |
10.3.1. Auditer une facture d’electricite en France (TURPE)
from Facture.TURPE import TurpeCalculator, input_Contrat, input_Tarif, input_Facture
# 1. Entrees : recopier les donnees de la facture
contrat = input_Contrat(
domaine_tension="HTA",
version_utilisation="CU_pf",
cadre_contractuel="contrat unique",
PS_pointe=100, PS_HPH=200, PS_HCH=200, PS_HPB=200, PS_HCB=200,
)
tarif = input_Tarif(
c_euro_kWh_pointe=0.12,
c_euro_kWh_HPH=0.09,
c_euro_kWh_HCH=0.07,
c_euro_kWh_HPB=0.06,
c_euro_kWh_HCB=0.05,
)
facture = input_Facture(
start="2025-01-01", end="2025-01-31",
kWh_pointe=5000, kWh_HPH=30000, kWh_HCH=20000,
kWh_HPB=25000, kWh_HCB=15000,
)
# 2. Calcul
calc = TurpeCalculator(contrat, tarif, facture)
calc.calculate_turpe()
# 3. Consultation des resultats
print("=== CONTRAT ===")
print(calc.df_contrat.to_string(index=False))
print("\n=== FOURNITURE ===")
print(calc.df_fourniture_detail.to_string(index=False))
print("\n=== ACHEMINEMENT (TURPE) ===")
print(calc.df_acheminement.to_string(index=False))
print("\n=== TAXES ===")
print(calc.df_taxes.to_string(index=False))
print("\n=== TOTAUX ===")
print(calc.df_totaux.to_string(index=False))
# 4. Graphiques
calc.plot() # Donut : Fourniture / TURPE / Taxes
calc.plot_detail() # Cascades detaillees
Resultat reel (df_acheminement) :
Ligne Formule Entree(s) Coefficient Resultat Annuel
Composante de Gestion (CG) CG_annuel / 12 361.20 EUR/an 31 jours 30.10 361.2
Composante de Comptage (CC) CC_annuel / 12 306.00 EUR/an 31 jours 25.50 306.0
CS Fixe Pointe b0 x PS_Pointe 250 kW 6.4400 EUR/kW/an (TURPE 5) 1610.00
CS Fixe HPH-Pointe b1 x (PS_HPH - PS_Pointe) 50 kW 6.4400 EUR/kW/an (TURPE 5) 322.00
= CS Fixe (proratise) CS_annuel x nb_jour / 365 1,932.00 EUR/an 31 jours 164.09 1932.0
CS Variable Pointe c_Pointe x kWh_Pointe 2,500 kWh 0.03690 EUR/kWh (TURPE 5) 92.25
CS Variable HPH c_HPH x kWh_HPH 55,000 kWh 0.03690 EUR/kWh (TURPE 5) 2029.50
CS Variable HCH c_HCH x kWh_HCH 35,000 kWh 0.03690 EUR/kWh (TURPE 5) 1291.50
= CS Variable total Somme c x kWh 3413.25
Depassement PS (CMDPS) CMDPS mensuel 0.00
= TOTAL TURPE (acheminement) CG + CC + CS_fixe + CS_var + CMDPS + CACS 3634.00 43558.2
Resultat reel (df_totaux) :
Ligne Formule Entree(s) Coefficient Resultat
Fourniture 10037.50
Acheminement (TURPE) 3634.00
Taxes et contributions 94.43
= Total HTVA Fourniture + TURPE + Taxes 13765.93
TVA 20% Total_HTVA x 20% 2753.19
= Total TTC HTVA + TVA 16519.12
Cout HTVA (EUR/MWh) Total_HTVA / MWh 92.50 MWh 148.82
Cout fourniture (EUR/MWh) Fourniture / MWh 108.51
Cout distribution (EUR/MWh) TURPE / MWh 39.29
Cout taxes (EUR/MWh) Taxes / MWh 1.02
Lecture du tableau :
Chaque ligne du df_acheminement montre :
Les coefficients b (part puissance) avec la version TURPE utilisee
Les coefficients c (part energie) par poste horaire
La formule exacte :
b0 x PS_Pointe,c_HPH x kWh_HPH, etc.Les sous-totaux CS fixe et CS variable
Verifier un ecart : Comparez chaque ligne du df_acheminement avec les
montants de votre facture ENEDIS. Les coefficients b et c doivent correspondre
a la grille TURPE en vigueur (publiee par la CRE).
10.3.2. Auditer une facture de gaz en France (ATR)
from Facture.ATR_Transport_Distribution import (
ATR_calculation, input_Contrat, input_Facture, input_Tarif
)
# 1. Entrees
contrat = input_Contrat(
type_tarif_acheminement="T4",
CAR_MWh=8920, # Consommation Annuelle de Reference (MWh)
CJA_MWh_j=93, # Capacite Journaliere Annualisee (MWh/j)
station_meteo="PARIS-MONTSOURIS",
profil="P016",
reseau_transport="naTran",
niv_tarif_region=2,
)
facture = input_Facture(
start="2024-01-01", end="2024-01-31",
kWh_total=1358713,
)
tarif = input_Tarif(prix_kWh=0.03171)
# 2. Calcul
calc = ATR_calculation(contrat, facture, tarif)
calc.calculate()
# 3. Resultats par section
print("=== CONTRAT ===")
print(calc.df_contrat.to_string(index=False))
print("\n=== FOURNITURE ===")
print(calc.df_fourniture.to_string(index=False))
print("\n=== TRANSPORT (ATRT) ===")
print(calc.df_transport.to_string(index=False))
print("\n=== DISTRIBUTION (ATRD) ===")
print(calc.df_distribution.to_string(index=False))
print("\n=== TAXES ===")
print(calc.df_taxes.to_string(index=False))
print("\n=== TOTAUX ===")
print(calc.df_totaux.to_string(index=False))
# 4. Graphiques
calc.plot() # Donut : Acheminement / Consommation / Taxes
calc.plot_detail() # Cascades ATRD, ATRT, Taxes
calc.plot_euro_MWh() # Couts unitaires EUR/MWh
Points cles a verifier :
CJN : calculee automatiquement depuis CAR x Zi x A (coefficients meteo et reseau)
ATRT : Transport = TCS + TCR x NTR + TCL (coefficients annuels naTran (ex-GRTgaz)/Terega)
ATRD : Distribution = fixe + capacite + variable (coefficients GRDF)
TVA : 5,5% sur fixe+CTA, 20% sur variable+molecule+accise
10.3.3. Auditer une facture d’electricite en Algerie (Sonalgaz)
from Facture.SONALGAZ_Elec import Sonalgaz_Elec, input_Contrat, input_Facture
# 1. Entrees (relever sur la facture Sonalgaz)
facture = input_Facture(
start="2025-01-01", end="2025-01-31",
kWh_pointe=5000,
kWh_pleine=10000,
kWh_jour=8000,
kWh_nuit=6000,
kvarh_reactif=5000, # Energie reactive mesuree
PMA_kW=100, # Puissance Maximale Atteinte
)
contrat = input_Contrat(
code_tarif="41", # HTA : 41, 42, 43, 44 / HTB : 31, 32 / BT : 51M-54NM
PMD_kW=120, # Puissance Mise a Disposition
)
# 2. Calcul
calc = Sonalgaz_Elec(contrat, facture)
calc.calculate()
# 3. Resultats detailles
print(calc.df_contrat.to_string(index=False))
print(calc.df_fourniture_detail.to_string(index=False))
print(calc.df_totaux.to_string(index=False))
# 4. Graphiques
calc.plot()
calc.plot_detail()
Codes tarif Sonalgaz Electricite :
Code |
Tension |
Description |
|---|---|---|
41 |
HTA |
Postes horaires : Pointe, Pleine, Jour, Hors Pointe, Nuit |
42 |
HTA |
Postes : Pointe, Hors Pointe |
43 |
HTA |
Postes : Pointe, Jour, Nuit |
44 |
HTA |
Poste unique |
31 |
HTB |
Postes : Pointe, Pleine, Nuit |
32 |
HTB |
Poste unique |
51M-54M |
BT |
Basse Tension mesure (54M = tranches progressives) |
51NM-54NM |
BT |
Basse Tension non-mesure |
Energie reactive : Un seuil de 50% de l’energie active est gratuit. Au-dela, un malus s’applique. En-dessous, un bonus est accorde.
10.3.4. Auditer une facture de gaz en Algerie (Sonalgaz Gaz)
from Facture.SONALGAZ_gaz import Sonalgaz_Gaz, input_Contrat, input_Facture
# 1. Entrees
facture = input_Facture(
start="2025-01-01", end="2025-01-31",
thermies=50000, # Consommation en thermies
DMA_thermie_h=30, # Debit Maximal Absorbe
# Optionnel : montants releves pour comparaison
releve_fixe=1500,
releve_DMD=2000,
releve_DMA=800,
releve_energie=5000,
releve_total_ht=9300,
releve_tva=1767,
redevance_entretien=250,
)
contrat = input_Contrat(
code_tarif="11", # HP : 11, 21T / MP : 21, 22 / BP : 23M, 23NM
DMD_thermie_h=25, # Debit Mis a Disposition (souscrit)
)
# 2. Calcul
calc = Sonalgaz_Gaz(contrat, facture)
calc.calculate()
# 3. Tableau de comparaison releve vs calcule
print(calc.df.to_string(index=False))
# 4. DataFrames auditables detailles
print(calc.df_contrat.to_string(index=False))
print(calc.df_fourniture_detail.to_string(index=False))
print(calc.df_charges.to_string(index=False))
print(calc.df_totaux.to_string(index=False))
Codes tarif Sonalgaz Gaz :
Code |
Pression |
Description |
|---|---|---|
11 |
HP |
Haute Pression : fixe + DMD + DMA + energie lineaire |
21T |
HP |
Haute Pression Transport |
21 |
MP |
Moyenne Pression : fixe + DMD + DMA + energie lineaire |
22 |
MP |
Moyenne Pression tarif reduit |
23M |
BP |
Basse Pression mesure : tranches progressives |
23NM |
BP |
Basse Pression non-mesure : tranches progressives |
10.3.5. Module utilitaire : df_utils
Le module Facture.df_utils fournit les fonctions partagees par tous les
calculateurs pour construire les DataFrames auditables :
from Facture.df_utils import (
add_row, # Ajouter une ligne au tableau
build_section_df, # Construire un DataFrame de section
format_number, # Formater un nombre (separateurs, unite)
smart_round, # Arrondi adaptatif (<10 : 6 dec, >=10 : 2 dec)
fmt, # Formater ou retourner '---' si None
ecart, # Calculer l'ecart releve vs calcule
add_comparison_row, # Ligne de comparaison
build_comparison_df, # DataFrame de comparaison
set_display_options, # Configurer pandas pour affichage optimal
STANDARD_COLUMNS, # ['Ligne', 'Formule', 'Entree(s)', 'Coefficient', 'Resultat', 'Annuel']
COMPARISON_COLUMNS, # ['Composante', 'Releve (facture)', 'Calcule (Python)', 'Ecart']
)
10.3.6. Recuperer tous les DataFrames en une fois
Pour le modele ATR gaz, une methode get_dataframes() retourne un
dictionnaire de tous les DataFrames :
calc = ATR_calculation(contrat, facture, tarif)
calc.calculate()
dfs = calc.get_dataframes()
for name, df in dfs.items():
if df is not None and not df.empty:
print(f"=== {name} ({len(df)} lignes) ===")
print(df.to_string(index=False))
print()