python - 请帮忙!需要显着提高 python for 循环的效率
问题描述
希望任何人都可以帮助我,因为我不知道更好。我构建了这个 for 循环,我需要将股票变动与触发每个股票变动的订单联系起来。订单和库存的数据集都很大(>2.000.000 行),我构建了这个 for 循环,它工作正常,但速度很慢:根据我的数学计算,它需要 74 天才能完成。我需要你们和你们魔术师的眼睛来看看它,告诉我我可以做些什么来提高这个循环的效率,因为我确信我犯了很多新手错误。
编辑: Stack Overflow 让我把问题集中在这个问题上,对不起,伙计们。我认为我的问题是我在循环中使用了很多 pd.DataFrames 因为这是我发现使它与我正在使用的日期时间操作一起工作并将行提取到结果数据框“插入”的唯一方法”。我认为如果我改用数组会变得更好,但由于我得到的所有数据类型错误,我只是不知道如何构建它甚至使它工作。请查看代码中的 Dataframe 操作,并告诉我您是否发现任何导致运行速度如此缓慢的怪诞错误。
for index, row in FOLredux.iterrows():
# leave stockmov update to another processing step, so this can go faster
newrow = []
rollingDF = []
if row['HadNoStock'] == 'Yes':
stepdate = row['CheckStockDate']
else:
stepdate = row['DecidePackagingDate']
insertedMovList = inserts['MovementDate'][(inserts['SiteID'] == row['SiteId']) & (inserts['ProductID'] == row['ProductId'])
& (inserts['SizeValue'] == row['SizeValue'])]
rollingDF = pd.DataFrame({'MovementDate':[StockMov['MovementDate'][(StockMov['siteid'] == row['SiteId']) & (StockMov['ProductID'] == row['ProductId'])
& (StockMov['SizeValue'] == row['SizeValue']) & (StockMov['Delta'] == row['QtySold']*-1)
]][0]})
rollingDF['TotalTime'] = (stepdate - rollingDF['MovementDate']).dt.total_seconds()
stockdate = pd.DataFrame({'MovementDate': [rollingDF['MovementDate'][(rollingDF['TotalTime'] >= -10) & (rollingDF['TotalTime'] <= 10)]][0]})
if len(stockdate) != 0:
stockdate = stockdate['MovementDate'][~stockdate['MovementDate'].isin(insertedMovList)]
if len(stockdate) == 0:
#use creation date
stepdate = row['BoutiqueOrderDate']
insertedMovList = inserts['MovementDate'][(inserts['SiteID'] == row['SiteId']) & (inserts['ProductID'] == row['ProductId'])
& (inserts['SizeValue'] == row['SizeValue'])]
rollingDF = pd.DataFrame({'MovementDate':[StockMov['MovementDate'][(StockMov['siteid'] == row['SiteId']) & (StockMov['ProductID'] == row['ProductId'])
& (StockMov['SizeValue'] == row['SizeValue']) & (StockMov['Delta'] == row['QtySold']*-1)
]][0]})
rollingDF['TotalTime'] = (rollingDF['MovementDate'] - stepdate).dt.total_seconds()/60
stockdate = pd.DataFrame({'MovementDate': [rollingDF['MovementDate'][(rollingDF['TotalTime'] >= 0) & (rollingDF['TotalTime'] <= 60)]][0]})
if len(stockdate) != 0:
stockdate = stockdate['MovementDate'][~stockdate['MovementDate'].isin(insertedMovList)]
if len(stockdate) != 0:
stockdate = min(stockdate)
orderid = row['OrderCodeId']
values = [orderid, stockdate, row['SiteId'], row['ProductId'], row['SizeValue'], 1, 0]
zipped = zip(columns, values)
data = dict(zipped)
newrow.append(data)
inserts = inserts.append(newrow, True)
else:
stockdate = min(stockdate)
orderid = row['OrderCodeId']
values = [orderid, stockdate, row['SiteId'], row['ProductId'], row['SizeValue'], 0, 0]
zipped = zip(columns, values)
data = dict(zipped)
newrow.append(data)
inserts = inserts.append(newrow, True)
从本质上讲,这是根据日期的接近程度、产品信息将订单与库存变动联系起来,并使用辅助数据框(插入)的帮助来不重复与先前使用的库存日志的链接。请帮忙 :))))
解决方案
注意:我对 Python 比较陌生,所以不要指望我的问题质量最高。
我在底部看不到循环功能。您可以将代码放在 def code(): 下,例如:def main():,然后在底部添加:main()。
def main():
# Code goes here
main()
底部的 main() 再次运行def main ():下的代码。如果要导入库,请确保它位于代码顶部,而不是在def main():之下。
推荐阅读
- android - Android Studio 未知的 Unicode 字体?
- mysql - 在 sum 内计数时,按功能分组无效
- c# - 在数据库每分钟获取新数据的同时从数据库加载更多数据
- c# - 将xml复制到没有标题的新文件
- reactjs - 中继 RefetchContainer 不更新道具
- node.js - 在传出请求快递js中使用中间件
- apache - 如何在 Apache 上使用 htaccess 和 mod_headers.c 发送带有 x-robots 标签 noindex 的 http 标头
- python - 在 Python 中使用 Redis 将数据保存在内存中的最快方法
- javascript - 显示另一个弹出窗口时如何隐藏 Bootstrap 3 弹出窗口?
- php - 将字符串转换为数组,然后在将过滤器链接添加到每个单词后打印数组以看起来像原始字符串