Creer un dashboard PowerBI
‚Äč‚Äč
‚Äč
‚Äč
Tags: #fec #powerbi #dataviz #analytics
Author: Alexandre STEVENS‚Äč
Ce Notebook permet de transformer des fichiers FEC de votre entreprise en un tableau de bord Microsoft Power BI. Le FEC (fichier des écritures comptables) est un export standard des logiciels de comptabilite et une obligation légale en france depuis 2014 afin de déposer ses comptes de manière electronique auprès des services fiscaux. -Durée de l’installation = 5 minutes -Support d’installation = Page Notion -Niveau = Facile

Input

Librairie

1
import pandas as pd
2
from datetime import datetime, timedelta
3
import os
4
import re
5
import naas
Copied!

Lien URL vers le logo de l'entreprise

1
LOGO = "https://landen.imgix.net/e5hx7wyzf53f/assets/26u7xg7u.png?w=400"
2
COLOR_1 = None
3
COLOR_2 = None
Copied!

Lire les fichiers FEC

1
def get_all_fec(file_regex,
2
sep=",",
3
decimal=".",
4
encoding=None,
5
header=None,
6
usecols=None,
7
names=None,
8
dtype=None):
9
# Create df init
10
df = pd.DataFrame()
11
‚Äč
12
# Get all files in INPUT_FOLDER
13
files = [f for f in os.listdir() if re.search(file_regex, f)]
14
if len(files) == 0:
15
print(f"Aucun fichier FEC ne correspond au standard de nomination")
16
else:
17
for file in files:
18
# Open file and create df
19
print(file)
20
tmp_df = pd.read_csv(file,
21
sep=sep,
22
decimal=decimal,
23
encoding=encoding,
24
header=header,
25
usecols=usecols,
26
names=names,
27
dtype=dtype)
28
# Add filename to df
29
tmp_df['NOM_FICHIER'] = file
30
‚Äč
31
# Concat df
32
df = pd.concat([df, tmp_df], axis=0, sort=False)
33
return df
Copied!
1
file_regex = "^\d{9}FEC\d{8}.txt"
2
‚Äč
3
db_init = get_all_fec(file_regex,
4
sep='\t',
5
decimal=',',
6
encoding='ISO-8859-1',
7
header=0)
8
db_init
Copied!

Model

Base de donnée FEC

Nettoyage des données
1
db_clean = db_init.copy()
2
‚Äč
3
# Selection des colonnes à conserver
4
to_select = ['NOM_FICHIER',
5
'EcritureDate',
6
'CompteNum',
7
'CompteLib',
8
'EcritureLib',
9
'Debit',
10
'Credit']
11
db_clean = db_clean[to_select]
12
‚Äč
13
# Renommage des colonnes
14
to_rename = {'EcritureDate': "DATE",
15
'CompteNum': "COMPTE_NUM",
16
'CompteLib': "RUBRIQUE_N3",
17
'EcritureLib': "RUBRIQUE_N4",
18
'Debit': "DEBIT",
19
'Credit': "CREDIT"}
20
db_clean = db_clean.rename(columns=to_rename)
21
‚Äč
22
#suppression des espaces colonne "COMPTE_NUM"
23
db_clean["COMPTE_NUM"] = db_clean["COMPTE_NUM"].astype(str).str.strip()
24
‚Äč
25
# Mise au format des colonnes
26
db_clean = db_clean.astype({"NOM_FICHIER" : str,
27
"DATE" : str,
28
"COMPTE_NUM" : str,
29
"RUBRIQUE_N3" : str,
30
"RUBRIQUE_N4" : str,
31
"DEBIT" : float,
32
"CREDIT" : float,
33
})
34
‚Äč
35
# Mise au format colonne date
36
db_clean["DATE"] = pd.to_datetime(db_clean["DATE"])
37
‚Äč
38
db_clean.head(5)
Copied!
Enrichissement de la base
1
db_enr = db_clean.copy()
2
‚Äč
3
# Ajout colonnes entité et période
4
db_enr['ENTITY'] = db_enr['NOM_FICHIER'].str[:9]
5
db_enr['PERIOD'] = db_enr['NOM_FICHIER'].str[12:-6]
6
db_enr['PERIOD'] = pd.to_datetime(db_enr['PERIOD'], format='%Y%m')
7
db_enr['PERIOD'] = db_enr['PERIOD'].dt.strftime("%Y-%m")
8
‚Äč
9
# Ajout colonne month et month_index
10
db_enr['MONTH'] = db_enr['DATE'].dt.strftime("%b")
11
db_enr['MONTH_INDEX'] = db_enr['DATE'].dt.month
12
‚Äč
13
# Calcul de la valeur debit-crédit
14
db_enr["VALUE"] = (db_enr["DEBIT"]) - (db_enr["CREDIT"])
15
‚Äč
16
db_enr.head(5)
Copied!
1
# Calcul résultat pour équilibrage bilan dans capitaux propre
2
db_rn = db_enr.copy()
3
‚Äč
4
db_rn = db_rn[db_rn['COMPTE_NUM'].str.contains(r'^6|^7')]
5
‚Äč
6
to_group = ["ENTITY", "PERIOD"]
7
to_agg = {"VALUE": "sum"}
8
db_rn = db_rn.groupby(to_group, as_index=False).agg(to_agg)
9
‚Äč
10
db_rn ["COMPTE_NUM"] = "10999999"
11
db_rn ["RUBRIQUE_N3"] = "RESULTAT"
12
‚Äč
13
# Reorganisation colonne
14
to_select = ['ENTITY',
15
'PERIOD',
16
'COMPTE_NUM',
17
'RUBRIQUE_N3',
18
'VALUE']
19
db_rn = db_rn[to_select]
20
db_rn
Copied!

Base de données FEC aggrégée avec variation

Aggrégation RUBRIQUE N3
1
# Calcul var v = création de dataset avec Period_comp pour merge
2
db_var = db_enr.copy()
3
‚Äč
4
# Regroupement
5
to_group = ["ENTITY",
6
"PERIOD",
7
"COMPTE_NUM",
8
"RUBRIQUE_N3"]
9
to_agg = {"VALUE": "sum"}
10
db_var = db_var.groupby(to_group, as_index=False).agg(to_agg)
11
‚Äč
12
# Ajout des résultats au dataframe
13
db_var = pd.concat([db_var, db_rn], axis=0, sort=False)
14
‚Äč
15
# Creation colonne COMP
16
db_var['PERIOD_COMP'] = (db_var['PERIOD'].str[:4].astype(int) - 1).astype(str) + db_var['PERIOD'].str[-3:]
17
‚Äč
18
db_var
Copied!
Création de la base comparable
1
db_comp = db_var.copy()
2
‚Äč
3
# Suppression de la colonne période
4
db_comp = db_comp.drop("PERIOD_COMP", axis=1)
5
‚Äč
6
# Renommage des colonnes
7
to_rename = {'VALUE': "VALUE_N-1",
8
'PERIOD': "PERIOD_COMP"}
9
db_comp = db_comp.rename(columns=to_rename)
10
‚Äč
11
db_comp.head(5)
Copied!
Jointure des 2 tables et calcul des variations
1
# Jointure entre les 2 tables
2
join_on = ["ENTITY",
3
"PERIOD_COMP",
4
"COMPTE_NUM",
5
"RUBRIQUE_N3"]
6
db_var = pd.merge(db_var, db_comp, how='left', on=join_on).drop("PERIOD_COMP", axis=1).fillna(0)
7
‚Äč
8
#Création colonne Var V
9
db_var["VARV"] = db_var["VALUE"] - db_var["VALUE_N-1"]
10
‚Äč
11
#Création colonne Var P (%)
12
db_var["VARP"] = db_var["VARV"] / db_var["VALUE_N-1"]
13
‚Äč
14
db_var
Copied!
1
db_cat = db_var.copy()
2
‚Äč
3
# Calcul des rubriques niveau 2
4
def rubrique_N2(row):
5
numero_compte = str(row["COMPTE_NUM"])
6
value = float(row["VALUE"])
7
8
# BILAN SIMPLIFIE type IFRS NIV2
9
‚Äč
10
to_check = ["^10", "^11", "^12", "^13", "^14"]
11
if any (re.search(x,numero_compte) for x in to_check):
12
return "CAPITAUX_PROPRES"
13
14
to_check = ["^15", "^16", "^17", "^18", "^19"]
15
if any (re.search(x,numero_compte) for x in to_check):
16
return "DETTES_FINANCIERES"
17
18
to_check = ["^20", "^21", "^22", "^23", "^25", "^26", "^27", "^28", "^29"]
19
if any (re.search(x,numero_compte) for x in to_check):
20
return "IMMOBILISATIONS"
21
22
to_check = ["^31", "^32", "^33", "^34", "^35", "^36", "^37", "^38", "^39"]
23
if any (re.search(x,numero_compte) for x in to_check):
24
return "STOCKS"
25
26
to_check = ["^40"]
27
if any (re.search(x,numero_compte) for x in to_check):
28
return "DETTES_FOURNISSEURS"
29
30
to_check = ["^41"]
31
if any (re.search(x,numero_compte) for x in to_check):
32
return "CREANCES_CLIENTS"
33
34
to_check = ["^42", "^43", "^44", "^45", "^46", "^47", "^48", "^49"]
35
if any (re.search(x,numero_compte) for x in to_check):
36
if value > 0:
37
return "AUTRES_CREANCES"
38
else:
39
return "AUTRES_DETTES"
40
41
to_check = ["^50", "^51", "^52", "^53", "^54", "^58", "^59"]
42
if any (re.search(x,numero_compte) for x in to_check):
43
return "DISPONIBILITES"
44
‚Äč
45
46
# COMPTE DE RESULTAT DETAILLE NIV2
47
‚Äč
48
to_check = ["^60"]
49
if any (re.search(x,numero_compte) for x in to_check):
50
return "ACHATS"
51
52
to_check= ["^61", "^62"]
53
if any (re.search(x,numero_compte) for x in to_check):
54
return "SERVICES_EXTERIEURS"
55
56
to_check = ["^63"]
57
if any (re.search(x,numero_compte) for x in to_check):
58
return "TAXES"
59
60
to_check = ["^64"]
61
if any (re.search(x,numero_compte) for x in to_check):
62
return "CHARGES_PERSONNEL"
63
64
to_check = ["^65"]
65
if any (re.search(x,numero_compte) for x in to_check):
66
return "AUTRES_CHARGES"
67
68
to_check = ["^66"]
69
if any (re.search(x,numero_compte) for x in to_check):
70
return "CHARGES_FINANCIERES"
71
72
to_check = ["^67"]
73
if any (re.search(x,numero_compte) for x in to_check):
74
return "CHARGES_EXCEPTIONNELLES"
75
76
to_check = ["^68", "^78"]
77
if any (re.search(x,numero_compte) for x in to_check):
78
return "AMORTISSEMENTS"
79
80
to_check = ["^69"]
81
if any (re.search(x,numero_compte) for x in to_check):
82
return "IMPOT"
83
84
to_check = ["^70"]
85
if any (re.search(x,numero_compte) for x in to_check):
86
return "VENTES"
87
88
to_check = ["^71", "^72"]
89
if any (re.search(x,numero_compte) for x in to_check):
90
return "PRODUCTION_STOCKEE_IMMOBILISEE"
91
92
to_check = ["^74"]
93
if any (re.search(x,numero_compte) for x in to_check):
94
return "SUBVENTIONS_D'EXPL."
95
96
to_check = ["^75", "^791"]
97
if any (re.search(x,numero_compte) for x in to_check):
98
return "AUTRES_PRODUITS_GESTION_COURANTE"
99
100
to_check = ["^76", "^796"]
101
if any (re.search(x,numero_compte) for x in to_check):
102
return "PRODUITS_FINANCIERS"
103
104
to_check = ["^77", "^797"]
105
if any (re.search(x,numero_compte) for x in to_check):
106
return "PRODUITS_EXCEPTIONNELS"
107
108
to_check = ["^78"]
109
if any (re.search(x,numero_compte) for x in to_check):
110
return "REPRISES_AMORT._DEP."
111
‚Äč
112
to_check = ["^8"]
113
if any (re.search(x,numero_compte) for x in to_check):
114
return "COMPTES_SPECIAUX"
115
‚Äč
116
117
# Calcul des rubriques niveau 1
118
def rubrique_N1(row):
119
categorisation = row.RUBRIQUE_N2
120
121
# BILAN SIMPLIFIE type IFRS N1
122
‚Äč
123
to_check = ["CAPITAUX_PROPRES", "DETTES_FINANCIERES"]
124
if any(re.search(x, categorisation) for x in to_check):
125
return "PASSIF_NON_COURANT"
126
127
to_check = ["IMMOBILISATIONS"]
128
if any(re.search(x, categorisation) for x in to_check):
129
return "ACTIF_NON_COURANT"
130
131
to_check = ["STOCKS", "CREANCES_CLIENTS", "AUTRES_CREANCES"]
132
if any(re.search(x, categorisation) for x in to_check):
133
return "ACTIF_COURANT"
134
135
to_check = ["DETTES_FOURNISSEURS", "AUTRES_DETTES"]
136
if any(re.search(x, categorisation) for x in to_check):
137
return "PASSIF_COURANT"
138
139
to_check = ["DISPONIBILITES"]
140
if any(re.search(x, categorisation) for x in to_check):
141
return "DISPONIBILITES"
142
‚Äč
143
144
# COMPTE DE RESULTAT SIMPLIFIE N1
145
146
to_check = ["ACHATS"]
147
if any(re.search(x, categorisation) for x in to_check):
148
return "COUTS_DIRECTS"
149
150
to_check = ["SERVICES_EXTERIEURS", "TAXES", "CHARGES_PERSONNEL", "AUTRES_CHARGES", "AMORTISSEMENTS"]
151
if any(re.search(x, categorisation) for x in to_check):
152
return "CHARGES_EXPLOITATION"
153
154
to_check = ["CHARGES_FINANCIERES"]
155
if any(re.search(x, categorisation) for x in to_check):
156
return "CHARGES_FINANCIERES"
157
158
to_check = ["CHARGES_EXCEPTIONNELLES", "IMPOT"]
159
if any(re.search(x, categorisation) for x in to_check):
160
return "CHARGES_EXCEPTIONNELLES"
161
‚Äč
162
to_check = ["VENTES", "PRODUCTION_STOCKEE_IMMOBILISEE"]
163
if any(re.search(x, categorisation) for x in to_check):
164
return "CHIFFRE_D'AFFAIRES"
165
166
to_check = ["SUBVENTIONS_D'EXPL.", "AUTRES_PRODUITS_GESTION_COURANTE", "REPRISES_AMORT._DEP."]
167
if any(re.search(x, categorisation) for x in to_check):
168
return "PRODUITS_EXPLOITATION"
169
170
to_check = ["PRODUITS_FINANCIERS"]
171
if any(re.search(x, categorisation) for x in to_check):
172
return "PRODUITS_FINANCIERS"
173
174
to_check = ["PRODUITS_EXCEPTIONNELS"]
175
if any(re.search(x, categorisation) for x in to_check):
176
return "PRODUITS_EXCEPTIONNELS"
177
178
‚Äč
179
# Calcul des rubriques niveau 0
180
def rubrique_N0(row):
181
masse = row.RUBRIQUE_N1
182
183
to_check = ["ACTIF_NON_COURANT", "ACTIF_COURANT", "DISPONIBILITES"]
184
if any(re.search(x, masse) for x in to_check):
185
return "ACTIF"
186
187
to_check = ["PASSIF_NON_COURANT", "PASSIF_COURANT"]
188
if any(re.search(x, masse) for x in to_check):
189
return "PASSIF"
190
‚Äč
191
to_check = ["COUTS_DIRECTS", "CHARGES_EXPLOITATION", "CHARGES_FINANCIERES", "CHARGES_EXCEPTIONNELLES"]
192
if any(re.search(x, masse) for x in to_check):
193
return "CHARGES"
194
195
to_check = ["CHIFFRE_D'AFFAIRES", "PRODUITS_EXPLOITATION", "PRODUITS_FINANCIERS", "PRODUITS_EXCEPTIONNELS"]
196
if any(re.search(x, masse) for x in to_check):
197
return "PRODUITS"
198
199
200
# Mapping des rubriques
201
db_cat["RUBRIQUE_N2"] = db_cat.apply(lambda row: rubrique_N2(row), axis=1)
202
db_cat["RUBRIQUE_N1"] = db_cat.apply(lambda row: rubrique_N1(row), axis=1)
203
db_cat["RUBRIQUE_N0"] = db_cat.apply(lambda row: rubrique_N0(row), axis=1)
204
‚Äč
205
‚Äč
206
# Reorganisation colonne
207
to_select = ['ENTITY',
208
'PERIOD',
209
'COMPTE_NUM',
210
'RUBRIQUE_N0',
211
'RUBRIQUE_N1',
212
'RUBRIQUE_N2',
213
'RUBRIQUE_N3',
214
'VALUE',
215
'VALUE_N-1',
216
'VARV',
217
'VARP']
218
db_cat = db_cat[to_select]
219
‚Äč
220
db_cat
Copied!

Modèles de données des graphiques

REF_ENTITE
1
# Creation du dataset ref_entite
2
dataset_entite = db_cat.copy()
3
‚Äč
4
# Regrouper par entite
5
to_group = ["ENTITY"]
6
to_agg = {"ENTITY": "max"}
7
dataset_entite = dataset_entite.groupby(to_group, as_index=False).agg(to_agg)
8
‚Äč
9
# Affichage du modèle de donnée
10
dataset_entite
Copied!
REF_SCENARIO
1
# Creation du dataset ref_scenario
2
dataset_scenario = db_cat.copy()
3
‚Äč
4
# Regrouper par entite
5
to_group = ["PERIOD"]
6
to_agg = {"PERIOD": "max"}
7
dataset_scenario = dataset_scenario.groupby(to_group, as_index=False).agg(to_agg)
8
‚Äč
9
# Affichage du modèle de donnée
10
dataset_scenario
Copied!
KPIS
1
# Creation du dataset KPIS (CA, MARGE, EBE, BFR, CC, DF)
2
dataset_kpis = db_cat.copy()
3
‚Äč
4
# KPIs CA
5
dataset_kpis_ca = dataset_kpis[dataset_kpis.RUBRIQUE_N1.isin(["CHIFFRE_D'AFFAIRES"])]
6
‚Äč
7
to_group = ["ENTITY", "PERIOD", "RUBRIQUE_N1"]
8
to_agg = {"VALUE": "sum"}
9
dataset_kpis_ca = dataset_kpis_ca.groupby(to_group, as_index=False).agg(to_agg)
10
‚Äč
11
# Passage value postif
12
dataset_kpis_ca["VALUE"] = dataset_kpis_ca["VALUE"]*-1
13
‚Äč
14
‚Äč
15
# COUTS_DIRECTS
16
dataset_kpis_ha = dataset_kpis[dataset_kpis.RUBRIQUE_N1.isin(["COUTS_DIRECTS"])]
17
‚Äč
18
to_group = ["ENTITY", "PERIOD", "RUBRIQUE_N1"]
19
to_agg = {"VALUE": "sum"}
20
dataset_kpis_ha = dataset_kpis_ha.groupby(to_group, as_index=False).agg(to_agg)
21
‚Äč
22
# Passage value négatif
23
dataset_kpis_ha["VALUE"] = dataset_kpis_ha["VALUE"]*-1
24
‚Äč
25
‚Äč
26
# KPIs MARGE BRUTE (CA - COUTS DIRECTS)
27
dataset_kpis_mb = dataset_kpis_ca.copy()
28
dataset_kpis_mb = pd.concat([dataset_kpis_mb, dataset_kpis_ha], axis=0, sort=False)
29
‚Äč
30
to_group = ["ENTITY",
31
"PERIOD"]
32
to_agg = {"VALUE": "sum"}
33
‚Äč
34
dataset_kpis_mb = dataset_kpis_mb.groupby(to_group, as_index=False).agg(to_agg)
35
dataset_kpis_mb["RUBRIQUE_N1"] = "MARGE"
36
dataset_kpis_mb = dataset_kpis_mb[["ENTITY", "PERIOD", "RUBRIQUE_N1", "VALUE"]]
37
‚Äč
38
‚Äč
39
# CHARGES EXTERNES
40
dataset_kpis_ce = dataset_kpis[dataset_kpis.RUBRIQUE_N2.isin(["SERVICES_EXTERIEURS"])]
41
to_group = ["ENTITY", "PERIOD", "RUBRIQUE_N2"]
42
to_agg = {"VALUE": "sum"}
43
dataset_kpis_ce = dataset_kpis_ce.groupby(to_group, as_index=False).agg(to_agg)
44
‚Äč
45
# Passage value negatif
46
dataset_kpis_ce["VALUE"] = dataset_kpis_ce["VALUE"]*-1
47
‚Äč
48
‚Äč
49
# IMPOTS
50
dataset_kpis_ip = dataset_kpis[dataset_kpis.RUBRIQUE_N2.isin(["TAXES"])]
51
to_group = ["ENTITY", "PERIOD", "RUBRIQUE_N2"]
52
to_agg = {"VALUE": "sum"}
53
dataset_kpis_ip = dataset_kpis_ip.groupby(to_group, as_index=False).agg(to_agg)
54
‚Äč
55
# Passage value negatif
56
dataset_kpis_ip["VALUE"] = dataset_kpis_ip["VALUE"]*-1
57
‚Äč
58
‚Äč
59
# CHARGES DE PERSONNEL
60
dataset_kpis_cp = dataset_kpis[dataset_kpis.RUBRIQUE_N2.isin(["CHARGES_PERSONNEL"])]
61
to_group = ["ENTITY", "PERIOD", "RUBRIQUE_N2"]
62
to_agg = {"VALUE": "sum"}
63
dataset_kpis_cp = dataset_kpis_cp.groupby(to_group, as_index=False).agg(to_agg)
64
‚Äč
65
# Passage value negatif
66
dataset_kpis_cp["VALUE"] = dataset_kpis_cp["VALUE"]*-1
67
‚Äč
68
‚Äč
69
# AUTRES_CHARGES
70
dataset_kpis_ac = dataset_kpis[dataset_kpis.RUBRIQUE_N2.isin(["AUTRES_CHARGES"])]
71
to_group = ["ENTITY", "PERIOD", "RUBRIQUE_N2"]
72
to_agg = {"VALUE": "sum"}
73
dataset_kpis_ac = dataset_kpis_ac.groupby(to_group, as_index=False).agg(to_agg)
74
‚Äč
75
# Passage value negatif
76
dataset_kpis_ac["VALUE"] = dataset_kpis_ac["VALUE"]*-1
77
‚Äč
78
‚Äč
79
# SUBVENTIONS D'EXPLOITATION
80
dataset_kpis_ac = dataset_kpis[dataset_kpis.RUBRIQUE_N2.isin(["SUBVENTIONS_D'EXPL."])]
81
to_group = ["ENTITY", "PERIOD", "RUBRIQUE_N2"]
82
to_agg = {"VALUE": "sum"}
83
dataset_kpis_ac = dataset_kpis_ac.groupby(to_group, as_index=False).agg(to_agg)
84
‚Äč
85
‚Äč
86
# KPIs EBE = MARGE - CHARGES EXTERNES - TAXES - CHARGES PERSONNEL - AUTRES CHARGES + SUBVENTION D'EXPLOITATION
87
dataset_kpis_ebe = dataset_kpis_mb.copy()
88
dataset_kpis_ebe = pd.concat([dataset_kpis_ebe, dataset_kpis_ce, dataset_kpis_ip, dataset_kpis_cp, dataset_kpis_ac], axis=0, sort=False)
89
‚Äč
90
to_group = ["ENTITY", "PERIOD"]
91
to_agg = {"VALUE": "sum"}
92
‚Äč
93
dataset_kpis_ebe = dataset_kpis_ebe.groupby(to_group, as_index=False).agg(to_agg)
94
dataset_kpis_ebe["RUBRIQUE_N1"] = "EBE"
95
dataset_kpis_ebe = dataset_kpis_ebe[["ENTITY", "PERIOD", "RUBRIQUE_N1", "VALUE"]]
96
‚Äč
97
‚Äč
98
# KPIs CREANCES CLIENTS
99
dataset_kpis_cc = dataset_kpis[dataset_kpis.RUBRIQUE_N2.isin(["CREANCES_CLIENTS"])]
100
to_group = ["ENTITY", "PERIOD", "RUBRIQUE_N2"]
101
to_agg = {"VALUE": "sum"}
102
dataset_kpis_cc = dataset_kpis_cc.groupby(to_group, as_index=False).agg(to_agg)
103
‚Äč
104
# Renommage colonne
105
to_rename = {'RUBRIQUE_N2': "RUBRIQUE_N1"}
106
dataset_kpis_cc = dataset_kpis_cc.rename(columns=to_rename)
107
‚Äč
108
‚Äč
109
# KPIs STOCKS
110
dataset_kpis_st = dataset_kpis[dataset_kpis.RUBRIQUE_N2.isin(["STOCKS"])]
111
to_group = ["ENTITY", "PERIOD", "RUBRIQUE_N2"]
112
to_agg = {"VALUE": "sum"}
113
dataset_kpis_st = dataset_kpis_st.groupby(to_group, as_index=False).agg(to_agg)
114
‚Äč
115
# Renommage colonne
116
to_rename = {'RUBRIQUE_N2': "RUBRIQUE_N1"}
117
dataset_kpis_st = dataset_kpis_st.rename(columns=to_rename)
118
‚Äč
119
‚Äč
120
# KPIs DETTES FOURNISSEURS
121
dataset_kpis_df = dataset_kpis[dataset_kpis.RUBRIQUE_N2.isin(["DETTES_FOURNISSEURS"])]
122
to_group = ["ENTITY", "PERIOD", "RUBRIQUE_N2"]
123
to_agg = {"VALUE": "sum"}
124
dataset_kpis_df = dataset_kpis_df.groupby(to_group, as_index=False).agg(to_agg)
125
‚Äč
126
# Renommage colonne
127
to_rename = {'RUBRIQUE_N2': "RUBRIQUE_N1"}
128
dataset_kpis_df = dataset_kpis_df.rename(columns=to_rename)
129
‚Äč
130
# Passage value positif
131
dataset_kpis_df["VALUE"] = dataset_kpis_df["VALUE"].abs()
132
‚Äč
133
‚Äč
134
# KPIs BFR = CREANCES + STOCKS - DETTES FOURNISSEURS
135
dataset_kpis_bfr_df = dataset_kpis_df.copy()
136
‚Äč
137
# Passage dette fournisseur value négatif
138
dataset_kpis_bfr_df["VALUE"] = dataset_kpis_bfr_df["VALUE"]*-1
139
‚Äč
140
dataset_kpis_bfr_df = pd.concat([dataset_kpis_cc, dataset_kpis_st, dataset_kpis_bfr_df], axis=0, sort=False)
141
‚Äč
142
to_group = ["ENTITY", "PERIOD"]
143
to_agg = {"VALUE": "sum"}
144
dataset_kpis_bfr_df = dataset_kpis_bfr_df.groupby(to_group, as_index=False).agg(to_agg)
145
‚Äč
146
# Creation colonne Rubrique_N1 = BFR
147
dataset_kpis_bfr_df["RUBRIQUE_N1"] = "BFR"
148
‚Äč
149
# Reorganisation colonne
150
dataset_kpis_bfr_df = dataset_kpis_bfr_df[["ENTITY", "PERIOD", "RUBRIQUE_N1", "VALUE"]]
151
‚Äč
152
‚Äč
153
# Creation du dataset final
154
dataset_kpis_final = pd.concat([dataset_kpis_ca, dataset_kpis_mb, dataset_kpis_ebe, dataset_kpis_cc, dataset_kpis_st, dataset_kpis_df, dataset_kpis_bfr_df], axis=0, sort=False)
155
‚Äč
156
‚Äč
157
# Creation colonne COMP
158
dataset_kpis_final['PERIOD_COMP'] = (dataset_kpis_final['PERIOD'].str[:4].astype(int) - 1).astype(str) + dataset_kpis_final['PERIOD'].str[-3:]
159
dataset_kpis_final
Copied!
1
# creation base comparable pour dataset_kpis
2
dataset_kpis_final_comp = dataset_kpis_final.copy()
3
‚Äč
4
# Suppression de la colonne période
5
dataset_kpis_final_comp = dataset_kpis_final_comp.drop("PERIOD_COMP", axis=1)
6
‚Äč
7
# Renommage des colonnes
8
to_rename = {'VALUE': "VALUE_N-1",
9
'PERIOD': "PERIOD_COMP"}
10
dataset_kpis_final_comp = dataset_kpis_final_comp.rename(columns=to_rename)
11
dataset_kpis_final_comp
Copied!
1
# Jointure entre les 2 tables dataset_kpis_final et dataset_kpis_vf
2
join_on = ["ENTITY",
3
"PERIOD_COMP",
4
"RUBRIQUE_N1"]
5
dataset_kpis_final = pd.merge(dataset_kpis_final, dataset_kpis_final_comp, how='left', on=join_on).drop("PERIOD_COMP", axis=1).fillna(0)
6
‚Äč
7
#Création colonne Var V
8
dataset_kpis_final["VARV"] = dataset_kpis_final["VALUE"] - dataset_kpis_final["VALUE_N-1"]
9
‚Äč
10
#Création colonne Var P (%)
11
dataset_kpis_final["VARP"] = dataset_kpis_final["VARV"] / dataset_kpis_final["VALUE_N-1"]
12
‚Äč
13
dataset_kpis_final
Copied!
EVOLUTION CA
1
# Creation du dataset evol_ca
2
dataset_evol_ca = db_enr.copy()
3
‚Äč
4
# Filtre COMPTE_NUM = Chiffre d'Affaire (RUBRIQUE N1)
5
dataset_evol_ca = dataset_evol_ca[dataset_evol_ca['COMPTE_NUM'].str.contains(r'^70|^71|^72')]
6
‚Äč
7
# Regroupement
8
to_group = ["ENTITY",
9
"PERIOD",
10
"MONTH",
11
"MONTH_INDEX",
12
"RUBRIQUE_N3"]
13
to_agg = {"VALUE": "sum"}
14
dataset_evol_ca = dataset_evol_ca.groupby(to_group, as_index=False).agg(to_agg)
15
‚Äč
16
dataset_evol_ca["VALUE"] = dataset_evol_ca["VALUE"].abs()
17
‚Äč
18
‚Äč
19
# Calcul de la somme cumulée
20
dataset_evol_ca = dataset_evol_ca.sort_values(by=["ENTITY", 'PERIOD', 'MONTH_INDEX']).reset_index(drop=True)
21
dataset_evol_ca['MONTH_INDEX'] = pd.to_datetime(dataset_evol_ca['MONTH_INDEX'], format="%m").dt.strftime("%m")
22
dataset_evol_ca['VALUE_CUM'] = dataset_evol_ca.groupby(["ENTITY", "PERIOD"], as_index=True).agg({"VALUE": "cumsum"})
23
‚Äč
24
# Affichage du modèle de donnée
25
dataset_evol_ca
Copied!
CHARGES
1
#Creation du dataset charges
2
dataset_charges = db_cat.copy()
3
‚Äč
4
# Filtre RUBRIQUE_N0 = CHARGES
5
dataset_charges = dataset_charges[dataset_charges["RUBRIQUE_N0"] == "CHARGES"]
6
‚Äč
7
# Mettre en valeur positive VALUE
8
dataset_charges["VALUE"] = dataset_charges["VALUE"].abs()
9
‚Äč
10
# Affichage du modèle de donnée
11
dataset_charges
Copied!
POSITIONS TRESORERIE
1
# Creation du dataset trésorerie
2
dataset_treso = db_enr.copy()
3
‚Äč
4
# Filtre RUBRIQUE_N1 = TRESORERIE
5
dataset_treso = dataset_treso[dataset_treso['COMPTE_NUM'].str.contains(r'^5')].reset_index(drop=True)
6
‚Äč
7
# Cash in / Cash out ?
8
dataset_treso.loc[dataset_treso.VALUE > 0, "CASH_IN"] = dataset_treso.VALUE
9
dataset_treso.loc[dataset_treso.VALUE < 0, "CASH_OUT"] = dataset_treso.VALUE
10
‚Äč
11
# Regroupement
12
to_group = ["ENTITY",
13
"PERIOD",
14
"MONTH",
15
"MONTH_INDEX"]
16
to_agg = {"VALUE": "sum",
17
"CASH_IN": "sum",
18
"CASH_OUT": "sum"}
19
dataset_treso = dataset_treso.groupby(to_group, as_index = False).agg(to_agg).fillna(0)
20
‚Äč
21
# Cumul par période
22
dataset_treso = dataset_treso.sort_values(["ENTITY", "PERIOD", "MONTH_INDEX"])
23
dataset_treso['MONTH_INDEX'] = pd.to_datetime(dataset_treso['MONTH_INDEX'], format="%m").dt.strftime("%m")
24
dataset_treso['VALUE_LINE'] = dataset_treso.groupby(["ENTITY", 'PERIOD'], as_index=True).agg({"VALUE": "cumsum"})
25
‚Äč
26
# Mettre en valeur positive CASH_OUT
27
dataset_treso["CASH_OUT"] = dataset_treso["CASH_OUT"].abs()
28
‚Äč
29
# Affichage du modèle de donnée
30
dataset_treso
Copied!
BILAN
1
# Creation du dataset Bilan
2
dataset_bilan = db_cat.copy()
3
‚Äč
4
# Filtre RUBRIQUE_N0 = ACTIF & PASSIF
5
dataset_bilan = dataset_bilan[(dataset_bilan["RUBRIQUE_N0"].isin(["ACTIF", "PASSIF"]))]
6
‚Äč
7
# Regroupement R0/R1/R2
8
to_group = ["ENTITY",
9
"PERIOD",
10
"RUBRIQUE_N0",
11