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
'programing' 카테고리의 다른 글
기본값이 아닌 NLS_NUMERIC_CHARACHARTS를 사용하여 Oracle PL/SQL에서 텍스트를 숫자로 효율적으로 변환하는 방법은 무엇입니까? (0) | 2023.07.24 |
---|---|
사용자/암호를 무시하는 창에 mysqdump (0) | 2023.07.24 |
업데이트 x set y = null에 시간이 오래 걸립니다. (0) | 2023.07.24 |
jQuery에서 요소의 n번째 수준 상위 항목을 가져오려면 어떻게 해야 합니까? (0) | 2023.07.24 |
cmath 단위의 sqrt, sin, cos, pow 등의 정의 (0) | 2023.07.24 |