是否有更好/更有效的方法(矢量化)?适用于熊猫的性能非常慢

时间:2018-06-09 10:44:11

标签: python pandas vectorization

所以在R中,我会使用优化的应用函数,但我现在已经读过Panda的apply函数是一个抽象的循环,甚至可能比一个慢,并且它表现在表演中。在我的机器上,处理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()

这是我的预期输出(我现在得到但非常非常缓慢):

这是数据框,这个例子我想要两个时间点的移动平均线,&#34; t&#34;在这个例子中:

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

1 个答案:

答案 0 :(得分:5)

这种操作(拆分成组)由pandas中的.groupby方法处理。如果我们注意将索引设置为time,它还会处理给我们正确的输出,并返回时间索引。

这是一个与您的代码基本相同的示例:

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