为因子变量的每个级别比较数据帧的两个连续行的值 - Python Pandas
Comparing the value of two consecutive rows of a dataframe for each level of a factor variable - Python Pandas
我有一个 pandas 数据框,其中包含交易者随时间变化的头寸,我是这样创建的:
history = pd.read_csv(r"history.csv")
history = DataFrame(history, columns=['Symbol', 'Size', 'Entry Price',
'Mark Price', 'PNL (ROE %)', 'Last Position Update'])
frames = [historylast, history]
history = pd.concat(frames)
positions = historylast['Symbol'].tolist()
historylast_symbol_set = set(positions)
其中 historylast 是包含当前位置的最后一个抓取的数据库,history 是包含先前位置的本地副本。这是结果:
history = history.sort_values('Symbol')
print (history)
Symbol Size ... PNL (ROE %) Last Position Update
0 BNBUSDT 250.800 ... 7702.095588 2021-05-01 03:12:09
5 BNBUSDT 1000.800 ... 43351.359565 2021-04-29 03:51:41
0 BTCUSDT 54.422 ... 513277.155788 2021-04-25 21:03:13
0 BTCUSDT 54.422 ... 328896.563684 2021-04-25 21:03:13
1 DOGEUSDT 2600000.000 ... 46896.408000 2021-05-01 08:24:51
此数据框是通过汇总交易者一段时间内的头寸创建的。
我想做的是查看每个硬币的最后可用 'Size' 相对于前一个是否发生了变化。例如,对于BNBUSDT,上次大小为250,相对于之前的大小1000减少了75%。对于BTCUSDT,大小自上次以来没有变化。而DOGEUSDT没有之前的数据可以对比,所以还是100%买仓。
为了实现这一点,我虽然应该将数据帧拆分为不同的数据帧,每个符号一个,并使用 for 循环计算并保存百分比变化,但我遇到了困难,想知道是否没有更好的方法.任何帮助将不胜感激
以下面的 df 为例(也将使用列名 Symbol
和 Size
)
import pandas as pd
d = {'Symbol': ["A", "C", "A", "B", "A", "B", "A"], 'Size': [1, 1, 2, 3, 4, 5, 4]}
df = pd.DataFrame(data=d)
print(df)
>>>> Symbol Size
0 A 1
1 C 1
2 A 2
3 B 3
4 A 4
5 B 5
6 A 4
要检索每个符号的最后两行,请执行以下操作
g = df.groupby('Symbol').head(2)
g = g.sort_values('Symbol').reset_index(drop=True)
print(g)
>>> Symbol Size
0 A 1
1 A 2
2 B 3
3 B 5
4 C 1
之后,为了计算各个组的每个大小之间的差异,假设该更改的值是相关的,创建一个新列以显示该差异
g['Difference'] = g.groupby('Symbol').diff()
print(g)
>>> Symbol Size Difference
0 A 1 NaN
1 A 2 1.0
2 B 3 NaN
3 B 5 2.0
4 C 1 NaN
请注意,第一个元素显示为 NaN,因为它没有更改。
我有一个 pandas 数据框,其中包含交易者随时间变化的头寸,我是这样创建的:
history = pd.read_csv(r"history.csv")
history = DataFrame(history, columns=['Symbol', 'Size', 'Entry Price',
'Mark Price', 'PNL (ROE %)', 'Last Position Update'])
frames = [historylast, history]
history = pd.concat(frames)
positions = historylast['Symbol'].tolist()
historylast_symbol_set = set(positions)
其中 historylast 是包含当前位置的最后一个抓取的数据库,history 是包含先前位置的本地副本。这是结果:
history = history.sort_values('Symbol')
print (history)
Symbol Size ... PNL (ROE %) Last Position Update
0 BNBUSDT 250.800 ... 7702.095588 2021-05-01 03:12:09
5 BNBUSDT 1000.800 ... 43351.359565 2021-04-29 03:51:41
0 BTCUSDT 54.422 ... 513277.155788 2021-04-25 21:03:13
0 BTCUSDT 54.422 ... 328896.563684 2021-04-25 21:03:13
1 DOGEUSDT 2600000.000 ... 46896.408000 2021-05-01 08:24:51
此数据框是通过汇总交易者一段时间内的头寸创建的。 我想做的是查看每个硬币的最后可用 'Size' 相对于前一个是否发生了变化。例如,对于BNBUSDT,上次大小为250,相对于之前的大小1000减少了75%。对于BTCUSDT,大小自上次以来没有变化。而DOGEUSDT没有之前的数据可以对比,所以还是100%买仓。
为了实现这一点,我虽然应该将数据帧拆分为不同的数据帧,每个符号一个,并使用 for 循环计算并保存百分比变化,但我遇到了困难,想知道是否没有更好的方法.任何帮助将不胜感激
以下面的 df 为例(也将使用列名 Symbol
和 Size
)
import pandas as pd
d = {'Symbol': ["A", "C", "A", "B", "A", "B", "A"], 'Size': [1, 1, 2, 3, 4, 5, 4]}
df = pd.DataFrame(data=d)
print(df)
>>>> Symbol Size
0 A 1
1 C 1
2 A 2
3 B 3
4 A 4
5 B 5
6 A 4
要检索每个符号的最后两行,请执行以下操作
g = df.groupby('Symbol').head(2)
g = g.sort_values('Symbol').reset_index(drop=True)
print(g)
>>> Symbol Size
0 A 1
1 A 2
2 B 3
3 B 5
4 C 1
之后,为了计算各个组的每个大小之间的差异,假设该更改的值是相关的,创建一个新列以显示该差异
g['Difference'] = g.groupby('Symbol').diff()
print(g)
>>> Symbol Size Difference
0 A 1 NaN
1 A 2 1.0
2 B 3 NaN
3 B 5 2.0
4 C 1 NaN
请注意,第一个元素显示为 NaN,因为它没有更改。