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

问题描述 投票:1回答:1

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

我有一个pandas的数据框架,是这样组织的

Month, portfolio name, return

月的格式是 201501,201502.回报率是%。我有几十万个观察值。

我想在每天早上以投资组合名称为单位进行统计--总回报率、指定时期的回报率、滚动波动率数字、整个时期的最大缩减量等。

在高层次上,什么是最好的方法?我觉得我需要做的是按投资组合名称进行分组,然后应用不同的函数,这些函数要么存在于一些统计或金融软件包中,要么我可以自己编写,但由于某些原因,我无法找到实践中的好例子。另外,对于像最大缩水这样的东西,观察的顺序很重要--当我们groupby的时候,我是否需要在这里做一些不同的事情,或者只要是在datetime中,pandas就会按顺序读取?

再一次,希望得到关于上述问题的一般性建议,以及正确方向的指点。也许当我接近的时候,我可以在这里用代码来排除故障。

先谢谢大家的回复。这是我第一次发帖,6年多来,这个网站帮助我留住了一份回答excel问题的工作。

数据样本 MONTH,PORTFOLIO_NAME,RETURN 201501,PORT1,0.014 201502,PORT1,0.0034 201503,PORT1,-0.0045 201501,PORT2,0.012 201502,PORT2,0.0054 201503,PORT2,-0.0174

EDIT:我了解了pandas的rolling()和expansion()功能,现在明白了很多。我也一直没有使用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)
python pandas pandas-groupby finance
1个回答
0
投票

下面是我的方法。

# 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 |
© www.soinside.com 2019 - 2024. All rights reserved.