Travel Tips
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
核心pandas介绍
import pandas as pd # pd.Period()创建时期 p = pd.Period('2020', freq = 'M') print(p, type(p)) # 生成一个以2017-01开始,月为频率的时间构造器 # pd.Period()参数:一个时间戳 + freq 参数 → freq 用于指明该 period 的长度,时间戳则说明该 period 在时间轴上的位置 print(p + 1) print(p - 2) print(pd.Period('2012', freq = 'A-DEC') - 1) # 通过加减整数,将周期整体移动 # 这里是按照 月、年 移动
prng = pd.period_range('1/1/2011', '1/1/2012', freq='M') print(prng,type(prng)) print(prng[0],type(prng[0])) # 数据格式为PeriodIndex,单个数值为Period ts = pd.Series(np.random.rand(len(prng)), index = prng) print(ts,type(ts)) print(ts.index) # 时间序列 # Period('2011', freq = 'A-DEC')可以看成多个时间期的时间段中的游标 # Timestamp表示一个时间戳,是一个时间截面;Period是一个时期,是一个时间段!!但两者作为index时区别不大
p = pd.Period('2017','A-DEC') print(p) print(p.asfreq('M', how = 'start')) # 也可写 how = 's' print(p.asfreq('D', how = 'end')) # 也可写 how = 'e' # 通过.asfreq(freq, method=None, how=None)方法转换成别的频率 prng = pd.period_range('2017','2018',freq = 'M') ts1 = pd.Series(np.random.rand(len(prng)), index = prng) ts2 = pd.Series(np.random.rand(len(prng)), index = prng.asfreq('D', how = 'start')) print(ts1.head(),len(ts1)) print(ts2.head(),len(ts2)) # asfreq也可以转换TIMESeries的index
rng = pd.date_range('2017/1/1', periods = 10, freq = 'M') prng = pd.period_range('2017','2018', freq = 'M') ts1 = pd.Series(np.random.rand(len(rng)), index = rng) print(ts1.head()) print(ts1.to_period().head()) # 每月最后一日,转化为每月 ts2 = pd.Series(np.random.rand(len(prng)), index = prng) print(ts2.head()) print(ts2.to_timestamp().head()) # 每月,转化为每月第一天
TimeSeries是Series的一个子类,所以Series索引及数据选取方面的方法基本一样
同时TimeSeries通过时间序列有更便捷的方法做索引和切片
from datetime import datetime rng = pd.date_range('2017/1','2017/3') ts = pd.Series(np.random.rand(len(rng)), index = rng) print(ts.head()) print(ts[0]) print(ts[:2]) print('-----') # 基本下标位置索引 print(ts['2017/1/2']) print(ts['20170103']) print(ts['1/10/2017']) print(ts[datetime(2017,1,20)]) print('-----') # 时间序列标签索引,支持各种时间字符串,以及datetime.datetime # 时间序列由于按照时间先后排序,故不用考虑顺序问题 # 索引方法同样适用于Dataframe
rng = pd.date_range('2017/1','2017/3',freq = '12H') ts = pd.Series(np.random.rand(len(rng)), index = rng) print(ts['2017/1/5':'2017/1/10']) print('-----') # 和Series按照index索引原理一样,也是末端包含 print(ts['2017/2'].head()) # 传入月,直接得到一个切片
dates = pd.DatetimeIndex(['1/1/2015','1/2/2015','1/3/2015','1/4/2015','1/1/2015','1/2/2015']) ts = pd.Series(np.random.rand(6), index = dates) print(ts) print(ts.is_unique,ts.index.is_unique) print('-----') # index有重复,is_unique检查 → values唯一,index不唯一 print(ts['20150101'],type(ts['20150101'])) print(ts['20150104'],type(ts['20150104'])) print('-----') # index有重复的将返回多个值 print(ts.groupby(level = 0).mean()) # 通过groupby做分组,重复的值这里用平均值处理
将时间序列从一个频率转换为另一个频率的过程,且会有数据的结合
降采样:高频数据 → 低频数据,eg.以天为频率的数据转为以月为频率的数据
升采样:低频数据 → 高频数据,eg.以年为频率的数据转为以月为频率的数据
# 重采样:.resample() # 创建一个以天为频率的TimeSeries,重采样为按2天为频率 rng = pd.date_range('20170101', periods = 12) ts = pd.Series(np.arange(12), index = rng) print(ts) ts_re = ts.resample('5D') ts_re2 = ts.resample('5D').sum() print(ts_re, type(ts_re)) print(ts_re2, type(ts_re2)) print('-----') # ts.resample('5D'):得到一个重采样构建器,频率改为5天 # ts.resample('5D').sum():得到一个新的聚合后的Series,聚合方式为求和 # freq:重采样频率 → ts.resample('5D') # .sum():聚合方法 print(ts.resample('5D').mean(),'→ 求平均值\n') print(ts.resample('5D').max(),'→ 求最大值\n') print(ts.resample('5D').min(),'→ 求最小值\n') print(ts.resample('5D').median(),'→ 求中值\n') print(ts.resample('5D').first(),'→ 返回第一个值\n') print(ts.resample('5D').last(),'→ 返回最后一个值\n') print(ts.resample('5D').ohlc(),'→ OHLC重采样\n') # OHLC:金融领域的时间序列聚合方式 → open开盘、high最大值、low最小值、close收盘
rng = pd.date_range('20170101', periods = 12) ts = pd.Series(np.arange(1,13), index = rng) print(ts) print(ts.resample('5D').sum(),'→ 默认\n') print(ts.resample('5D', closed = 'left').sum(),'→ left\n') print(ts.resample('5D', closed = 'right').sum(),'→ right\n') print('-----') # closed:各时间段哪一端是闭合(即包含)的,默认 左闭右闭 # 详解:这里values为0-11,按照5D重采样 → [1,2,3,4,5],[6,7,8,9,10],[11,12] # left指定间隔左边为结束 → [1,2,3,4,5],[6,7,8,9,10],[11,12] # right指定间隔右边为结束 → [1],[2,3,4,5,6],[7,8,9,10,11],[12] print(ts.resample('5D', label = 'left').sum(),'→ leftlabel\n') print(ts.resample('5D', label = 'right').sum(),'→ rightlabel\n') # label:聚合值的index,默认为取左 # 值采样认为默认(这里closed默认)
rng = pd.date_range('2017/1/1 0:0:0', periods = 5, freq = 'H') ts = pd.DataFrame(np.arange(15).reshape(5,3), index = rng, columns = ['a','b','c']) print(ts) print(ts.resample('15T').asfreq()) print(ts.resample('15T').ffill()) print(ts.resample('15T').bfill()) # 低频转高频,主要是如何插值 # .asfreq():不做填充,返回Nan # .ffill():向上填充 # .bfill():向下填充
prng = pd.period_range('2016','2017',freq = 'M') ts = pd.Series(np.arange(len(prng)), index = prng) print(ts) print(ts.resample('15D').ffill()) # 升采样 ts.index = ts.index.astype('datetime64[ns]') print(ts.resample('3M', kind='period').sum()) # 降采样
Sed ac lorem felis. Ut in odio lorem. Quisque magna dui, maximus ut commodo sed, vestibulum ac nibh. Aenean a tortor in sem tempus auctor
December 4, 2020 at 3:12 pm
Sed ac lorem felis. Ut in odio lorem. Quisque magna dui, maximus ut commodo sed, vestibulum ac nibh. Aenean a tortor in sem tempus auctor
December 4, 2020 at 3:12 pm
Donec in ullamcorper quam. Aenean vel nibh eu magna gravida fermentum. Praesent eget nisi pulvinar, sollicitudin eros vitae, tristique odio.
December 4, 2020 at 3:12 pm
我是 s enim interduante quis metus. Duis porta ornare nulla ut bibendum
Rosie
6 minutes ago