时间序列数据分析学习笔记
时间序列数据分析学习笔记
目录
时间序列的分类
时间戳(timestamp)
特定的时刻
固定周期(period)
某月或某年
时间间隔(interval)
由起始时间戳和结束时间戳表示
Python的日期和时间处理
Python的日期和时间数据类型
类型 | 格式 |
---|---|
time | 时间格式 |
date | 日期格式 |
datetime | 日期时间格式 |
timestamp | 时间戳格式 |
datetime、time和calender模块是处理时间数据的主要工具
日期时间对象datetime
datetime.datetime
存储日期和细化到微秒的时间
datetime.timedelta
表示两个datetime对象的时间差
可为一个datetime对象加或减一个timedelta或其整数倍来产生一个新的datetime对象
datetime模块中包含的数据类型
说明 | 类型 |
---|---|
date | 以公历形式存储日历日期(年、月、日) |
time | 把时间存储为时、分、秒、毫秒 |
datetime | 存储日期和时间 |
timedelta | 表示两个datetime值之间的差(日、秒、毫秒) |
tzinfo | 用于存储时区信息 |
字符串和datetime相互转换
import datetime
#datetime表示时间的数据类型是datetime
first_day=datetime.datetime(2020,1,1)
print(first_day)
print(type(first_day))
2020-01-01 00:00:00
<class 'datetime.datetime'>
datetime类型转换成字符串
date.strftime(’%Y-%m-%d’)
可以把datetime类型转换成想要的格式的字符串
str(date)
按默认格式转换
#方法一:date.strftime('%Y-%m-%d')
#此法可以设置转换成字符串的表示格式
first_day_str=first_day.strftime('%Y-%m-%d')
print(first_day_str)
print(type(first_day_str))
#方法二:str(date)
print('\n'+str(first_day))
2020-01-01
<class 'str'>
2020-01-01 00:00:00
字符串变成datetime类型
datetime.datetime.strptime(datestr, ‘%Y/%m/%d’)
在已知格式的情况下转换日期,但每次都需要输入格式代码:比如’%Y/%m/%d’
last_day_str='2020/12/31'
#方法一:datetime.datetime.strptime(datestr, '%Y/%m/%d')
last_day=datetime.datetime.strptime(last_day_str, '%Y/%m/%d')
print(last_day)
print(type(last_day))
2020-12-31 00:00:00
<class 'datetime.datetime'>
dateutil.parser.parse()
第三方包dateutil包的parser.parse方法
dateutil能够解析大部分人类可理解的日期表示
#方法二:dateutil.parser.parse()
#DateUtil.parse方法会自动识别一些常用格式
from dateutil.parser import parse
last_day_1=parse(last_day_str)
print(last_day_1)
print(type(last_day_1))
2020-12-31 00:00:00
<class 'datetime.datetime'>
ps: 在国际场合下,日期出现在月份之前很常见,此时可传递dayfirst=True来表明这种情况
print(parse('2020/2/11',dayfirst=True))
2020-11-02 00:00:00
pd.to_datetime()
to_datetime()方法可同时转换很多种不同的日期表示格式
还可处理那些被认为是缺失值的值
#方法三:pd.to_datetime()
#可处理缺失值和空字符串
import pandas as pd
#一个日期格式不同且有缺失值的数据表
date_dic={'id':['a','b','c'],'date':['2020.1.1','2019/2/1',None]}
date=pd.DataFrame(date_dic)
print(date)
#转换成datetime格式
date['date']=pd.to_datetime(date['date'])
print('\n',date)
#查看缺失值
print('\n',date['date'][2])
print(type(date['date'][2]))
id date
0 a 2020.1.1
1 b 2019/2/1
2 c None
id date
0 a 2020-01-01
1 b 2019-02-01
2 c NaT
NaT
<class 'pandas._libs.tslibs.nattype.NaTType'>
NaT(Not a Time)是panda中时间戳数据的null值
read_csv()方法中的parse_dates参数
read_csv(path,parse_dates=[要转换成日期格式的列名])
时间戳timestamp
获取当前时间戳
time.time()
import time
#获取当前时间戳
now=time.time()
now
1604297902.3029757
默认情况下,python的时间戳是以秒为单位输出的float
把具体日期转换成时间戳
time.strptime()
time.mktime()
#一个时间字符串
t1='2020-11-02 14:21:00'
#用time.strptime()把时间字符串变成struct_time
t1_struct_time=time.strptime(t1,'%Y-%m-%d %H:%M:%S')
print(t1_struct_time)
print(type(t1_struct_time))
#用time.mktime()把时间数组变成时间戳
t1_timestamp=time.mktime(t1_struct_time)
print(t1_timestamp)
print(type(t1_timestamp))
time.struct_time(tm_year=2020, tm_mon=11, tm_mday=2, tm_hour=14, tm_min=21, tm_sec=0, tm_wday=0, tm_yday=307, tm_isdst=-1)
<class 'time.struct_time'>
1604298060.0
<class 'float'>
时间戳转换成datetime日期格式
datetime.utcfromtimestamp()
import datetime
#使用datetime.utcfromtimestamp()把时间戳转换为指定时间格式
t1_datetime=datetime.datetime.utcfromtimestamp(t1_timestamp)
print(t1_datetime)
print(type(t1_datetime))
2020-11-02 06:21:00
<class 'datetime.datetime'>
Pandas的时间序列数据处理
pandas中的基础时间序列
pandas中的基础时间序列种类是由时间戳索引的Series
import datetime
import pandas as pd
date_list=[datetime.datetime(1996,10,1),
datetime.datetime(1968,11,16),
datetime.datetime(1970,11,6)]
birth_day=pd.Series(['tomato','dad','mom'],index=date_list)
print(birth_day)
print(type(birth_day.index))
1996-10-01 tomato
1968-11-16 dad
1970-11-06 mom
dtype: object
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
pandas使用NumPy的datetime64数据类型,在纳秒级的分辨率下存储时间戳
birth_day.index.dtype
dtype('<M8[ns]')
DatetimeIndex中的标量值是pandas的Timestamp对象
所有使用datetime对象的地方都可使用timestamp
birth_day.index[0]
Timestamp('1996-10-01 00:00:00')
索引方式
按位置索引
按值索引
#按值索引
print(birth_day[datetime.datetime(1996,10,1)])
tomato
按被解析的字符串形式来索引
传递一个能解释为日期的字符串
#按字符串形式来索引
print(birth_day['1996-10-1'])
print(birth_day['1996/10/1'])
1996-10-01 tomato
dtype: object
1996-10-01 tomato
dtype: object
按照年份和月份来选择数据的切片
可使用不包含在时间序列的时间戳进行切片,以执行范围查询
#按照年份和月份来筛选
print(birth_day['1996'])
1996-10-01 tomato
dtype: object
#按日期进行切片
print(birth_day['1968-11':'1979-11'])
1968-11-16 dad
1970-11-06 mom
dtype: object
日期的过滤
import numpy as np
import datetime
#生成一个以日期为索引的随机数字Series
days=pd.date_range('2020-1-1','2020-10-26',freq='MS')
days_s=pd.Series(np.random.randn(10),index=days)
print(days_s)
2020-01-01 -1.359864
2020-02-01 0.495404
2020-03-01 -1.179290
2020-04-01 -0.815449
2020-05-01 -1.318030
2020-06-01 -0.766392
2020-07-01 -1.200902
2020-08-01 0.265950
2020-09-01 0.093936
2020-10-01 -0.067863
Freq: MS, dtype: float6
#按日期筛选
print(days_s.truncate(after='2020-2-3'))#取2020-2-3之前的所有数据
print('\n\n',days_s.truncate(before='2020-2-3'))#取2020-2-3之后的所有数据
2020-01-01 -1.359864
2020-02-01 0.495404
Freq: MS, dtype: float64
2020-03-01 -1.179290
2020-04-01 -0.815449
2020-05-01 -1.318030
2020-06-01 -0.766392
2020-07-01 -1.200902
2020-08-01 0.265950
2020-09-01 0.093936
2020-10-01 -0.067863
Freq: MS, dtype: float64
生成一个日期范围
pd.date_range()
pd.date_range(start=None, end=None,
periods=None, freq=‘D’,
tz=None, normalize=False,
name=None, closed=None, **kwargs)
start:起始日期
end:终结日期
period:周期(规定取多少个日期)
以上参数至少要指定俩
freq:频率,由基础频率的倍数组成
取值为string或DateOffset,默认为’D’(一天)
基础频率包括:
BM:每个月最后一个工作日
D:天
M:月
closed:可以理解成在closed=None情况下返回的结果中,
若closed=‘left’表示在返回的结果基础上,再取左开右闭
若closed='right’表示在返回的结果基础上,再取做闭右开
someday=pd.date_range('2001-1-1',periods=5,freq='10D')
print(someday)
DatetimeIndex(['2001-01-01', '2001-01-11', '2001-01-21', '2001-01-31',
'2001-02-10'],
dtype='datetime64[ns]', freq='10D')
频率
print(pd.date_range('2017/02/18', '2017/03/18', freq='2D'))
print(pd.date_range('2017/02/18', '2018/02/18', freq='BM'))
DatetimeIndex(['2017-02-18', '2017-02-20', '2017-02-22', '2017-02-24',
'2017-02-26', '2017-02-28', '2017-03-02', '2017-03-04',
'2017-03-06', '2017-03-08', '2017-03-10', '2017-03-12',
'2017-03-14', '2017-03-16', '2017-03-18'],
dtype='datetime64[ns]', freq='2D')
DatetimeIndex(['2017-02-28', '2017-03-31', '2017-04-28', '2017-05-31',
'2017-06-30', '2017-07-31', '2017-08-31', '2017-09-29',
'2017-10-31', '2017-11-30', '2017-12-29', '2018-01-31'],
dtype='datetime64[ns]', freq='BM')
基础频率
别名 | 偏移量类型 | 说明 |
---|---|---|
D | Day | 每日历日 |
B | BusinessDay | 每工作日 |
H | Hour | 每小时 |
T/min | Minute | 每分 |
S | Second | 每秒 |
L/ms | Million | 每毫秒 |
U | Micro | 每微妙 |
M | MonthEnd | 每月最后一个日历日 |
BM | BusinessMonthEnd | 每月最后一个工作日 |
MS | MonthBegin | 每月第一个日历日 |
BMS | BusinessMonthBegin | 每月第一个工作日 |
W-MON、W-TUE… | Week | 从指定的星期几开始算起,每周 |
WOM-1MON、WOM-2MON… | WeekOfMonth | 产生每月第一、二、三、四周的星期几,例如WOM-1MON表示每月的第一个星期一 |
Q-JAN、Q-FEB… | QuarterEnd | 对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的最后一个日历日 |
BQ-JAN、BQ-FEB… | BusinessQuarterEnd | 对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的最后一个工作日 |
QS-JAN、QS-FEB… | QuarterBegin | 对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的第一个日历日 |
BQS-JAN、BQS-FEB… | BusinessQuarterBegin | 对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的第一个工作日 |
A-JAN、A-FEB… | YearEnd | 每年指定月份最后一个日历日 |
BA-JAN、BA-FEB… | BusinessYearEnd | 每年指定月份最后一个工作日 |
AS-JAN、AS-FEB… | YearBegin | 每月指定月份第一个日历日 |
BAS-JAN、BAS-FEB… | BusinessYearBegin | 每月指定月份第一个工作日 |
偏移量
# 偏移量通过加法连接
sum_offset = pd.tseries.offsets.Week(2) + pd.tseries.offsets.Hour(12)
print(sum_offset)
print(pd.date_range('2017/02/18', '2017/03/18', freq=sum_offset))
14 days 12:00:00
DatetimeIndex(['2017-02-18 00:00:00', '2017-03-04 12:00:00'], dtype='datetime64[ns]', freq='348H')
移动数据
print(days_s)
print('\n',days_s.shift(1))#向后移动1个位置
print('\n',days_s.shift(-3))#向前移动3个位置
2020-01-01 -1.359864
2020-02-01 0.495404
2020-03-01 -1.179290
2020-04-01 -0.815449
2020-05-01 -1.318030
2020-06-01 -0.766392
2020-07-01 -1.200902
2020-08-01 0.265950
2020-09-01 0.093936
2020-10-01 -0.067863
Freq: MS, dtype: float64
2020-01-01 NaN
2020-02-01 -1.359864
2020-03-01 0.495404
2020-04-01 -1.179290
2020-05-01 -0.815449
2020-06-01 -1.318030
2020-07-01 -0.766392
2020-08-01 -1.200902
2020-09-01 0.265950
2020-10-01 0.093936
Freq: MS, dtype: float64
2020-01-01 -0.815449
2020-02-01 -1.318030
2020-03-01 -0.766392
2020-04-01 -1.200902
2020-05-01 0.265950
2020-06-01 0.093936
2020-07-01 -0.067863
2020-08-01 NaN
2020-09-01 NaN
2020-10-01 NaN
Freq: MS, dtype: float64
时间周期
pd.Period()
pd.Period()的参数包括:
一个时间戳:指明period在时间轴上的位置
freq参数:指明该period的长度
p1=pd.Period('2017-2-3',freq='5D')
#生成一个时间周期,起始于2017年2月3日
#长度为5天
#生成的时间周期用起始的时间来表示
print(p1,type(p))
#可以通过加减进行运算
print(p1+1)
#用to_timestamp()可把Period变成起始位置的时间戳
p1_ts=p1.to_timestamp()
print(p1_ts,type(p1_ts))
#时间戳可以直接转换成字符串显示
print(str(p1_ts),type(str(p1_ts)))
#时间戳可以单独提取年、月、日、小时等
print("{}年{}月{}日".format(p1_ts.year,p1_ts.month,p1_ts.day))
2017-02-03 <class 'pandas._libs.tslibs.period.Period'>
2017-02-08
2017-02-03 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
2017-02-03 00:00:00 <class 'str'>
2017年2月3日
"""
许多季度型数据会涉及“财年末”的概念,
通常是一年12个月中某月的最后一个工作日或日历日。
因此,时间“2012Q4”根据财年末的不同会有不同的含义。
pandas支持12种可能的季度型频率,即Q-JAN到Q-DEC。
学到辽
"""
#Q-JAN: 对于一个以1月结束的年度,每季度的最后一月的最后一个日历日
p=pd.Period('2020-2',freq='Q-JAN')
#输出结果为2020年2月之后的第一个财年季度(2020年2月1日-2020年4月30日)
print(p)
#输出下一个季度(2020年5月1日-2020年7月31日)
print(p+1)
#2020-2之后的第一季度的起始时间戳
print(p.to_timestamp())
#2020-2之后的第二季度的起始时间戳
print((p+1).to_timestamp())
2021Q1
2021Q2
2020-02-01 00:00:00
2020-05-01 00:00:00
pd.period_range()
生成指定规则的时间周期范围
p_rng=pd.period_range('2019-2','2020-1',freq='Q-JAN')
print(p_rng)
print(p_rng[0].to_timestamp())
PeriodIndex(['2020Q1', '2020Q2', '2020Q3', '2020Q4'], dtype='period[Q-JAN]', freq='Q-JAN')
2019-02-01 00:00:00
period频率转换(asfreq)
p2=pd.Period('2020-3',freq='Q-JAN')#p是2020年2月1日-4月31日
#频率是季度
print(p)
print(p.to_timestamp())
#频率转换成月,起始时间2020-2
print('\n转换后')
print(p.asfreq('M','start'))
print(p.asfreq('M','start').to_timestamp())
#频率转换成月,起始时间戳2020-4
print(p.asfreq('M','end'))
print(p.asfreq('M','end').to_timestamp())
2021Q1
2020-02-01 00:00:00
转换后
2020-02
2020-02-01 00:00:00
2020-04
2020-04-01 00:00:00
Timestamp与Period互相转换
1.通过to_period方法,可以将时间戳(timestamp)索引的Series和DataFrame对象转换为以时期(period)索引
rng = pd.date_range('1/1/2000',periods=3,freq='M')
ts = pd.Series(np.random.randn(3),index=rng)
ts
2000-01-31 -0.501502
2000-02-29 -1.299610
2000-03-31 -0.705091
Freq: M, dtype: float64
pts = ts.to_period()
pts
2000-01 -0.501502
2000-02 -1.299610
2000-03 -0.705091
Freq: M, dtype: float64
2.将timestamp转换为period
rng = pd.date_range('1/29/2000',periods=6,freq='D')
ts2 = pd.Series(np.random.randn(6),index=rng)
ts2.to_period('M')
2000-01 1.368367
2000-01 -0.256934
2000-01 0.417902
2000-02 -1.065910
2000-02 -1.694405
2000-02 0.665471
Freq: M, dtype: float64
3.to_timestamp可以将period转换为timestamp
pts.to_timestamp(how='end')
2000-01-31 -0.501502
2000-02-29 -1.299610
2000-03-31 -0.705091
Freq: M, dtype: float64
时间数据重采样
降采样
将数据聚合到规整的低频率
import pandas as pd
import numpy as np
import datetime
#表格行索引为2020年1月到10月27日的所有工作日
days_2020=pd.date_range('2020-1-1','2020-10-27',freq='B')
days_2020_s=pd.Series(range(len(days_2020)),index=days_2020)
print(days_2020_s.head(10))
2020-01-01 0
2020-01-02 1
2020-01-03 2
2020-01-06 3
2020-01-07 4
2020-01-08 5
2020-01-09 6
2020-01-10 7
2020-01-13 8
2020-01-14 9
Freq: B, dtype: int64
# 统计每个季度的数据总和
days_2020_s.resample('3M',closed='left').sum()
2020-03-31 2016
2020-06-30 6240
2020-09-30 10659
2020-12-31 4090
Freq: 3M, dtype: int64
# 将数据聚合到每5个工作日
days_2020_s.resample('5B',closed='left').sum().head()
2020-01-01 10
2020-01-08 35
2020-01-15 60
2020-01-22 85
2020-01-29 110
Freq: 5B, dtype: int64
days_2020_s.resample('5B',closed='left').ohlc().head()
#每五个工作日的起始值、最高值、最低值、结束值
open | high | low | close | |
---|---|---|---|---|
2020-01-01 | 0 | 4 | 0 | 4 |
2020-01-08 | 5 | 9 | 5 | 9 |
2020-01-15 | 10 | 14 | 10 | 14 |
2020-01-22 | 15 | 19 | 15 | 19 |
2020-01-29 | 20 | 24 | 20 | 24 |
升采样
将数据从低频转到高频,需要插值,否则会产生空值
import pandas as pd
import numpy as np
import datetime
#表格行索引为每周一的数据
df=pd.DataFrame(np.random.randn(5,2),
index=pd.date_range('2020-01-01',periods=5,freq='W-MON'),
columns=['s1','s2'])
print(df)
s1 s2
2020-01-06 0.378195 1.005377
2020-01-13 1.002959 -0.054421
2020-01-20 0.382896 -1.952720
2020-01-27 1.062598 -0.925133
2020-02-03 -0.920116 0.795869
#直接升采样到每个工作日的数据
#产生空值
print(df.resample('B').asfreq())
s1 s2
2020-01-06 0.378195 1.005377
2020-01-07 NaN NaN
2020-01-08 NaN NaN
2020-01-09 NaN NaN
2020-01-10 NaN NaN
2020-01-13 1.002959 -0.054421
2020-01-14 NaN NaN
2020-01-15 NaN NaN
2020-01-16 NaN NaN
2020-01-17 NaN NaN
2020-01-20 0.382896 -1.952720
2020-01-21 NaN NaN
2020-01-22 NaN NaN
2020-01-23 NaN NaN
2020-01-24 NaN NaN
2020-01-27 1.062598 -0.925133
2020-01-28 NaN NaN
2020-01-29 NaN NaN
2020-01-30 NaN NaN
2020-01-31 NaN NaN
2020-02-03 -0.920116 0.795869
常用的插值方法
ffill(limit)、fillna(‘ffill’,limit)
空值取前面的值补充,limit为填充个数
不写limit就是默认补全
#使用ffill(limit)进行插值:空值取前面的值填充,limit为填充个数
print(df.resample('B').ffill(2))
s1 s2
2020-01-06 0.378195 1.005377
2020-01-07 0.378195 1.005377
2020-01-08 0.378195 1.005377
2020-01-09 NaN NaN
2020-01-10 NaN NaN
2020-01-13 1.002959 -0.054421
2020-01-14 1.002959 -0.054421
2020-01-15 1.002959 -0.054421
2020-01-16 NaN NaN
2020-01-17 NaN NaN
2020-01-20 0.382896 -1.952720
2020-01-21 0.382896 -1.952720
2020-01-22 0.382896 -1.952720
2020-01-23 NaN NaN
2020-01-24 NaN NaN
2020-01-27 1.062598 -0.925133
2020-01-28 1.062598 -0.925133
2020-01-29 1.062598 -0.925133
2020-01-30 NaN NaN
2020-01-31 NaN NaN
2020-02-03 -0.920116 0.795869
fillna(‘ffill’)
print(df.resample('B').fillna('ffill'))
s1 s2
2020-01-06 0.378195 1.005377
2020-01-07 0.378195 1.005377
2020-01-08 0.378195 1.005377
2020-01-09 0.378195 1.005377
2020-01-10 0.378195 1.005377
2020-01-13 1.002959 -0.054421
2020-01-14 1.002959 -0.054421
2020-01-15 1.002959 -0.054421
2020-01-16 1.002959 -0.054421
2020-01-17 1.002959 -0.054421
2020-01-20 0.382896 -1.952720
2020-01-21 0.382896 -1.952720
2020-01-22 0.382896 -1.952720
2020-01-23 0.382896 -1.952720
2020-01-24 0.382896 -1.952720
2020-01-27 1.062598 -0.925133
2020-01-28 1.062598 -0.925133
2020-01-29 1.062598 -0.925133
2020-01-30 1.062598 -0.925133
2020-01-31 1.062598 -0.925133
2020-02-03 -0.920116 0.795869
bfill(limit)、fillna(‘bfill’,limit)
空值取后面的值填充,limit为填充个数
#使用bfill(limit)进行插值:空值取后面的值填充,limit为填充个数
print(df.resample('B').bfill())
s1 s2
2020-01-06 0.378195 1.005377
2020-01-07 1.002959 -0.054421
2020-01-08 1.002959 -0.054421
2020-01-09 1.002959 -0.054421
2020-01-10 1.002959 -0.054421
2020-01-13 1.002959 -0.054421
2020-01-14 0.382896 -1.952720
2020-01-15 0.382896 -1.952720
2020-01-16 0.382896 -1.952720
2020-01-17 0.382896 -1.952720
2020-01-20 0.382896 -1.952720
2020-01-21 1.062598 -0.925133
2020-01-22 1.062598 -0.925133
2020-01-23 1.062598 -0.925133
2020-01-24 1.062598 -0.925133
2020-01-27 1.062598 -0.925133
2020-01-28 -0.920116 0.795869
2020-01-29 -0.920116 0.795869
2020-01-30 -0.920116 0.795869
2020-01-31 -0.920116 0.795869
2020-02-03 -0.920116 0.795869
interpolate()
根据插值算法补全
#根据插值算法来补全
print(df.resample('B').interpolate())
s1 s2
2020-01-06 0.378195 1.005377
2020-01-07 0.503148 0.793417
2020-01-08 0.628101 0.581458
2020-01-09 0.753054 0.369498
2020-01-10 0.878006 0.157538
2020-01-13 1.002959 -0.054421
2020-01-14 0.878947 -0.434081
2020-01-15 0.754934 -0.813741
2020-01-16 0.630921 -1.193401
2020-01-17 0.506909 -1.573060
2020-01-20 0.382896 -1.952720
2020-01-21 0.518837 -1.747203
2020-01-22 0.654777 -1.541685
2020-01-23 0.790718 -1.336168
2020-01-24 0.926658 -1.130650
2020-01-27 1.062598 -0.925133
2020-01-28 0.666056 -0.580933
2020-01-29 0.269513 -0.236732
2020-01-30 -0.127030 0.107468
2020-01-31 -0.523573 0.451669
2020-02-03 -0.920116 0.795869
时间序列数据统计—滑动窗口
Moving Window Functions移动窗口函数
- 一种用于时间序列操作的重要用法
- 使用滑窗(sliding windown)或呈指数降低的权重(exponentially decaying weights),来对时间序列进行统计值计算和其他一些函数计算。
- 对于消除噪声或有缺陷的数据很有用
rolling操作符
rolling相当于在表格中建立一个固定长度的滑窗
可以对滑窗中的数据进行聚合计算
"""
获得一个索引为2016年1月-2020年1月的随机数series
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
index_1=pd.date_range('20160101','20200101')
ser_obj = pd.Series(np.random.randn(len(index_1)),
index=index_1)
print(ser_obj.head())
2016-01-01 0.339842
2016-01-02 1.907454
2016-01-03 -0.252507
2016-01-04 -0.482200
2016-01-05 -1.234327
Freq: D, dtype: float64
#建立一个长度为5天的滑窗
r1=ser_obj.rolling(5)
print(r1)
#在5天的滑窗上计算平均值
#默认每一行都是当前窗口的末尾
print(r1.mean().head(10))
#验证
print('2016-01-05:',ser_obj['2016-01-01':'2016-01-05'].mean())
print('2016-01-06:',ser_obj['2016-01-02':'2016-01-06'].mean())
Rolling [window=5,center=False,axis=0]
2016-01-01 NaN
2016-01-02 NaN
2016-01-03 NaN
2016-01-04 NaN
2016-01-05 0.055652
2016-01-06 0.218727
2016-01-07 -0.166836
2016-01-08 -0.288675
2016-01-09 0.376412
2016-01-10 0.659496
Freq: D, dtype: float64
2016-01-05: 0.055652377696070364
2016-01-06: 0.21872723515278863
# 画图查看
import matplotlib.pyplot as plt
%matplotlib inline
#设定图片尺寸
plt.figure(figsize=(15, 5))
#对原来的数据画图
ser_obj.plot(style='r--')
#在10天的滑窗上求平均值之后画图
ser_obj.rolling(window=10).mean().plot(style='g')
#以每行作为当前窗口的中心
print(ser_obj.rolling(window=5, center=True).mean())
2016-01-01 NaN
2016-01-02 NaN
2016-01-03 0.055652
2016-01-04 0.218727
2016-01-05 -0.166836
...
2019-12-28 -0.391057
2019-12-29 -0.692582
2019-12-30 -0.829366
2019-12-31 NaN
2020-01-01 NaN
Freq: D, Length: 1462, dtype: float64
expanding操作符
一个以时间序列的起始处为开始,长度从1开始逐渐递增的窗口
#依次计算前n个数据的和
ser_obj.expanding().sum()
2016-01-01 0.339842
2016-01-02 2.247296
2016-01-03 1.994788
2016-01-04 1.512588
2016-01-05 0.278262
...
2019-12-28 -24.466380
2019-12-29 -25.386748
2019-12-30 -25.716463
2019-12-31 -26.564858
2020-01-01 -28.195007
Freq: D, Length: 1462, dtype: float64
计算扩张窗口平均(expanding window mean):
依次计算前1个、2个、3个、……n个数据的平均值
#计算扩张窗口平均
ser_obj.expanding().mean().plot(figsize=(15,8))
上一篇: 时间序列的分析和预测ARIMA
下一篇: c#中单选按钮和复选框的使用
推荐阅读
-
Android学习笔记--通过Application传递数据代码示例
-
Android学习笔记之ActionBar Item用法分析
-
Python学习笔记之抓取某只基金历史净值数据实战案例
-
python网络编程学习笔记(九):数据库客户端 DB-API
-
Python ORM框架SQLAlchemy学习笔记之数据查询实例
-
javascript学习笔记整理(概述、变量、数据类型简介)
-
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
-
词法分析---基于Asp.NET(实验二学习笔记)
-
使用网易大数据,数链科技数据分析时间节省80%
-
JavaScript学习笔记之图片库案例分析