Python基于滑动平均思想实现缺失数据填充的方法
在时序数据处理过程中,我们经常会遇到由于现实中的种种原因导致获取的数据缺失的情况,这里的数据缺失不单单是指为‘NaN'的数据,比如在AQI数据中,0是不可能出现的,这时候如果数据中出现了0也就是数据缺失了,最近正好在拿一个污染物的数据在做模型分析,中间就遇到了数据缺失值的问题,数据量本身不大,如果直接对缺失值进行丢弃处理的话会进一步减小数据量,所以这里考虑采用数据填充的方法来实现缺失数据的填充。我做了两个版本其中,第一个版本很简单可以不看,主要是简单实现以下效果。具体实现如下:
#!usr/bin/envpython #encoding:utf-8 from__future__importdivision ''' __Author__:沂水寒城 功能:python基于滑动平均思想实现简易的缺失数据填充 ''' defzeroDataFill(one_all_list): ''' 对于0数据处理,简单实现版本,可忽略 ''' res_list=[] foriinrange(len(one_all_list)): ifone_all_list[i]!=0: res_list.append(one_all_list[i]) else: ifi==0: forjinrange(1,len(one_all_list)): ifone_all_list[j]!=0: res_list.append(one_all_list[j]) break elifi==len(one_all_list)-1: res_list.append(int(sum(res_list[-3:-1])/2)) else: tmp=0 forjinrange(i,len(one_all_list)): ifone_all_list[j]!=0: tmp=one_all_list[j] break now=(res_list[i-1]+tmp)/2 res_list.append(int(now)) printres_list returnres_list defdataProcessing(one_all_list,num=7): ''' 对于时间序列数据中的0进行处理,采用滑动平均的方法来填充(默认时间为一周) ''' nozero_list=[oneforoneinone_all_listifone!=0] before_avg,last_avg=sum(nozero_list[:num])/num,sum(nozero_list[-1*num:])/num res_list=[] foriinrange(len(one_all_list)): ifone_all_list[i]!=0: res_list.append(one_all_list[i]) else: tmp=int(num/2)+1 ifi<=tmp: res_list.append(int(before_avg)) elifi>=len(one_all_list)-tmp: res_list.append(int(last_avg)) slice_list=one_all_list[i-tmp:i+tmp+1] res_list.append(int(sum(slice_list)/(num-1))) printres_list returnres_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] zeroDataFill(one_all_list) dataProcessing(one_all_list,num=7)
结果如下:
[12,12,3,5,1,5,7,8,4,8,12,14,29,37,45,34,67,43,26,9,1,17]
[5,12,3,5,1,5,7,8,4,12,14,45,34,67,43,30,33,9,1,30,8]
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接