« Discussion:CompteurVSNolimit » : différence entre les versions

De INDYWiki
Page créée avec « 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(chem... »
 
→‎Code source : nouvelle section
Ligne 168 : Ligne 168 :
         else:
         else:
             print("Aucun client avec le produit 'Appel(s) simu(s) SIP - Compteur NPV' trouvé.")
             print("Aucun client avec le produit 'Appel(s) simu(s) SIP - Compteur NPV' trouvé.")
== Code source ==
<pre>
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é.")
</pre>

Version du 10 novembre 2023 à 16:10

import os import pandas as pd

  1. Obtenir le chemin absolu du répertoire courant du script

repertoire_courant = os.path.dirname(os.path.abspath(__file__))

  1. Chemin vers le répertoire "Data"

chemin_data = os.path.join(repertoire_courant, "Data")

  1. Chemin vers le répertoire "result"

chemin_result = os.path.join(repertoire_courant, "Result")

  1. Vérifier si le répertoire "result" existe, sinon le créer

if not os.path.exists(chemin_result):

   os.makedirs(chemin_result)
  1. Obtenir la liste des fichiers dans le répertoire "Data"

fichiers_dans_repertoire = os.listdir(chemin_data)

  1. 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é.")

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é.")