【问题标题】:Pandas TimeGrouper: .median() behaves differently to .quantile(0.5)Pandas TimeGrouper:.median() 与 .quantile(0.5) 的行为不同
【发布时间】:2014-10-22 11:14:47
【问题描述】:

我有一个多年的时间序列,想按季节查找分位数。

从数值上看,这很好用。但是,当我期望一个单一索引的 DataFrame 时,我得到一个 MultiIndex Series 作为输出。

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'd 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

我应该指出:

  • 这不是我在现实中想要的第 0.5 个分位数
  • 我知道我只是 mult_idx_series.unstack(1) 我想要的格式

我对不同的返回形状感到惊讶,并想了解其中的原因。

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    区别在于grouped.median() 调用优化(cythonized)median 聚合函数,而grouped.quantile() 调用通用包装器以应用组上的函数。 p>

    考虑一下:

    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 也可以返回一个 DataFrame(因此并不总是一个纯粹的聚合),如果你一次计算多个分位数,例如使用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
    ...
    

    【讨论】:

    • 我们真的可以通过一次调用计算多个分位数吗?做grouped.quantile([0.1, 0.5, 0.9])给我TypeError: ("unsupported operand type(s) for /: 'list' and 'float'", u'occurred at index a')来自scipy.scoreatpercentile()通过pandas.core.frame.quantile()
    • 你有什么版本的熊猫?它对我有用(0.14.1)。查看答案中的输出
    • 啊,就是这样。我仍然只在0.13.1。谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-06-28
    • 2017-08-16
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2020-08-02
    相关资源
    最近更新 更多