有没有更好/更有效的方法(矢量化)?非常慢的性能

2024-04-26 10:44:22 发布

您现在位置:Python中文网/ 问答频道 /正文

所以在R中,我会使用一个优化的apply函数,但是我已经读到Panda的apply函数是一个抽象的循环,甚至可能比一个循环慢,它在性能上表现出来了。在我的机器上,处理6万行需要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()

这是我的预期输出(我目前正在获得,但速度非常慢):

这是数据帧,这个例子我想要两个时间点上的移动平均值,这个例子中的“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

Tags: 数据函数dfindexlengroup解决方案矢量化
1条回答
网友
1楼 · 发布于 2024-04-26 10:44:22

{pandas}在cd1操作中被处理为组。如果我们注意将索引设置为time,那么它还可以处理返回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

相关问题 更多 >