如何在python中的groupby上运行更复杂的聚合函数

2024-09-02 05:22:44 发布

您现在位置:Python中文网/ 问答频道 /正文

这里是python初学者。只是用spyder做一些金融相关的工作。我可以在以下方面提供一些指导。。我甚至没有尝试过代码,因为我不知道从何开始

我有一个像这样组织的熊猫数据框架

Month, portfolio name, return

月份的格式为201501,201502。回报率是1%。我有几十万次观察

我想每天早上在投资组合名称级别生成统计数据-总回报、指定期间的回报、滚动卷数量、整个期间的最大提取量等

在高层次上,什么是最好的方法?我觉得我需要做的是按投资组合名称分组,然后应用不同的函数,这些函数存在于一些统计数据或财务包中,或者我可以自己编写,但由于某些原因,在实践中找不到这样的好例子。另外,在这段时间里,观察的顺序很重要,比如说最大下降量,我们分组时,我需要做些不同的事情吗?还是熊猫会按顺序阅读,只要是在datetime中

再次,寻找关于上述内容的一般建议,以及正确方向的指针。也许当我接近时,我可以在这里用代码进行故障排除

提前感谢您的回复。这是我的第一篇帖子,这个网站帮助我在6年以上的时间里一直在回答excel问题

数据样本
月份、投资组合名称、回报
201501,端口1,0.014
201502,端口1,0.0034
201503,端口1,-0.0045
201501,端口2,0.012
201502,端口2,0.0054
201503,端口2,-0.0174

编辑:我了解了熊猫的滚动()和扩展()功能,现在我对它们有了更多的了解。我也没有将AGG()用于自定义函数。请参见下面我如何为每个投资组合创建一个聚合,以获得两个不同的指标。如果我有任何具体问题,我会为你写一篇新的帖子。谢谢

    import numpy as np
import pandas as pd

def rolled_ret(arr):
    return arr.add(1).prod() -1
def ann_vol(arr):
    return np.std(arr) * np.sqrt(12)
def max_drawdown(arr):
    return arr.add(1).cumprod().diff().min()

full_return = df_final.groupby('PORTFOLIO_NAME')['RETURN'].agg(full_period_returns=rolled_ret,annualised_vol=ann_vol,MDD=max_drawdown)

Tags: 数据端口函数代码import名称return顺序
1条回答
网友
1楼 · 发布于 2024-09-02 05:22:44

以下是我的做法:

# Convert Month to datetime
df["MONTH"] = pd.to_datetime(df["MONTH"], format="%Y%m")

# create a new column with your period
df["PERIOD"] = df["MONTH"].dt.to_period("m")

# Now aggregate per period:
df.groupby(["PORTFOLIO_NAME","PERIOD"]).agg([("total",sum),("min",min),("max",max)])


|                                   |   ('RETURN', 'total') |   ('RETURN', 'min') |   ('RETURN', 'max') |
|:                 |           :|          :|          :|
| ('PORT1', Period('2015-01', 'M')) |                0.014  |              0.014  |              0.014  |
| ('PORT1', Period('2015-02', 'M')) |                0.0034 |              0.0034 |              0.0034 |
| ('PORT1', Period('2015-03', 'M')) |               -0.0045 |             -0.0045 |             -0.0045 |
| ('PORT2', Period('2015-01', 'M')) |                0.012  |              0.012  |              0.012  |
| ('PORT2', Period('2015-02', 'M')) |                0.0054 |              0.0054 |              0.0054 |
| ('PORT2', Period('2015-03', 'M')) |               -0.0174 |             -0.0174 |             -0.0174 |

相关问题 更多 >