在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. JBPM4常用表结构及入门流程

    JBPM4 常用表结构 第一部分:表结构说明 Jbpm4 共有18张表,如下,其中红色的表为经常使用的表   一:资源库与运行时表结构 1.  JBPM4_DEPLOYMENT 流程定义表 2.  J ...

  2. Java8 Stream —— 更丝滑的集合操作方式

    一.概念 Stream是一种可供流式操作的数据视图有些类似数据库中视图的概念它不改变源数据集合如果对其进行改变的操作它会返回一个新的数据集合. 总的来讲它有三大特性:在之后我们会对照着详细说明     ...

  3. mybatis源码学习(二)--mybatis+spring源码学习

    这篇笔记主要来就,mybatis是如何利用spring的扩展点来实现和spring的整合 1.mybatis和spring整合之后,我们就不需要使用sqlSession.selectOne()这种方式 ...

  4. 浅析 Java 与 C++ 的垃圾回收机制

        Java老师在期末复习大纲上出了一道关于JVM垃圾回收机制的题目,想要我们简述一下JVM垃圾回收机制,与老师交流后,大概老师是希望通过与其他语言在垃圾回收对比,介绍一下Java在这方面的特点和 ...

  5. RMAN备份数据库与表空间

    脚本: 数据库备份: backup database format='/u01/app/oracle/oradata/Backup/oradb_%d_%s.bak'; 表空间备份:backup tab ...

  6. RF之简介

    robot framework 是一个通用型的自动测试框架 - 自动测试用例的实现方式 - 自动测试用例的开发支持 :  IDE.库 - 和用例管理系统的集成 - 测试执行:相关测试套件和测试用例的执 ...

  7. Android——application全局类的使用

    目录 1.概述 2.Application基类 3.自定义Application类 4.Application的生命周期 5.Application对象的回调函数 6.Application对象的作用 ...

  8. [debug] 解决pycharm中无法import自己建立的模块问题

    修改文件夹属性,将其改为"resource",就可以来import了.

  9. JavaScript 日期格式

    有四种 JavaScript 日期输入格式: 类型 实例 ISO 日期 "2018-02-19" (国际标准) 短日期 "02/19/2018" 或者 &quo ...

  10. InnoDB On-Disk Structures(三)--Tablespaces (转载)

    转载.节选于 https://dev.mysql.com/doc/refman/8.0/en/innodb-tablespace.html This section covers topics rel ...