我设置了一个大型的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)来跟踪股票的平均回报率是否大于市场的平均回报率。由于它跟踪平均数,新列对整个股票来说要么是1,要么是零。因此,Beat Market (Overall) for AA中的每个值可能为1,而Beat Market (Overall)中的ZTS中的每个值可能为0。它的复杂之处在于,这些ROI需要对每个滴答进行求和,可能使用groupby函数,但我不知道如何在这个上下文中使用它。
第二部分:我有一个查找数据,companies,它保存了每个滴答机的工业id信息。我希望在不使用循环的情况下,将最终数据want中的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发布于 2021-12-11 22:47:03
(1)您可以在groupby on Ticker上查找组均值,并将其与数据中每个项目的市场回报均值进行比较。
(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 Bhttps://stackoverflow.com/questions/70319558
复制相似问题