[英]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。 因此, AA
的Beat Market (Overall)
中的每个值都可能是 1,而ZTS
的Beat 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.