import os
import pandas as pd
# Obtenir le chemin absolu du répertoire courant du script
repertoire_courant = os.path.dirname(os.path.abspath(__file__))
# Chemin vers le répertoire "Data"
chemin_data = os.path.join(repertoire_courant, "Data")
# Chemin vers le répertoire "result"
chemin_result = os.path.join(repertoire_courant, "Result")
# Vérifier si le répertoire "result" existe, sinon le créer
if not os.path.exists(chemin_result):
os.makedirs(chemin_result)
# Obtenir la liste des fichiers dans le répertoire "Data"
fichiers_dans_repertoire = os.listdir(chemin_data)
# Parcourir tous les fichiers pour trouver les fichiers CSV
for nom_fichier_csv in fichiers_dans_repertoire:
if nom_fichier_csv.lower().endswith('.csv'):
chemin_complet_csv = os.path.join(chemin_data, nom_fichier_csv)
# Charger le fichier dans un DataFrame
df = pd.read_csv(chemin_complet_csv, sep=';', encoding='utf-8') # Utilisez le séparateur ';' pour les colonnes
print("Chargement du fichier CDR.csv terminé.")
# Filtrer les lignes avec le "Type" contenant "Abonnement périodique" et le "Produit" étant "Appel(s) simu(s) SIP - Compteur NPV"
filtered_df = df[
(
(df['Type'].str.contains('CDR')) |
(
(df['Type'] == 'Abonnement périodique') &
(
(df['Produit'] == 'Appel(s) simu(s) SIP - Compteur NPV') |
(df['Produit'] == 'Appel(s) simu(s) SIP - Illimité fixes, mobiles et inter NPV')
)
)
)
]
print("Filtrage des données terminé.")
# Regrouper les données par "Client final"
grouped = filtered_df.groupby('Client final')
# Initialiser les listes pour les colonnes du nouveau fichier CSV
Client = []
Type_Cli = []
Cout_cpteur = []
Cout_illim = []
Marge = []
ProgressionPour100 = []
NbCanaux = []
# Parcourir les clients avec le produit et calculer les valeurs pour chaque client
for client, group in grouped:
# On vérifie si le client est au compteur ou en illimité
lignes_compteur = group[group['Produit'] == 'Appel(s) simu(s) SIP - Compteur NPV']
lignes_illi = group[group['Produit'] == 'Appel(s) simu(s) SIP - Illimité fixes, mobiles et inter NPV']
# Client au compteur, on simule son cout en illimité
if len(lignes_compteur) > 0:
cout_actuel = group['Montant HT'].sum()
# On retire du cout actuel les SVA, qui sont neutres dans le PA, puisqu'également facturés en illimité
# Traitement du CDR SVA A
for index, row in group.iterrows():
if row['Type'] == 'CDR SVA A':
cout_actuel -= row['Montant HT']
# Traitement du CDR SVA B
for index, row in group.iterrows():
if row['Type'] == 'CDR SVA B':
cout_actuel -= row['Montant HT']
# Traitement du CDR SVA D
for index, row in group.iterrows():
if row['Type'] == 'CDR SVA D':
cout_actuel -= row['Montant HT']
# Traitement du CDR SVA G
for index, row in group.iterrows():
if row['Type'] == 'CDR SVA G':
cout_actuel -= row['Montant HT']
cout_illi = len(lignes_compteur) * 12
marge = cout_illi - cout_actuel
Client.append(client)
Type_Cli.append("Compteur")
Cout_cpteur.append(round(cout_actuel, 2))
Cout_illim.append(round(cout_illi, 2))
Marge.append(round(marge, 2))
ProgressionPour100.append(round(cout_illi * 100 / cout_actuel, 2))
NbCanaux.append(len(lignes_compteur))
# Client en illimité, on simule son cout au compteur
if len(lignes_illi) > 0:
cout_actuel = group['Montant HT'].sum()
# On retire du cout actuel les SVA, qui sont neutres dans le PA, puisqu'également facturés en illimité
# Traitement du CDR SVA A
for index, row in group.iterrows():
if row['Type'] == 'CDR SVA A':
cout_actuel -= row['Montant HT']
# Traitement du CDR SVA B
for index, row in group.iterrows():
if row['Type'] == 'CDR SVA B':
cout_actuel -= row['Montant HT']
# Traitement du CDR SVA D
for index, row in group.iterrows():
if row['Type'] == 'CDR SVA D':
cout_actuel -= row['Montant HT']
# Traitement du CDR SVA G
for index, row in group.iterrows():
if row['Type'] == 'CDR SVA G':
cout_actuel -= row['Montant HT']
cout_cpteur = len(lignes_illi) * 1.65
# Traitement du CDR mobiles
for index, row in group.iterrows():
if row['Type'] == 'CDR Mobiles' and row['Montant HT'] == 0:
cout_cpteur += row['Quantité 2'] * 0.0004
# Traitement du CDR fixe
for index, row in group.iterrows():
if row['Type'] == 'CDR Nationaux' and row['Montant HT'] == 0:
cout_cpteur += row['Quantité 2'] * 0.000115
marge = cout_actuel - cout_cpteur
Client.append(client)
Type_Cli.append("illimite")
Cout_cpteur.append(round(cout_cpteur, 2))
Cout_illim.append(round(cout_actuel, 2))
Marge.append(round(marge, 2))
ProgressionPour100.append(round(cout_actuel * 100 / cout_cpteur, 2))
NbCanaux.append(len(lignes_illi))
print("Calcul des valeurs terminé.")
# Ajouter la ligne "TOTAL" avec les sommes des colonnes B, C et D
total_montant = round(sum(Cout_cpteur), 2)
total_Cout_illim = round(sum(Cout_illim), 2)
total_Marge = round(sum(Marge), 2)
total_canaux=sum(NbCanaux)
if len(Client) > 0:
Client.append("TOTAL")
Type_Cli.append("**")
Cout_cpteur.append(total_montant)
Cout_illim.append(total_Cout_illim)
Marge.append(total_Marge)
ProgressionPour100.append(round(total_Cout_illim * 100 / total_montant, 2))
NbCanaux.append(total_canaux)
# Créer un DataFrame à partir des listes
result_df = pd.DataFrame({
'Client': Client,
'Type_Cli': Type_Cli,
'PA Compteur': Cout_cpteur,
'PA illimite': Cout_illim,
'Marge': Marge,
'% Evol Marge': ProgressionPour100,
'Nb Canaux' : NbCanaux
})
# Construire le nom du fichier de résultat avec le suffixe "_analyse"
nom_fichier_resultat = nom_fichier_csv.replace('.csv', '_analyse.csv')
# Écrire le DataFrame résultant dans un nouveau fichier CSV avec le nom de résultat
chemin_complet_resultat = os.path.join(chemin_result, nom_fichier_resultat)
result_df.to_csv(chemin_complet_resultat, index=False, sep=';')
print("Le fichier résultat a été généré avec succès.")
else:
print("Aucun client avec le produit 'Appel(s) simu(s) SIP - Compteur NPV' trouvé.")