第四章. Pandas进阶
4.9 时间序列
重采样(resample)
在Pandas中,对时间序列频率的调整称为重采样,即时间序列从一个频率转换到另一个频率的过程,由周统计变成月统计
1).语法:
- 4.8章 第4点 已介绍过:链接: DataFrame.resample
2).示例:
import pandas as pd
#重采样:将1分钟的时间序列转换成5分钟
index=pd.date_range('2022/11/29',periods=10,freq='T')
Series=pd.Series(range(10),index=index)
print(Series)
print("*"*50)
df_sum=Series.resample('5T').sum()
print(df_sum)
结果展示:
降采样(resample)
在Pandas中,周期由高频率转向低频率称为降采样,例如按日统计变成按年统计
1).示例1:
import pandas as pd
# 降采样:按年统计销售量
pd.set_option('display.unicode.ambiguous_as_wide', True) # 处理数据的列标题与数据无法对齐的情况
pd.set_option('display.unicode.east_asian_width', True) # 无法对齐主要是因为列标题是中文
df = pd.read_excel('F:\\Note\\图书采购清单.xlsx', sheet_name='Sheet1')
df1 = df.set_index('发货日期')
df2 = df1['原价'].resample('AS').sum()
print(df2)
print('*' * 50)
结果展示:
升采样(resample)
在Pandas中,周期由低频率转向高频率称为升采样,例如按天统计变成按小时统计
1).示例1:
import pandas as pd
import numpy as np
# 升采样:
index = pd.date_range('2022/11/29', periods=2, freq='D')
Series = pd.Series(np.arange(1, 3), index=index)
print(Series)
print("*" * 50)
df1 = Series.resample('8H').asfreq().bfill() # ffill:向前填充 bfill:向后填充
print(df1)
结果展示:
时间序列数据汇总(ohlc)
1).语法:
DataFrame.resample.ohlc()
参数说明:
返回值:DataFrame对象, 即每组数据的open(开),close(关),high(高),low(低)值
2).示例:
import pandas as pd
# 时间序列数据汇总:找出一组数据的开始数据,结束数据,最大值,最小值
import numpy as np
index = pd.date_range('2022/11/29', periods=12, freq='T')
Series = pd.Series(np.random.random(12), index=index)
print(Series)
print("*" * 50)
df1 = Series.resample('6T').ohlc()
print(df1)
结果展示:
移动窗口数据计算(rolling)
通过重采样可以得到想要的任何频率的数据,但是这些数据也只是一个时点的数据,那么就存在一个数问题:时点的数据波动较大,某一点的数据就不能很好的表现它本身的特性,就引入了移动窗口的概念,简单得说:为了提升数据的可靠性,将某点的取值扩大到包含这个点的一段区域,用区间来进行判断,这个区间就是窗口
1).语法:
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
参数说明:
window:时间窗的大小,数值int:即向前几个数据,offset:即表示时间窗口的大小
min_periods:每个窗口最少包含的观测值数量,小于这个值的窗口结果为NA,值可以是int,offset类型(默认值为1)
center:把窗口的标签设置为居中,布尔型,默认False
win_type: 窗口的类型,截取窗的各种函数。字符串类型,默认为None
on: 可选参数,对于dataframe而言,指定要计算移动窗口的列,值为列名
axis:0:表示列,1:表示行 ,默认值为0
closed:定义区间的开闭,支持int类型的window,对于offset类型默认是左开右闭,即默认为right,可以根据情况指定为left、both等
2).示例:
import pandas as pd
import numpy as np
# 移动窗口数据计算
index = pd.date_range('2022/11/29', periods=8, freq='T')
Series = pd.Series(np.random.random(8), index=index)
print(Series)
print("*" * 50)
df_mean = Series.rolling('3T', min_periods=1).mean()
print(df_mean)
结果展示: