首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何优化这个熊猫的数据代码?

我如何优化这个熊猫的数据代码?
EN

Stack Overflow用户
提问于 2021-12-11 22:33:57
回答 1查看 54关注 0票数 0

我设置了一个大型的dataframe (resultsDF),它有一个排序为三列的索引:[Ticker, Fiscal Year, Fiscal Period],如下所示

代码语言:javascript
复制
      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。

问题是,为这个数据集运行这段代码的时间太长了,如果我能够将它向量化,它将更快。

下面是我想要矢量化的循环:

代码语言:javascript
复制
# 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 (减去一些其他列)如下所示:

代码语言:javascript
复制
      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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-11 22:47:03

(1)您可以在groupby on Ticker上查找组均值,并将其与数据中每个项目的市场回报均值进行比较。

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

代码语言:javascript
复制
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'])

输出:

代码语言:javascript
复制
      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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70319558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档