首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫,.resample('B')的意外行为

熊猫,.resample('B')的意外行为
EN

Stack Overflow用户
提问于 2016-05-20 08:46:54
回答 1查看 316关注 0票数 1

我从一个月的系列开始,加盖了这个月底的时间戳.我想通过填写远期价值来提高他们的日常工作频率(星期一至星期五)。我希望有两个条件是正确的:

  1. 如果是原始时间序列中的一个周末,就不要丢失重采样的值。
  2. 始终向前填写:如果原系列中的EOM日期是星期六,我希望这个观察结果在下星期一出现在每日系列中。

虽然不优雅,但我得出的结论是,最安全的方法是:

代码语言:javascript
复制
    daily_series = monthly_series.resample(rule='D').ffill().resample(rule='B',how='first')

现在,意外的情况是:

代码语言:javascript
复制
    dates = ['1953-02-28', '1953-03-31', '1953-04-30', '1953-05-31']
    # '1953-02-28' was a Saturday

    values = [1,2,3,4]
    monthly_ts  = pd.Series(values, index = dates)

    monthly_ts
    Out[74]: 
    1953-02-28    1
    1953-03-31    2
    1953-04-30    3
    1953-05-31    4
    dtype: int64

    daily_ts = monthly_ts.resample(rule='D').ffill().resample(rule='B',how='first')

     Out[77]: 
     1953-02-27    1           # Why do I have this observation?
     1953-03-02    1
     1953-03-03    1
     1953-03-04    1

星期六的观测是在星期五重新取样时使用的。这发生在.resample之后(规则= 'B')

请你向我解释一下为什么会发生这种情况,以及如何防止这种情况发生?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-20 12:36:52

这种行为方式发生的原因是让抽样周期过短。间隔中的工作日数量小于日历日。这就是为什么星期五和星期一被加入到周六和周日,并代表为一个单一的单位。周六和周日的值用于“如何”和“关闭”参数的下采样。

代码语言:javascript
复制
dates = ['1953-02-28', '1953-03-31', '1953-04-30', '1953-05-31']
values = [1,2,3,4]
monthly_ts  = pd.Series(values, index = pd.to_datetime(dates))

首先向上样至日历日

代码语言:javascript
复制
calendar_daily_ts = monthly_ts.resample(rule='D').ffill()

让我们来看看最后三张唱片

代码语言:javascript
复制
In[8]: calendar_daily_ts[-3:]
Out[8]: 
1953-05-29    3
1953-05-30    3
1953-05-31    4
Freq: D, dtype: int64

如果我们将样本降到平均和结束为‘左’的工作日,最后的值将是3.33333。

代码语言:javascript
复制
In [15]: calendar_daily_ts.resample(rule='B', closed='left').mean()[-2:]
Out[15]: 
1953-05-28    3.000000
1953-05-29    3.333333
Freq: B, dtype: float64

星期五的数值(1953-05-29)是按星期五、星期六和星期日(3 +3+ 4) /3的平均值计算的。

如果我们将样本降到平均和封闭的工作日=“对”,最后的值将是3.5

代码语言:javascript
复制
In [16]: calendar_daily_ts.resample(rule='B', closed='right').mean()[-2:]
Out[16]: 
1953-05-28    3.0
1953-05-29    3.5
Freq: B, dtype: float64

星期五的数值(1953-05-29)按星期六、星期日和下星期一(3 +4+ 0) /2的平均值计算。

这没有星期五的价值。

所以你问题中的观察之所以出现,是因为1953-02-28 (星期六)下采样期包括1953-02-27、1953-02-28、1953-03-01和1953-03-02。默认情况下,间隔为左- (1953-02-27,1953-02-28,1953-03-01)。你得到了第一个- 1953-02-27

还有一个有趣的例子

代码语言:javascript
复制
In [45]: calendar_daily_ts[:4]
Out[45]: 
1953-02-27    1
1953-02-28    2
1953-03-01    3
1953-03-02    4
dtype: int64

In [47]: calendar_daily_ts.resample(rule='B', closed='left').first()[:4]
Out[47]: 
1953-02-27    1
1953-03-02    4
1953-03-03    1
1953-03-04    1
Freq: B, dtype: int64

In [48]: calendar_daily_ts.resample(rule='B', closed='right').first()[:4]
Out[48]: 
1953-02-26    1
1953-02-27    2
1953-03-02    1
1953-03-03    1
Freq: B, dtype: int64

(1953-02-26,值1)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37342089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档