下午好,
我正在尝试加快一个嵌套的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。