繁体   English   中英

如何优化此 pandas dataframe 代码

[英]How can I optimize this pandas dataframe code

我有一个大的 dataframe ( 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)列来跟踪代码的平均ROI 是否大于市场的平均回报。 由于它跟踪平均值,因此对于整个股票,该新列将是 1 或 0。 因此, AABeat Market (Overall)中的每个值都可能是 1,而ZTSBeat Market (Overall)中的每个值都可能是 0。复杂的是,这些ROI需要为每个股票加总,可能使用groupby function,但我不确定如何在这种情况下使用它。

第二部分:我有一个查找 dataframe, companies ,其中包含每个股票代码的行业 ID 信息。 我想在不使用循环的情况下将最终 dataframe 中的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

最终的 dataframe(少一些其他列)如下所示:

      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
resultsDF['Beat Market (Overall)'] = (resultsDF.groupby('Ticker')['ROI'].transform(np.mean) > resultsDF['Market Returns'].mean()).astype(int)
resultsDF['Sector'] = resultsDF['Ticker'].map({v['Ticker']:v['Sector'] for v in companies[['Ticker','Sector']].T.to_dict().values()})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM