6. resample 和频率转换

  1. Series/DataFrame有一个shift()方法用于执行单纯的前移或者后移操作,:

    1. Series/DataFrame.shift(periods=1, freq=None, axis=0)
    • periods:一个整数(可以为负的),指定移动的数量。对于时间序列,单位由freq指定。
    • freq:一个DateOffset/timedelta或者一个频率字符串。指定移动的单位。注意,如果为PeriodIndex,则freq必须和它匹配。
    • axis:为0/'index'表示沿着0轴移动;为1/'columns'表示沿着1轴移动

    如果为时间序列,则该方法移动并建立一个新的索引,但是Series/DataFrame的值不变。对于非时间序列,则保持索引不变,而移动Series/DataFrame的值。

    本质上,时间序列和非时间序列都是index_i-->value_i转换成index_i+n-->value_i。只是时间序列截取的都是有效值,非时间序列截取了NaN而已。

    TimeSeries_shift0 TimeSeries_shift1 shift

  2. 重采样resampling指的是将时间序列从一个频率转换到另一个频率的处理过程。

    • 将高频数据转换到低频数据称作降采样。降采样时,待聚合的数据不必拥有固定的频率,期望的频率(低频的)会自动划分聚合的bin的边界。这些bin将时间序列拆分为多个片段。这些片段都是半开放的,一个数据点只能属于一个片段,所有的片段的并集组成了整个时间帧。在对数据降采样时,只需要考虑两样:
    • 各个区间哪边是闭合的
    • 如何标记各个聚合bin,用区间的开头还是结尾
    • 将低频数据转换到高频数据称作升采样。将数据转换到高频时,就不需要聚合了,而是插值,默认引入缺失值。插值的填充和填充方式与fillna/reindex的一样。
    • 在对时间段Period进行重采样时,升采样稍微麻烦点,因为你必须决定:哪个高频区间代表原区间。就像asfreq一样,convention可以设置为'end'/'start'

    有些重采样并不划分到上述两者之中。比如将W-WED(每周三)转换到W-FRI(每周五)。另外,由于Period是时间区间,所以升采样和降采样的规则就比较严格:

    • 降采样中,目标频率必须包含原频率。如Day->Month,目标频率为每月,原频率为每天。
    • 升采样中,原频率必须包含目标频率。如Day->Hour,目标频率为每小时,原频率为每天。

    如果不满足这些条件,则会引发异常。

  3. resample 方法:

    1. Series/DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None,
    2. label=None, convention='start', kind=None, loffset=None, limit=None,
    3. base=0, on=None, level=None)
    • rule:一个字符串,指定了重采样的目标频率

    • axis:为0/'index'表示沿着0轴重采样;为1/'columns'表示沿着1轴重采样

    • closed:一个字符串,指定降采样中,各时间段的哪一端是闭合的。如果为'right',则是左开右闭区间;如果为'left',则是左闭右开区间

    • label:在降采样中,如何设置聚合值的标签。可以为'right'/'left'(面元的右边界或者左边界)。如:9:30~9:35这5分钟会被标记为9:30或者9:35

    • how:用于产生聚合值的函数名或者数组函数。可以为'mean'/'ohlc'/np.max等。默认为'mean',其他常用的有:'first'/'last'/'median'/'ohlc'/'max'/'min'

      how被废弃了,而是采用.resample().mean()这种方案。

    • convention:当重采样时期时,将低频转换到高频所采用的约定。可以为's'/'start'(用第一个高频)或者'e'/'end'(用最后一个高频)

    • loffset:一个timedelta,用于调整面元(bin)标签。如'-1s',会将用于将聚合的结果标签调早1秒,从而更容易表示它代表哪个区间。比如12:00:00你就难以判别是哪个区间,而11:59:59就很容易知道它是那个区间。

      你也可以对调用结果对象使用.shift()方法来实现该目的,这样就不必设置loffset

    • base:一个整数,默认为0.用于聚合过程中,当频率可以整除1D(比如4H)时,第一个完整的分组从哪个元素开始的。如rule='4H'base=2,则Series[0:1]作为一个分组,Series[2:6]....作为一个分组….

    • on:一个字符串,对于DataFrame,它指定了重采样的列。该列必须是datetime-like

    • level:一个字符串或者整数。对于MultiIndex,该参数指定了被重采样的子索引

    • fill_method:一个字符串,指定升采样时,如何插值。如'ffill'/'bfill'。默认不插值

      该参数被废弃。推荐使用.resample().ffill()这种方案。而limit作为ffill()的参数。

    • limit:一个整数。指定向前或者向后填充时,运行连续填充的最大单元数量

    • kind:一个字符串,指定聚合到时间段Period还是时间戳Timestamp。默认聚合到时间序列的索引类型

    resample0 resample1 resample2 resample3 resample4

  4. OHLC重采样是计算bin中的四个值:开盘值(第一个值)、收盘值(最后一个值)、最高值(最大值)、最低值(最小值)

  5. 另一种降采样的办法是:使用groupby功能。如:

    1. series.groupby(lambda x:x.month).mean()

    如果你想根据年份来聚合,则使用x.year

resample_groupby