一、构建指标体系的套路 @数据建设

Step1. 做加法 —— 核心目标层层层…层层层拆解

一次总销量的巨大滑坡可能与一件最末端的微不足道的小事有关,正如一只蝴蝶在巴西轻拍翅膀,可以导致一个月后德克萨斯州的一场龙卷风。分析一个我们赖以生存的核心指标,面面俱到、刨根问底绝不是多虑。

相比于头脑风暴环节天马行空的发散型思维,为了避免遗漏细枝末节,在开始构建指标体系时,我们更倾向于信赖数学公式。最简单的加减乘除四则运算就可以帮助我们实现目标,比如销量就可以找到至少3条不同的数学公式来表示推导(具体略),销量拆解出了一堆二级小目标们……重复拆解工作,直到指标细到无法再分割,找到足以影响核心目前的局部因素。

此时我们得到了一个汇集大量指标的拥挤的脑图。

Step2. 做减法 —— 关注指标与维度

此时如果仔细观察拥挤的脑图,可以发现它并不十分让人满意,出现在你眼前的是很多冗余的信息,譬如大多数指标都带着优惠前、优惠后、品牌用户、非品牌用户的前缀,此时引入维度也许能缓解这种拥挤,如果说指标多数情况下指被观察事物的数值考量,那么维度可以理解为观察事物的角度。如时间、类别都是典型的维度,这些维度帮助我们从不同视角观察事物的变化、分布。

然而,是否将指标合二为一以维度进行替代不能一概而论,譬如对于品牌用户、非品牌用户,我们时长需要将两者的消费数据进行对比,于是将前者或后者抹去以维度替代就不是那么合理了。

说回做减法,除去合适使用维度减少指标,从业务角度也需要对哪些指标有意义进行判断,比如我们一厢情愿的将用户数拆分为品牌用户数和非品牌用户数,而实际的状况是我们并不能统计到非品牌用户的任何信息,那么至少在本期,我们可以去除一些无意义的指标了。

Step3. 调结构 —— 面向对象输出

时刻记得你的输出结果面向的是人类,不同对象关注的点有着天壤之别,譬如相比于某个小客户的为每次活动补贴了100大洋,CEO可能更想知道这个月公司预计的收入是多少。


二、懒人测试脚本方法 @数据提取

- 悄悄插入一条测试数据,观察增量部分导致的数据结果变化是否符合预期

- 简单粗暴的复制表结构,建立一模一样的测试表结构用于测试,与杂乱庞大数据说再见

- 在脚本中,将可能有问题的部分输出查看结果


三、谜一样的Python模块 @数据提取

Python中,每个.py文件被称之为模块,每个具有__init__.py文件的目录被称为包。只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包,其中site-packages 是包存储的最佳位置选择。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
In [1]: import sys
In [2]: import pprint
In [3]: pprint.pprint(sys.path)
['',
'/Users/breaking_red/Applications/anaconda/bin',
'/Users/breaking_red/Applications/anaconda/lib/python36.zip',
'/Users/breaking_red/Applications/anaconda/lib/python3.6',
'/Users/breaking_red/Applications/anaconda/lib/python3.6/lib-dynload',
'/Users/breaking_red/Applications/anaconda/lib/python3.6/site-packages',
'/Users/breaking_red/Applications/anaconda/lib/python3.6/site-packages/Sphinx-1.5.6-py3.6.egg',
'/Users/breaking_red/Applications/anaconda/lib/python3.6/site-packages/aeosa',
'/Users/breaking_red/Applications/anaconda/lib/python3.6/site-packages/twilio-6.3.dev0-py3.6.egg',
'/Users/breaking_red/Applications/anaconda/lib/python3.6/site-packages/PySocks-1.6.7-py3.6.egg',
'/Users/breaking_red/Applications/anaconda/lib/python3.6/site-packages/httplib2-0.10.3-py3.6.egg',
'/Users/breaking_red/Applications/anaconda/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg',
'/Users/breaking_red/Applications/anaconda/lib/python3.6/site-packages/IPython/extensions',
'/Users/breaking_red/.ipython']

这里顺带提一嘴常见的导入模块的姿势:

  • import module
  • from module import method
  • from module import *

书上说:命名冲突可能发生在很隐蔽的角落,因此除非真的需要from这个形式的模块导入语句,否则应该坚持使用普通的import,这种做法在少数情况下是挺方便的,但是这样也会打乱你的命名空间。

例如,你可能定义了一个与导入模块中名称相同的变量或函数,这时如果你试图使用os模块中的同名变量或函数,实际使用的将是你自己定义的内容。因此,你最后可能会碰到一个相当让人困惑的逻辑错误。


四、其他印象深刻的糟心事

- 装包超时超时超时…(1kb/s…)

装MaxCompute提供给Python的ODPS,pip default timeout = 1000 都不管用,索性换个源,安装阿里云pip镜像,速度快到飞起。

创建.pip文件夹,创建pip.conf,配置[global]:

trusted-host = mirrors.ustc.edu.cn

index-url = https://mirrors.ustc.edu.cn/pypi/web/simple

- 可怕的版本管理

本地git捡起来