从orm querysets创建透视表和直方图
django-pivot的Python项目详细描述
Django透视表
这个包提供了将django queryset转换为 透视表和直方图 让您的数据库完成所有繁重的工作。
示例
我将无耻地从标题中引用的维基百科页面中举出一些例子。 这是衬衫销售表的一部分:
<表> < COLGROUP > < COL/> < COL/> < COL/> < COL/> < COL/> < COL/> < COL/> <广告> 区域 性别 样式 发货日期 单位 价格 成本 < /广告> <正文> 东部 <我们可能想知道,在每个地区,我们在每个发货日期销售了多少套产品? 得到如下结果:
<表> < COLGROUP > < COL/> < COL/> < COL/> < COL/> < COL/> < COL/> <广告> 区域 2005年1月31日 2005年2月1日 2005年2月2日 2005年3月2日 2005年4月2日 < /广告> <正文> 东部将原始表透视到摘要结果需要3个数量,两列和 第三列的总和。在本例中,这两列是region和ship date, 第三列是单位,合计是和
基本用法
枢轴功能
数据透视表由Pivot函数生成,该函数使用一个模型和3个属性名, 要像上面的示例那样创建透视表:
>>> pivot_table = pivot(ShirtSales, 'shipped', 'region', 'units')
结果是valuesqueryset,这意味着返回的对象是字典。每个 dictionary有一个行的键(在本例中为"shipped"日期)和一个每个值的键 列的('区域')。
>>> for record in pivot_table: ... print(record) ... {u'West': 59, 'shipped': datetime.date(2004, 12, 24), u'East': 71, u'North': 115, u'South': 56} ... {u'West': 55, 'shipped': datetime.date(2005, 1, 31), u'East': 65, u'North': 121, u'South': 66} ... {u'West': 56, 'shipped': datetime.date(2005, 2, 1), u'East': 62, u'North': 124, u'South': 68} ... {u'West': 56, 'shipped': datetime.date(2005, 2, 2), u'East': 59, u'North': 127, u'South': 71} ... {u'West': 66, 'shipped': datetime.date(2005, 3, 1), u'East': 55, u'North': 131, u'South': 65} ... {u'West': 68, 'shipped': datetime.date(2005, 3, 2), u'East': 56, u'North': 130, u'South': 62} ... {u'West': 71, 'shipped': datetime.date(2005, 4, 3), u'East': 56, u'North': 130, u'South': 59} ... {u'West': 65, 'shipped': datetime.date(2005, 5, 6), u'East': 66, u'North': 120, u'South': 55}
第一个参数可以是模型、QuerySet或管理器。这允许您生成一个轴 由另一列筛选的表。例如,你可能想知道W售出多少套 在每个地区的每个发货日期,但仅限于高尔夫球衣:
>>> pivot_table = pivot(ShirtSales.objects.filter(style='Golf'), 'region', 'shipped', 'units')
pivot函数接受用于聚合数据的可选参数。例如, 我们可能感兴趣的不是每个发货日期每个地区的总销售量 每个订单的平均单位数。然后我们可以传递avg聚合函数
>>> from django.db.models import Avg >>> pivot_table = pivot(ShirtSales, 'region', 'shipped', 'units', aggregation=Avg)
如果数据存储在多个表中,请使用django的双下划线表示法 遍历外键关系。例如,shirtsales模型没有 一个 region 属性,它可能有一个存储模型的外键,而存储模型又有一个 区域模型的外键,该模型具有名为的属性。然后我们的中心呼叫看起来 像
>>> pivot_table = pivot(ShirtSales, 'store__region__name', 'shipped', 'units')
我们正在聚合的数据列也可能是计算列。 在我们的示例shirtsales模型中,我们存储了每件衣服的数量和价格 单位,但不是订单的总成本。如果我们想知道 每个发货日期的每个地区的美元,我们可以旋转shirtsales表:
>>> from django.db.models import F, Avg >>> pivot_table = pivot(ShirtSales, 'region', 'shipped', F('units') * F('price'), Avg)
例如,如果要将行分组到复合列上,则需要知道 在每个发货日期出售的单位不只是按地区划分,而是按地区组合 和性别,您可以将列表传递给第一个参数:
>>> pivot_table = pivot(ShirtSales, ['region', 'gender'], 'shipped', 'units')
要更改行键的显示方式,可以将display_transform函数传递给 轴心函数。display_transform是一个接受字符串并返回字符串的函数。 例如,而不是获取区域的北、东、南和西的结果 如果您希望它们都是小写的,可以执行以下操作
>>> def lowercase(s): >>> return s.lower() >>> pivot_table = pivot(ShirtSales, 'region', 'shipped', 'units', display_transform=lowercase)
如果原始数据表中没有透视结果中特定单元格的记录, sql将返回null,并且在python中将其转换为none。如果你想归零,或者 其他一些默认值,可以将其作为参数传递给pivot:
>>> pivot_table = pivot(ShirtSales, 'region', 'shipped', 'units', default=0)
上述要求可确保在某一特定区域内某一特定区域内 日期,结果是零而不是零。但是,结果将只包含 发货日期(如果至少有一个地区在该日期有销售)。如果有必要的话 对于一个范围内的所有日期,包括没有衬衫记录的日期,我们可以通过 目标行范围:
>>> pivot_table = pivot(ShirtSales, 'shipped', 'region', 'units')0
将输出从1月1日到2月28日的每个发货日期的结果 在那些日子里销售与否。
直方图函数
此库还支持使用 直方图函数,它接受一个模型、一个属性名和一个左边缘的iterable 垃圾桶。
>>> pivot_table = pivot(ShirtSales, 'shipped', 'region', 'units')1
与pivot一样,第一个参数可以是model、queryset或manager。结果是 词典列表:
>>> pivot_table = pivot(ShirtSales, 'shipped', 'region', 'units')2
通过对一个查询上的数据进行切片,也可以从一个查询中获取多个直方图 列的。例如,我们可能需要两个直方图,而不是上面的直方图, 一个男孩一个女孩。 衬衫 的 性别 栏有两个值, "男孩" 和 "女孩" 。将性别列作为第四个可选参数传递给直方图 将对该列上的数据进行切片。
>>> pivot_table = pivot(ShirtSales, 'shipped', 'region', 'units')3
结果是一个valuesqueryset,其中每一行对应一个bin
>>> pivot_table = pivot(ShirtSales, 'shipped', 'region', 'units')4
安装
<>:>>> pivot_table = pivot(ShirtSales, 'shipped', 'region', 'units')5
将django_pivot放入设置文件中已安装的应用程序中,然后您:
>>> pivot_table = pivot(ShirtSales, 'shipped', 'region', 'units')6
然后离开。
测试
测试套件由travis运行 Django版本1.10和1.11以及后端sqlite、mysql和postgres。如果你 希望从根目录在本地运行测试套件:
>>> pivot_table = pivot(ShirtSales, 'shipped', 'region', 'units')7
它将使用sqlite作为后端和任何版本的d詹戈,你有 在您当前的环境中。
许可证
麻省理工学院< /P>
版权所有2017 Brad Martsberger
兹免费授予获得本软件及相关文档文件(以下简称"软件")副本的任何人使用本软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再授权的权利。,和/或出售软件的副本,并允许向其提供软件的人员这样做,但须遵守以下条件:
上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。
本软件按"原样"提供,不作任何形式的明示或默示保证,包括但不限于适销性保证、特定用途适用性保证和非侵权性保证。在任何情况下,无论是在合同、侵权或其他诉讼中,作者或版权所有人都不对任何索赔、损害赔偿或其他责任负责,这些索赔、损害赔偿或其他责任是由软件或软件的使用或其他交易引起的、由软件引起的或与之相关的。