在django中使用pandas操作django的ORM查询出来的QuerySet对象,可以使用插件django-pandas。

截止教程书写时间,django-pandas已发布到0.6.1。

依赖:django>=1.4.5

Django-model-utils >=1.4.0

Pandas >=0.12.0

当然,还需要numpy

用法:

1、IO模块:

该django-pandas.io模块提供了一些方便的方法,以便从django的查询集转换成DataFrames的创建。

read_frame

参数:

l   qs :一个django的QuerySet。

l   fieldnames :用于创建DataFrame的模型字段名称列表。可以使用双下划线指定另一个model中的相关字段,以通常的Django方式跨越关系。

l   index_col:使用指定用于DataFrame索引的字段名称。如果索引字段不在fieldnames参数中,则将会添加,注意这里的字段必须为该model里的字段。

l   coerce_float:Boolean(布尔值),默认为True。尝试将值转换为非字符串,将非数字对象(如decimal.Decimal)转化为浮点类型。

Eg:

model.py

class Img_info(models.Model):
'''
图片信息表
'''
img_name = models.CharField(max_length=128, verbose_name="图片名")
img = models.ImageField(upload_to="img", verbose_name="图片") class Meta:
db_table = "img_info" class Product_score(models.Model):
'''
图片打分表
'''
img_of = models.ForeignKey(Img_info, on_delete=models.CASCADE, verbose_name="图片")
scoring_staff = models.CharField(max_length=32, verbose_name="打分员")
score_num = models.FloatField(verbose_name="分数") class Meta:
db_table = "product_score"

views.py

1、直接转化

from django_pandas.io import read_frame

def tset(request):
qs = Product_score.objects.all()
qs_dataframe = read_frame(qs=qs)
print(qs_dataframe)
return HttpResponse('ok')

运行结果:

    id               img_of scoring_staff  score_num
0 15 Img_info object (5) 测试1 22.0
1 16 Img_info object (6) 测试1 23.0
2 17 Img_info object (7) 测试1 24.0
3 18 Img_info object (8) 测试1 25.0
4 19 Img_info object (9) 测试1 26.0
5 20 Img_info object (5) 测试2 22.0
6 21 Img_info object (6) 测试2 23.0
7 22 Img_info object (7) 测试2 24.0
8 23 Img_info object (8) 测试2 25.0
9 24 Img_info object (9) 测试2 26.0
10 25 Img_info object (5) 测试3 22.0
11 26 Img_info object (6) 测试3 23.0
12 27 Img_info object (7) 测试3 24.0
13 28 Img_info object (8) 测试3 25.0

2、跨关联表显示

views.py

from django_pandas.io import read_frame

def tset(request):
qs = Product_score.objects.all()
qs_dataframe = read_frame(qs=qs,fieldnames=['img_of__img_name', 'scoring_staff', 'score_num'])
print(qs_dataframe)
return HttpResponse('ok')

运行结果:

   img_of__img_name scoring_staff  score_num
0 士大夫 测试1 22.0
1 士大夫 测试2 22.0
2 士大夫 测试3 22.0
3 54撒 测试1 23.0
4 54撒 测试2 23.0
5 54撒 测试3 23.0
6 撒旦撒 测试1 24.0
7 撒旦撒 测试2 24.0
8 撒旦撒 测试3 24.0
9 撒旦撒2 测试1 25.0
10 撒旦撒2 测试2 25.0
11 撒旦撒2 测试3 25.0
12 24 测试1 26.0
13 24 测试2 26.0

3、指定索引

views.py

def tset(request):
qs = Product_score.objects.all()
qs_dataframe = read_frame(qs=qs,fieldnames=['img_of__img_name', 'scoring_staff', 'score_num'],index_col='id')
print(qs_dataframe)
return HttpResponse('ok')

运行结果:

   img_of__img_name scoring_staff  score_num
id
15 士大夫 测试1 22.0
20 士大夫 测试2 22.0
25 士大夫 测试3 22.0
16 54撒 测试1 23.0
21 54撒 测试2 23.0
26 54撒 测试3 23.0
17 撒旦撒 测试1 24.0
22 撒旦撒 测试2 24.0
27 撒旦撒 测试3 24.0
18 撒旦撒2 测试1 25.0
23 撒旦撒2 测试2 25.0
28 撒旦撒2 测试3 25.0
19 24 测试1 26.0
24 24 测试2 26.0

2、DataFrameManager

django-pandas提供了一个自定义管理器,可用于要呈现为pandas Dataframes的模型。该DataFrameManager管理器提供to_dataframe返回你模型查询集(queryset )为pandas的DataFrame。要使用DataFrameManager,首先覆盖model定义中的默认管理器(objects)。

这将使您可以访问以下QuerySet方法:

l   to_dataframe  从QuerySet返回DataFrame

l   to_timeserie  用于创建时间序列的便捷方法,即DataFrame索引是DateTime或PeriodIndex的实例

l   to_pivot_table 从QuerySet创建数据透视表的便捷方法

to_dataframe

l   fieldnames :用于创建DataFrame的模型字段名称列表。可以使用双下划线指定另一个model中的相关字段,以通常的Django方式跨越关系。

l   index:使用指定用于DataFrame索引的字段名称。如果索引字段不在fieldnames参数中,则将会添加,注意这里的字段必须为该model里的字段。

l   coerce_float:Boolean(布尔值),默认为True。尝试将值转换为非字符串,将非数字对象(如decimal.Decimal)转化为浮点类型。

eg:

models.py

class Img_info(models.Model):
'''
图片信息表
'''
img_name = models.CharField(max_length=128, verbose_name="图片名")
img = models.ImageField(upload_to="img", verbose_name="图片") class Meta:
db_table = "img_info" class Product_score(models.Model):
'''
图片打分表
'''
img_of = models.ForeignKey(Img_info, on_delete=models.CASCADE, verbose_name="图片")
scoring_staff = models.CharField(max_length=32, verbose_name="打分员")
score_num = models.FloatField(verbose_name="分数")
objects = DataFrameManager() class Meta:
db_table = "product_score"

views.py

def tset(request):
qs = Product_score.objects.all()
qs_dataframe = qs.to_dataframe(fieldnames=['img_of__img_name', 'scoring_staff', 'score_num'], index='id', coerce_float=True)
print(qs_dataframe)
return HttpResponse('ok')

运行结果:

   img_of__img_name scoring_staff  score_num
id
15 士大夫 测试1 22.0
20 士大夫 测试2 22.0
25 士大夫 测试3 22.0
16 54撒 测试1 23.0
21 54撒 测试2 23.0
26 54撒 测试3 23.0
17 撒旦撒 测试1 24.0
22 撒旦撒 测试2 24.0
27 撒旦撒 测试3 24.0
18 撒旦撒2 测试1 25.0
23 撒旦撒2 测试2 25.0
28 撒旦撒2 测试3 25.0
19 24 测试1 26.0
24 24 测试2 26.0

您可以使用过滤器和排除:

筛选出分数大于23的

views.py

def tset(request):
qs = Product_score.objects.all()
qs_dataframe = qs.filter(score_num__gt=23).to_dataframe(fieldnames=['img_of__img_name', 'scoring_staff', 'score_num'], index='id', coerce_float=True)
print(qs_dataframe)
return HttpResponse('ok')

运行结果:

   img_of__img_name scoring_staff  score_num
id
17 撒旦撒 测试1 24.0
18 撒旦撒2 测试1 25.0
19 24 测试1 26.0
22 撒旦撒 测试2 24.0
23 撒旦撒2 测试2 25.0
24 24 测试2 26.0
27 撒旦撒 测试3 24.0
28 撒旦撒2 测试3 25.0

to_pivot_table

  • fieldnames:用于创建DataFrame的模型字段名称列表。可以使用双下划线指定另一个model中的相关字段,以通常的Django方式跨越关系。
  • values:要聚合的列,可选
  • rows : 要分组的列名称或数组的列表,在数据透视表的x轴上分组的键
  • cols : 要分组的列名称或数组的列表,在数据透视表的y轴上分组的键
  • aggfunc : function,默认numpy.mean或函数列表,如果传递的函数列表,生成的数据透视表将具有分层列,其顶层是函数名称(从函数对象本身推断)
  • fill_value : 标量,默认无,用于替换缺失值的值
  • margin : boolean,默认为False,添加所有行/列(例如,对于小计/总计)
  • dropna:布尔值,默认为True,去除NaN值

views.py

def tset(request):
qs = Product_score.objects.all()
data_df_to_pivot_table = qs.to_pivot_table(
values='score_num', rows=['img_of__img_name'], cols=['scoring_staff'], fieldnames=['img_of__img_name', 'scoring_staff', 'score_num'], margins=True)
print(data_df_to_pivot_table)
return HttpResponse('ok')

运行结果:

scoring_staff      测试1   测试2   测试3        All
img_of__img_name
24 26.0 26.0 NaN 26.000000
54撒 23.0 23.0 23.0 23.000000
士大夫 22.0 22.0 22.0 22.000000
撒旦撒 24.0 24.0 24.0 24.000000
撒旦撒2 25.0 25.0 25.0 25.000000
All 24.0 24.0 23.5 23.857143

django中使用pandas Django-pandas的更多相关文章

  1. Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',

    1.Django中CSRF中间件的工作原理及form表单提交需要添加{% csrf_token %}防止出现403错误 CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站 ...

  2. Django中ORM介绍和字段及其参数

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  3. Django中ORM介绍

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  4. Django 中的 cookie 和 session

    一.cookie 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新的 ...

  5. django中的ORM介绍和字段及字段参数

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  6. Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)

    Django中ORM介绍和字段及字段参数   Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...

  7. Django中cookie&session的实现

    1.什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie是key-value结构,类似于一个python中的字典.随着服 ...

  8. Django中的ORM介绍,字段以及字段的参数。

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  9. django中使用mysql数据库的事务

    django中怎么使用mysql数据库的事务   Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起 ...

  10. 如何在 Django 中保证并发的数据一致性

    1. 关于锁 1.1 乐观锁 乐观锁的出发点是,同一条数据很少会因为并发修改而产生冲突,适用于读多写少的场景,用以提高吞吐量. 实现方式,读取一个字段,执行处理逻辑,当需要更新数据时,再次检查该字段是 ...

随机推荐

  1. ES6对数组的扩展(简要总结)

    文章目录 数组的扩展(ES6) 1. 扩展运算符 2. Array.from 3. Array.of() 4. copyWithin() 5. find() 和 findIndex() 6. fill ...

  2. LeetCode刷题总结-树篇(上)

          引子:刷题的过程可能是枯燥的,但程序员们的日常确不乏趣味.分享一则LeetCode上名为<打家劫舍 |||>题目的评论: 如有兴趣可以从此题为起点,去LeetCode开启刷题之 ...

  3. Tomcat系列(一)- 整体架构

    整体架构 我们想要了解一个框架,首先要了解它是干什么的,Tomcat我们都知道,是用于处理连接过来的Socket请求的.那么Tomcat就会有两个功能: 对外处理连接,将收到的字节流转化为自己想要的R ...

  4. 【转载】img图片之间的间距问题

    [问题]页面中如果有多张图片,那么图片之间会有一些间距,在某些情况下(如切好的图片再次拼接),在显示上就会出现一些问题.效果如下: 解决方案参看以下文章 img图片之间的间距问题

  5. Android中Parcelable的使用

    转载请标明出处 :https://www.cnblogs.com/tangZH/p/10998065.html  Parcelable与Serializable Serializable是Java为我 ...

  6. python数据挖掘第三篇-垃圾短信文本分类

    数据挖掘第三篇-文本分类 文本分类总体上包括8个步骤.数据探索分析->数据抽取->文本预处理->分词->去除停用词->文本向量化表示->分类器->模型评估.重 ...

  7. 集合系列 Queue(十一):ArrayDeque

    从名字我们可以看出,其实一个双向队列实现,而且底层采用数组实现. public class ArrayDeque<E> extends AbstractCollection<E> ...

  8. js的动态表格的增删改查完整代码

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. php的swoole和rpc区别

    RPC是远程过程调用(Remote Procedure Call)的缩写形式. SAP系统RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自 ...

  10. Leetcode题解 - DFS部分简单题目代码+思路(113、114、116、117、1020、494、576、688)

    这次接触到记忆化DFS,不过还需要多加练习 113. 路径总和 II - (根到叶子结点相关信息记录) """ 思路: 本题 = 根到叶子结点的路径记录 + 根到叶子结点 ...