熊猫:基于指数值不均匀的滑动平均值

时间:2014-10-07 07:36:08

标签: python pandas

我使用Pandas 0.13.0并尝试根据索引值进行滑动平均。

索引值的分布不均匀。 索引按增加的值和唯一值排序。

import pandas as pd
import Quantities as pq

f = { 
    'A': [ 0.0,  0.1,  0.2,  0.5,  1.0,  1.4,  1.5] * pq.m,
    'B': [10.0, 11.0, 12.0, 15.0, 20.0, 30.0, 50.0] * pq.kPa      
}

df = pd.DataFrame(f)

df.set_index(df['A'], inplace=True)

DataFrame提供:

in: print df

out:
      A       B
A                 
0.00  0.00 m  10.0 kPa
0.10  0.10 m  11.0 kPa
0.20  0.20 m  12.0 kPa
0.50  0.50 m  15.0 kPa
1.00  1.00 m  20.0 kPa
1.40  1.40 m  30.0 kPa
1.50  1.50 m  50.0 kPa

现在我想对索引的每个x值进行B列的平均值,在x和x + c之间,c是用户定义的标准。

为了这个例子,c = 0.40。

平均过程会给出:

      A       B          C
A                 
0.00  0.00 m  10.0 kPa   11.0 kPa  = (10.0 + 11.0 + 12.0) / 3
0.10  0.10 m  11.0 kPa   12.7 kPa  = (11.0 + 12.0 + 15.0) / 3
0.20  0.20 m  12.0 kPa   13.5 kPa  = (12.0 + 15.0) / 2
0.50  0.50 m  15.0 kPa   15.0 kPa  = (15.0) / 1
1.00  1.00 m  20.0 kPa   25.0 kPa  = (20.0 + 30.0) / 2
1.40  1.40 m  30.0 kPa   40.0 kPa  = (30.0 + 50.0) / 2
1.50  1.50 m  50.0 kPa   50.0 kPa  = (50.0) / 1

请注意,由于索引值的空间不均匀,因此有时无法找到x + c。现在还可以,但我肯定会添加一种方法来获取之前的值和x + c之后的值之间的x + c的平均值,因此我得到更准确的平均值。

我尝试了Zelazny7的解决方案: pandas rolling computation with window based on values instead of counts

但我不能让它适合我的情况,在那里搜索索引。

我也看了看: Pandas Rolling Computations on Sliding Windows (Unevenly spaced)

但我不明白如何将它应用到我的案例中。

知道如何在高效的熊猫方法中解决这个问题吗? (使用申请,地图或滚动?)

感谢。

1 个答案:

答案 0 :(得分:0)

您需要从链接到的answer开始,将索引转换为系列,然后您可以调用它。另一个关键的事情是你必须索引构造的系列与你的df索引相同,因为默认是从零开始创建索引,如0,1,2,3 ......

In [26]:

def f(x, c):
    ser = df.loc[(df.index >= x) & (df.index <= x + c),'B']
    return ser.mean()

df['C'] = pd.Series(data = df.index, index = df.index).apply(lambda x: f(x,c=0.4))
df

Out[26]:
       A   B          C
A                      
0.0  0.0  10  11.000000
0.1  0.1  11  12.666667
0.2  0.2  12  13.500000
0.5  0.5  15  15.000000
1.0  1.0  20  25.000000
1.4  1.4  30  40.000000
1.5  1.5  50  50.000000
相关问题