python 基于滑动平均思想实现缺失数据填充

     在时序数据处理过程中,我们经常会遇到由于现实中的种种原因导致获取的数据缺失的情况,这里的数据缺失不单单是指为‘NaN’的数据,比如在AQI数据中,0是不可能出现的,这时候如果数据中出现了0也就是数据缺失了,最近正好在拿一个污染物的数据在做模型分析,中间就遇到了数据缺失值的问题,数据量本身不大,如果直接对缺失值进行丢弃处理的话会进一步减小数据量,所以这里考虑采用数据填充的方法来实现缺失数据的填充。我做了两个版本其中,第一个版本很简单可以不看,主要是简单实现以下效果。具体实现如下:
 

#!usr/bin/env python
#encoding:utf-8
from __future__ import division

'''
__Author__:沂水寒城
功能: python 基于滑动平均思想实现简易的缺失数据填充
'''




def zeroDataFill(one_all_list):
    '''
    对于0数据处理,简单实现版本,可忽略
    '''
    res_list=[]
    for i in range(len(one_all_list)):
        if one_all_list[i]!=0:
            res_list.append(one_all_list[i])
        else:
            if i==0:
                for j in range(1,len(one_all_list)):
                    if one_all_list[j]!=0:
                        res_list.append(one_all_list[j])
                        break
            elif i==len(one_all_list)-1:
                res_list.append(int(sum(res_list[-3:-1])/2))
            else:
                tmp=0
                for j in range(i,len(one_all_list)):
                    if one_all_list[j]!=0:
                        tmp=one_all_list[j]
                        break
                now=(res_list[i-1]+tmp)/2
                res_list.append(int(now))
    return res_list




def dataProcessing(one_all_list,num=7):
    '''
    对于时间序列数据中的 0 进行处理,采用滑动平均的方法来填充(默认时间为一周)
    '''
    nozero_list=[one for one in one_all_list if one!=0]
    before_avg,last_avg=sum(nozero_list[:num])/num,sum(nozero_list[-1*num:])/num
    res_list=[]
    for i in range(len(one_all_list)):
        if one_all_list[i]!=0:
            res_list.append(one_all_list[i])
        else:
            tmp=int(num/2)+1
            if i<=tmp:
                res_list.append(int(before_avg))
            elif i>=len(one_all_list)-tmp:
                res_list.append(int(last_avg))
            else:
                slice_list=one_all_list[i-tmp:i+tmp+1]
                res_list.append(int(sum(slice_list)/(num-1)))
    return res_list


if __name__=='__main__':
    one_all_list=[0,12,3,5,1,5,7,8,4,0,12,14,0,0,45,34,67,43,0,9,1,0]
    result1=zeroDataFill(one_all_list)
    result2=dataProcessing(one_all_list,num=7)
    print 'result1: ', result1
    print 'result2: ', result1
    print len(result1),len(result2)

      结果如下:

result1:  [12, 12, 3, 5, 1, 5, 7, 8, 4, 8, 12, 14, 29, 37, 45, 34, 67, 43, 26, 9, 1, 17]
result2:  [12, 12, 3, 5, 1, 5, 7, 8, 4, 8, 12, 14, 29, 37, 45, 34, 67, 43, 26, 9, 1, 17]
22 22
[Finished in 0.2s]

 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Together_CZ

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值