一、rolling函数的基本用法
pandas 的rolling函数,功能比较强大,可以实现大部分统计功能,主要功能与用法如下:
df[col_name].rolling(window, min_periods
=
None
, freq
=
None
, center
=
False
, win_type
=
None
, on
=
None
, axis
=
0
, closed
=
None
)
min_periods : 参数的数值是整数,缺省无。窗口中需要有值的最小观察次数(否则结果为na)。对于由偏移量指定的窗口,最小时段将默认为1。否则,最小时段将默认为窗口大小。
center : 参数的是布尔值 , 缺省为False,设置标签在窗口的中心。
win_type : 参数为字符串, 缺省为None提供一个窗口类型. 如果是None,也就是缺省,全部的点都平均加权.
win——type的类型:
boxcar
triang
blackman
hamming
bartlett
parzen
bohman
blackmanharris
nuttall
barthann
kaiser (needs beta)
gaussian (needs std)
general_gaussian (needs power, width)
slepian (needs width).
具体这些类型的使用,参考: scipy.signal window functions.
on:参数为字符串,可选,对于数据帧,计算滚动窗口而不是索引的列
axis:参数为0或1,默认为0,0为按列,1为按行
close:参数为字符串,默认无,在“right”、“left”、“both”或“neither”终结点上关闭间
隔。对于基于偏移量的窗口,它默认为“left”。对于固定窗口,默认为“both”。
在使用rolling函数后,我们还可以使用下面的统计方法对数据进行汇聚,比如:
rolling.count()计算非空观察数
rolling. sum()值的总和
rolling. mean()平均值
rolling. median()计算中值
rolling. min()得到最小值
rolling. max()得到最大值
rolling. std()求贝塞尔修正样本标准差
rolling. var()求无偏方差
rolling. skew()样本偏度
rolling. kurt()样本峰度
rolling. quantile()样本分位数(参数值为百分比)
rolling. apply()这个自己可以定义函数来灵活运用。
rolling. cov()无偏协方差在数据处理中用于衡量两个变量的总体误差。
rolling. corr()相关系数, 它是研究变量之间线性相关程度的量
它的计算与取值原理如下:
注:图片来自https://www.cnblogs.com/traditional/p/13776180.html,对原作者表示感谢,侵删
二、重写rolling,判断窗口期内数据为升序还是降序,并输出
原理思路:和上面基本相同,根据设定的window,通过循环取值,并对所取的值进行升序降序判断,实现对升续还是降序数据的查找。
def ascend_decend_series_finder(df,col_name,window=5):
"""查找df指定序列中窗口期内的数字是升序还是降序,并将期输出
Params:
df: pandas 数据框文件
col_name:指定查找列的列名
window:窗口周期
Returns:
升降序与序列位置、序列值
"""
df_data = df[col_name]
flag1=0
try:
for i in range(len(df_data)):
arr = df_data[i:window+i]
for i in range(window):
# i = 0,1,2,...window-1;
if i <= window-2:
if arr.iloc[i] < arr.iloc[i+1]:
flag0 = 1
elif arr.iloc[i] > arr.iloc[i+1]:
flag0 = -1
if i == 0:
flag1=flag0
else:
flag1 = 0
if flag1 == 1:
print('升势',arr)
elif flag1 == -1:
print('降势',arr)
except:
pass
return
print(ascend_decend_series_finder(new_csv_df,'Site_R',window=4))
输出结果如下:
这种方法有一个缺陷,就是数据量大、窗口大的情况下,计算速度比较慢。有优化的思路,但是鉴于时间有限,没有进行深究。
谁有更好的解决思路和结果,欢迎斧正!