pandas 基于多个标准的Python时间序列数据聚合

ibrsph3r  于 2023-05-21  发布在  Python
关注(0)|答案(1)|浏览(93)

我最近得到了我的ETF时间周期回报的解决方案-感谢Laurent -解决方案链接:https://stackoverflow.com/a/76136825/1332019
遗漏的是为SecurityID添加截至“起息日”的“市场价值”。
我还没有弄清楚如何将“市场价值”添加到迭代中。
以下是df_data时间序列数据源:一个账号有多个基金,有些是独立账户。

这是我想要的SUMMARY输出:

这是Laurent提供的解决方案,我们只需要市值和日期与正确的帐号关联。
下面是到目前为止工作正常的代码,只需要添加Market Value和Date以及正确的AccountNumber关联。再次感谢我对这段代码的任何帮助。

import pandas as pd
import numpy as np

#As of Date:
VME = '3/31/2023'

results = pd.DataFrame()
for etf in df_data["SecurityID"].unique():
    # 3 Month Return
    df_3m = df_data.loc[
        (df_data["SecurityID"] == etf)
        & (df_data["Date"] >= pd.to_datetime(VME) - pd.DateOffset(months=2))
        & (df_data["Date"] <= VME)
    ]
    df_3mror = (np.prod(df_3m["Return"] / 100 + 1) - 1) * 100

    # 1 Year Return
    df_1yr = df_data.loc[
        (df_data["SecurityID"] == etf)
        & (df_data["Date"] >= pd.to_datetime(VME) - pd.DateOffset(months=11))
        & (df_data["Date"] <= VME)
    ]
    df_1ror = (np.prod(df_1yr["Return"] / 100 + 1) - 1) * 100

    # 3 Year Return
    df_3yr = df_data.loc[
        (df_data["SecurityID"] == etf)
        & (df_data["Date"] >= pd.to_datetime(VME) - pd.DateOffset(months=35))
        & (df_data["Date"] <= VME)
    ]
    df_3ror = (np.prod(df_3yr["Return"] / 100 + 1) ** (12 / 36) - 1) * 100

    results = pd.concat(
        [
            results,
            pd.DataFrame(
                {
                    "AccountNumber": [85150],
                    "AssetID": [etf],
                    "3 Months": [df_3mror],
                    "1 YR ROR": [df_1ror],
                    "3 YRS ROR": [df_3ror],
                }
            ),
        ]
    )
print(results)
nmpmafwu

nmpmafwu1#

在当前的代码中,可以像这样将market value添加到最终的 Dataframe 中:

results = pd.concat(
    [
        results,
        pd.DataFrame(
            {
                "AccountNumber": [85150],
                "AssetID": [etf],
                "3 Months": [df_3mror],
                "1 YR ROR": [df_1ror],
                "3 YRS ROR": [df_3ror],
                "Market Value": [
                    df_data.loc[
                        (df_data["Date"] == pd.to_datetime(VME))
                        & (df_data["SecurityID"] == etf),
                        "Market Value",
                    ].values
                ][0],
            }
        ),
    ],
    ignore_index=True,
)

在for-loop之后和外部添加:

results["Date"] = VME

然后:

print(results)
# Output

   AccountNumber AssetID  3 Months  1 YR ROR  3 YRS ROR  Market Value       Date
0          85150     IVV  5.953382  5.953382   1.946333         40539  3/31/2023
1          85150     IWM  0.850816  0.850816   0.282805         17518  3/31/2023
2          85150     IWP  7.019195  7.019195   2.287028          8932  3/31/2023

相关问题