secmi / data /dataframes.py
tgey's picture
APP test
2145052
from typing import List
import pandas as pd
def merge_clients(data):
mnr_df = data['MNR_Client']
mnr_df['Prestataire'] = 'MNR'
stm_df = data['STM_Client']
stm_df['Prestataire'] = 'STM'
valm_df = data['VALM_Client']
valm_df['Prestataire'] = 'VALM'
data['Clients'] = pd.concat([mnr_df, stm_df, valm_df], ignore_index=True)
data['Clients'].rename(columns=dict(zip(data['Clients'].columns,['Code client', 'Type client', 'Nom client', 'Dist STE', 'Duration STE', 'Dist VAL', 'Duration VAL', 'Prestataire'])), inplace=True)
data['Clients'] = data['Clients'][data['Clients']['Type client'] == 'Client']
data['Clients']['Dist STE'] = data['Clients']['Dist STE'].fillna(0)
data['Clients']['Duration STE'] = data['Clients']['Duration STE'].fillna(0)
data['Clients']['Dist VAL'] = data['Clients']['Dist VAL'].fillna(0)
data['Clients']['Duration VAL'] = data['Clients']['Duration VAL'].fillna(0)
del data['MNR_Client']
del data['STM_Client']
del data['VALM_Client']
def add_motifs_absences(df: pd.DataFrame, motifs: List[str]):
filtered_df = df[df['Nom client'].isin(['SECMI'])]
intervenants = df['Code intervenant (Identifiant du document de référence -> Document de vente)'].unique()
for intervenant in intervenants:
rows = []
for motif in motifs['Libellé GTP2023'].tolist():
rows.append({
'Code intervenant (Identifiant du document de référence -> Document de vente)': intervenant,
'Code client': filtered_df.iloc[0]['Code client'] if filtered_df.shape[0] > 0 else 'SECMI',
'Nom client': filtered_df.iloc[0]['Nom client'] if filtered_df.shape[0] > 0 else 'SECMI',
'Code chantier': '000000',
'Libellé': motif
})
df = pd.concat([df, pd.DataFrame(rows)], ignore_index=True)
return df
def merge_affaires(data):
mnr_df = data['MNR_Affaire']
mnr_df = add_motifs_absences(mnr_df, data['absences'])
mnr_df['Prestataire'] = 'MNR'
stm_df = data['STM_Affaire']
stm_df = add_motifs_absences(stm_df, data['absences'])
stm_df['Prestataire'] = 'STM'
valm_df = data['VALM_Affaire']
valm_df = add_motifs_absences(valm_df, data['absences'])
valm_df['Prestataire'] = 'VALM'
data['affaire'] = pd.concat([mnr_df, stm_df, valm_df], ignore_index=True)
data['affaire']['Code affaire'] = data['affaire']['Code chantier'] + ' - ' + data['affaire']['Libellé']
del data['affaire']['Code chantier']
del data['affaire']['Libellé']
data['affaire'].rename(columns=dict(zip(data['affaire'].columns,['Code intervenant', 'Code client', 'Nom client', 'prestataire', 'Code affaire'])), inplace=True)
del data['MNR_Affaire']
del data['STM_Affaire']
del data['VALM_Affaire']
def merge_intervenants_affaires(data):
data['all'] = data['affaire'].merge(data['intervenants'], on='Code intervenant', how='left')
data['all'].rename(columns=dict(zip(['Code intervenant', 'Code affaire', 'Nom client', 'Code secteur géographique', 'Veh_Affecte', 'Durée Hebdo', 'Coût horaire'],['intervenant', 'affaire', 'client', 'secteur', 'vehicule affecte', 'contrat heures', 'cout horaire'])), inplace=True)
new_row = pd.DataFrame([['-'] * (data['all'].shape[1])], columns=data['all'].columns)
data['all'] = pd.concat([new_row, data['all']], ignore_index=True)
data['all']['secteur'] = data['all']['secteur'].fillna('STE')
data['all']['contrat heures'] = data['all']['contrat heures'].fillna(0)
data['all']['cout horaire'] = data['all']['cout horaire'].fillna(0)
data['all'] = data['all'].dropna(subset=['intervenant', 'client', 'affaire'])
def complete_vehicules(data):
data['vehicules']['vehicules'] = 'Collectif - ' + data['vehicules']['IMMAT'] + ' - ' + data['vehicules']['Description']
data['vehicules'].loc[len(data['vehicules'])] = [None, None, 'Perso']
data['vehicules'].loc[len(data['vehicules'])] = [None, None, 'Service affecté']
def complete_supplements(data):
data['supplements'].rename(columns=dict(zip(data['supplements'].columns,['supplements'])), inplace=True)
data['supplements']['supplements'] = data['supplements']['supplements'].str.replace('_x000D_', ' ')
new_row = pd.DataFrame([['-'] * (data['supplements'].shape[1])], columns=data['supplements'].columns)
data['supplements'] = pd.concat([new_row, data['supplements']], ignore_index=True)
data['supplements'] = data['supplements'][~data['supplements']['supplements'].isin([' H Peinture ', ' H Qualif. Électrique ', ' H Soudure '])]
def complete_affaires(data):
data['affaire'].rename(columns=dict(zip(['Code intervenant', 'Code affaire', 'Nom client'],['intervenant', 'affaire', 'client'])), inplace=True)
new_row = pd.DataFrame([['-'] * (data['affaire'].shape[1])], columns=data['affaire'].columns)
data['affaire'] = pd.concat([new_row, data['affaire']], ignore_index=True)
def complete_intervenants(data):
data['intervenants'].rename(columns=dict(zip(['Code intervenant', 'Code secteur géographique', 'Veh_Affecte', 'Durée Hebdo', 'Coût horaire'],['intervenant', 'secteur', 'vehicule affecte', 'contrat heures', 'cout horaire'])), inplace=True)
data['intervenants']['Employeur'] = data['intervenants']['Employeur'].apply(lambda x: x.split()[1] if pd.notna(x) else None)
data['intervenants']['Employeur'] = data['intervenants']['Employeur'].fillna('SECMI')
new_row = pd.DataFrame([['-'] * (data['intervenants'].shape[1])], columns=data['intervenants'].columns)
data['intervenants'] = pd.concat([new_row, data['intervenants']], ignore_index=True)
#TODO to remove, for test only. Fill with 0
data['intervenants']['contrat heures'] = data['intervenants']['contrat heures'].fillna(35)
def complete_arrets(data):
data['arrets'].rename(columns=dict(zip(data['arrets'].columns,['code_absence', 'H-35.0', 'H-37.0', 'H-37.5', 'H-39.0'])), inplace=True)
data['arrets']['code_absence'] = data['arrets']['code_absence'].str.replace('_x000D_', ' ')
data['arrets'].fillna(0, inplace=True)
def cast_specifics_to_str(data):
data['all'] = data['all'].astype({'intervenant': str, 'affaire': str, 'client': str, 'prestataire': str})
data['vehicules'] = data['vehicules'].astype({'IMMAT': str, 'Description': str})
# print(data['affaire'])
data['affaire'] = data['affaire'].astype({'intervenant': str, 'affaire': str, 'client': str, 'prestataire': str})
data['intervenants'] = data['intervenants'].astype({'intervenant': str, 'secteur': str, 'vehicule affecte': str})