programing

Django 쿼리 세트를 Panda DataFrame으로 변환하는 중

newsource 2023. 7. 24. 22:32

Django 쿼리 세트를 Panda DataFrame으로 변환하는 중

장고 쿼리 세트를 판다로 변환합니다.DataFrame다음과 같이:

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

효과는 있지만, 더 효율적인 방법이 있을까요?

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')))

위의 내용은 제가 같은 일을 하는 방법입니다.가장 유용한 추가 기능은 관심 있는 필드를 지정하는 것입니다.사용 가능한 분야 중 일부에만 관심이 있다면 성능이 향상될 것으로 예상됩니다.

쿼리 집합 변환values_list()메모리 효율성이 더 높습니다.values()직접적으로.메소드 이후로values()딕트 목록의 쿼리 집합(키:값 쌍)을 반환합니다.values_list()튜플 목록(순수 데이터)만 반환합니다.메모리를 약 50% 절약할 수 있습니다. 호출할 때 열 정보를 설정하기만 하면 됩니다.pd.DataFrame().

방법 1:queryset = 모델.xxx.objects.values("A","B","C","D")df = pd.DataFrame(목록(쿼리셋) ## 많은 메모리 소비#df = pd.데이터 프레임.from_messages(queryset) ##는 작동하지만 메모리 사용량에는 큰 변화가 없습니다.
방법 2:.queryset = 모델.xxx.objects.values_list("A","B","C","D")df = pd.DataFrame(목록(쿼리 집합), column=["A","B","C","D"]) ## 이렇게 하면 메모리가 50% 절약됩니다.#df = pd.데이터 프레임.from_delays(queryset, column=["A","B","C","D"]) ##작동하지 않습니다.crashed with datatype is queryset not list.

100만 행 이상의 데이터로 프로젝트에서 테스트한 결과 최대 메모리가 2G에서 1G로 감소했습니다.

장고 판다는 이 문제를 깔끔하게 해결했습니다: https://github.com/chrisdev/django-pandas/

README에서:

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)

장고의 관점에서 (나는 잘 모릅니다.pandas) 이것으로 괜찮습니다.제 유일한 걱정은 레코드 수가 너무 많으면 메모리 문제에 부딪힐 수 있다는 것입니다.만약 그렇다면, 이 메모리 효율적인 쿼리 세트 반복기에 따라 무언가가 필요할 것입니다. (작성된 스니펫은 사용자의 스마트한 사용을 위해 약간의 재작성이 필요할 수 있습니다.).values()).

model_to_dict를 사용할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/11697887/converting-django-queryset-to-pandas-dataframe