首页 > 解决方案 > 请帮忙!需要显着提高 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)

从本质上讲,这是根据日期的接近程度、产品信息将订单与库存变动联系起来,并使用辅助数据框(插入)的帮助来不重复与先前使用的库存日志的链接。请帮忙 :))))

标签: pythonpandasnumpy

解决方案


注意:我对 Python 比较陌生,所以不要指望我的问题质量最高。

我在底部看不到循环功能。您可以将代码放在 def code(): 下,例如:def main():,然后在底部添加:main()。

def main():
    # Code goes here
main()

底部的 main() 再次运行def main ():下的代码。如果要导入库,请确保它位于代码顶部,而不是在def main():之下。


推荐阅读