জ্যাঙ্গো ক্যোয়ারীসেটকে ডেটাফ্রেমে পান্ডে রূপান্তর করা হচ্ছে


90

আমি একটি জাঙ্গো ক্যোয়ারীসেটকে নীচে একটি পান্ডায় রূপান্তর করতে যাচ্ছি DataFrame:

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

এটি কাজ করে, তবে আরও কার্যকর উপায় আছে?


হাই @ ফ্র্যাঙ্কো মারিলিউইস, বিষয়টির বাইরে এই সম্পর্কে দুঃখিত: আপনি কি জ্যাঙ্গো প্রকল্পগুলিতে পান্ডা ব্যবহার করছেন? আপনি জ্যাঙ্গো ওয়েব অ্যাপ্লিকেশনগুলির মাধ্যমে "প্ল্যাটিং উইথ ম্যাটপ্লোটিলিব" ব্যবহার করে গ্রাফিক্স দেখান। আপনার জন্য একটি বৈধ সমাধান? ধন্যবাদ
দানি হেরেরায়

হাই, জাজানোতে গ্রাফিক্স দেখানোর জন্য আমি জ্যাঙ্গো-চারটিট ব্যবহার করছি, যা ভাল কাজ করে, তবে আমি ম্যাটপ্ল্লোব ব্যবহার করার কথা ভাবছি, যা আমাকে আরও নমনীয়তা দেবে
ফ্রাঙ্কো মেরিলুইস

দেখতে বেশ সোজা মনে হচ্ছে এবং এটি কাজ করে। কোন বিশেষ উদ্বেগ?
দিমিত্রি শেভচেঙ্কো 20'12

আপনি এখন যেভাবে পেয়েছেন তাতে কী সমস্যা? আপনার কি বিশেষ উদ্বেগ আছে?
বুরহান খালিদ

এটি আমার প্রথম (এবং একমাত্র!) দৃষ্টিভঙ্গি ছিল, তবে যেহেতু আমি পান্ডাদের কাছে মোটামুটি নতুন, তাই আমি অন্য কোনও উপায় আছে কিনা তা দেখতে চেয়েছিলাম তবে এটি মনে হয় এটি ভাল।
ফ্রেঞ্চো মেরিলুইস

উত্তর:


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

উপরেরটি হল আমি একই জিনিসটি কীভাবে করব। সর্বাধিক দরকারী সংযোজন হ'ল আপনি কোন ক্ষেত্রগুলিতে আগ্রহী তা উল্লেখ করা। যদি এটি আপনি আগ্রহী এমন উপলব্ধ ক্ষেত্রগুলির কেবলমাত্র একটি উপসেট হয়, তবে এটি আমার কল্পনাশক্তিকে বাড়িয়ে তুলবে।


37
'তালিকা ()' ব্যবহার করে প্রত্যাখ্যান করা হয়েছে বলে মনে হচ্ছে (আমি পান্ডাস 0.12 তে আছি)। ব্যবহার DataFrame.from_records()করে আরও ভাল কাজ করে df = pd.DataFrame.from_records(BlogPost.objects.all().values())
গ্রেগলটসভ

4
এটি যদি ওপি প্রশ্ন থেকে নামগুলি ব্যবহার করে তবে এটি আরও পরিষ্কার হবে। উদাহরণস্বরূপ, BlogPostতার একই হিসাবে অনুমিত হয় SomeModel?
হ্যাক-আর

হাই, ডেটা ফ্রেমে আপনার প্রয়োজন নেই এমন কলামটি বাদ দেওয়ার কোনও উপায় আছে কি?
উইলওয়ার

19

জ্যাঙ্গো পান্ডস এটি বরং ঝরঝরে সমাধান করে: https://github.com/chrisdev/django-pandas/

পুনরায় পড়া থেকে:

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)

10
জ্যাঙ্গো পান্ডারা কীভাবে বড় ডেটাসেটগুলি ব্যবহার করে? github.com/chrisdev/django-pandas/blob/master/django_pandas/… এই লাইনটি আমাকে ভয় দেখায়, কারণ আমি মনে করি এটির অর্থ পুরো ডেটাসেটটি একবারে স্মৃতিতে লোড হয়ে যাবে।
অ্যাডাম বার্নস

@ আডা নির্দিষ্ট ক্ষেত্রের নাম ব্যবহার করে ডেটাফ্রেম তৈরি করতে:df = read_frame(qs, fieldnames=['age', 'wage', 'full_name'])
গ্যাথাইড

এই বিস্ময়কর ভবিষ্যতে আপনারা যারা ভাবছেন যে আমি যে সম্পর্কে ছিলাম, সেই সময়কার উত্সটির
অ্যাডাম বার্নেস

9

মানসমূহের তালিকায় ক্যোরিসেটটি রূপান্তর করুন () সরাসরি মানের () এর চেয়ে বেশি মেমরি কার্যকর হবে। যেহেতু পদ্ধতির মানগুলি () ডিকের তালিকার (কী: মান জোড়) তালিকার একটি ক্যোরিসেটটি ফেরত দেয় তাই মান_ তালিকা () কেবলমাত্র টুপলের (খাঁটি ডেটা) তালিকার তালিকা দেয়। এটি প্রায় 50% মেমরি সঞ্চয় করবে, আপনি যখন পিডি ডেটফ্রেম () কল করবেন তখন কলামের তথ্য সেট করা দরকার।

পদ্ধতি 1:
    ক্যোয়ারেট = মডেল.এক্সএক্সএক্স.ওবজেক্টস.ভ্যালু ("এ", "বি", "সি", "ডি")
    df = pd.DataFrame (তালিকা (ক্যোয়ারসেট)) ## অনেক বেশি মেমরি গ্রহণ করে
    #df = pd.DataFrame.from_records (ক্যোয়ারসেট) ## কাজ করে কিন্তু মেমরির ব্যবহারে খুব বেশি পরিবর্তন আসে না

পদ্ধতি 2:
    ক্যোরিসেট = মডেল.এক্সএক্সএক্স.বজেক্টস.ভ্যালু_লিস্ট ("এ", "বি", "সি", "ডি")
    ডিএফ = পিডি.ডাটা ফ্রেম (তালিকা (ক্যোরিসেট), কলাম = ["এ", "বি", "সি", "ডি"]) ## এটি 50% মেমরি সঞ্চয় করবে
    #df = pd.DataFrame.from_records (ক্যোয়ারসেট, কলামগুলি = ["এ", "বি", "সি", "ডি"]) ## এটি কাজ করে না। ডেটাটাইপ সহ ক্র্যাশ হ'ল ক্যোরিসেট তালিকা নয়।

আমি আমার প্রকল্পে> 1 মিলিয়ন সারি ডেটা দিয়ে এটি পরীক্ষা করেছি, পিক মেমরি 2 জি থেকে 1 জি তে হ্রাস পেয়েছে।


2

জাজানো দৃষ্টিকোণ থেকে (আমি এর সাথে পরিচিত নই pandas) এটি ঠিক আছে। আমার একমাত্র উদ্বেগ হ'ল আপনার যদি খুব বেশি সংখ্যক রেকর্ড থাকে তবে আপনি মেমরির সমস্যায় পড়তে পারেন। যদি এটি হয় তবে এই মেমরির দক্ষ ক্যোয়ারসেট পুনরাবৃত্তকারীটির পংক্তির পাশাপাশি কিছু প্রয়োজন something (লিখিত হিসাবে স্নিপেট আপনার স্মার্ট ব্যবহারের জন্য কিছু পুনর্লিখন প্রয়োজন হতে পারে .values())।


@ গ্রেগরিগোলটসভের ব্যবহার .from_records()এবং ব্যবহার না করার ধারণা list()মেমরির দক্ষতার উদ্বেগকে দূর করবে।
hobs

4
স্মৃতি দক্ষতার উদ্বেগ জাজানো দিকের দিকে। .values()একটি ValuesQuerySetফলাফল প্রদান করে যা প্রদান করে, সুতরাং একটি বৃহত পরিমাণে ডেটাসেটের জন্য, এটি বেশ স্মৃতি-নিবিড় হতে চলেছে।
ডেভিড আইক

4
আঃ হ্যাঁ আপনাকে ক্যোরিসেটে সূচি লিখতে হবে এবং.from_records মেমরি হোগ উভয়ই মুছে ফেলার জন্য তালিকাটি বোঝার ছাড়াই ব্যবহার করতে হবে। যেমন pd.DataFrame.from_records(qs[i].__dict__ for i in range(qs.count()))"_state"আপনার কাজ শেষ হয়ে গেলে আপনি সেই বিরক্তিকর কলামটি রেখে গেছেন । qs.values()[i]অনেক দ্রুত এবং পরিষ্কার, তবে আমি মনে করি এটি ক্যাশে করে।
hobs

1

আপনি হয়ত মডেল_ট_ডিক্ট ব্যবহার করতে পারেন

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()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.