【发布时间】:2022-01-21 02:50:32
【问题描述】:
我有以下数据框:
from datetime import datetime as dt
import numpy as np
import pandas as pd
inputs = {
'indicator':[69.88, 85.05, 50.19, 71.08, 44.83, 36.32, 29.42, 44.47, 34.71, 37.91, 32.78, 35.85, 38.98, 23.16, 73.22, 77.77, 49.22, 59.1, 83.38, 88.5, 47.78],
'short_trade':[0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0],
'pnl':[-0.0, -0.0, 0.05, -0.06, 0.05, 0.0, 0.0, -0.0, 0.0, -0.0, 0.0, -0.0, -0.0, 0.0, -0.0, -0.0, 0.01, -0.0, -0.0, -0.01, 0.03]
}
_idx = pd.date_range('2018-08-10','2018-09-09',freq='D').to_series()
_idx = _idx[_idx.dt.dayofweek < 5]
data = pd.DataFrame(inputs, index = _idx)
我的目标是创建一个新的 DataFrame,如下面的屏幕截图所示。在short_trade != 0 或pnl != 0 时进行分组(相同)。
新 DataFrame (trade_n) 的第一列只是每个不同交易的 ID。新列 pnl 是初始 DataFrame 中每个组的总和。最后,duration (D) 是每笔交易持续的天数。
我找到了一种解决方法,循环遍历 DataFrame 并检查每一行,但我很确定使用 pandas/numpy 有一个更有效的解决方案。
【问题讨论】:
-
您选择的逻辑是什么?因为您首先选择 3 行,然后选择 1,然后选择 2
-
您要选择 pnl != 0 的行吗?加上之前的 0
-
是的,或者 short_trade != 0,都是一样的。将编辑Q,谢谢指出
-
在您的预期输出中,第二行的
pnl是0.01- 不应该是0.005,因为这是0.00和0.01的平均值,或者应该是它被夹在0.01。 -
@richardec 这只是
short_trade == 1时我会得到的价格(回报)的pct_change()。稍后我使用该列进行cumsum(),然后获得总 PnL。我没有在此处发布该部分,因为我想让它尽可能简单(出于同样的目的,我还对pnl和indicator数字进行了四舍五入)
标签: python pandas dataframe numpy