Untitled
unknown
plain_text
2 years ago
3.7 kB
12
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