gpt4 book ai didi

python-3.x - Pandas - 在多个时间序列的组内插值/估算缺失值

转载 作者:行者123 更新时间:2023-12-04 15:39:41 26 4
gpt4 key购买 nike

我正在处理一个数据集,该数据集包含多个用户的月度信息。每个用户都有不同的时间范围。每个用户也缺少数据。我想做的是根据每个用户的时间范围(从 min.time 到 max.time 以月为单位)为每个用户填写缺失的数据。

由于数据模式属于时间序列,线性插值没有意义。我还根据“用户”和“日期”为数据框设置了多索引,但是基于“时间”的插值不起作用(因为它尚未实现)

x = pd.DataFrame({'user': ['a','a','a','a','a','a','a','a','b','b','b','b','b','b','b','b','b','c','c','c','c','c','c','c','c'],'dt':['2015-01-01','2015-02-01','2015-03-01','2015-04-01','2015-05-01','2015-06-01','2015-07-01','2015-08-01','2016-01-01','2016-02-01','2016-03-01','2016-04-01','2016-05-01','2016-06-01','2016-07-01','2016-08-01','2016-09-01','2017-01-01','2017-02-01','2017-03-01','2017-04-01','2017-05-01','2017-06-01','2017-07-01','2017-08-01'], 'val': [1,33,np.nan,1,np.nan,4,2,np.nan,66,2,5,1,np.nan,np.nan,7,5,np.nan,1,np.nan,7,4,np.nan,5,3,np.nan]})

user dt val
0 a 2015-01-01 1
1 a 2015-02-01 33
2 a 2015-03-01 NaN
3 a 2015-04-01 1
4 a 2015-05-01 NaN
5 a 2015-06-01 4
6 a 2015-07-01 2
7 a 2015-08-01 NaN
8 b 2016-01-01 66
9 b 2016-02-01 2
10 b 2016-03-01 5
11 b 2016-04-01 1
12 b 2016-05-01 NaN
13 b 2016-06-01 NaN
14 b 2016-07-01 7
15 b 2016-08-01 5
16 b 2016-09-01 NaN
17 c 2017-01-01 1
18 c 2017-02-01 NaN
19 c 2017-03-01 7
20 c 2017-04-01 4
21 c 2017-05-01 NaN
22 c 2017-06-01 5
23 c 2017-07-01 3
24 c 2017-08-01 NaN

在上面的数据集中,“val”列有几个缺失值,我正在弄清楚如何为多个“用户”自动执行此过程。

此外,考虑到没有,为每个用户构建时间序列模型是否有意义。每个用户的数据点数?

任何输入/解决方法将不胜感激。

谢谢,卢克。

最佳答案

你可以使用 Groupby + apply根据用户填写缺失值。无需为每个用户创建系列。

这是一个如何填写缺失数据的示例(除了这些方法之外,您还可以创建自己的函数):

1.用 interpolate 对每个组进行插值.填充fillna

x['val']=x.groupby('user')['val'].apply(lambda x: x.fillna(x.interpolate()))
print(x)

   user          dt   val
0 a 2015-01-01 1.0
1 a 2015-02-01 33.0
2 a 2015-03-01 17.0
3 a 2015-04-01 1.0
4 a 2015-05-01 2.5
5 a 2015-06-01 4.0
6 a 2015-07-01 2.0
7 a 2015-08-01 2.0
8 b 2016-01-01 66.0
9 b 2016-02-01 2.0
10 b 2016-03-01 5.0
11 b 2016-04-01 1.0
12 b 2016-05-01 3.0
13 b 2016-06-01 5.0
14 b 2016-07-01 7.0
15 b 2016-08-01 5.0
16 b 2016-09-01 5.0
17 c 2017-01-01 1.0
18 c 2017-02-01 4.0
19 c 2017-03-01 7.0
20 c 2017-04-01 4.0
21 c 2017-05-01 4.5
22 c 2017-06-01 5.0
23 c 2017-07-01 3.0
24 c 2017-08-01 3.0

<强>2。 ffill方法:

x['val']=x.groupby('user')['val'].apply(lambda x: x.ffill())

   user          dt   val
0 a 2015-01-01 1.0
1 a 2015-02-01 33.0
2 a 2015-03-01 33.0
3 a 2015-04-01 1.0
4 a 2015-05-01 1.0
5 a 2015-06-01 4.0
6 a 2015-07-01 2.0
7 a 2015-08-01 2.0
8 b 2016-01-01 66.0
9 b 2016-02-01 2.0
10 b 2016-03-01 5.0
11 b 2016-04-01 1.0
12 b 2016-05-01 1.0
13 b 2016-06-01 1.0
14 b 2016-07-01 7.0
15 b 2016-08-01 5.0
16 b 2016-09-01 5.0
17 c 2017-01-01 1.0
18 c 2017-02-01 1.0
19 c 2017-03-01 7.0
20 c 2017-04-01 4.0
21 c 2017-05-01 4.0
22 c 2017-06-01 5.0
23 c 2017-07-01 3.0
24 c 2017-08-01 3.0

3.使用mean组。填充 fillna :

x['val']=x.groupby('user')['val'].apply(lambda x: x.fillna(x.mean()))
print(x)

   user          dt        val
0 a 2015-01-01 1.000000
1 a 2015-02-01 33.000000
2 a 2015-03-01 8.200000
3 a 2015-04-01 1.000000
4 a 2015-05-01 8.200000
5 a 2015-06-01 4.000000
6 a 2015-07-01 2.000000
7 a 2015-08-01 8.200000
8 b 2016-01-01 66.000000
9 b 2016-02-01 2.000000
10 b 2016-03-01 5.000000
11 b 2016-04-01 1.000000
12 b 2016-05-01 14.333333
13 b 2016-06-01 14.333333
14 b 2016-07-01 7.000000
15 b 2016-08-01 5.000000
16 b 2016-09-01 14.333333
17 c 2017-01-01 1.000000
18 c 2017-02-01 4.000000
19 c 2017-03-01 7.000000
20 c 2017-04-01 4.000000
21 c 2017-05-01 4.000000
22 c 2017-06-01 5.000000
23 c 2017-07-01 3.000000
24 c 2017-08-01 4.000000

关于python-3.x - Pandas - 在多个时间序列的组内插值/估算缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58284671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com