pandas 重写rolling功能,判断window窗口期内数据为升降还是降序

一、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))

输出结果如下:

 

这种方法有一个缺陷,就是数据量大、窗口大的情况下,计算速度比较慢。有优化的思路,但是鉴于时间有限,没有进行深究。

谁有更好的解决思路和结果,欢迎斧正!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃饭的家伙事儿

您的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值