有没有一种方法可以加快此嵌套的for循环? (多线程?)

时间:2020-11-05 21:54:07

标签: python pandas multithreading for-loop

下午好,

我正在尝试加快一个嵌套的for循环的运行时间,该循环目前大约需要8个小时才能运行。

澄清代码的作用:

-循环浏览两个列表,并根据这些列表中的项目过滤另一个DataFrame。然后,我根据这些值过滤第二个DataFrame并在其上聚合一列。最后,我将带有过滤器项和汇总值的结果写入另一个DataFrame。

  • 代码循环遍历日期列表(1000天)和一系列对象。

  • 然后,它基于这些对象过滤另一个大型DataFrame(500,000行),并将一列汇总为总和。

  • 最后,它使用以前的对象值,循环中的日期和聚合值,并将其追加到新的DataFrame中。

    #Create Date List ascending per day
    base = datetime.datetime.today()
    numdays = 1000
    dateList = [(base - datetime.timedelta(days=x)).date() for x in range(numdays)]
    dateList.reverse()
    
    #Initialize empty objects
    data = pd.DataFrame([])
    
    
    for date in dateList: 
        for asset in assetList:
            dfi = df.copy()
            dfi = dfi[dfi['AssetNum'] == asset]
            dfi = dfi[dfi['InstallDate']<date]
            dfi = dfi.reset_index(drop=True)
    
            try:
                installDate= dfi['InstallDate'].loc[0]
    
                sti = st.copy()
                sti = sti[sti['ASSETSERIAL'] == asset]
                sti = sti[sti['TIMESTAMP']>installDate]
                sti = sti[sti['TIMESTAMP']<date]
    
                cycles= sti['CYCLES'].sum()
    
                data = data.append(pd.DataFrame({'AssetNumber': asset, 'InstallDate': installDate,  'CurrentDate':date, 'Cycles':cycles}, index=[0]), ignore_index=True)
    
    
             except:
                 pass
    

最后,快速浏览一下DataFrame的外观:

df (4000行)

     AssetNum      InstallDate
     SRF63712      2019-04-12
     SRF39304      2020-11-28
     SRF15302      2019-06-23
        ...           ...
   

st (50万行)

      ASSETSERIAL     TIMESTAMP      CYCLES
       SRF63712       2020-01-01      354
       SRF39304       2020-01-01      163
       SRF15302       2020-01-01      356
       SRF63712       2020-01-01       35
       SRF39304       2020-01-01      253
       SRF15302       2020-01-01      352
       SRF63712       2020-01-01       43
       SRF39304       2020-01-01      566
       SRF15302       2020-01-01      231

谢谢大家!

循环会一直向每个资产添加“ CYCLES”,直到到达新的InstallDate,然后将结果附加到DataFrame。

0 个答案:

没有答案