pandas 中的列滚动平均值
Column-wise rolling mean in pandas
我正在处理一个包含数百万行和 15 列(时间序列特征)的大型数据集(宽格式)。
我想计算每个观察值的移动平均值。我可以使用下面的代码块来做到这一点。但是,它需要将数据帧转换为长格式。但是,我认为随着数据集的增长,这(将宽转换为长,反之亦然)效率会很低。另外,我需要处理 .groupby()
.
我可以按列方式计算滚动平均值吗?
请在下面找到当前方法的最小可重现示例。
import pandas as pd
df = pd.DataFrame({'id': range(3),
'Date_1': range(3, 6),
'Date_2': range(4, 7),
'Date_3': range(5, 8),
'Date_4': range(6, 9),
'Date_5': range(11, 14)})
df
id Date_1 Date_2 Date_3 Date_4 Date_5
0 0 3 4 5 6 11
1 1 4 5 6 7 12
2 2 5 6 7 8 13
df = pd.melt(df, id_vars= "id")
df = df.sort_values(["id", "variable"])
df
id variable value
0 0 Date_1 3
3 0 Date_2 4
6 0 Date_3 5
9 0 Date_4 6
12 0 Date_5 11
1 1 Date_1 4
4 1 Date_2 5
7 1 Date_3 6
10 1 Date_4 7
13 1 Date_5 12
2 2 Date_1 5
5 2 Date_2 6
8 2 Date_3 7
11 2 Date_4 8
14 2 Date_5 13
df["ma"] = df.groupby("id")["value"].rolling(3).mean().values
id variable value ma
0 0 Date_1 3 NaN
3 0 Date_2 4 NaN
6 0 Date_3 5 4.000000
9 0 Date_4 6 5.000000
12 0 Date_5 11 7.333333
1 1 Date_1 4 NaN
4 1 Date_2 5 NaN
7 1 Date_3 6 5.000000
10 1 Date_4 7 6.000000
13 1 Date_5 12 8.333333
2 2 Date_1 5 NaN
5 2 Date_2 6 NaN
8 2 Date_3 7 6.000000
11 2 Date_4 8 7.000000
14 2 Date_5 13 9.333333
所需的输出如下。可以删除 NaN 列,但目前这并不重要。
df[["id", "variable", "ma"]].pivot("id", columns = "variable",
values = "ma")
variable Date_1 Date_2 Date_3 Date_4 Date_5
id
0 NaN NaN 4.0 5.0 7.333333
1 NaN NaN 5.0 6.0 8.333333
2 NaN NaN 6.0 7.0 9.333333
编辑:感谢@Mortz 和@PanagiotisKanavo 的提示
谢谢
rolling
方法接受一个 axis
参数,您可以将其设置为 1 -
import pandas as pd
df = pd.DataFrame({'id': range(3),
'Date_1': range(3, 6),
'Date_2': range(4, 7),
'Date_3': range(5, 8),
'Date_4': range(6, 9),
'Date_5': range(11, 14)})
df = df.set_index('id')
df.rolling(3, axis=1).mean()
Date_1 Date_2 Date_3 Date_4 Date_5
id
0 NaN NaN 4.0 5.0 7.333333
1 NaN NaN 5.0 6.0 8.333333
2 NaN NaN 6.0 7.0 9.333333
我正在处理一个包含数百万行和 15 列(时间序列特征)的大型数据集(宽格式)。
我想计算每个观察值的移动平均值。我可以使用下面的代码块来做到这一点。但是,它需要将数据帧转换为长格式。但是,我认为随着数据集的增长,这(将宽转换为长,反之亦然)效率会很低。另外,我需要处理 .groupby()
.
我可以按列方式计算滚动平均值吗?
请在下面找到当前方法的最小可重现示例。
import pandas as pd
df = pd.DataFrame({'id': range(3),
'Date_1': range(3, 6),
'Date_2': range(4, 7),
'Date_3': range(5, 8),
'Date_4': range(6, 9),
'Date_5': range(11, 14)})
df
id Date_1 Date_2 Date_3 Date_4 Date_5
0 0 3 4 5 6 11
1 1 4 5 6 7 12
2 2 5 6 7 8 13
df = pd.melt(df, id_vars= "id")
df = df.sort_values(["id", "variable"])
df
id variable value
0 0 Date_1 3
3 0 Date_2 4
6 0 Date_3 5
9 0 Date_4 6
12 0 Date_5 11
1 1 Date_1 4
4 1 Date_2 5
7 1 Date_3 6
10 1 Date_4 7
13 1 Date_5 12
2 2 Date_1 5
5 2 Date_2 6
8 2 Date_3 7
11 2 Date_4 8
14 2 Date_5 13
df["ma"] = df.groupby("id")["value"].rolling(3).mean().values
id variable value ma
0 0 Date_1 3 NaN
3 0 Date_2 4 NaN
6 0 Date_3 5 4.000000
9 0 Date_4 6 5.000000
12 0 Date_5 11 7.333333
1 1 Date_1 4 NaN
4 1 Date_2 5 NaN
7 1 Date_3 6 5.000000
10 1 Date_4 7 6.000000
13 1 Date_5 12 8.333333
2 2 Date_1 5 NaN
5 2 Date_2 6 NaN
8 2 Date_3 7 6.000000
11 2 Date_4 8 7.000000
14 2 Date_5 13 9.333333
所需的输出如下。可以删除 NaN 列,但目前这并不重要。
df[["id", "variable", "ma"]].pivot("id", columns = "variable",
values = "ma")
variable Date_1 Date_2 Date_3 Date_4 Date_5
id
0 NaN NaN 4.0 5.0 7.333333
1 NaN NaN 5.0 6.0 8.333333
2 NaN NaN 6.0 7.0 9.333333
编辑:感谢@Mortz 和@PanagiotisKanavo 的提示 谢谢
rolling
方法接受一个 axis
参数,您可以将其设置为 1 -
import pandas as pd
df = pd.DataFrame({'id': range(3),
'Date_1': range(3, 6),
'Date_2': range(4, 7),
'Date_3': range(5, 8),
'Date_4': range(6, 9),
'Date_5': range(11, 14)})
df = df.set_index('id')
df.rolling(3, axis=1).mean()
Date_1 Date_2 Date_3 Date_4 Date_5
id
0 NaN NaN 4.0 5.0 7.333333
1 NaN NaN 5.0 6.0 8.333333
2 NaN NaN 6.0 7.0 9.333333