龙空技术网

时间序列:python移动窗口函数中篇

python知识分享 369

前言:

而今同学们对“python中resample函数”大体比较珍视,小伙伴们都想要分析一些“python中resample函数”的相关文章。那么小编也在网络上搜集了一些关于“python中resample函数””的相关内容,希望看官们能喜欢,各位老铁们一起来学习一下吧!

一起学习,一起成长!

移动(shifting)指的是沿着时间轴将数据前移或后移。Series和DataFrame都有一个shift方法用于执行单纯的前移或后移操作,保持索引不变:

1.使用shift方法

In [105]: ts=Series(np.random.randn(4),index=pd.date_range('1/1/2019',periods=4,freq='M'))

In [106]: ts

Out[106]:

2019-01-31 -0.690646

2019-02-28 -0.088123

2019-03-31 2.525132

2019-04-30 2.147924

Freq: M, dtype: float64

In [107]: ts.shift(2)

Out[107]:

2019-01-31 NaN

2019-02-28 NaN

2019-03-31 -0.690646

2019-04-30 -0.088123

Freq: M, dtype: float64

In [108]: ts.shift(-2)

Out[108]:

2019-01-31 2.525132

2019-02-28 2.147924

2019-03-31 NaN

2019-04-30 NaN

Freq: M, dtype: float64

Shift通常用于计算一个时间序列或多个时间序列(DataFrame的列)中的百分比变化,可以这样表达:

In [112]: ts

Out[112]:

2019-01-31 -0.690646

2019-02-28 -0.088123

2019-03-31 2.525132

2019-04-30 2.147924

Freq: M, dtype: float64

In [113]: ts.shift(1)

Out[113]:

2019-01-31 NaN

2019-02-28 -0.690646

2019-03-31 -0.088123

2019-04-30 2.525132

Freq: M, dtype: float64

In [114]: ts/ts.shift(1)

Out[114]:

2019-01-31 NaN

2019-02-28 0.127596

2019-03-31 -28.654500

2019-04-30 0.850618

Freq: M, dtype: float64

In [115]: ts/ts.shift(1)-1

Out[115]:

2019-01-31 NaN

2019-02-28 -0.872404

2019-03-31 -29.654500

2019-04-30 -0.149382

Freq: M, dtype: float64

由于单纯的移位操作不会修改索引,所以部分数据会丢失。因此,如果频率已知,则可以将其传给shift以便实现对时间戳进行位移而不是对数据进行简单位移:

In [118]: ts.shift(1,freq='M')

Out[118]:

2019-02-28 -0.690646

2019-03-31 -0.088123

2019-04-30 2.525132

2019-05-31 2.147924

Freq: M, dtype: float64

In [119]: ts.shift(2,freq='M')

Out[119]:

2019-03-31 -0.690646

2019-04-30 -0.088123

2019-05-31 2.525132

2019-06-30 2.147924

Freq: M, dtype: float64

还可以使用其他频率,就可以灵活地对数据进行超前和滞后处理了:

2.使用freq='D'参数

In [122]: ts

Out[122]:

2019-01-31 -0.690646

2019-02-28 -0.088123

2019-03-31 2.525132

2019-04-30 2.147924

Freq: M, dtype: float64

In [123]: ts.shift(3,freq='D')

Out[123]:

2019-02-03 -0.690646

2019-03-03 -0.088123

2019-04-03 2.525132

2019-05-03 2.147924

dtype: float64

In [124]: ts.shift(4,freq='D')

Out[124]:

2019-02-04 -0.690646

2019-03-04 -0.088123

2019-04-04 2.525132

2019-05-04 2.147924

dtype: float64

3.freq='3D'

In [125]: ts

Out[125]:

2019-01-31 -0.690646

2019-02-28 -0.088123

2019-03-31 2.525132

2019-04-30 2.147924

Freq: M, dtype: float64

In [126]: ts.shift(1,freq='3D')

Out[126]:

2019-02-03 -0.690646

2019-03-03 -0.088123

2019-04-03 2.525132

2019-05-03 2.147924

dtype: float64

4.freq='90T'

In [127]: ts

Out[127]:

2019-01-31 -0.690646

2019-02-28 -0.088123

2019-03-31 2.525132

2019-04-30 2.147924

Freq: M, dtype: float64

In [128]: ts.shift(1,freq='90T')

Out[128]:

2019-01-31 01:30:00 -0.690646

2019-02-28 01:30:00 -0.088123

2019-03-31 01:30:00 2.525132

2019-04-30 01:30:00 2.147924

Freq: M, dtype: float64

3.通过偏移量对日期进行位移

Pandas的日期偏移量还可以用在datetime或TimeStamp对象上:

使用锚点偏移量

In [129]: from pandas.tseries.offsets import Day,MonthEnd

In [130]: now=datetime(2019,1,1)

In [131]: now+3*Day()

Out[131]: Timestamp('2019-01-04 00:00:00')

In [132]: now+MonthEnd()

Out[132]: Timestamp('2019-01-31 00:00:00')

In [133]: now+MonthEnd(2)

Out[133]: Timestamp('2019-02-28 00:00:00')

In [134]: offset=MonthEnd()

In [135]: offset

Out[135]: <MonthEnd>

通过锚点偏移量的rollforward(向前)方法

In [136]: offset.rollforward(now)

Out[136]: Timestamp('2019-01-31 00:00:00')

通过锚点偏移量的rollback(向后)方法

In [137]: offset.rollback(now)

Out[137]: Timestamp('2018-12-31 00:00:00')

结合groupby使用两个“滚动”方法

n [138]: ts=Series(np.random.randn(20),index=pd.date_range('1/1/2019',periods=20,freq='4d'))

In [139]: ts

Out[139]:

2019-01-01 1.111570

2019-01-05 -0.665521

2019-01-09 0.339194

2019-01-13 1.290567

2019-01-17 -0.903246

2019-01-21 -0.090241

2019-01-25 -0.054101

2019-01-29 0.718818

2019-02-02 0.593305

2019-02-06 -0.452957

2019-02-10 0.257083

2019-02-14 -0.957972

2019-02-18 2.925902

2019-02-22 0.784374

2019-02-26 -0.278628

2019-03-02 -0.415946

2019-03-06 -0.339939

2019-03-10 2.128525

2019-03-14 -1.421271

2019-03-18 0.442716

Freq: 4D, dtype: float64

In [140]: ts.groupby(offset.rollforward).mean()

Out[140]:

2019-01-31 0.218380

2019-02-28 0.410158

2019-03-31 0.07

4.使用resample方法

In [141]: ts.resample('M',how='mean')

__main__:1: FutureWarning: how in .resample() is deprecated

the new syntax is .resample(...).mean()

Out[141]:

2019-01-31 0.218380

2019-02-28 0.410158

2019-03-31 0.078817

Freq: M, dtype: float64

In [142]: ts.resample('M').mean()

Out[142]:

2019-01-31 0.218380

2019-02-28 0.410158

2019-03-31 0.078817

Freq: M, dtype: float64

「亲,如果笔记对您有帮助,收藏的同时,记得给点个赞、加个关注哦!感谢!」

「文中代码均亲测过,若有错误之处,欢迎批评指正,一起学习,一起成长!」

标签: #python中resample函数