首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python分组方式

Python分组方式
EN

Stack Overflow用户
提问于 2020-07-30 01:08:35
回答 1查看 101关注 0票数 0

我正在尝试根据Sharpe按年/月分组对以下df进行排名。例如,在2018年1月,我想查看股票1,2,3的夏普指数,分别为0.4,0.3和0.6,并在1(低分)-5(最高分)的范围内对它们进行排名。我的标准是,如果夏普比率大于2,则分配分数5,如果夏普低于-0.5,则分配分数1,如果夏普在-0 .5和2之间,则使用线性增量来计算夏普分数。

代码语言:javascript
运行
复制
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

当我键入此代码时,我得到以下错误:

代码语言:javascript
运行
复制
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()

对此有什么想法吗?谢谢

EN

Stack Overflow用户

发布于 2020-07-30 14:58:20

看你的需求,而不是具体的方法。groupby()上的关键点apply()提供了一个数据帧,因此lambda函数需要对一个数据帧进行操作,该数据帧是groupby()定义的数据的子集

生成一个更大的测试列取dataset

  • assign()的result

  • pd.cut()才是你真正想要的
  1. 的核心。连续变量,你想放入,

  1. ,get,bin,value_counts()。然后修改它们以满足需求。duplicates="drop"

bins=4比所需的柱状图少一个,因为边界是由

  • 代码插入的,因此可能会出现重复的柱状图边界,因此NB

代码语言:javascript
运行
复制
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))

输出

代码语言:javascript
运行
复制
 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    5
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63158883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档