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

问题描述:

我使用熊猫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) 

数据帧给出:

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)

但我不知道如何将它应用到我的情况。

任何想法如何在高效率的熊猫方法中解决这个问题? (使用apply,map还是滚动?)

谢谢。

你需要从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 
+0

喜,非常感谢您的回答。它绝对有帮助。但是在平均过程之后,我放弃了单位。 C列应以'kPa'为单位返回结果。如果我在f函数中打印ser.mean(),则该单元已连接。但是在返回结果时它会丢失。 – Julien 2014-10-07 09:34:13

+0

@Julien我尝试使用您的数量模块,但它对我的数据没有任何作用,您可以将其添加到该函数中,例如'return ser.mean()* pq.kPa'或在列产生后执行此操作,例如, 'df ['C'] = df ['C'] * pq.kPa' – EdChum 2014-10-07 09:52:26

+0

@Julien问题可能在于我运行的版本不同,我使用熊猫'0.14.1',numpy'1.9.0'和python的'3.3.2' 64位 – EdChum 2014-10-07 09:55:01