Python avec Excel
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Python avec Excel



  1. #1
    Elinobrouss

    Python avec Excel


    ------

    Bonjour à tous,

    J'ai un projet concernant la manipulation des données xlsx(Excel) par le logiciel Spyder Python.

    Mon objectif est de faire un rapport excel contenant d'une couverture, des contenues dont le tableau et la figure.

    Pour ce faire:
    - j'ai exporter manuellement des données en format xlsx d'après le site web VCOM.
    - et puis je lancer mon code pour traiter ces données afin de créer un rapport xlsx

    Le fichier ci-joint contient la figure qui montre mes données en format xlsx :

    Nom : 2023.xlsx.jpg
Affichages : 135
Taille : 101,4 Ko

    Et voici mes ligne de code avec les erreurs :

    def get_data_site_xlsx_12m(data_pa th_12m_prev, data_path_12m, writer, report_date):

    list_path = [data_path_12m_prev, data_path_12m]
    df_export_tot = pd.DataFrame()

    for data_path in list_path:
    data_file = load_workbook(data_path)
    sheet = data_file.active
    data = sheet.values

    data = sheet.iter_rows(min_row=3, values_only=True)
    columns = next(data)
    df = pd.DataFrame(data, columns=columns)
    df = df.replace('x', 0)
    file_name = data_path.split('/')[-1]
    year = file_name.split('.')[0]

    month_mapping = {
    'Janv': 1,
    'Févr': 2,
    'Mars': 3,
    'Avril': 4,
    'Mai': 5,
    'Juin': 6,
    'Juil': 7,
    'Août': 8,
    'Sept': 9,
    'Oct': 10,
    'Nov': 11,
    'Déc': 12
    }

    # Convert French month names to numeric format
    df['Date'] = [month_mapping[month] for month in df['Date']]

    df['Formatted_Date'] = df['Date'].apply(lambda month: f"01/{month:02d}/{year}")


    columns_to_process = [
    ("Consommation Jirama totale", "Jirama alimentant les charges"),
    ("Consommation charge totale","Consommation totale"),
    ("Énergie active (export)","Export"),
    ("Compteur rendement photovoltaïque", "Production PV totale"),
    ("Production GE totale","Groupe alimentant les charges"),
    ("Fraction renouvelable","Fraction renouvelable"),
    ("Indice de performance énergétique", "Indice de performance énergétique"),
    ("Production spécifique", "Rendement spécifique moyen"),
    ("Ratio de performance", "Performance Ratio"),
    ("Irradiation","Irradiance moyenne")]

    # Create an empty DataFrame to store the results
    df_temp = pd.DataFrame()
    df_temp['Date'] = pd.to_datetime(df['Formatted_Date'] , format="%d/%m/%Y")

    for data_column, export_column in columns_to_process:
    matched_columns = []
    # Find all data columns that match the partial name (case-insensitive)
    for col in df.columns:
    if data_column.lower() in col.lower():
    matched_columns.append(col)

    if matched_columns:
    df_temp[export_column] = df[matched_columns].sum(axis=1)
    else:
    df_temp[export_column] = [0] * len(df)

    if 'Export' in df_temp.columns:
    df_temp["Export"] = df_temp["Export"].diff()

    df_temp = df_temp.fillna(0)

    df_export = pd.DataFrame()
    df_export['Date'] = df_temp['Date']
    df_export['Production PV totale'] = df_temp["Production PV totale"]
    df_export["Consommation totale"] = df_temp['Consommation totale']
    df_export["Groupe"] = df_temp['Groupe alimentant les charges']
    df_export['Jirama'] = df_temp["Jirama alimentant les charges"]
    df_export["Export"] = df_temp['Export']
    df_export['Irradiance moyenne'] = df_temp['Irradiance moyenne']/30.5

    df_export_tot = pd.concat([df_export_tot, df_export], ignore_index=True)

    df_export_tot = df_export_tot[~df_export_tot.iloc[:, 1:].eq(0).all(axis=1)]
    df_export_tot['Date'] = pd.to_datetime(df_export_tot['Date'] , format="%d/%m/%Y")

    filter_cond = report_date.strftime('%m/%d/%Y')
    df_export_tot = df_export_tot[df_export_tot['Date'] <= filter_cond]

    if len(df_export_tot) > 12:
    df_export_tot = df_export_tot.tail(13)

    df_export_tot.to_excel(writer, sheet_name= "data_12m", index=False)


    Les erreurs :
    Traceback (most recent call last):

    File ~\miniconda3\Lib\site-packages\pandas\core\indexes\b ase.py:3790 in get_loc
    return self._engine.get_loc(casted_ke y)

    File index.pyx:152 in pandas._libs.index.IndexEngine .get_loc

    File index.pyx:176 in pandas._libs.index.IndexEngine .get_loc

    File index.pyx:213 in pandas._libs.index.IndexEngine ._get_loc_duplicates

    KeyError: 'Date'


    The above exception was the direct cause of the following exception:

    Traceback (most recent call last):

    File ~\miniconda3\Lib\site-packages\spyder_kernels\py3com pat.py:356 in compat_exec
    res = exec(code, globals, locals)

    File c:\users\elino\dossierssav\rep ortgenerator\report_generator_ mc.py:810
    generator(path_master,path_src )

    File c:\users\elino\dossierssav\rep ortgenerator\report_generator_ mc.py:467 in generator
    get_data_site_xlsx_12m(data_pa th_12m_prev, data_path_12m, writer, report_date)

    File c:\users\elino\dossierssav\rep ortgenerator\report_generator_ mc.py:64 in get_data_site_xlsx_12m
    df['Date'] = [month_mapping[month] for month in df['Date']]

    File ~\miniconda3\Lib\site-packages\pandas\core\frame.py: 3896 in __getitem__
    indexer = self.columns.get_loc(key)

    File ~\miniconda3\Lib\site-packages\pandas\core\indexes\b ase.py:3797 in get_loc
    raise KeyError(key) from err

    KeyError: 'Date'

    Quelqu'un pourrait m'aider à résoudre ce problème?

    Merci d'avance pour votre réponse et bonne journée à tous.

    -----

  2. #2
    pm42

    Re : Python avec Excel

    Bonjour,

    Plusieurs choses :

    1) le code est illisible sans les balise QUOTE et le Python encore plus vu qu'on perd l'indentation
    2) le message est clair : tu n'as pas de colonne Date dans ton dataframe df
    3) c'est probablement du à la façon dont tu récupères la variable columns
    3) je ne sais pas pourquoi tu lis le dataframe de cette façon quand avec un pandas, un pd.read_excel est plus simple
    4) vu que tu utilises un IDE, en l'occurence Spyder, il faut apprendre à utiliser le débugger intégré. Quand tu as une erreur comme ça, tu mets un breakpoint sur la ligne indiquée dans l'erreur, la dernière dans ton code à toi et tu lances. Quand le debugger s'arrête là, tu peux regarder les variables, visualiser le dataframe, etc et trouver rapidement d'où vient le problème.

  3. #3
    Elinobrouss

    Re : Python avec Excel

    Ok et merci pm42,

    je vais suivre ton instruction et je donnerai son résultat après.

    Voici le code dans le balise

    Code:
    def get_data_site_month_xlsx(data_path, writer, month_type):
        # call excel fill to get the last month values
        print(data_path)
        data_path = "C:/Users/elino/DossiersSAV/ReportGenerator/export excel MC/Antana Production/10-2023.xlsx"
        data_file = load_workbook(data_path)
        sheet = data_file.active
        data = sheet.values
        
        data = sheet.iter_rows(min_row=3, values_only=True)
        try:
            columns = next(data)
        except StopIteration:
            print("Il n'y a plus de données à lire dans 'data'")
            return
        df = pd.DataFrame(data, columns=columns)
        df = df.replace('x', 0)
        file_name = data_path.split('/')[-1]  
        month_year = file_name.split('.')[0]    
        month, year = month_year.split('-')   
        
        if 'Date' in df.columns:
            df['Formatted_Date'] = df['Date'].apply(lambda day: f"{day:02d}/{month}/{year}")
        else:
            print("La colonne 'Date' n'existe pas dans le DataFrame" )
    
        
        columns_to_process = [
        ("Consommation Jirama totale", "Jirama alimentant les charges"),
        ("Consommation charge totale","Consommation totale"),
        ("Énergie active (export)","Export"),
        ("Compteur rendement photovoltaïque", "Production PV totale"),
        ("Production GE totale","Groupe alimentant les charges"),
        ("Fraction renouvelable","Fraction renouvelable"),
        ("Indice de performance énergétique", "Indice de performance énergétique"),
        ("Production spécifique", "Rendement spécifique moyen"),
        ("Ratio de performance", "Performance Ratio"),
        ("Irradiation","Irradiance moyenne")]
    
        # Create an empty DataFrame to store the results
        df_temp = pd.DataFrame()
        if 'Date' in df.columns:
            df_temp['Date'] = pd.to_datetime(df['Formatted_Date'] , format="%d/%m/%Y")
        else:
            print("La colonne 'Date' n'existe pas dans le DataFrame" )   
        
        for data_column, export_column in columns_to_process:
            matched_columns = []
            if isinstance(data_column, str):
                # Find all data columns that match the partial name (case-insensitive)
                for col in df.columns:
                    if isinstance (col, str) and data_column.lower() in col.lower():
                        matched_columns.append(col)
            
                if matched_columns:
                    df_temp[export_column] = df[matched_columns].sum(axis=1)
                else:
                    df_temp[export_column] = [0] * len(df)
            else:
                print(f"Warning: data_column {data_column} is not a string.")
            
            
        
        if 'Export' in df_temp.columns:
            df_temp["Export"] = df_temp["Export"].diff()
         
                
        df_export = pd.DataFrame()
        df_export['Date'] = df_temp['Date']
        df_export["Groupe"] = df_temp['Groupe alimentant les charges']
        df_export['Jirama'] = df_temp["Jirama alimentant les charges"]
        df_export['PV'] = df_temp["Production PV totale"]
        df_export["Consommation"] = df_temp['Consommation totale']
        df_export["Rendement spécifique moyen"] = df_temp['Rendement spécifique moyen']
        df_export['Irradiance moyenne'] = df_temp['Irradiance moyenne']
        df_export["Export"] = df_temp['Export']
        df_export["Indice de performance énergétique"] = df_temp['Indice de performance énergétique']
        df_export["Performance Ratio"] = df_temp['Performance Ratio']
        
            
        if month_type == "prev" :
            df_export.to_excel(writer, sheet_name= "data_previous_month", index=False)
        else :
            df_export.to_excel(writer, sheet_name= "data", index=False)
            
            id_target_day_sun = df_export['PV'].idxmax()
            target_day_sun = df_export['Date'][id_target_day_sun].strftime('%d-%m-%Y')
            
            id_target_day_conso = df_export['Consommation'].idxmax()
            target_day_conso = df_export['Date'][id_target_day_conso].strftime('%d-%m-%Y')
            
            data_path_sun = os.path.dirname(data_path) + f"/{target_day_sun}.xlsx"
            data_path_conso = os.path.dirname(data_path) + f"/{target_day_conso}.xlsx"
    
            get_data_site_day_xlsx(data_path_sun, writer, "sun", target_day_sun)
            get_data_site_day_xlsx(data_path_conso, writer, "conso", target_day_conso)
    Dernière modification par Elinobrouss ; 23/11/2023 à 08h11.

  4. #4
    Elinobrouss

    Re : Python avec Excel

    voici les erreurs pour cette fonction :

    Code:
    C:/Users/elino/DossiersSAV/ReportGenerator/export excel MC/Antana Production/10-2023.xlsx
    La colonne 'Date' n'existe pas dans le DataFrame
    La colonne 'Date' n'existe pas dans le DataFrame
    Traceback (most recent call last):
    
      File ~\miniconda3\Lib\site-packages\pandas\core\indexes\base.py:3790 in get_loc
        return self._engine.get_loc(casted_key)
    
      File index.pyx:152 in pandas._libs.index.IndexEngine.get_loc
    
      File index.pyx:181 in pandas._libs.index.IndexEngine.get_loc
    
      File pandas\_libs\hashtable_class_helper.pxi:7080 in pandas._libs.hashtable.PyObjectHashTable.get_item
    
      File pandas\_libs\hashtable_class_helper.pxi:7088 in pandas._libs.hashtable.PyObjectHashTable.get_item
    
    KeyError: 'Date'
    
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
    
      File ~\miniconda3\Lib\site-packages\spyder_kernels\py3compat.py:356 in compat_exec
        res = exec(code, globals, locals)
    
      File c:\users\elino\dossierssav\reportgenerator\mgp_report_generator_mc.py:879
        generator(path_master,path_src)
    
      File c:\users\elino\dossierssav\reportgenerator\mgp_report_generator_mc.py:527 in generator
        get_data_site_month_xlsx(data_path, writer, None)
    
      File c:\users\elino\dossierssav\reportgenerator\mgp_report_generator_mc.py:232 in get_data_site_month_xlsx
        df_export['Date'] = df_temp['Date']
    
      File ~\miniconda3\Lib\site-packages\pandas\core\frame.py:3896 in __getitem__
        indexer = self.columns.get_loc(key)
    
      File ~\miniconda3\Lib\site-packages\pandas\core\indexes\base.py:3797 in get_loc
        raise KeyError(key) from err
    
    KeyError: 'Date'
    Dernière modification par JPL ; 23/11/2023 à 16h20.

  5. A voir en vidéo sur Futura
  6. #5
    pm42

    Re : Python avec Excel

    C'est la même erreur.

  7. #6
    Elinobrouss

    Re : Python avec Excel

    D'après mes données dans mon dataFrame, je crois qu'il existe bien le colonne 'Date' entouré en jaune comme montre la figure suivante :
    Nom : 2023#.xlsx.jpg
Affichages : 114
Taille : 102,7 Ko

  8. #7
    pm42

    Re : Python avec Excel

    Citation Envoyé par Elinobrouss Voir le message
    D'après mes données dans mon dataFrame, je crois qu'il existe bien le colonne 'Date' entouré en jaune comme montre la figure suivante :
    Tu viens de montrer le tableur Excel là. Ton dataframe, c'est autre chose et il est parfaitement possible que la méthode que tu utilises pour le lire soit ignore cette colonne soit qu'il y a un autre problème.

    Tout cela et comment régler le problème a déjà été dit dans la 1ère réponse.

  9. #8
    Elinobrouss

    Re : Python avec Excel

    A bon, ok je comprend

Discussions similaires

  1. Dessiner avec python
    Par Thcoundi dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 22/11/2021, 13h46
  2. Courbe avec python
    Par invite69893974 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 12/05/2019, 10h59
  3. [Python] subprocess, lancer un autre programme avec python
    Par Loupsio dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 30/11/2016, 19h56
  4. problème avec TinkerForge avec python
    Par invite1066d387 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 02/07/2012, 16h58
  5. Python 2.6 avec Tcl/tk8.6
    Par invitea6f89eb3 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 08/09/2009, 15h49