【问题标题】:How to speed up / replace a python for loop如何加速/替换 python for 循环
【发布时间】:2019-11-29 10:39:19
【问题描述】:

我正在运行以下代码:

def get_previous_next_returns(portfolio,total_returns):
    assets=[]
    i=0
    for asset in portfolio:
        i+=1
        try:
            for offset in [1,5,15,30,45,60,75,90,120,150,
                           200,250,500,750,1000,1250,1500]:
                print(i,asset.name,offset)
                asset['return_stock'] = (asset.Close - asset.Close.shift(1)) / (asset.Close.shift(1))
                merged_data = pd.merge(asset, sp_500, on='Date')
                total_positive_days=0
                total_beating_sp_days=0
                total_days = offset
                for index in range(0,len(merged_data)):
                    if index-offset>0:
                #for index, row in merged_data.iterrows():
                    #print(offset, index)
                        sliced = merged_data.iloc[index - offset : index]
                        total_positive_days = (sliced.Close_x > sliced.Close_x.shift(1)).sum()
                        total_beating_sp_days = (sliced.return_stock > sliced.return_sp).sum()
                        percentage_of_positive_days = float(total_positive_days/total_days)
                        percentage_of_beating_days = float(total_beating_sp_days/total_days)
                        asset.loc[index,'Pct_positive_'+str(offset)] = percentage_of_positive_days
                        asset.loc[index,'Pct_beating_'+str(offset)] = percentage_of_beating_days
                # previous period returns
                asset['Pct_change_'+str(offset)] = asset['Close'].pct_change(periods = offset)
                # next period returns
                asset['Pct_change_plus_'+str(offset)] = asset['Close'].pct_change(periods = -offset)
            assets.append(asset)
            total_returns=total_returns.append(asset) 
        except IndexError:
            print("Index error")
    return assets, total_returns

问题是我正在运行它的数据框(merged_data)非常大(超过 100 万行),因此代码需要很多小时才能完成......有没有办法以某种方式加速它(即更换 for使用更高效的代码块循环?

【问题讨论】:

  • 您可以将数据帧拆分为不同的块并使用multiprocessingpool.startmap 函数,它将函数和可迭代列表作为函数参数,并以并行方式应用函数。
  • 能否请您编辑我的代码,建议您尝试它的方法,因为我不熟悉这种方法。谢谢。
  • 您可以使用github.com/nalepae/pandarallel 进行并行化。由于您的代码对我来说太复杂了,并且在函数范围内有一些未定义的变量,例如sp_500,我无法编辑它。但是看看这个:stackoverflow.com/a/56626819/8265036
  • 请分享mcve。原始 df 的样本和预期的输出会很棒。

标签: python dataframe for-loop


【解决方案1】:

将数据框分成几部分,并使用 python 的 multiprocessing 模块同时执行它们。 为此,您可以使用 multiprocessing.Pool 或 multiprocessing.Process

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 2021-09-03
    • 2018-12-27
    • 2022-01-14
    相关资源
    最近更新 更多