2014-10-07 110 views
1

我使用熊貓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還是滾動?)

謝謝。

回答

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 
+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