Press "Enter" to skip to content

Pandas中时间窗函数rolling()和expanding()的使用

rolling()函数

在做数据分析过程中,我们常常需要需要对有时间关系的数据进行整理。比如我们想要得到某一时刻过去30分钟的销量(产量,速度,消耗量等),传统方法复杂消耗资源较多,pandas提供的rolling使用简单,速度较快。

举个例子

打开一份数据

假设我想知道浦发银行收盘价的前15天的均线?这个时候就可以使用时间窗函数rolling

具体操作如下:

import pandas as pd

pd.set_option('display.unicode.ambiguous_as_wide', True)  #处理数据的列标题与数据无法对齐的情况
pd.set_option('display.unicode.east_asian_width', True)   #无法对齐主要是因为列标题是中文
 
pd.set_option('expand_frame_repr', False)  # 当列太多时不换行
pd.set_option('display.max_columns',None,'display.max_rows', None) #显示最多行数,超出该数以省略号表示
pd.set_option('display.width', 100) #数据显示总宽度

df=pd.read_csv(r'D:/BaiduNetdiskWorkspace/A股基础交易数据库/stock/sh600000.csv',skiprows=1,encoding='gbk')
df['MA15']=df['收盘价'].rolling(15).mean()

print(df)

这样就得出它的15天均线了,但是我们会看到前面有空值,那是因为,这里窗口长度为15,他们前面的数都不够15,所以得到空值,如果想要处理它,就需要增加一个参数 min_periods=1 ,直译过来是窗口中需要有值的最小观测数量(表示窗口最少包含的观测值),例如:前面的长度是14那就就把前面14个值相加然后除以14,得到均值,这样以此类推。

df['MA15']=df['收盘价'].rolling(15,min_periods=1).mean()

这样处理前面的空值就没有了

expanding()函数

expanding()函数的参数,与rolling()函数的参数用法相同,类似cumsum()函数的累计求和,其优势在于还可以进行更多的聚类计算;

下面还是用一个例子来演示一下

打开一份数据

假设我想求 收盘价至今 的平均值,就可以使用这个expanding()函数

具体操作如下:

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_csv(r'data\sh600000.csv',encoding='gbk')
df['交易日期']=pd.to_datetime(df['交易日期'])
df.set_index('交易日期',inplace=True)
df['收盘价_至今均值']=df['收盘价'].expanding().mean()

print(df[['收盘价','收盘价_至今均值']])

除了求它的平均值,它还可以求最大值max(),最小值min(),标准偏差std()等。

发表评论

您的电子邮箱地址不会被公开。