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

Top*_*cal 7 python vectorization pandas

所以在R中,我会使用一个优化的应用函数,但我现在已经读过Panda的apply函数是一个抽象的循环,甚至可能比一个慢,它表现在性能上.在我的机器上,处理60k行需要30分钟.

所以基本上我打算根据我需要计算移动平均线的不同组的数据集来计算移动平均线.这些群体很多.所以我基本上首先必须在行/单元格的基础上对数据集进行子集化,然后才计算移动平均值.

所以我试图想出一个矢量化解决方案,但似乎无法想象你如何在矢量化方法中对数据帧进行子集化.

我当前的解决方案使用了一个非常容易理解和维护的apply函数:

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()
Run Code Online (Sandbox Code Playgroud)

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

这是数据帧,这个例子我想要两个时间点的移动平均值,在这个例子中是"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
Run Code Online (Sandbox Code Playgroud)

cht*_*mon 5

这种操作(分组)由.groupbypandas中的方法处理.如果我们注意将索引设置为时间,它还会处理给我们正确的输出和时间索引.

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

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()
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)