如何在Pyxirr库中按ID分组计算XIRR?解决InvalidPaymentsError
解决分组计算XIRR时的InvalidPaymentsError问题
错误翻译
InvalidPaymentsError: 必须同时包含支出(负值)和收入(正值)的支付记录
问题原因
XIRR的计算逻辑要求每组数据里必须同时存在正负支付记录(比如既有投入资金,也有收回资金),你的数据中部分ID对应的payment列全为正值或全为负值,导致无法完成XIRR计算。
解决方案
方案1:先过滤无效分组
先筛选出同时包含正负支付记录的ID,再针对这些有效分组计算XIRR:
import pandas as pd from pyxirr import xirr # 筛选出同时存在正负payment的ID valid_ids = df.groupby("ID")["payment"].apply(lambda x: (x < 0).any() and (x > 0).any()) valid_df = df[df["ID"].isin(valid_ids[valid_ids].index)] # 计算有效分组的XIRR result = valid_df.groupby("ID")[['date','payment']].apply(xirr)
方案2:添加错误处理跳过无效分组
通过try-except捕获错误,对无法计算的分组返回标记值(比如pd.NA):
import pandas as pd from pyxirr import xirr, InvalidPaymentsError def calculate_xirr(group): try: return xirr(group) except InvalidPaymentsError: return pd.NA # 用NA标记无法计算的分组 result = df.groupby("ID")[['date','payment']].apply(calculate_xirr)
内容的提问来源于stack exchange,提问作者Ajit
相关产品推荐
相关产品推荐

