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

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

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

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

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

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

1 Ответ

2 голосов
/ 29 июня 2020

Как сделать листовое исполнение параллельно? Могу ли я использовать 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

...