我如何优化此 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) 您可以 groupby
在 Ticker
上找到组均值,transform
并将其与数据框中每个项目的市场 returns 均值进行比较
(2) 您可以使用 .map
方法映射到 companies
数据帧中的 Sector
(这里我假设 AA
在扇区 A
并且ZTS
在 B
)
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
我有一个大型数据框 (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) 您可以 groupby
在 Ticker
上找到组均值,transform
并将其与数据框中每个项目的市场 returns 均值进行比较
(2) 您可以使用 .map
方法映射到 companies
数据帧中的 Sector
(这里我假设 AA
在扇区 A
并且ZTS
在 B
)
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