带有随附标签列的堆栈列
Stack columns with accompanying label column
我正在尝试堆叠一组列以适合内核密度估计器,以了解观察时间间隔的概率如何随着时间和价格的变化而变化。
我当前的DataFrame如下(不是精确值,只是一个例子):
date price 1d_change 2d_price_change
2017-01-03 10.2 1.0 7.8
2017-01-04 11.2 7.8 9.4
2017-01-05 17.0 3.6 1.5
2017-01-06 20.6 -2.1 ...
2017-01-07 18.5 ... ...
我想将每个价格变化列堆叠成一个单独的列,并创建另一个对应于时间变化的列,例如:
price_change time_interval
10.2 1
11.2 1
17.0 1
20.6 1
18.5 1
7.8 2
9.4 2
1.5 2
我知道我可以简单地使用 pd.hstack() 来实现这一点,但我不确定如何创建一个相应的列来标记时间的变化。
感谢收到的任何帮助。
正在设置源数据。
df = pd.DataFrame({
'date': ['2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06'],
'price': [10.2, 11.2, 17, 20.6],
'1d': [1, 7.8, 3.6, -2.1],
'2d': [7.8, 9.4, 1.5, 3.3]})
df = df[['date', 'price', '1d', '2d']]
print(df)
date price 1d 2d
0 2017-01-03 10.2 1.0 7.8
1 2017-01-04 11.2 7.8 9.4
2 2017-01-05 17.0 3.6 1.5
3 2017-01-06 20.6 -2.1 3.3
现在开始解决。基本思想如您提到的那样使用 stack
。但是在正确命名轴方面需要做一些准备工作,这样当我们堆叠和 reset_index
时,列名就是我们想要的。最后一步是简单地用适当的整数替换列名称标签“1d”、“2d”等。
x = df.set_index('date').stack()
x.index.set_names(['date', 'time_interval'], inplace=True)
x.name = 'price_change'
print(x)
date time_interval
2017-01-03 price 10.2
1d 1.0
2d 7.8
2017-01-04 price 11.2
1d 7.8
2d 9.4
2017-01-05 price 17.0
1d 3.6
2d 1.5
2017-01-06 price 20.6
1d -2.1
2d 3.3
stacked = x.reset_index().replace({'price': 1, '1d': 2, '2d': 3})
print(stacked)
date time_interval price_change
0 2017-01-03 1 10.2
1 2017-01-03 2 1.0
2 2017-01-03 3 7.8
3 2017-01-04 1 11.2
4 2017-01-04 2 7.8
5 2017-01-04 3 9.4
6 2017-01-05 1 17.0
7 2017-01-05 2 3.6
8 2017-01-05 3 1.5
9 2017-01-06 1 20.6
10 2017-01-06 2 -2.1
11 2017-01-06 3 3.3
我正在尝试堆叠一组列以适合内核密度估计器,以了解观察时间间隔的概率如何随着时间和价格的变化而变化。
我当前的DataFrame如下(不是精确值,只是一个例子):
date price 1d_change 2d_price_change
2017-01-03 10.2 1.0 7.8
2017-01-04 11.2 7.8 9.4
2017-01-05 17.0 3.6 1.5
2017-01-06 20.6 -2.1 ...
2017-01-07 18.5 ... ...
我想将每个价格变化列堆叠成一个单独的列,并创建另一个对应于时间变化的列,例如:
price_change time_interval
10.2 1
11.2 1
17.0 1
20.6 1
18.5 1
7.8 2
9.4 2
1.5 2
我知道我可以简单地使用 pd.hstack() 来实现这一点,但我不确定如何创建一个相应的列来标记时间的变化。
感谢收到的任何帮助。
正在设置源数据。
df = pd.DataFrame({
'date': ['2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06'],
'price': [10.2, 11.2, 17, 20.6],
'1d': [1, 7.8, 3.6, -2.1],
'2d': [7.8, 9.4, 1.5, 3.3]})
df = df[['date', 'price', '1d', '2d']]
print(df)
date price 1d 2d
0 2017-01-03 10.2 1.0 7.8
1 2017-01-04 11.2 7.8 9.4
2 2017-01-05 17.0 3.6 1.5
3 2017-01-06 20.6 -2.1 3.3
现在开始解决。基本思想如您提到的那样使用 stack
。但是在正确命名轴方面需要做一些准备工作,这样当我们堆叠和 reset_index
时,列名就是我们想要的。最后一步是简单地用适当的整数替换列名称标签“1d”、“2d”等。
x = df.set_index('date').stack()
x.index.set_names(['date', 'time_interval'], inplace=True)
x.name = 'price_change'
print(x)
date time_interval
2017-01-03 price 10.2
1d 1.0
2d 7.8
2017-01-04 price 11.2
1d 7.8
2d 9.4
2017-01-05 price 17.0
1d 3.6
2d 1.5
2017-01-06 price 20.6
1d -2.1
2d 3.3
stacked = x.reset_index().replace({'price': 1, '1d': 2, '2d': 3})
print(stacked)
date time_interval price_change
0 2017-01-03 1 10.2
1 2017-01-03 2 1.0
2 2017-01-03 3 7.8
3 2017-01-04 1 11.2
4 2017-01-04 2 7.8
5 2017-01-04 3 9.4
6 2017-01-05 1 17.0
7 2017-01-05 2 3.6
8 2017-01-05 3 1.5
9 2017-01-06 1 20.6
10 2017-01-06 2 -2.1
11 2017-01-06 3 3.3