首页 > 解决方案 > 如何在 Django 模型中插入许多(+200)行数据框时提高效率?

问题描述

for transaction in df.itertuples():
    transaction_obj = Transactions()
    transaction_obj.portfolio = strategy.portfolio
    transaction_obj.strategy = strategy
    transaction_obj.transaction_price = transaction.TransactionPrices
    transaction_obj.time_stamp = transaction[0]
    transaction_obj.transaction_type = name
    transaction_obj.brokerage = transaction.Brokerage

    if name == Transactions.LONG:
        if transaction.EntryLong:
            transaction_obj.action = Transactions.BUY
        if transaction.ExitLong:
            transaction_obj.action = Transactions.SELL
    elif name == Transactions.SHORT:
        if transaction.EntryShort:
            transaction_obj.action = Transactions.SELL
        if transaction.ExitShort:
            transaction_obj.action = Transactions.BUY

    transaction_obj.save()

该代码工作正常,没有问题或错误,但是我想减少执行时间。目前,插入 180 行行大约需要 7 秒。我正在使用 PostgreSQL 数据库。

标签: pythondjangopandasdataframedjango-models

解决方案


如果您的脚本假设始终创建记录(而不是修改),那么您可以使用Bulk create优化创建时间:

transactions = []
for transaction in df.itertuples():
    transaction_obj = Transactions()
    transaction_obj.portfolio = strategy.portfolio
    transaction_obj.strategy = strategy
    transaction_obj.transaction_price = transaction.TransactionPrices
    transaction_obj.time_stamp = transaction[0]
    transaction_obj.transaction_type = name
    transaction_obj.brokerage = transaction.Brokerage

    if name == Transactions.LONG:
        if transaction.EntryLong:
            transaction_obj.action = Transactions.BUY
        if transaction.ExitLong:
            transaction_obj.action = Transactions.SELL
    elif name == Transactions.SHORT:
        if transaction.EntryShort:
            transaction_obj.action = Transactions.SELL
        if transaction.ExitShort:
            transaction_obj.action = Transactions.BUY

    transactions.append(transaction_obj)
Transaction.objects.bulk_create(transactions)

推荐阅读