Как сделать так, чтобы 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.