2015-12-07 22 views
-1

我有一個熊貓數據框,其中包含一系列不同類型的水果在一系列不均勻分佈的日期上的一系列價格值。我想要做的是在每種水果類型的一致時間框架內插水果價格。在數據框中按組插入值 - Python

困難的部分是,目前,一些時間重疊,其他人不(見下面的例子)。我寧願不將插值的範圍擴大到所提供的日期範圍之外,因爲這會給錯誤留下太多空間。所以我沒有比較下面的水果01和02的價格,但01和03應該有一個我可以用來比較的窗口。我的目標是具有一致/重疊的日期範圍,以便比較水果價格的變化,即我應該能夠比較水果01和水果03的插入價格,比如9/21/14,9/28/14,10/5/14等

至於插值,我應該考慮什麼,因爲我考慮使用什麼類型的插值?我認爲每週價格內插就足夠了。

id date  price 
01 2014-09-21 3.41 
01 2014-11-05 5.63 
01 2015-02-22 6.22 
02 2013-04-11 245.22 
02 2013-05-20 250.05 
03 2014-08-28 10.53 
03 2014-10-01 12.43 

讓我知道,如果我可以提供任何更多的信息。謝謝您的幫助!

+0

什麼是您預期的結果? – Alexander

+0

@Alexander我的預期結果是具有相同格式的數據框,它仍具有所有原始值,但現在也包含新插入的每週價格估計值。 – nflove

+0

你的問題太含糊,你沒有提供什麼是預期結果的細節。例如,「我寧願不將插值擴展得超出所提供的日期範圍」。這實際上意味着什麼?而且「我可以沒有比較下面的水果01和02的價格,但01和03應該有一個我可以用來比較的窗口」你如何確定什麼是可以接受的? – Alexander

回答

1

我相信這符合你正在努力完成的任務,但如果沒有明確的措辭目標,就很難做到更精確。

pt = pd.pivot_table(df, values='price', columns='id', index='date') 

>>> pt 
id    1  2  3 
date       
2013-04-11 NaN 245.22 NaN 
2013-05-20 NaN 250.05 NaN 
2014-08-28 NaN  NaN 10.53 
2014-09-21 3.41  NaN NaN 
2014-10-01 NaN  NaN 12.43 
2014-11-05 5.63  NaN NaN 
2015-02-22 6.22  NaN NaN 

df2 = (pt 
     .set_index(pd.DatetimeIndex(pt.index)) 
     .resample('W') 
     .apply(lambda series: series.interpolate())) 

for col in df2: 
    end_date = pt[col].last_valid_index() 
    df2.loc[df2.index > end_date, col] = np.nan 

>>> df2 
id     1  2  3 
2013-04-14  NaN 245.220 NaN 
2013-04-21  NaN 246.025 NaN 
2013-04-28  NaN 246.830 NaN 
2013-05-05  NaN 247.635 NaN 
2013-05-12  NaN 248.440 NaN 
2013-05-19  NaN 249.245 NaN 
2013-05-26  NaN  NaN NaN 
2013-06-02  NaN  NaN NaN 
...    ...  ... ... 
2014-08-31  NaN  NaN 10.53 
2014-09-07  NaN  NaN 10.91 
2014-09-14  NaN  NaN 11.29 
2014-09-21 3.410000  NaN 11.67 
2014-09-28 3.727143  NaN 12.05 
2014-10-05 4.044286  NaN NaN 
... 
2015-02-15 6.180667  NaN NaN 
2015-02-22 6.220000  NaN NaN 

如果你想拉平這個背下來:

>>> df2.stack().reset_index() 

     level_0 id   0 
0 2013-04-14 2 245.220000 
1 2013-04-21 2 246.025000 
2 2013-04-28 2 246.830000 
..   ... ..   ... 
31 2015-02-08 1 6.141333 
32 2015-02-15 1 6.180667 
33 2015-02-22 1 6.220000 
+0

這看起來很符合我想要做的事情。謝謝您的幫助。我唯一的問題是,我不希望在數據透視表的整個日期範圍內延長價格估計,我希望每個水果的第一個和最後一個日期是原始數據框中的第一個和最後一個日期。例如,插入水果2的日期範圍應該是(2013-4-11到2013-5-20),而水果1的範圍應該是(2014-9-21到2014-10-1)。這可能嗎? – nflove

+0

見上面的修訂。這是不完美的,因爲每天到每週插值。例如,當插值打破每週週期時,第二個果實的值被削減。 – Alexander