在时序数据处理过程中,我们经常会遇到由于现实中的种种原因导致获取的数据缺失的情况,这里的数据缺失不单单是指为‘NaN'的数据,比如在AQI数据中,0是不可能出现的,这时候如果数据中出现了0也就是数据缺失了,最近正好在拿一个污染物的数据在做模型分析,中间就遇到了数据缺失值的问题,数据量本身不大,如果直接对缺失值进行丢弃处理的话会进一步减小数据量,所以这里考虑采用数据填充的方法来实现缺失数据的填充。我做了两个版本其中,第一个版本很简单可以不看,主要是简单实现以下效果。具体实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
#!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))
print res_list
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))
slice_list = one_all_list[i - tmp:i + tmp + 1 ]
res_list.append( int ( sum (slice_list) / (num - 1 )))
print res_list
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 ]
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]
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:https://blog.csdn.net/Together_CZ/article/details/85000866