如何将django QuerySet转换为numpy记录数组?

时间:2009-11-16 09:43:12

标签: django numpy

如何将django QuerySet转换为numpy记录数组?

PS:我知道你可以迭代并构建它,但还有其他更清洁的解决方案吗?

7 个答案:

答案 0 :(得分:14)

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迭代器,避免了创建python列表的浪费时间和浪费的步骤。它还使用MyModel._meta.fields从模型中获取实际字段名称,如Get model's fields in Django中所述

如果您只想将一个字段(例如模型的“投票”字段)提取到一维数组中,您可以这样做:

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

答案 1 :(得分:5)

这就像问“如何将冰箱的内容转换成晚餐?”。这取决于你的冰箱里有什么,以及你想吃什么。简短的回答(相当于说“通过烹饪”)是迭代查询集,构建您想要实例化数组的任何复合数据类型的对象(通常是可迭代的和字典)。答案很长取决于你真正想要完成的事情。

答案 2 :(得分:2)

如果你想获取所有对象并创建一个带有对象作为数组元素的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))

数组的行对应于记录,数组的列对应于我在上面定义的值(id,名字,姓氏)。

答案 3 :(得分:1)

我在寻找:

  1. 来自QuerySet qs get vlqs(django.db.models.query.ValuesListQuerySet)

    vlqs = qs.values_list()

  2. 将vlqs隐藏到列表

    mylist = list(vlqs)

  3. 创建numpy记录数组

    r = np.core.records.array(mylist,names ='field1,field2,field3')//名称是模型字段

答案 4 :(得分:1)

你能做的是:

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

并准备好...... XD

答案 5 :(得分:1)

并将它放入一个简洁的小函数,你只需要传递任何Django Queryset:

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)

答案 6 :(得分: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])

您也可以将它们直接转换为pandas数据框,如下所示:

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