Py学习  »  Django

了解Pandas是怎样提高Django性能的

Python程序员 • 4 年前 • 303 次点击  


主题


这张帖子的面对人群是使用Python语言进行网页应用框架开发的开发人员。


Pandas是一个功能非常强大的数据分析工具,它能够非常有效的提高你的网页开发效率尤其是当开发过程涉及到数据分析的时候。


Pandas能应用在下列网页开发情境中
•    对表格数据进行可视化以确保对象映射查询是正确的
•    在做报告面板时获得速度的提高
•    让使用者进行查询时省时省力


我们将对以上三种情境在细节上进行讨论


Pandas引言


在我们继续进行上述三种情境的操作之前,我们要将数据库表数据装载在Pandas内。不要觉得麻烦,这个过程不会耗时太多。

现在我们用下面的Django例子来贯穿全篇文章进行讲解



我们以下面的方式加载所有的问题在一个Pandas对象里面:



让我们看下一个questiongs_pandas的内容:



Pandas有一种数据结构叫数据帧。DataFrame.questions_pandas是一个数据帧实例。


让我们装载所有的选项到一个数据帧:



可视化列表数据


简单的对象关系映射查询是很直接明了的,我们确信

Question.objects.all()


Question.objects.filter(question_text='something')

将执行正确的操作


而进一步的使用带注释跨关系的对象关系映射查询,以及那些使用Q对象的高级关系映射查询则不那么简单了。


在编写它们的时候,我们希望它们能确定给出一个符合预期的输出。我想每个Django开发者都会发现他们曾有过这样的想法。


手动运行这些语句,并以表格的外观展现数据,能给我们额外的信心。使用SQL编写语句也能得到表格化的展现,但数据库SQL编写起来更麻烦。


Pandas能显示表数据,它的声明写起来也比较短,而且pandas的数据帧能够被切片、过滤、分组。而且能够被作为变量储存从而促使声明更加短且使数据操作更简单


假设我们正在构建一个报告面板并且希望能对每一个问题进行投票,而且对表单进行排序,使表单中得票最高的在顶部,现在我们为这样的需求写一个对象映射关系查询:

In [29]: questions_orm = Question.objects.annotate(num_votes=Sum('choice__votes')).exclude(num_votes=0).order_by('-num_votes')


该查询对问题进行分组,找出每个问题的投票数,并根据最高投票数对查询结果进行排序



现在让我们用Pandas验证我们的结果,我们能联合question_pandas和choice_pandas两个类,还能很容易的将它们可视化



Pandas的合并运算跟数据库连接相类似,但是Pandas的合并运算比数据库连接声明要短。


从question_id列能明显看出,上面显示的表格数据的前三行是question_id 56。我们可以把votes列的值相加,得到的票数是6。


此即数据分析的结果给我们额外的保证,即确保我们的查询集表现与预期的相同。


与此同效的数据库连接是下面的形式:



你可能已经注意到,数据库的声明比等效的数据分析声明长


获得速度提升


假设我们正在为问题与选项建一个问答报告面板。我们希望这个控制面板能完成过滤以及排序工作。


对此,较为普通的做法是:每次请求对列进行排序时,我们都会运行对象关系映射查询,我们假设第一个请求是按选票数量升序排列的。



下一条要求以选票数量的递减作为排序,我们希望再次执行一次对象关系映射查询,这条查询将对接到数据库



如果使用pandas,我们可以缓存question_and_choices数据帧,而且运用数据帧根据参数进行排序。这样我们就避免了数据库调用。


这将使我们的视图响应加快,我们还可以在每次更新数据库列表或将行插入数据库表格中时更新缓存。缓存服务我们可以使用Redis,但是Pandas也是有这种能力的。


快速响应客户需求


非常多的时候,我们的客户会要求我们对生产数据库做一些临时的查询。这将涉及编写很长的ORM查询,或者我们可以编写很短的pandas语句,只要我们已经将数据加载到DataFrame中。


例如:找出最多的票数。ORM对此的执行方式是:

In [58]: Question.objects.annotate(num_votes=Sum('choice__votes')).exclude(num_votes=0).order_by('-num_votes')[0].question_textOut[58]: 'Is the color of sky blue'


下一个问题是找出最少的票最少的选项:

In [58]: Question.objects.annotate(num_votes=Sum('choice__votes')).exclude(num_votes=0).order_by('num_votes')[0].question_textOut[58]: 'Do you love charles dickens novels?'


接下去,找出无选项的问题:

In [62]: Question.objects.annotate(num_choices=Count('choice')).filter(num_choices=0).values_list('question_text', flat=True)Out[62]: 'Is Samsung more reliable than iPhone?']>


使用panda方法,我可以将数据加载到dataframe中,执行连接,并快速回答后续问题



例如:找出最多票数的问题。Pandas的解决方式为:



找出最少的票数



如果你是一个Python网页开发者,Pandas是一个非常有用的库。学习使用Pandas基本的分组与聚合操作不会超过几个小时的时间。


英文原文:https://blog.urbanpiper.com/how-knowing-pandas-can-boost-your-django-efficiency/ 
译者:超音速

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56985
 
303 次点击