所以在 R 中,我会为此使用优化的应用函数,但我现在读到 Panda 的应用函数是一个抽象循环,甚至可能比一个循环更慢,这在性能上有所体现。在我的机器上,处理 60k 行需要 30 分钟。
所以本质上,我希望根据具有不同组的数据集来计算移动平均值,我需要在这些数据集上计算移动平均值。有很多这样的团体。所以我基本上首先必须在行/单元格的基础上对数据集进行子集化,然后才计算移动平均值。
所以我正在尝试为此提出一个矢量化解决方案,但似乎无法弄清楚您将如何在矢量化方法中对数据框进行子集化。
我目前的解决方案使用了一个非常容易理解和维护的应用函数:
df['SMA'] = df.apply(SMA, axis=1)
def SMA(row):
Subset = df[(df['group']==row['group'])&(df['t']<=row['t'])].reset_index()
Subset2 = Subset[len(Subset.index)-(2):len(Subset.index)]
return df['val'].mean()
这是我的预期输出(我目前正在获得,但速度非常非常慢):
这是数据框,这个例子我想要两个时间点的移动平均值,在这个例子中是“t”:
t group val moving average
1 A 1 NA
2 A 2 1.5
3 A 3 2.5
1 B 4 NA
2 B 5 4.5
3 B 6 5.5
1 C 7 NA
2 C 8 7.5
3 C 9 8.5
最佳答案
这种操作(分群)由pandas中的.groupby
方法处理。如果我们注意将索引设置为时间,它还会处理为我们提供带有时间索引的正确输出。
这是一个与您的代码基本相同的示例:
df = pandas.DataFrame(
[[1, 'A', 1],
[2, 'A', 2],
[3, 'A', 3],
[1, 'B', 4],
[2, 'B', 5],
[3, 'B', 6],
[1, 'C', 7],
[2, 'C', 8],
[3, 'C', 9]],
columns=['t', 'group', 'val'])
df = df.set_index('t')
moving_avg = df.groupby('group').rolling(2).mean()
moving_avg
现在是一个新的数据框。请注意,因为我在第一部分中将索引设置为 t
,所以它在分组和滚动平均值中得到了正确处理:
val
group t
A 1 NaN
2 1.5
3 2.5
B 1 NaN
2 4.5
3 5.5
C 1 NaN
2 7.5
3 8.5
关于python - 有没有更好/更有效的方法来做到这一点(矢量化)? Pandas apply 性能非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50773410/