gpt4 book ai didi

python - Pandas ,.resample ('B' 的意外行为)

转载 作者:行者123 更新时间:2023-12-01 03:56:39 25 4
gpt4 key购买 nike

我从时间戳为月底的每月系列开始。我想通过填充远期值将它们升级为业务(周一至周五)每日频率。我希望满足两个条件:

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

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

    daily_series = monthly_series.resample(rule='D').ffill().resample(rule='B',how='first')

现在,意外的情况:

    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(rule = 'B') 之后

您能向我解释一下为什么会发生这种情况以及如何防止这种情况发生吗?

最佳答案

这种行为方式是由于设置下采样周期而发生的。间隔中工作日的数量小于日历天数。这就是为什么星期五和星期一与星期六和星期日相连并表示为一个单元。周六和周日的值用于使用“how”和“close”参数进行下采样。<​​/p>

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))

第一次上采样到日历天

calendar_daily_ts = monthly_ts.resample(rule='D').ffill()

让我们看看最后三条记录

In[8]: calendar_daily_ts[-3:]
Out[8]:
1953-05-29 3
1953-05-30 3
1953-05-31 4
Freq: D, dtype: int64

如果我们使用平均值和 close='left' 将采样缩减到工作日,则最后一个值将为 3.33333

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

如果我们将平均值降采样到营业日且结束='right',则最后一个值将为 3.5

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

还有一个有趣的例子

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)

关于python - Pandas ,.resample ('B' 的意外行为),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37342089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com