2014-01-14 134 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

相关问题