2012-07-28 26 views
45
pandas dönüştürülüyor

Bir pandalar DataFrame bir Django Sorgu Kümesi dönüştürmek için gidiyorum?Django QuerySet DataFrame

+0

Merhaba @FrancoMariluis, konunun dışına bu konuda üzgün: README itibaren https://github.com/chrisdev/django-pandas/

vardır django projelerine pandalar kullanıyorsunuz. Django web uygulamaları aracılığıyla "matplotlib ile çizim" kullanarak grafikleri gösterirsiniz. Sizin için geçerli bir çözüm mü? Teşekkürler. – danihp

+0

Merhaba, Django'da grafikler göstermek için iyi çalışıyor django-chartit kullanıyorum, ama bana daha esneklik verecek matplotlib kullanmayı düşünüyorum, –

+0

iyi bir yol gibi görünüyor. –

cevap

2

Django perspektifinden (pandas modeline aşina değilim) bu sorun değil. Tek endişem, çok fazla sayıda kayda sahip olmanız durumunda, bellek problemlerine maruz kalabilirsiniz. Durum buysa, bu memory efficient queryset iterator satırında bir şey gerekli olacaktır. (Yazılı snippet, akıllı kullanımınız için .values()) yeniden yazmayı gerektirebilir).

+0

@ GregoryGoltsov'un '.from_records()' kullanma ve 'list()' kullanma fikri, bellek verimliliği sorununu ortadan kaldırır. – hobs

+1

Bellek verimliliği endişesi Django tarafında. ['.values ​​()'] (https://docs.djangoproject.com/en/1.7/ref/models/querysets/#django.db.models.query.QuerySet.values) sonuçları önbelleğe alan bir "ValuesQuerySet" döndürür Bu nedenle, yeterince büyük bir veri kümesi için, oldukça yoğun bellek olacak. –

+0

Ahh evet. Queryset dizinine indekslemeniz gerekir * ve * hem memory hogs'u ortadan kaldırmak için liste kavraması olmadan '.from_records işlevini kullanın. Örneğin. 'pd.DataFrame.from_records (qs [i] .__ dict__, i aralığında (qs.count()))'. Ama işin bittiğinde bu sinir bozucu "" _state "sütununa sahipsin. 'qs.values ​​() [i]' daha hızlı ve daha temiz, ama önbellekleri düşünüyorum. – hobs

40
import pandas as pd 
import datetime 
from myapp.models import BlogPost 

df = pd.DataFrame(list(BlogPost.objects.all().values())) 
df = pd.DataFrame(list(BlogPost.objects.filter(date__gte=datetime.datetime(2012, 5, 1)).values())) 

# limit which fields 
df = pd.DataFrame(list(BlogPost.objects.all().values('author', 'date', 'slug'))) 

Yukarıdaki gibi, aynı şeyi nasıl yaparım. En kullanışlı eklenti, ilgilendiğiniz alanları belirtir. İlgilendiğiniz mevcut alanların sadece bir alt kümesi ise, bu benim tahmin ettiğim bir performans artışı verir.

+16

'list()' kullanma, kullanımdan kaldırılmıştır (pandalar 0.12'deyim). 'DataFrame.from_records() işlevinin kullanılması daha iyi çalışır; yani df = pd.DataFrame.from_records (BlogPost.objects.all(). Values ​​())'. – gregoltsov

+0

Bu sorunun OP sorusundan kullanılması daha açık olacaktır. Örneğin, 'BlogPost'' 'SomeModel' ile aynı olması gerekiyordu? –

0

Belki model_to_dict kullanabilirsiniz

import datetime 
from django.forms import model_to_dict 
pallobjs = [ model_to_dict(pallobj) for pallobj in PalletsManag.objects.filter(estado='APTO_PARA_VENTA')] 
df = pd.DataFrame(pallobjs) 
df.head() 
9

Django Pandalar yerine düzgünce bu çözer:

class MyModel(models.Model): 
    full_name = models.CharField(max_length=25) 
    age = models.IntegerField() 
    department = models.CharField(max_length=3) 
    wage = models.FloatField() 

from django_pandas.io import read_frame 
qs = MyModel.objects.all() 
df = read_frame(qs) 
+2

Django Panda'ları büyük veri kümeleriyle nasıl ilgileniyor? https://github.com/chrisdev/django-pandas/blob/master/django_pandas/io.py#L107 Bu hat beni korkutuyor, çünkü tüm veri kümesinin bir kerede belleğe yükleneceği anlamına geldiğini düşünüyorum. –

İlgili konular