Pandas:分配具有多个条件和日期阈值的列

Mys*_*r91 11 python finance portfolio dataframe pandas

编辑:

我在大熊猫数据框df中有一个金融投资组合,其中指数是日期,我每个日期有多个金融股.

例如数据帧:

Date    Stock   Weight  Percentile  Final weight
1/1/2000    Apple   0.010   0.75    0.010
1/1/2000    IBM    0.011    0.4     0
1/1/2000    Google  0.012   0.45    0
1/1/2000    Nokia   0.022   0.81    0.022
2/1/2000    Apple   0.014   0.56    0
2/1/2000    Google  0.015   0.45    0
2/1/2000    Nokia   0.016   0.55    0
3/1/2000    Apple   0.020   0.52    0
3/1/2000    Google  0.030   0.51    0
3/1/2000    Nokia   0.040   0.47    0
Run Code Online (Sandbox Code Playgroud)

我创建了Final_weight这样做的分配值Weight,只要Percentile大于0.7

现在我希望这有点复杂,我仍然希望Weight被分配到Final_weight什么时候Percentile is > 0.7,但是在这个日期之后(在未来的任何时候),而不是在股票Percentile没有时变为0 >0.7,我们仍然会得到权重只要股票Percentile在上方0.5(即持有头寸超过一天).

然后如果股票低于0.5(在不久的将来)那么Final_weight would become 0.

例如,从上面修改的数据框:

Date    Stock   Weight  Percentile  Final weight
1/1/2000    Apple   0.010   0.75    0.010
1/1/2000    IBM     0.011   0.4     0
1/1/2000    Google  0.012   0.45    0
1/1/2000    Nokia   0.022   0.81    0.022
2/1/2000    Apple   0.014   0.56    0.014
2/1/2000    Google  0.015   0.45    0
2/1/2000    Nokia   0.016   0.55    0.016
3/1/2000    Apple   0.020   0.52    0.020
3/1/2000    Google  0.030   0.51    0
3/1/2000    Nokia   0.040   0.47    0
Run Code Online (Sandbox Code Playgroud)

每天投资组合不同,并不总是从前一天拥有相同的股票.

cro*_*nos 6

这个解决方案更明确,更少大熊猫式,但它只涉及一次遍历所有行而不创建大量的临时列,因此可能更快.它需要一个额外的状态变量,我把它包装成一个闭包,不必创建一个类.

def closure():
    cur_weight = {}
    def func(x):
        if x["Percentile"] > 0.7:
            next_weight = x["Weight"]
        elif x["Percentile"] < 0.5 :
            next_weight = 0
        else:
            next_weight = x["Weight"] if cur_weight.get(x["Stock"], 0) > 0 else 0
        cur_weight[x["Stock"]] = next_weight
        return next_weight
    return func

df["FinalWeight"] = df.apply(closure(), axis=1)
Run Code Online (Sandbox Code Playgroud)