我正在尝试根据Sharpe按年/月分组对以下df进行排名。例如,在2018年1月,我想查看股票1,2,3的夏普指数,分别为0.4,0.3和0.6,并在1(低分)-5(最高分)的范围内对它们进行排名。我的标准是,如果夏普比率大于2,则分配分数5,如果夏普低于-0.5,则分配分数1,如果夏普在-0 .5和2之间,则使用线性增量来计算夏普分数。
Year Month Stock Sharpe
2018 1 Stock 1 0.4
2018 1 Stock 2 0.3
2018 1 Stock 3 0.6
2018 2 Stock 1 0.2
2018 2 Stock 2 0.3
2018 2 Stock 3 0.5
2018 3 Stock 1 -0.2
2018 3 Stock 2 1.5
2018 3 Stock 3 0.7当我键入此代码时,我得到以下错误:
df.groupby(['Year','Month'])[['Sharpe]].apply(lambda x:1 if (x <= -0.5) else 1)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()对此有什么想法吗?谢谢
发布于 2020-07-30 14:58:20
看你的需求,而不是具体的方法。groupby()上的关键点apply()提供了一个数据帧,因此lambda函数需要对一个数据帧进行操作,该数据帧是groupby()定义的数据的子集
生成一个更大的测试列取dataset
assign()的result
pd.cut()才是你真正想要的,
value_counts()。然后修改它们以满足需求。duplicates="drop" bins=4比所需的柱状图少一个,因为边界是由
a = [[e for e in re.split("[ ][ ]+", l)] for l in data.split("\n")]
df = pd.DataFrame(a[1:], columns=a[0])
a = np.array(np.meshgrid([2018], [1,2],
[f"Stock {i+1}" for i in range(15)],
)).reshape(3,-1)
a = [a[0], a[1], a[2], [round(random.uniform(-1,2.5),1) for e in a[0]]]
df = pd.DataFrame({"Year":a[0], "Month":a[1], "Stock":a[2], "Sharpe":a[3]})
df["Sharpe"] = df["Sharpe"].astype(float)
def myrank(df):
# given boundaries get bins between boundaries
b = sorted([i.left
for i in df[df["Sharpe"].between(-0.5,2)]["Sharpe"]\
.value_counts(bins=4).index])
b[0] = -0.5 # rank 1 only goues to =< -0.5
b[-1] = 2 # rank 5 only goes to > 2
b += [-100,200] # add in lower and upper bounds
df["Rank"] = pd.cut(df["Sharpe"], sorted(b), labels=[i+1 for i in range(len(b)-1)],
duplicates="drop")
return df
df = df.assign(Rank=1).groupby(["Year","Month"]).apply(lambda df: myrank(df))
print(df.sort_values(["Year","Month","Sharpe"]).to_string(index=False))输出
Year Month Stock Sharpe Rank
2018 1 Stock 1 -1.0 1
2018 1 Stock 15 -0.7 1
2018 1 Stock 13 -0.2 2
2018 1 Stock 4 -0.1 2
2018 1 Stock 3 0.3 2
2018 1 Stock 2 0.4 3
2018 1 Stock 11 0.4 3
2018 1 Stock 9 0.5 3
2018 1 Stock 14 0.8 3
2018 1 Stock 12 1.0 4
2018 1 Stock 10 1.7 4
2018 1 Stock 8 1.8 4
2018 1 Stock 5 1.9 4
2018 1 Stock 7 1.9 4
2018 1 Stock 6 2.3 5
2018 2 Stock 9 -0.8 1
2018 2 Stock 13 -0.8 1
2018 2 Stock 15 0.1 2
2018 2 Stock 14 0.3 2
2018 2 Stock 7 0.5 3
2018 2 Stock 1 0.6 3
2018 2 Stock 10 0.6 3
2018 2 Stock 12 1.0 4
2018 2 Stock 3 1.2 4
2018 2 Stock 2 1.3 4
2018 2 Stock 4 1.3 4
2018 2 Stock 8 1.3 4
2018 2 Stock 6 1.4 4
2018 2 Stock 11 2.3 5
2018 2 Stock 5 2.4 5https://stackoverflow.com/questions/63158883
复制相似问题