2014-08-28 35 views
4

我有一个多年的时间序列,并希望找到季节位数。熊猫TimeGrouper:.median()的行为不同,以.quantile(0.5)

数字上,这工作正常。但是,我得到一个MultiIndexSeries作为输出,当我想到一个单独索引DataFrame

import pandas as pd 
import numpy as np 

rng = pd.date_range(start='2014-01-01', end='2016-01-01', freq='30T') 
a_data = np.random.normal(loc=np.pi, scale=np.e, size=len(rng)) 
b_data = a_data - 5 
df = pd.DataFrame(index=rng, data={'a': a_data, 'b': b_data})  
grouped = df.groupby(pd.TimeGrouper(freq='QS-DEC')) 
mult_idx_series = grouped.quantile(0.5) 
mult_idx_series 

显示MultiIndex倒是Series

2013-12-01 a 3.079999 
      b -1.920001 
2014-03-01 a 3.126490 
      b -1.873510 

我预料(并希望)相同的输出中的格式.median()

median_df = grouped.median() 
median_df 

它看起来像:

  a   b 
2013-12-01 3.079999 -1.920001 
2014-03-01 3.126490 -1.873510 

我SH乌尔德指出:

  • 它不是0.5th位数,我想在现实中
  • 我知道我从格式只mult_idx_series.unstack(1)我想

我被惊讶不同的回报形态,并且想要理解推理。

回答

5

不同之处在于这样一个事实:grouped.median()调用优化的(cythonized)median聚集功能,而grouped.quantile()调用通用包装到适用于团体功能。

考虑一下:

In [56]: grouped.apply(lambda x: x.quantile(0.5)) 
Out[56]: 
2013-12-01 a 3.175594 
      b -1.824406 
2014-03-01 a 3.116556 
      b -1.883444 
2014-06-01 a 3.222320 
      b -1.777680 
2014-09-01 a 3.207015 
      b -1.792985 
2014-12-01 a 3.114767 
      b -1.885233 
2015-03-01 a 3.091952 
      b -1.908048 
2015-06-01 a 3.220528 
      b -1.779472 
2015-09-01 a 3.204990 
      b -1.795010 
2015-12-01 a 3.108755 
      b -1.891245 
dtype: float64 

In [57]: grouped.agg(lambda x: x.quantile(0.5)) 
Out[57]: 
        a   b 
2013-12-01 3.175594 -1.824406 
2014-03-01 3.116556 -1.883444 
2014-06-01 3.222320 -1.777680 
2014-09-01 3.207015 -1.792985 
2014-12-01 3.114767 -1.885233 
2015-03-01 3.091952 -1.908048 
2015-06-01 3.220528 -1.779472 
2015-09-01 3.204990 -1.795010 
2015-12-01 3.108755 -1.891245 

所以grouped.quantile()确实一般适用而不是聚集。这样做的原因是,quantile还可以grouped.quantile([0.1, 0.5, 0.9])返回一个数据框(因此并不总是一个纯粹的聚合),如果一次计算多位数,如:

In [67]: grouped.quantile([0.1, 0.5, 0.9]) 
Out[67]: 
         a   b 
2013-12-01 0.1 -0.310566 -5.310566 
      0.5 3.131418 -1.868582 
      0.9 6.624399 1.624399 
2014-03-01 0.1 -0.219992 -5.219992 
      0.5 3.173881 -1.826119 
      0.9 6.550259 1.550259 
... 
+0

我们能不能用一个单一的计算多位数呼叫?做'grouped.quantile([0.1,0.5,0.9])'给我'类型错误:( “不支持的操作数类型(个),/: '列表' 和 '浮动'”,在索引“u'occurred)从' 'scipy.scoreatpercentile()通过'pandas.core.frame.quantile()'' – 2014-08-29 07:39:39

+0

你有什么版本的熊猫呢?它适用于我(0.14.1)。看到答案 – joris 2014-08-29 07:47:36

+0

输出啊,就是这样。我仍然只在'0.13.1'上。谢谢 – 2014-08-29 07:57:13