Django项目开发实战
上QQ阅读APP看书,第一时间看更新

2.6 统计模块

统计数据对于网站的运营人员来说是至关重要的。运营人员在网站的日常运营工作中,需要对他们的工作成果有一个能够量化的衡量标准,以观察工作效果,据此估算网站未来的运营目标并对具体的运营事务作出调整。

统计是一门非常复杂的学科,它是数学的一个分支,涉及数据收集、数据组织、数据分析、展示等内容。数据统计分析的专业程度是很高的,在组织内部往往由专门的团队来负责相关的工作。

对于我们实现的这个简单的电商网站来说,因为其需求简单,所以数据的采集过程也比较简单。主要做法是将请求网站的流量保存到数据库、记录用户请求的日志及借助Google Analytics等第三方平台和工具收集数据。

简单的统计可以通过数据库聚合查询得到结果,在数据量比较少、统计指标比较单一的时候,这是一种非常直观且简单的方式。这样统计得到的结果是实时的。

不过直接使用数据库聚合查询也有一些缺点,首先是可能对数据服务造成负担。在数据量非常大的时候,这不但会造成对数据服务的压力,而且会出现计算时间过长等问题。

面对这些问题,流行的做法是“离线计算”。比较简单的离线计算是从数据服务获取数据,然后采用定时运行脚本的方式,计算得到统计数据后存储到磁盘或者数据库中,Web服务器接到统计数据的请求后,从磁盘或数据库中直接读取数据,然后响应请求,从而实现计算的异步。

现在流行一些比较复杂的离线计算框架,如Apache Hadoop、Apache Spark等,Python也有一些流行的统计包,如pandas、numpy等,这些框架和包已经超出了本书范畴,这里不做展开。

这里采用简单的做法,通过定时运行脚本的方式将数据存储到数据库中。

首先要为统计的数据建立模型。统计结果应该根据数据的粒度和维度进行区分。这里我们以业务的不同模块作为维度,共有用户、商品、订单这3个维度。我们以统计周期作为粒度,代表不同时间段的统计数据,同时以名字来代表指标。模型如下:

说明:

  • metric_name:用于标记某一个指标,如用increased_products来代表某一段时间内增长的商品总数。
  • dimension:用于标记统计的业务维度,如用product来表示产品维度。
  • granularity:用于标记统计的粒度,如用daily表示每日的统计,用weekly表示每周的统计。
  • label:用于标识统计的开始时间。假设label为2018-10-12,当granularity为daily时,表示统计2018年10月12日的统计结果;当granularity为weekly时,表示统计2018年10月12日到2018年10月18日的统计结果。