带有熊猫重采样的额外箱

Posted

技术标签:

【中文标题】带有熊猫重采样的额外箱【英文标题】:Extra Bin with Pandas Resample 【发布时间】:2013-05-10 13:56:24 【问题描述】:

我有一个这样定义的 pandas 数据框:

    last_4_weeks_range = pandas.date_range(                                
            start=datetime.datetime(2001, 5, 4), periods=28)               
    last_4_weeks = pandas.DataFrame(                                       
        ['REST_KEY': 1, 'DLY_TRN_QT': 80, 'DLY_SLS_AMT': 90,              
            'COOP_DLY_TRN_QT': 30, 'COOP_DLY_SLS_AMT': 20] * 28 +         
        ['REST_KEY': 2, 'DLY_TRN_QT': 70, 'DLY_SLS_AMT': 10,              
            'COOP_DLY_TRN_QT': 50, 'COOP_DLY_SLS_AMT': 20] * 28,          
        index=last_4_weeks_range.append(last_4_weeks_range))               
    last_4_weeks.sort(inplace=True)

当我去重新采样时:

In [265]: last_4_weeks.resample('7D', how='sum')
Out[265]: 
            COOP_DLY_SLS_AMT  COOP_DLY_TRN_QT  DLY_SLS_AMT  DLY_TRN_QT  REST_KEY
2001-05-04               280              560          700        1050        21
2001-05-11               280              560          700        1050        21
2001-05-18               280              560          700        1050        21
2001-05-25               280              560          700        1050        21
2001-06-01                 0                0            0           0         0

我最终得到了一个我不希望看到的额外空垃圾箱 -- 2001-06-01。我不希望那个垃圾箱在那里,因为我的 28 天可以平分到我正在执行的 7 天重新采样中。我试过弄乱封闭的kwarg,但我无法逃脱那个额外的垃圾箱。为什么当我没有任何东西可以放入时出现额外的垃圾箱?如何避免生成它?

我最终想要做的是获得每个 REST_KEY 的 7 天平均值,所以做一个

In [266]: last_4_weeks.groupby('REST_KEY').resample('7D', how='sum').mean(level=0)
Out[266]: 
          COOP_DLY_SLS_AMT  COOP_DLY_TRN_QT  DLY_SLS_AMT  DLY_TRN_QT  REST_KEY
REST_KEY                                                                      
1                      112              168          504         448       5.6
2                      112              280           56         392      11.2

但是那个额外的空箱子让我失去了平均值(例如,对于 COOP_DLY_SLS_AMT,我得到 112,即 (20 * 7 * 4) / 5 而不是我从 (20 * 7 * 4) 得到的 140 / 4 如果我没有那个额外的 bin。)我也不希望 REST_KEY 出现在聚合中,因为它是 groupby 的一部分,但这确实是一个较小的问题。

附:我正在使用熊猫 0.11.0

【问题讨论】:

一个快速的解决方法是只取前 4 个元素 [0:4] 但是... 这很奇怪。如果我计算而不是总和,我最终不会得到额外的垃圾箱。 (在 0.11 中) 【参考方案1】:

我认为这是一个错误:

pandas 0.9.0dev 在 mac 上的输出是:

In [3]: pandas.__version__
Out[3]: '0.9.0.dev-1e68fd9'


In [6]: last_4_weeks.resample('7D', how='sum')
Out[6]: 
            COOP_DLY_SLS_AMT  COOP_DLY_TRN_QT  DLY_SLS_AMT  DLY_TRN_QT  REST_KEY
2001-05-04                40               80          100         150         3
2001-05-11               280              560          700        1050        21
2001-05-18               280              560          700        1050        21
2001-05-25               280              560          700        1050        21
2001-06-01               240              480          600         900        18


In [4]: last_4_weeks.groupby('REST_KEY').resample('7D', how='sum').mean(level=0)
Out[4]: 
          COOP_DLY_SLS_AMT  COOP_DLY_TRN_QT  DLY_SLS_AMT  DLY_TRN_QT  REST_KEY
REST_KEY                                                                      
1                      112              168          504         448       5.6
2                      112              280           56         392      11.2

我正在使用这个版本(通过 pip freeze):

numpy==1.8.0.dev-9597b1f-20120920
pandas==0.9.0.dev-1e68fd9-20120920

【讨论】:

不,你的输出只是关闭了='right',我相信这曾经是熊猫的默认设置。现在默认是关闭='left',这是我在这种情况下想要的。如果我在 pandas 0.11.0 中执行 closed='right' ,我会得到相同的输出。您会注意到,您的方法也有我在原始问题中报告的完全相同的问题,这些问题来自额外的垃圾箱。您的 bin 恰好出现在不同的地方 (2001-05-04) 并且是非空的,因为如果间隔以不同方式关闭(2001-06-01 是 40少。)

以上是关于带有熊猫重采样的额外箱的主要内容,如果未能解决你的问题,请参考以下文章

基于列标准的熊猫数据框重采样

熊猫结合了滚动和重采样

熊猫时间序列重采样和插值一起

使用重采样来对齐熊猫中的多个时间序列

如何理解熊猫重采样方法中的封闭和标签参数?

时间序列重采样错误 - 熊猫列中没有日期索引