2009-11-16 4 views
6

मैं एक django क्वेरीसेट को numpy रिकॉर्ड सरणी में कैसे परिवर्तित करूं?मैं django क्वेरीसेट को numpy रिकॉर्ड सरणी में कैसे परिवर्तित करूं?

पीएस: मुझे पता है कि आप इसे फिर से बना सकते हैं और इसे बना सकते हैं और क्या कोई अन्य क्लीनर समाधान है?

उत्तर

1

क्या मैं के लिए देख रहा था:

  1. क्वेरीसमूह Q के vlqs (django.db.models.query.ValuesListQuerySet)

    vlqs = qs.values_list()

  2. गुप्त मिल vlqs सूची

    MyList = सूची (vlqs)

  3. numpy रिकॉर्ड सरणी

    r = np.core.records.array (MyList, नाम = 'फ़ील्ड 1, field2, फ़ील्ड 3') // नाम मॉडल क्षेत्र हैं

6

यह पूछने की तरह है "मैं अपने फ्रिज की सामग्री को रात के खाने में कैसे परिवर्तित करूं?"। यह आपके फ्रिज में क्या है और आप क्या खाना चाहते हैं इस पर निर्भर करता है। संक्षिप्त उत्तर ("खाना पकाने के द्वारा" कहने के बराबर) क्वेरीसेट पर फिर से शुरू करना है, जो भी समेकित डेटा प्रकारों की वस्तुओं का निर्माण करना है, जिन्हें आप सरणी को तुरंत चालू करना चाहते हैं (आमतौर पर एक पुनरावर्तनीय और एक शब्दकोश)। लंबा जवाब उस पर निर्भर करता है जिसे आप वास्तव में पूरा करना चाहते हैं।

+5

हम्म ... रात के खाने के ... –

+2

आपकी सलाह के लिए धन्यवाद! लेकिन मैं इस स्पष्ट उत्तर के लिए इस सवाल को पोस्ट नहीं किया होता :)। – Vishal

11
import numpy as np 
qs = MyModel.objects.all() 
vlqs = qs.values_list() 
r = np.core.records.fromrecords(vlqs, names=[f.name for f in MyModel._meta.fields]) 

इस का उपयोग किया गया QuerySet iterator सीधे और एक अजगर सूची बनाने के समय और कचरा बर्बाद करने से कदम से बचाता है। यह मॉडल से वास्तविक फ़ील्ड नाम प्राप्त करने के लिए MyModel._meta.fields का भी उपयोग करता है, जैसा कि Get model's fields in Django

यदि आप केवल एक फ़ील्ड चाहते हैं (उदाहरण के लिए मॉडल के 'वोट' फ़ील्ड) को एक-आयामी में निकाला गया है सरणी, आप कर सकते हैं:

vlqs = qs.values_list('votes', flat=True) 
votes = np.fromiter(vlqs, numpy.dtype('int_')) 
+1

यह एक महान उदाहरण है! अन्य peeps: कृपया ध्यान दें फ्लैट = सही बहुत महत्वपूर्ण है ताकि मूल्य_सूची के मान सरल मान हों और एक tuples नहीं: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#values-list –

1

है कि आप क्या कर सकता है: ...

[index[0] for index in qs.values_list('votes')] 

और तैयार एक्सडी

+0

सूचकांक [0] क्या कर रहा है, कृपया? –

1

आप अपनी वस्तुओं और रचनात्मक के सभी प्राप्त करना चाहते हैं सरणी के तत्वों के रूप वस्तुओं के साथ एक numpy सरणी खा लिया:

import numpy as np 
qs = MyModel.objects.all() 
numpy_array = np.array(list(qs)) 

मेरे काम के अनुसार, मैं नीचे के रूप में कुछ का उपयोग करें: मेल खाती है

import numpy as np  
qs = MyModel.objects.values_list('id','first_name','last_name').filter(gender='male').order_by('id') 
numpy_array = np.array(list(qs)) 

सरणी की कतारें रिकॉर्ड और सरणी के स्तंभों के मूल्यों से मेल खाती है कि मैंने उपरोक्त परिभाषित किया है (आईडी, पहला नाम, अंतिम नाम)।

1

और यह एक साफ थोड़ा समारोह में लाना जो आप बस किसी भी Django क्वेरीसमूह पारित करने के लिए:

import pandas as pd 
import numpy as np 

def qs_to_df(qs): 
    """ QuerySet to DataFrame """ 
    Model = qs.model 
    np_array = np.core.records.fromrecords(qs.values_list(), names=[f.name for f in Model._meta.fields]) 
    return pd.DataFrame(np_array) 
0

@CpILL के जवाब से दूर जा रहे हैं तुम इतनी तरह एक numpy रिकॉर्ड सरणी में सबसे क्वेरीसमूहों कर सकते हैं:

def qs_to_ra(qs, *args): 
    """ 
    Turn most querysets directly into a numpy record array 
    :param qs: django queryset 
    :param args: takes a list of field names to specify 
    :return: numpy.recarray 
    """ 
    model = qs.model 
    if args: 
     return np.core.records.fromrecords(qs.values_list(*args), names=args) 
    return np.core.records.fromrecords(qs.values_list(), names=[f.name for f in model._meta.fields]) 

तुम भी उन्हें सीधे एक पांडा dataframe में इतनी तरह कर सकते हैं:

def qs_to_df(qs, *args): 
    """ 
    Turn most querysets directly into a pandas dataframe. 

    :param qs: django queryset 
    :param args: takes a list of field names to specify 
    :return: pandas.DataFrame 
    """ 
    model = qs.model 
    if args: 
     return pd.DataFrame.from_records(list(qs.values_list(*args)), columns=args) 
    return pd.DataFrame.from_records(list(qs.values_list()), columns=[f.name for f in model._meta.fields])