Untitled

mail@pastecode.io avatar
unknown
plain_text
11 days ago
3.7 kB
1
Indexable
Never
def clean_and_transform_data_stat(df: pd.DataFrame) -> pd.DataFrame:
    """
        Nettoyage et traitement des données extraites.

        Params:
            df (pd.DataFrame): Le dataframe contenant les données extraites.

        Returns:
            df (pd.DataFrame): Le dataframe contenant les données traitées.
    """
    # Copie du DataFrame pour éviter des modifications inattendues sur l'original
    df = df.copy()

    # Conversion du format de date et formatage
    date_columns = ['DATE_PIECE', 'DATE_RELEVE', 'DATE_ECHEANCE_RELEVE', 'DATE_ECHEANCE_PIECE']
    for col in date_columns:
        try:
            df[col] = pd.to_datetime(df[col]).dt.strftime('%d/%m/%Y')
            
        except ValueError as e:
            print("Error parsing datetime:", e)
    
    # Tri des données par ordre croissant
    df.sort_values(by = ["CODE_CABINET", "ENTITE", "CODE_CLIENT", "DATE_RELEVE", "NUMERO_PRELEVEMENT", "NUMERO_TRAITE", "DATE_PIECE", "PIECE"], inplace = True)    

    # Remplacement des NaN par des chaînes vides dans les colonnes de total ascending = [True, True, True, True, True, True, True, True]
    df['TOTAL'].fillna('', inplace = True)
    df['TOTAL_CLIENT'].fillna('', inplace = True)
    df['TOTAL_ENTITE'].fillna('', inplace = True)

    # Remplacement des points par des virgules dans les colonnes appropriées
    numeric_columns = ['MONTANT', 'TOTAL', 'TOTAL_CLIENT', 'TOTAL_ENTITE']
    for col in numeric_columns:
        df[col] = df[col].astype(str).str.replace('.', ',')

    # Ajustement de la logique pour placer les totaux sur la première ligne
    # df['TOTAL_CLIENT'] = np.where(df.groupby(['CODE_CLIENT_SAP', 'ENTITE']), '', df['TOTAL_CLIENT'])
    # df['TOTAL_ENTITE'] = np.where(df.groupby(['ENTITE']), '', df['TOTAL_ENTITE'])

    # df['TOTAL_CLIENT'] = np.where(df.groupby(['CODE_CLIENT', 'ENTITE'])['TOTAL_CLIENT'].transform('first').notna(), df['TOTAL_CLIENT'], '')
    # df['TOTAL_ENTITE'] = np.where(df.groupby(['ENTITE'])['TOTAL_ENTITE'].transform('first').notna(), df['TOTAL_ENTITE'], '')

    # Ajustement de la logique pour placer les totaux sur la première ligne
    # first_row_condition_client = ~df.duplicated(['CODE_CLIENT', 'ENTITE'], keep = 'first')
    # first_row_condition_entite = ~df.duplicated(['ENTITE'], keep = 'first')
    # df.loc[first_row_condition_client, 'TOTAL_CLIENT'] = df['TOTAL_CLIENT']
    # df.loc[first_row_condition_entite, 'TOTAL_ENTITE'] = df['TOTAL_ENTITE']

    # Ajustement de la logique pour placer les totaux sur la première ligne
    # first_row_condition_client = ~df.duplicated(['CODE_CLIENT', 'ENTITE'], keep = 'last')
    # first_row_condition_entite = ~df.duplicated(['ENTITE'], keep = 'last')
    # df['TOTAL_CLIENT'] = np.where(first_row_condition_client, df['TOTAL_CLIENT'], '')
    # df['TOTAL_ENTITE'] = np.where(first_row_condition_entite, df['TOTAL_ENTITE'], '')

    # Retirer la colonne adresse email et code cabinet
    df = df.drop('ADRESSE_EMAIL', axis = 1, errors = 'ignore')

    # Remplacement des valeurs null par des chaînes vides
    # df.replace({np.nan: ''}, inplace = True)

    # Remplacer les NaN par des chaînes vides dans les colonnes 'total client' et 'total entité'
    # df['TOTAL_CLIENT'] = df['TOTAL_CLIENT'].fillna('')
    # df['TOTAL_ENTITE'] = df['TOTAL_ENTITE'].fillna('')

    # # Ajustement pour placer les totaux sur la première ligne
    # df['TOTAL_CLIENT'] = df['TOTAL_CLIENT'].where(df.groupby('CODE_CLIENT_SAP').cumcount() == 0)
    # df['TOTAL_ENTITE'] = df['TOTAL_ENTITE'].where(df.groupby('ENTITE').cumcount() == 0)

    # df.sort_values(by = ["TOTAL_CLIENT", "TOTAL_ENTITE"], inplace = False)

    return df
Leave a Comment