让我们尝试一下,看看这是否可以加快您的代码速度:
idx = [np.array(['Jan', 'Jan', 'Feb', 'Mar', 'Mar', 'Mar','Apr', 'Apr', 'May', 'Jun', 'Jun', 'Jun','Jul', 'Aug', 'Aug', 'Sep', 'Sep', 'Oct','Oct', 'Oct', 'Nov', 'Dic', 'Dic',]),np.array(['A', 'B', 'B', 'A', 'B', 'C', 'A', 'B', 'B', 'A', 'B', 'C','A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'A', 'B', 'C'])]
data = [{'x': 1}, {'x': 5}, {'x': 3}, {'x': 2}, {'x': 7}, {'x': 3},{'x': 1}, {'x': 6}, {'x': 3}, {'x': 5}, {'x': 2}, {'x': 3},{'x': 1}, {'x': 9}, {'x': 3}, {'x': 2}, {'x': 7}, {'x': 3}, {'x': 6}, {'x': 8}, {'x': 2}, {'x': 7}, {'x': 9}]
df = pd.DataFrame(data, index=idx, columns=['x'])
df.index.names=['date','type']
df['rolling'] = df.groupby('type')['x'].rolling(4).apply(lambda x: x[-4]*.2 + x[-3]*.3 + x[-2]*.5, raw=True)\
.reset_index(level=2, drop=True).swaplevel(0,1)
df
输出:
x rolling
date type
Jan A 1 NaN
B 5 NaN
Feb B 3 NaN
Mar A 2 NaN
B 7 NaN
C 3 NaN
Apr A 1 NaN
B 6 5.4
May B 3 5.7
Jun A 5 1.3
B 2 4.7
C 3 NaN
Jul A 1 3.2
Aug B 9 3.1
C 3 NaN
Sep A 2 2.2
B 7 5.7
Oct C 3 3.0
A 6 2.3
B 8 6.6
Nov A 2 3.8
Dic B 7 7.9
C 9 3.0
时间......
您的代码:
每次循环 324 毫秒 ± 1.55 毫秒(7 次运行的平均值 ± 标准差,每次 1 次循环)
这段代码:
每个循环 12.6 ms ± 138 µs(7 次运行的平均值 ± 标准差,每次 100 个循环)
我是一名优秀的程序员,十分优秀!