« Discussion:CompteurVSNolimit » : différence entre les versions
→Code source : nouvelle section |
mAucun résumé des modifications |
||
Ligne 1 : | Ligne 1 : | ||
== Code source == | == Code source == | ||
Dernière version du 10 novembre 2023 à 16:11
Code source
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é.")