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)
每天投资组合不同,并不总是从前一天拥有相同的股票.
这个解决方案更明确,更少大熊猫式,但它只涉及一次遍历所有行而不创建大量的临时列,因此可能更快.它需要一个额外的状态变量,我把它包装成一个闭包,不必创建一个类.
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)