我如何优化此 pandas 数据框代码

How can I optimize this pandas dataframe code

我有一个大型数据框 (resultsDF),它设置了一种三列索引:[Ticker, Fiscal Year, Fiscal Period] 就像这样

      Ticker  Fiscal Year Fiscal Period  Market Returns       ROI
21        AA         2017            Q3        0.028904  0.006549
23        AA         2019            Q2        0.038022 -0.026191
24        AA         2018            Q3        0.024746 -0.002533
25        AA         2018            Q4       -0.058857  0.004141
26        AA         2019            Q3        0.010057 -0.015065
...      ...          ...           ...             ...       ...
36582    ZTS         2017            Q1        0.056305  0.031115
36583    ZTS         2019            Q1        0.014543  0.028669
36584    ZTS         2018            Q4       -0.058857  0.032013
36585    ZTS         2019            Q4        0.033800  0.033261
36586    ZTS         2020            Q1       -0.041786  0.036693

第一部分: 我正在创建一个列 Beat Market (Overall) 来跟踪代码的 平均 投资回报率是否大于 平均 return的市场。由于它跟踪平均值,因此对于整个股票,该新列将是 1 或 0。所以 Beat Market (Overall) 中的每个值对于 AA 可能是 1,而 Beat Market (Overall) 中的每个值对于 ZTS 可能是 0。复杂的是那些 ROI 需要为 each 代码求和,可能使用 groupby 函数,但我不确定如何在这种情况下使用它。

第二部分:我有一个查找数据框 companies,它包含每个代码的行业 ID 信息。我想在不使用循环的情况下将最终数据框中的 Sector 列与每个代码的正确行业 ID 匹配。

问题是 运行 这个数据集的这段代码太长了,如果我可以对其进行矢量化,它会更快。

这是我要矢量化的循环:

# find if AVG returns for each ticker is greater than AVG returns for market
avg_ror = resultsDF["Market Returns"].unique().mean()

for index, row in resultsDF.iterrows():
    roi = resultsDF[resultsDF["Ticker"] == row["Ticker"]]["ROI"].mean()
    resultsDF.loc[index, "Beat Market (Overall)"] = 1 if roi > avg_ror else 0
    try:
        resultsDF.loc[index, "Sector"] = companies.loc[row["Ticker"]][
            "IndustryId"
        ]  # ["Sector"]
    except:
        pass

最终数据框(减去一些其他列)如下所示:

      Ticker  Fiscal Year Fiscal Period    Sector  Market Returns       ROI  Beat Market (Overall)
21        AA         2017            Q3    110004        0.028904  0.006549                    0.0
23        AA         2019            Q2    110004        0.038022 -0.026191                    0.0
24        AA         2018            Q3    110004        0.024746 -0.002533                    0.0
25        AA         2018            Q4    110004       -0.058857  0.004141                    0.0
26        AA         2019            Q3    110004        0.010057 -0.015065                    0.0
...      ...          ...           ...       ...             ...       ...                    ...
36582    ZTS         2017            Q1  106005.0        0.056305  0.031115                    1.0
36583    ZTS         2019            Q1  106005.0        0.014543  0.028669                    1.0
36584    ZTS         2018            Q4  106005.0       -0.058857  0.032013                    1.0
36585    ZTS         2019            Q4  106005.0        0.033800  0.033261                    1.0
36586    ZTS         2020            Q1  106005.0       -0.041786  0.036693                    1.0

(1) 您可以 groupbyTicker 上找到组均值,transform 并将其与数据框中每个项目的市场 returns 均值进行比较

(2) 您可以使用 .map 方法映射到 companies 数据帧中的 Sector (这里我假设 AA 在扇区 A 并且ZTSB)

resultsDF['Beat Market (Overall)'] = (resultsDF.groupby('Ticker')['ROI'].transform(np.mean) > resultsDF['Market Returns'].unique().mean()).astype(int)
resultsDF['Sector'] = resultsDF['Ticker'].map(companies.set_index('Ticker')['IndustryId'])

输出:

      Ticker  Fiscal Year Fiscal Period  Market Returns    ROI  Beat Market Sector
21        AA         2017            Q3        0.028904  0.006549     0      A
23        AA         2019            Q2        0.038022 -0.026191     0      A
24        AA         2018            Q3        0.024746 -0.002533     0      A
25        AA         2018            Q4       -0.058857  0.004141     0      A
26        AA         2019            Q3        0.010057 -0.015065     0      A
36582    ZTS         2017            Q1        0.056305  0.031115     1      B
36583    ZTS         2019            Q1        0.014543  0.028669     1      B
36584    ZTS         2018            Q4       -0.058857  0.032013     1      B
36585    ZTS         2019            Q4        0.033800  0.033261     1      B
36586    ZTS         2020            Q1       -0.041786  0.036693     1      B