2014-01-14 138 views
1

對於我正在進行的項目,我需要計算商店產品的平均價格。每當商店更改產品的價格時,都會向數據集添加新條目。如果商店停止(暫時或永久)銷售產品,則會輸入時間戳和價格值-1。例如:Pandas中時間相關數據集的平均值,缺失值

  timestamp  shop product price 

2014-01-01 10:07:32  E  4 19.99 
2014-01-01 10:07:32  F  5 54.00 
2014-01-02 14:41:12  A  1 28.00 
2014-01-02 14:41:12  D  3 249.99 
2014-01-02 15:12:38  C  1 29.99 
2014-01-03 14:05:12  B  2 43.00 
2014-01-05 12:21:57  F  5 49.99 
2014-01-06 23:55:32  F  5 -1 
2014-01-07 03:05:12  B  2 39.99 
2014-01-07 11:24:49  D  3 -1 
2014-01-08 11:35:33  C  2 40.99 
2014-01-08 16:28:07  F  5 65.00 
2014-01-12 21:41:04  E  3 199.00 

測試用例:

  • 店鋪:阿具有在該時間段爲產品1沒有價格條目來計算
  • B鋪具有周期
  • 內的產品2交換機的價格
  • 在期間開始銷售商品2的商店C,並且通過銷售商品1全部通過
  • 在期間停止銷售商品3的商店D.
  • 啓動期後銷售產品3,銷售產品4貫穿
  • 店的f,產品5變動的價格,然後停止銷售店E,然後再以新的價格開始,所有的週期

的時期FINT平均值是從2014年1月5日00:00:00至23:59:59 2014-01-10

我需要做的是計算一定週期內的平均價格是什麼對於某個商店以及整體而言。即平均值是時間加權的(3天價格爲3天,1天價格1爲平均2.5天,平均4天)。我有兩個問題:

  • 可能會丟失起始值。最近的價格變化我很可能在計算時間段的乞討中,所以我需要找到一種方法來填充它,以便它將用於平均值。事實上,這可能是整個時期唯一的價格。
  • 用-1計算會得到錯誤的結果。該值應該被忽略,並且隨着產品不再可用的時間,整體時間差應該被減小。

對於上面給出的數據的預期輸出是(價格向上取整到最接近的分):

shop product price 
    A   1 28.00 
    B   2 41.06 
    C   1 29.99 
    C   2 40.99 
    D   3 249.99 
    E   4 19.99 
    F   5 53.81 

我已經使用numpy.ma掩蓋了-1值試過。不過,我一直沒有成功,因爲isnanmasked_less無法處理此問題。

任何想法,我怎麼能做到這一點?

編輯: 編輯測試數據連接預期的結果更清楚地反映問題

+0

向我們展示了上述數據的預期輸出。 –

+0

其他商店呢? –

+0

另外,我們只需要查看您所包含數據的預期輸出。 –

回答

0

AFAIR,pandas不處理蒙面值numpy.ma方式。但是,在計算平均值時,它應該處理nans。 最簡單的辦法是分析你的Dataframenp.nan的東西,如更換您的-1.00價格:

price = dataframe['price'] 
price[price == -1] = np.nan 
+0

謝謝您的回答。我試過這個來處理我的第二個問題。然而熊貓的意思是不加權的。我需要時間加權平均。 [看到這個問題](http://stackoverflow.com/questions/10839701/time-weighted-average-with-pandas) – kfirbreger

0

這不是很清楚,我正是你需要的。這似乎是一個簡單的groupby會做的伎倆:

import StringIO 
import numpy as np 
import pandas 

datatext = StringIO.StringIO("""\ 
      timestamp        shop product price 
2014-01-02 14:41:12 3075774DFBB0014CC1257822003CE79B 1135972 28.00 
2014-01-03 14:05:12 3075774DFBB0014CC1257822003CE79B 1129779 43.00 
2014-01-03 20:49:12 FDB140FB8F5FB469C125713B0035474F 1643094 145.00 
2014-01-04 07:26:12 3075774DFBB0014CC1257822003CE79B 1080521 27.00 
2014-01-05 10:44:12 949BC26900E5E48BC125773D00520641 1149009 59.99 
2014-01-06 13:21:53 FDB140FB8F5FB469C125713B0035474F 1644526 -1.00 
2014-01-06 15:28:53 FDB140FB8F5FB469C125713B0035474F 1643094 -1.00 
2014-01-06 13:21:53 00000000000000000000000001262068 1742831 -1.00 
2014-01-07 12:00:10 9D973A188A017E3DC1256C220034A923 1067842 31.99 
2014-01-09 12:25:54 78F58D53EA47E73AC12575F4004A42AA 232979 129.00 
""") 
df = pandas.read_table(datatext, index_col=[0], parse_dates=True, sep='\s\s+') 

# mask out the negative values 
df['price'][df['price'] < 0] = np.nan 

# group by the shop and product and compute the mean 
df.groupby(by=['shop', 'product']).mean() 

這給我:

          price 
shop        product   
00000000000000000000000001262068 1742831  NaN 
3075774DFBB0014CC1257822003CE79B 1080521 27.00 
3075774DFBB0014CC1257822003CE79B 1129779 43.00 
3075774DFBB0014CC1257822003CE79B 1135972 28.00 
78F58D53EA47E73AC12575F4004A42AA 232979 129.00 
949BC26900E5E48BC125773D00520641 1149009 59.99 
9D973A188A017E3DC1256C220034A923 1067842 31.99 
FDB140FB8F5FB469C125713B0035474F 1643094 145.00 
FDB140FB8F5FB469C125713B0035474F 1644526  NaN 
+0

如果它不是時間加權的,並且如果-1在該期間內不可逆,這將起作用。在我的示例數據中查看商店E的實例。 – kfirbreger

相關問題