klydekushy commited on
Commit
efaca3a
·
verified ·
1 Parent(s): e3f7023

Update src/Analytics/AnalyseFinance.py

Browse files
Files changed (1) hide show
  1. src/Analytics/AnalyseFinance.py +24 -36
src/Analytics/AnalyseFinance.py CHANGED
@@ -4,9 +4,26 @@
4
  import pandas as pd
5
  from datetime import date, timedelta
6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
  # ============================================================================
9
- # fonction de nettoyage robuste
10
  # ============================================================================
11
 
12
  def clean_currency_value(val):
@@ -14,14 +31,12 @@ def clean_currency_value(val):
14
  try:
15
  if isinstance(val, (int, float)):
16
  return float(val)
17
- # Nettoyage des strings: "100,000 XOF" → 100000.0
18
  cleaned = str(val).upper().replace("XOF", "").replace("FCFA", "").replace(" ", "").replace(",", "")
19
  return float(cleaned) if cleaned else 0.0
20
  except (ValueError, AttributeError):
21
  return 0.0
22
 
23
 
24
- # ✅ AJOUTEZ CETTE FONCTION ICI
25
  def clean_taux_value(val):
26
  """
27
  Convertit un taux correctement.
@@ -29,41 +44,17 @@ def clean_taux_value(val):
29
  """
30
  try:
31
  if isinstance(val, str):
32
- # Si c'est une string avec virgule : "5,3%" → "5.3"
33
  val = val.replace('%', '').replace(' ', '').replace(',', '.')
34
 
35
  taux = float(val)
36
 
37
- # ✅ Si le taux semble anormalement élevé (ex: 53 au lieu de 5.3)
38
- # On divise par 10
39
  if taux > 20:
40
  taux = taux / 10
41
 
42
- return round(taux, 2) # Arrondi à 2 décimales
43
  except (ValueError, AttributeError, TypeError):
44
  return 0.0
45
 
46
- # ============================================================================
47
- # CONSTANTES ET SEUILS
48
- # ============================================================================
49
- SEUILS = {
50
- "taux_endettement_mensuel": {
51
- "excellent": 25, "bon": 33, "acceptable": 40, "critique": 50
52
- },
53
- "taux_effort_epargne": {
54
- "excellent": 20, "bon": 30, "acceptable": 40, "critique": 50
55
- },
56
- "reste_a_vivre_min": {
57
- "excellent": 50000, "bon": 30000, "acceptable": 20000, "critique": 15000
58
- },
59
- "liquidite_min_ratio": 1.2,
60
- "duree_courte_semaines": 6
61
- }
62
-
63
-
64
- # ============================================================================
65
- # fonction de ncalcule du taux d'endettement et de mise à jour dans excel
66
- # ============================================================================
67
 
68
  def calculer_taux_endettement(type_code, montant_versement, nb_versements, duree_semaines, revenus_mensuels):
69
  """
@@ -77,40 +68,37 @@ def calculer_taux_endettement(type_code, montant_versement, nb_versements, duree
77
 
78
  # Calcul de la charge mensuelle selon le type
79
  if type_code == "IN_FINE":
80
- # Pas de charge mensuelle récurrente, sauf si durée < 2 mois
81
  duree_mois = duree_semaines / 4.33
82
  if duree_mois < 2:
83
  charge_mensuelle = montant_versement / duree_mois
84
  else:
85
- charge_mensuelle = 0 # Épargne progressive non comptée
86
 
87
  elif type_code == "MENSUEL_INTERETS":
88
- # Charge = intérêts mensuels uniquement
89
  charge_mensuelle = montant_versement
90
 
91
  elif type_code == "MENSUEL_CONSTANT":
92
- # Charge = mensualité constante
93
  charge_mensuelle = montant_versement
94
 
95
  elif type_code == "HEBDOMADAIRE":
96
- # Conversion hebdo → mensuel
97
  charge_mensuelle = montant_versement * 4.33
98
 
99
  elif type_code == "PERSONNALISE":
100
- # Moyenne des versements ramenée au mois
101
  charge_mensuelle = montant_versement * (nb_versements / (duree_semaines / 4.33)) if duree_semaines > 0 else montant_versement
102
 
103
  else:
104
  charge_mensuelle = 0
105
 
106
- # Calcul du taux
107
  taux = (charge_mensuelle / revenus_mensuels) * 100
108
  return round(taux, 2)
109
-
 
110
  # ============================================================================
111
  # LOGIQUE D'AMORTISSEMENT
112
  # ============================================================================
 
113
  def generer_tableau_amortissement(type_code, montant, taux_hebdo, duree_semaines, montant_versement, nb_versements, date_debut, dates_versements=None):
 
114
  tableau = []
115
 
116
  if type_code == "IN_FINE":
 
4
  import pandas as pd
5
  from datetime import date, timedelta
6
 
7
+ # ============================================================================
8
+ # CONSTANTES ET SEUILS
9
+ # ============================================================================
10
+ SEUILS = {
11
+ "taux_endettement_mensuel": {
12
+ "excellent": 25, "bon": 33, "acceptable": 40, "critique": 50
13
+ },
14
+ "taux_effort_epargne": {
15
+ "excellent": 20, "bon": 30, "acceptable": 40, "critique": 50
16
+ },
17
+ "reste_a_vivre_min": {
18
+ "excellent": 50000, "bon": 30000, "acceptable": 20000, "critique": 15000
19
+ },
20
+ "liquidite_min_ratio": 1.2,
21
+ "duree_courte_semaines": 6
22
+ }
23
+
24
 
25
  # ============================================================================
26
+ # FONCTIONS DE NETTOYAGE
27
  # ============================================================================
28
 
29
  def clean_currency_value(val):
 
31
  try:
32
  if isinstance(val, (int, float)):
33
  return float(val)
 
34
  cleaned = str(val).upper().replace("XOF", "").replace("FCFA", "").replace(" ", "").replace(",", "")
35
  return float(cleaned) if cleaned else 0.0
36
  except (ValueError, AttributeError):
37
  return 0.0
38
 
39
 
 
40
  def clean_taux_value(val):
41
  """
42
  Convertit un taux correctement.
 
44
  """
45
  try:
46
  if isinstance(val, str):
 
47
  val = val.replace('%', '').replace(' ', '').replace(',', '.')
48
 
49
  taux = float(val)
50
 
 
 
51
  if taux > 20:
52
  taux = taux / 10
53
 
54
+ return round(taux, 2)
55
  except (ValueError, AttributeError, TypeError):
56
  return 0.0
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
 
59
  def calculer_taux_endettement(type_code, montant_versement, nb_versements, duree_semaines, revenus_mensuels):
60
  """
 
68
 
69
  # Calcul de la charge mensuelle selon le type
70
  if type_code == "IN_FINE":
 
71
  duree_mois = duree_semaines / 4.33
72
  if duree_mois < 2:
73
  charge_mensuelle = montant_versement / duree_mois
74
  else:
75
+ charge_mensuelle = 0
76
 
77
  elif type_code == "MENSUEL_INTERETS":
 
78
  charge_mensuelle = montant_versement
79
 
80
  elif type_code == "MENSUEL_CONSTANT":
 
81
  charge_mensuelle = montant_versement
82
 
83
  elif type_code == "HEBDOMADAIRE":
 
84
  charge_mensuelle = montant_versement * 4.33
85
 
86
  elif type_code == "PERSONNALISE":
 
87
  charge_mensuelle = montant_versement * (nb_versements / (duree_semaines / 4.33)) if duree_semaines > 0 else montant_versement
88
 
89
  else:
90
  charge_mensuelle = 0
91
 
 
92
  taux = (charge_mensuelle / revenus_mensuels) * 100
93
  return round(taux, 2)
94
+
95
+
96
  # ============================================================================
97
  # LOGIQUE D'AMORTISSEMENT
98
  # ============================================================================
99
+
100
  def generer_tableau_amortissement(type_code, montant, taux_hebdo, duree_semaines, montant_versement, nb_versements, date_debut, dates_versements=None):
101
+
102
  tableau = []
103
 
104
  if type_code == "IN_FINE":