Заставьте Pandas Groupby быстрее применить скользящее среднее - PullRequest
0 голосов
/ 21 апреля 2020

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

У меня есть кадр данных с Store number, date and number of orders, содержащий несколько миллионов строк.

Хотите получить среднее количество сгруппированных заказов магазином и часом дня. Например, если я задаю вопрос How many orders on average a particular store gets at a particular time of day?

, я попробовал много pandas трюков, но остановился на этом:

Генерация данных:

import pandas as pd
from datetime import datetime
import numpy as np

date_rng = pd.date_range(start="1/1/2018", end="1/08/2019", freq="5s")

df = pd.DataFrame(date_rng, columns=['date'])

df["orders"] = np.random.randint(0, 1000,size=(len(date_rng)))
df["store"] = np.random.randint(0, 500,size=(len(date_rng)))
df["hour"] = df["date"].dt.hour

df.shape

Вывод :

(6428161, 4)

Groupby Apply:

%%time

rolling_mean = df.groupby(["store", "hour"]).apply(
    lambda x: x.set_index("date").sort_index().rolling("7D", min_periods=1)["orders"].mean()
).reset_index()

rolling_mean.rename(columns={"orders": "rolling_mean_orders"}, inplace=True)

df = df.merge(
    rolling_mean, 
    how="left",
    on=["store", "date"]
).drop_duplicates(subset=["store", "date"])

Вывод:

CPU times: user 29 s, sys: 3.53 s, total: 32.6 s
Wall time: 1min

Проблема заключается в том, что по мере роста данных это время увеличивается в часах.

Есть ли способ сделать это быстрее?

Я использую swifter для обычного pandas применения, но это не поддерживается в применении groupby.

...