Untitled
unknown
plain_text
a year ago
3.7 kB
6
Indexable
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
Editor is loading...
Leave a Comment