web-gelistirme-sc.com

Django QuerySet'i pandalara dönüştürme DataFrame

Bir Django QuerySet'i DataFrame pandalarına dönüştüreceğim.

qs = SomeModel.objects.select_related().filter(date__year=2012)
q = qs.values('date', 'OtherField')
df = pd.DataFrame.from_records(q)

Çalışıyor, ancak daha verimli bir yolu var mı?

63
Franco Mariluis
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, aynı şeyi nasıl yaptığımdır. En yararlı ekleme, ilgilendiğiniz alanları belirtmektir. İlgilendiğiniz alanların yalnızca bir alt kümesi ise, bu, hayal ettiğim bir performans artışı sağlayacaktır.

55
lexual

Django Pandalar bunu oldukça özenle çözer: https://github.com/chrisdev/Django-pandas/

README'den:

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)
14
David Watson

Django açısından (pandas ile aşina değilim) bu iyi. Tek endişem, eğer çok sayıda kaydınız varsa, hafıza problemleriyle karşılaşabilirsiniz. Durum böyle olsaydı, bu hafıza etkin queryset yineleyici satırları boyunca bir şeyler gerekli olurdu. (Yazılı olarak snippet, .values() işlevini akıllıca kullanabilmeniz için yeniden yazma gerektirebilir).

2
David Eyk

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()
0
pjl

Parametreyi parametre_list () 'e dönüştürmek, doğrudan değerlerden () daha verimlidir. Value () yöntemi, dict (qu: value çiftleri) listesinden bir queryset döndürdüğü için, options_list () yalnızca Tuple (yalnızca veri) listesini döndürür. Bu% 50 hafıza kazandıracak, sadece pd.DataFrame () çağırdığınızda sütun bilgilerini ayarlamanız gerekir.

 Yöntem 1: 
 Queryset = models.xxx.objects.values ​​("A", "B", "C", "D") 
 Df = pd.DataFrame ( list (queryset)) ## çok fazla bellek tüketir 
 #df = pd.DataFrame.from_records (queryset) ## çalışır ancak bellek kullanımında çok fazla değişiklik olmaz 
 
 Yöntem 2: 
 queryset = models.xxx.objects.values_list ("A", "B", "C", "D") 
 df = pd.DataFrame (list (queryset), sütun = [" A "," B "," C "," D "]) ## bu,% 50 belleği koruyacaktır 
 #Df = pd.DataFrame.from_records (queryset, column = [" A "," B " , "C", "D"]) ## Çalışmıyor. Veri türü ile çöktü Queryset listesi değil. 

Bunu projemde> 1 milyon satır veriyle test ettim, en yüksek bellek 2G'den 1G'ye düşürüldü.

0
shengyang wang