欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

时间序列数据分析学习笔记

程序员文章站 2022-05-09 10:56:32
...

时间序列数据分析学习笔记

目录

时间序列的分类

时间戳(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))

时间序列数据分析学习笔记

相关标签: python 数据分析