Как я могу выполнить определенную функцию на каждом листе файла xlsx, имеющего более 100 листов параллельно?

У меня есть xlsx файл File.xlsx, в нем больше 100 листов.

Мне нужно выполнить определенную функцию f() для данных каждого листа и, наконец, вернуть список операций каждого листа, объединенных вместе.

Я попытался использовать pandas, читая данные каждого листа один за другим, а затем применяя к нему функцию и добавляя в список. Что отнимает много времени. Необходимо сократить время операции.

Как я могу сделать лист мудрым выполнением параллельно? Могу ли я использовать DASK или что-то еще?

Примечание: необходимо jsonify данные каждого листа, поэтому используйте df.to_json()


person Koustav Chanda    schedule 20.06.2020    source источник


Ответы (1)


Как я могу сделать лист мудрым выполнением параллельно? Могу ли я использовать DASK или что-то еще?

Это тривиальное использование Dask:

import dask
import pandas as pd

@dask.delayed
def get_sheet(filename, sheet_index=0):
    return pd.read_excel(filename, sheet_name=sheet_index)

@dask.delayed
def process(df: pd.DataFrame) -> pd.DataFrame:
    """
    Inputs
    ------
    df : pd.DataFrame
        A Pandas DataFrame. For this example, this DataFrame represents on sheet.

    Returns
    -------
    out : pd.DataFrame
        A new dataframe that makes some modifications on the original sheet.
    """
    out = df.copy()
    out["foo"] = "bar"
    return out

if __name__ == "__main__":
    # Get the sheets of the Excel file (test.xlsx has two sheets)
    future_dfs = [get_sheet("test.xlsx", sheet_index=i) for i in [0, 1]]

    # Process the sheets
    processed_dfs = [process(df) for df in future_dfs]

    # Now that we've detailed the computation, start the computation.
    dfs = dask.compute(processed_dfs)

Функция process не должна изменять входной DataFrame, потому что функции должны быть чистыми и не изменять входные данные. Подробнее см. строку документации dask.delayed: https://docs.dask.org/en/latest/delayed-api.html#dask.delayed.delayed

person Scott    schedule 29.06.2020