使Pandas Groupby更快地应用滚动平均值

时间:2020-04-21 06:19:24

标签: python pandas pandas-groupby data-science

如何使Pandas Groupby更快地应用滚动平均值?

我有一个Store number, date and number of orders的数据帧,其中包含几百万行。

想要获取按商店和一天中的小时分组的平均订单数。例如,如果我问问题How many orders on average a particular store gets at a particular time of day?

我尝试了很多熊猫技巧,但最终选择了:

生成数据:

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申请:

%%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用于普通熊猫申请,但groupby apply不支持。

0 个答案:

没有答案