2016-06-07 60 views
4

我已被存儲在如以下所示的熊貓數據幀股票價格數據(實際上它是在一個面板,但我它轉換爲一個數據幀)保存大熊貓數據幀到一個Django模型

 date ticker close  tsr 
0 2013-03-28 abc  22.81 1.000439 
1 2013-03-28 def  94.21 1.006947 
2 2013-03-28 ghi  95.84 1.014180 
3 2013-03-28 jkl  31.80 1.000000 
4 2013-03-28 mno  32.10 1.003125 
...many more rows 

我要保存這個在Django模型,它看起來像這樣(相匹配的列名):

class HistoricalPrices(models.Model): 
    ticker = models.CharField(max_length=10) 
    date = models.DateField() 
    tsr = models.DecimalField() 
    close = models.DecimalField() 

我想出迄今使用此保存它的最好的,其中df是我的數據框:

entries = [] 
for e in df.T.to_dict().values(): 
    entries.append(HistoricalPrices(**e)) 
HistoricalPrices.objects.bulk_create(entries) 

有沒有更好的方法來保存?

我看了看django-pandas,但看起來好像只是從數據庫中讀取。

回答

10

這將是最有效的使用to_sql()適當connection參數的engine,並運行此您Django內部應用程序,而不是通過DataFrame迭代,並在節省時間的一個model例如:

from django.conf import settings 

user = settings.DATABASES['default']['USER'] 
password = settings.DATABASES['default']['PASSWORD'] 
database_name = settings.DATABASES['default']['NAME'] 

database_url = 'postgresql://{user}:{password}@localhost:5432/{database_name}'.format(
    user=user, 
    password=password, 
    database_name=database_name, 
) 

engine = create_engine(database_url, echo=False) 
df.to_sql(HistoricalPrices, con=engine) 
+0

有沒有辦法讓數據庫生成的自動ID返回到'DataFrame'? (我的Excel數據需要存儲在通過外鍵鏈接的多個Django模型中。) – Chris

+1

您可以隨時使用[read_sql](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html )使用所有自動生成的列獲取完整的df。如果這就是你所指的,django自己就會使用數據庫生成的'id'。 – Stefan

+0

謝謝@Stefan,在我的情況下,確定我最新的行子集將是一個昂貴的操作,並可能出現錯誤。這是說替代[似乎](http://stackoverflow.com/questions/26770489/how-to-get-autoincrement-values-for-a-column-after-uploading-a-pandas-dataframe)被鎖定表和手動設置ID,或寫[通過CSV](http://stackoverflow.com/questions/31997859/bulk-insert-a-pandas-dataframe-using-sqlalchemy),所以也很可能打擊性能或丟失ID,也許這只是批量插入的一個基本限制。我會做更多的研究並報告回來。 – Chris

-1

如果你不想直接惹SQL,你可以用這樣的東西:

entries = df.to_dict('records') 
HistoricalPrices.objects.bulk_create(entries) 

我沒有比較p性能,但我認爲這更清潔。

+0

這將不起作用,因爲您不能使用'bulk_create'與一系列的字典,只能使用'HistoricalPrices'對象列表。 – shabda