[英]How do you run more complex aggregation functions on groupby in python
从这里开始使用 python。 只是将 spyder 用于一些与金融相关的工作。 我可以在下面使用一些指导。我什至没有尝试过代码,因为我不知道从什么开始。
我有一个像这样组织的 pandas dataframe
Month, portfolio name, return
月份的格式为201501,201502
。 回报是一个%。 我有几十万个观察结果。
我想每天早上在投资组合名称级别生成统计数据 - 总回报、指定时期的回报、滚动交易量、整个时期的最大回撤等。
在高层次上,最好的方法是什么? 我觉得我需要做的是 groupby 投资组合名称,只需应用某些统计数据或财务 package 中存在的不同功能,或者我可以自己编写,但由于某种原因在实践中找不到很好的例子。 此外,由于在此期间的最大回撤,观察的顺序很重要 - 当我们分组时我是否需要在这里做一些不同的事情,或者 pandas 是否会按顺序读取它,只要它在日期时间?
再次,寻找关于上述内容的一般建议,以及正确方向的指针。 也许当我接近时,我可以在这里使用代码进行故障排除。
提前感谢您的任何回复。 这是我的第一篇文章,这个网站帮助我在 6 年多的时间里继续回答 excel 问题。
数据样本
MONTH,PORTFOLIO_NAME,返回
201501,PORT1,0.014
201502,PORT1,0.0034
201503,PORT1,-0.0045
201501,PORT2,0.012
201502,PORT2,0.0054
201503,PORT2,-0.0174
编辑:我了解了 pandas 的 rolling() 和 expand() 功能,现在对它有了更多的了解。 我也没有将 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)
这是我将如何处理它:
# 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 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.