├── README.md ├── jupyter notebook导出pdf并支持中文.md ├── 勘误表.md ├── 本书安装包 ├── 本书详细介绍.md ├── 本书额外教程 ├── python包的安装方式.md ├── 原来你竟然是这样的txt?.md ├── 实战-用户价值模型搭建.md └── 将Chrome设置为Jupyter_notebook的默认浏览器.md └── 随书数据集 ├── Python报表自动化数据集.xlsx └── 对比Excel,轻松学习Python数据分析数据集.zip /README.md: -------------------------------------------------------------------------------- 1 | 本仓库为『对比Excel,轻松学习Python数据分析』读者服务仓库。主要会包括以下几个方面: 2 | 3 | # 本书介绍 4 | [关于本书的详细介绍](https://github.com/junhongzhang/Excel-Python-DA/blob/master/%E6%9C%AC%E4%B9%A6%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D.md) 5 | 6 | # 随书代码 7 | 本模块为读者自由贡献板块,包含了书中所有的代码和数据集,大家可以到此查看。欢迎大家添加链接到此模块。 8 | 9 | [书籍代码1](https://github.com/xmaniu/Excel-Python) 10 | 11 | [书籍代码2](https://github.com/Zhou-kun/Excel-Python-Learning-Note) 12 | 13 | # 本书勘误表 14 | 由于作者水平有限,所以在写作过程中难免会出现一些意想不到的错误,欢迎大家指正。 15 | [勘误表](https://github.com/junhongzhang/Excel-Python-DA/blob/master/%E5%8B%98%E8%AF%AF%E8%A1%A8.md) 16 | 17 | # 随书数据集 18 | 为了能够让大家复现本书中的例子,现提供本书中用到的一些数据集。 19 | [数据集](https://github.com/junhongzhang/Excel-Python-DA/tree/master/%E9%9A%8F%E4%B9%A6%E6%95%B0%E6%8D%AE%E9%9B%86) 20 | 21 | # 本书额外教程 22 | 针对大家问题比较多的问题或者大家在平常数据分析工作中有需求,但是本书没有涉及到的内容,我会专门来写相应的教程发出来。 23 | [额外教程](https://github.com/junhongzhang/Excel-Python-DA/tree/master/%E6%9C%AC%E4%B9%A6%E9%A2%9D%E5%A4%96%E6%95%99%E7%A8%8B) 24 | 25 | # 本书所需Python安装包 26 | 可以直接到百度云下载所需要的Python安装包。[下载地址](https://github.com/junhongzhang/Excel-Python-DA) 27 | -------------------------------------------------------------------------------- /jupyter notebook导出pdf并支持中文.md: -------------------------------------------------------------------------------- 1 | **Jupyter Notebook**是很好的数据科学创作环境,反正我做数据分析的项目或小练习的时候,基本都是在用jupyter notebook(原先是叫ipython notebook,所以现在文件后缀还是.ipynb),以前不怎么用到导出pdf功能,然后要用的时候就遇到很多坑了。jupyter提供导出的格式有.py、.html、.md、.pdf等。 2 | 3 | ![jupyter notebook支持的导出格式](https://upload-images.jianshu.io/upload_images/2473543-b37f85b5584364b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 4 | 5 | 从效果来看,网页中notebook的渲染是最好看的,导出的html对代码和超链接失真严重。在网页上点*Download as -> PDF via LaTex*的时候先是说缺少Pandoc库,于是pip install pandoc,之后不再说缺少这个库了,而是 6 | nbconvert failed: pdflatex not found on PATH 或者 nbconvert failed: PDF creating failed, captured latex output。查了一些资料后改用命令行,要避免*'xelatex' 不是内部或外部命令,也不是可运行的程序或批处理文件*,需要先安装MiKTeX,在其[官网下载](https://miktex.org/download)后,Windows版一路next安装就行,安装包有190MB,安装过程还是耗费些时间的,下载安装完成之后的步骤是: 7 | 8 | ### 1, ipynb文件编译为tex 9 | 在命令行中定位到要转换的jupyter文件的路径下,输入 10 | **jupyter nbconvert --to latex yourNotebookName.ipynb** 11 | 12 | ![编译ipynb文件为LaTeX文件](https://upload-images.jianshu.io/upload_images/2473543-3066970796a6043b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 13 | 在文件目录下就可以看到一个叫**yourNotebookName.tex**的LaTeX文件了。 14 | ### 2, 手动编辑latex文件 15 | 为了能支持输出中文,需要改一下tex文件,在编辑器(我用的是Notepad++)打开刚才生成的LaTeX文件, 16 | 在**\documentclass{article}**(没有这一句就在\documentclass[11pt]{ctexart} 的后面插入下面的语句)后面插入 17 | ```latex 18 | \usepackage{fontspec, xunicode, xltxtra} 19 | \setmainfont{Microsoft YaHei} 20 | ``` 21 | ![修改latex文件](https://upload-images.jianshu.io/upload_images/2473543-898fdf8271689505.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 22 | 23 | ### 3, 转latex为pdf 24 | 随后在命令行下输入:(我演示文件用的是GeoCluster.tex) 25 | ``` 26 | xelatex yourNotebookName.tex 27 | ``` 28 | ![命令行转latex为pdf](https://upload-images.jianshu.io/upload_images/2473543-6624da52f9d4d9d1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 29 | 之前没有运行过xelatex,首次运行会安装一些依赖文件,会慢一些,最后运行完毕: 30 | ![运行完xelatex命令](https://upload-images.jianshu.io/upload_images/2473543-192ac8f3fe434b96.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 31 | 可以在文件夹下看到输出的文件: 32 | ![最后文件夹下的结果](https://upload-images.jianshu.io/upload_images/2473543-c7f89da3bad6866f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 33 | - .ipynb 是我们的jupyter文件 34 | - .tex 是由jupyter notebook文件生成的 35 | - .pdf 是我们最后的目标文件由.tex文件生成 36 | - .log、.out、.aux是LaTex生成pdf的一些输出和日志 37 | 38 | 总结一下,从jupyter notebook生成pdf文件需要的依赖项还是比较多的,Windows下安装MiKTeX才能用xelatex命令。生成步骤是先把ipynb文件编译为LaTex,然后为了支持中文修改一下lex文件,最后转换为pdf文件。 39 | 40 | 最后效果如下,虽然还是比不上网页端.ipynb的直接渲染效果,但比起导出的html等格式,更好地作为展示格式。 41 | ![生成pdf的效果](https://upload-images.jianshu.io/upload_images/2473543-036c476dcddbbca0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 42 | 43 | ps: 44 | - 现在觉得下载安装部分说得有些简略,之后可以把这部分说得更详细; 45 | - 原文[简书链接](https://www.jianshu.com/p/6b84a9631f8a) 46 | -------------------------------------------------------------------------------- /勘误表.md: -------------------------------------------------------------------------------- 1 | 本篇为『对比Excel,轻松学习Python数据分析』书籍勘误表,欢迎大家指正。 2 | 3 | |位置|误|正| 4 | |---|---|---| 5 | |P27|变量名必须以字母或下画线|变量名必须以字母或下划线| 6 | |P28|.2%表示以百分比的形式展示,且展示小数点后两位|.2%表示以百分比的形式展示,且显示小数点后两位| 7 | |P30|"张俊红"|'张俊红'| 8 | |P30|"Python真强大"*3|'Python真强大Python真强大Python真强大'| 9 | |P36|"a","d",["b","c"]|'a','d',['b','c']| 10 | |P36|>str_list...|>>>str_list...| 11 | |P37|然后用dict进行转化。|然后用dict()进行转化。| 12 | |P38|元组(tup)虽然与列表相似|元组(tuple)虽然与列表相似| 13 | |P38|("a","b","c")|('a','b','c')| 14 | |P40|<>|<>在python3.x中已经取消| 15 | |P50|从一个较大的模块中import较小的一个模块|从一个较大的模块中import一个较小的模块| 16 | |P67|除了sql和con这两个关键参数,read_table()函数|除了sql和con这两个关键参数,read_sql()函数| 17 | |P76|只要给dropna()方法传入一个参数how=all即可|只要给dropna()方法传入一个参数how="all"即可| 18 | |P81|df.drop_duplicates(subset=["姓名","唯一识别码"])|df.drop_duplicates(subset=["客户姓名","唯一识别码"])| 19 | |P82|下图为正太分布图|下图为正态分布图| 20 | |P84|dtype("int64")|dtype('int64')| 21 | |P85|df["唯一识别码"].dtype()|df["唯一识别码"].dtype| 22 | |P87|df.index=[1,2,3,4,5,6]|df.index=[1,2,3,4,5]| 23 | |P89|df.rename(columns={"订单编号":"新订单编号","客户姓名":"新客户姓名"}index={1:"一",2:"二",3:"三"})|df.rename(columns={"订单编号":"新订单编号","客户姓名":"新客户姓名"},index={1:"一",2:"二",3:"三"})| 24 | |P92|df["订单编号"]获取的结果|df["订单编号"]获取到的结果中没有列名| 25 | |P95|df.iloc[0:2]|df.iloc[0:3]| 26 | |P98|0、1、2、3、4索引一、二、三、四、五| 27 | |P98|df.iloc[0:2,1:2]|df.iloc[0:3,1:3]| 28 | |P99|df.ix[0:2,["客户姓名","唯一识别码"]]|df.ix[0:3,["客户姓名","唯一识别码"]] 注意:使用ix也可以得出结果,但是会报警告,因为ix方法被弃用,换成loc即可消除报警| 29 | |P101|df["年龄"].replace(240,33)|df.replace(240,33)或者 df["年龄"].replace(240,33,inplace = True) 再打印df| 30 | |P116|df.isin([A2,31])|df.isin(["A2",31])| 31 | |P118|pd.cut(df["年龄"],3,bins=[0,3,6,10])|pd.cut(df["年龄"],bins=[0,3,6,10])| 32 | |P124|Nmae|Name| 33 | |P124、P125、P126|Conpany、conpany|Company| 34 | |P125|df.melt出来的结果顺序有问题|df.melt出来的结果应该是按照year排序的,即相同的年份在一起| 35 | |P126|长表转化为宽表|结果中不包含亚马逊和腾讯| 36 | |P129|df["C1"] != df["C2"]|df["C1"] < df["C2"]| 37 | |P135|df["C1"].var()|df["C1"].std()| 38 | |P139|datatime.now.weeekeday()+1|datetime.now().weekday()+1| 39 | |P139|datatime.now.isocalendar()|datetime.now().isocalendar()| 40 | |P139|datatime.now.isocalendar()[1]|datetime.now().isocalendar()[1]| 41 | |P140|datatime.now.date()|datetime.now().date()| 42 | |P140|datatime.now.time()|datetime.now().time()| 43 | |P142|parse(str_now)|parse(str_time)| 44 | |P142|type(parse(str_now))|type(parse(str_time))| 45 | |P146|#往后推60分钟|#往前推60分钟| 46 | |P146|data|date| 47 | |P146|2018/5/19 23:32|2018/5/18 23:32| 48 | |P146|2018/5/19 21:32|2018/5/18 21:32| 49 | |P146|2018/5/19 17:32|2018/5/18 17:32| 50 | |P146|2018/5/19 19:32|2018/5/18 19:32| 51 | |P147|from pd.tseries.offsets import Day,Hour,Minute|from pandas.tseries.offsets import Day,Hour,Minute| 52 | |P147|#往后推10分钟,date+Minute(1)|#往后推10分钟,date+Minute(10)| 53 | |P147|#往前推1小时,date+Hour(1)|#往前推1小时,date-Hour(1)| 54 | |P147|#往前推10分钟,date+Minute(1)|#往前推10分钟,date-Minute(10)| 55 | |P153|df.group("客户分类")|df.groupby("客户分类")| 56 | |P153|df.group("客户分类").sum().reset_index()|df.groupby("客户分类").sum().reset_index()| 57 | |P156|pd.pivot_table(df,values=["用户ID","7月销量"],,|pd.pivot_table(df,values=["用户ID","7月销量"],| 58 | |P172|float("-inf)|float("-inf")| 59 | |P184|然后在[1,1]坐标系中绘制折线图|然后在[1,1]坐标系中绘制柱状图| 60 | |P189|y=array([])|y=np.array([])| 61 | |P195、P196|plt.title(s=|plt.title(label=| 62 | |P197|plt.text(5,1605,"极值点")|折线图的文字是"极值点"点不是1605| 63 | |P207|#x+0.3相当于把完成量的每个柱子右移0.3|删除| 64 | |P207|plt.bar(x+0.3,y2|plt.bar(x,y2| 65 | |P208|.xlabel("任务量")|plt.xlabel("任务量")| 66 | |P212|y1=array|y1=np.array| 67 | |P212|y2=array|y2=np.array| 68 | |P214|size = np.array([0.34,0.693...|size = np.array([3.4,0.693| 69 | |P216|plt.title(s='综合评级') |plt.title(label='综合评级') | 70 | |P217|y1=array([])|y1=np.array([])| 71 | |P217|y2=array([])|y2=np.array([])| 72 | |P222|x = np.array|cm = np.array| 73 | |P222|for i,j in itertools.product|需要引入import itertools| 74 | |P237|s_t_1=sales/traffic|s_t_1=sales_1/traffic_1| 75 | |P237|s_t_2=sales/traffic|s_t_2=sales_2/traffic_2| 76 | |P237|s_t_3=sales/traffic|s_t_3=sales_3/traffic_3| 77 | |P237|format(sale_1,traffic_1,s_t_1)|format(sales_1,traffic_1,s_t_1)| 78 | |P237|format(sale_2,traffic_1,s_t_1)|format(sales_2,traffic_1,s_t_1)| 79 | |P237|format(sale_3,traffic_1,s_t_1)|format(sales_3,traffic_1,s_t_1)| 80 | |P238|sale = (data["Price"]\*data["Qty"]).sum()|sale = (data["单价"]*data["销量"]).sum()| 81 | |P238|traffic = data["SheetID"].drop_duplicates().count()|traffic = data["订单ID"].drop_duplicates().count()| 82 | |P238| [traffic_1.traffic_2,traffic_3]|[traffic_1,traffic_2,traffic_3]| 83 | |P240|邮件自动发送部分最开始添加from email.mime.multipart import MIMEMultipart|| 84 | |P242|pd.pivot_table(data_2017|pd.pivot_table(data| 85 | |P244|#求每个小时的客流量tracffic.groupby("小时")["订单ID"].count().plot()|去掉.plot| 86 | |P247|age_cut = pd.cut(data["年龄"],6)|age_cut = pd.qcut(data["年龄"],6)| 87 | |P249|bad_rate.plot.bar()|bad_rate.plot()| 88 | |P252|npp.ones((2,3))|np.ones((2,3))| 89 | |P254|np.random.randint(5,10)|np.random.randint(5,size=10)| 90 | |P254|np.random.randint(5,3)|np.random.choice(5,3)| 91 | |P254|np.random.randint(5,(2,3))|np.random.choice(5,(2,3))| 92 | |P255|np.random.shuffle(arr)| 在这行后面增加arr输出| 93 | |P260|arr[np.isnan(arr)]=0| 在这行后面增加arr输出| 94 | |P261|#将数组重塑为2行6列的| 在这行后面增加arr.reshape(2,6)| 95 | |P265|argmin、argmax:分别为最大值和最小值对应的索引| argmin、argmax:分别为最小值和最大值对应的索引| 96 | -------------------------------------------------------------------------------- /本书安装包: -------------------------------------------------------------------------------- 1 | 以下为本书所需要的Python安装包的百度云地址,可以直接打开链接获取哦。 2 | 链接:https://pan.baidu.com/s/171hvC4O2c4wQv2zmQ1JPwg 3 | 提取码:69xb 4 | -------------------------------------------------------------------------------- /本书详细介绍.md: -------------------------------------------------------------------------------- 1 | 我写了一本书,现在这本书终于面世了,这本书就是『对比Excel,轻松学习Python数据分析』,这本书是写什么的,以及这本书怎么写的,相信大家通过书名就能了解一二,但还是有必要专门写一篇文章来详细介绍一下。 2 | ![书就是长这个样子啦](https://i.loli.net/2019/02/17/5c68ede45d4e8.jpg) 3 | 4 | 5 | # 1.本书简介 6 | 集Python、Excel、数据分析为一体是本书的一大特色。 7 | 8 | 本书围绕整个数据分析的常规流程:熟悉工具—明确目的—获取数据—熟悉数据—处理数据—分析数据—得出结论—验证结论—展示结论进行Excel和Python的对比实现,告诉 你每一个过程中都会用到什么,过程与过程之间有什么联系。本书既可以作为系统学习数 据分析操作流程的说明书,也可以作为一本数据分析师案头必备的实操工具书。 9 | 10 | 本书通过对比Excel功能操作去学习Python的代码实现,而不是直接学习Python代码,大大降低了学习门槛,消除了读者对代码的恐惧心理。适合刚入行的数据分析师,也适合对Excel比较熟练的数据分析师,以及从事其他岗位想提高工作效率的职场人。 11 | # 2.为什么要写这本书 12 | 本书既是一本数据分析的书,也是一本Excel数据分析的书,同时还是一本Python数据分析的书。在互联网上,无论是搜索数据分析,还是搜索Excel数据分析,亦或是搜索Python数据分析,我们都可以找到很多相关的图书。既然已经有这么多同类题材的书了,为什么我还要写呢?因为在我准备写这本书时,还没有一本把数据分析、Excel 数据分析、Python数据分析这三者结合在一起的书。 13 | 14 | 为什么我要把它们结合在一起写呢?那是因为,我认为这三者是一个数据分析师必备的技能,而且这三者本身也是一个有机统一体。数据分析让你知道怎么分析以及分析什么;Excel和Python是你在分析过程中会用到的两个工具。 15 | # 3.为什么要学习Python 16 | 既然Python在数据分析领域是一个和Excel类似的数据分析工具,二者实现的功能都一样,为什么还要学 Python,把Excel学好不就行了吗?我认为学习Python的主要原因有以下几点: 17 | 18 | #### 1.在处理大量数据时,Python的效率高于Excel 19 | 20 | 当数据量很小的时候,Excel和Python的处理速度基本上差不多,但是当数据量较大或者公式嵌套太多时,Excel 就会变得很慢,这个时候怎么办呢?我们可以使用Python,Python对于海量数据的处理效果要明显优于 Excel。用Vlookup函数做一个 实验,两个大小均为23MB的表(6 万行数据),在未作任何处理、没有任何公式嵌套之前,Excel中直接在一个表中用 Vlookup 函数获取另一个表的数据需要20秒(我的 计算机性能参数是 I7、8GB 内存、256GB 固态硬盘),配置稍微差点的计算机可能打开这个表都很难。但是用Python实现上述过程只需要580毫秒,即 0.58 秒,是 Excel 效率的 34 倍。 21 | 22 | #### 2.Python可以轻松实现自动化 23 | 24 | 你可能会说Excel的VBA也可以自动化,但是VBA主要还是基于Excel内部的 自动化,一些其他方面的自动化VBA 就做不了,比如你要针对本地某一文件夹下面的文件名进行批量修改,VBA就不能实现,但是Python可以。 25 | 26 | #### 3.Python可用来做算法模型 27 | 28 | 虽然你是做数据分析的,但是一些基础的算法模型还是有必要掌握的,Python可以让你在懂一些基础的算法原理的情况下就能搭建一些模型,比如你可以使用聚类算法搭建一个模型去对用户进行分类。 29 | 30 | # 4.为什么要对比Excel学习Python 31 | 32 | Python虽然是一门编程语言,但是在数据分析领域实现的功能和Excel的基本功 能一样,而Excel又是大家比较熟悉、容易上手的软件,所以可以通过Excel数据分析去对比学习Python数据分析。对于同一个功能,本书告诉你在Excel中怎么做,并告诉你对应到Python中是什么样的代码。例如数值替换,即把一个值替换成另一个值, 对把“Excel”替换成“Python”这一要求,在Excel中可以通过鼠标点选实现,如下图所示。: 33 | 34 | ![](https://i.loli.net/2019/02/17/5c68cdc702ce9.png) 35 | 36 | 在 Python 中则通过具体的代码实现,如下所示: 37 | ``` 38 | df.replace(“Excel”,”Python”)#表示将表df中的Excel替换成Python 39 | ``` 40 | 本书将数据分析过程中涉及的每一个操作都按这种方式对照讲解,让你从熟悉的Excel操作中去学习对应的 Python实现,而不是直接学习Python代码,**大大降低了学习门槛,消除了大家对代码的恐惧心理**。这也是本书的一大特色,也是我为什么要写本书的主要原因,就是希望帮助你不再惧怕代码,让你可以像学Excel数据分析一 样,轻松学习Python数据分析。 41 | 42 | # 5.本书目录 43 | 本书分为三篇,入门篇主要讲数据分析的一些基础知识,介绍数据分析是什么,为什么要做数据分析,数据分析究竟在分析什么,以及数据分析的常规流程;实践篇围绕数据分析的整个流程,为了让大家便于理解,又将数据分析整个过程与买菜做饭相联系,分别介绍每一个步骤中的操作,这些操作用Excel如何实现,用Python又如何实现;进阶篇:介绍几个实战案例,让你体会一下在实际业务中如何使用Python。 44 | 45 | **入门篇** 46 | 第 1 章 数据分析基础 47 | 48 | **实践篇** 49 | 第 2 章 熟悉锅——Python 基础知识 50 | 第 3 章 Pandas 数据结构 51 | 第 4 章 准备食材——获取数据源 52 | 第 5 章 淘米洗菜——数据预处理 53 | 第 6 章 菜品挑选——数据选择 54 | 第 7 章 切配菜品——数值操作 55 | 第 8 章 开始烹调——数据运算 56 | 第 9 章 炒菜计时器——时间序列 57 | 第 10 章 菜品分类——数据分组/数据透视表 58 | 第 11 章 水果拼盘——多表拼接 59 | 第 12 章 盛菜装盘——结果导出 60 | 第 13 章 菜品摆放——数据可视化 61 | 62 | **进阶篇** 63 | 第 14 章 典型数据分析案例 64 | 第 15 章 NumPy数组 65 | 66 | # 6.专家推荐 67 | 来看看一些行业大佬怎么讲,在此再次感谢为这本书写推荐的各位老师。 68 | --- 69 | 数据分析的门槛可以很高,也可以很低,但它一定很重要!这本书不是晦涩难懂的学术教材,而是适合不同层次职场人士学习的工具书,通俗易懂的阐述了数据分析的基础及在不同工具下的主要实践,对于初学者或是资深数据爱好者都有很好的启发和助益。 70 | 71 | by--黄小伟 有赞数据分析团队负责人/R语言中文社区创始人 72 | --- 73 | 大数据时代,数据分析是每个职场人士的必备技能之一,你掌握了吗?本书以一种人人都熟悉的炒菜的故事作为主线,用轻松的语言深入浅出的讲述数据分析的各个核心要素,是初入数据分析领域的同学一个很好的入门教材,同时也是有一定分析经验同学的参考工具书。 74 | 75 | by--黄崇杰 平安壹钱包数据营销总监 76 | --- 77 | 数据分析工作中的80%以上的时间都在处理底层数据。一份“高大上”的报告实际上只占了分析师不到20%的时间。张老师的这本书出现的正是时候——Excel好用但是在大数据是的效率低,但是结合上Python的能力以后,会让分析师如虎添翼。数据分析师们动动手指产出INSIGHT的美好时光指日可待了! 78 | 79 | by--刘洋 阿里巴巴高级产品专家 80 | --- 81 | 本书为传统数据分析人员迈向大数据时代指明方向,并终将带来竞争优势 82 | 83 | by--闵军 找钢网数据中心总经理 84 | --- 85 | 一本少见的结合了Excel及Python来学习数据分析的好书。作为基本的数据分析工具,Excel技能及Python技能的掌握,对于数据分析师来说都是十分必要的,相信任何一个有志于学习数据分析的朋友,都能从此书收获良多。 86 | 87 | by--张浩彬 广东柯内特环境科技有限公司首席数据科学家 88 | --- 89 | 本书是实用并且可操作,通过Python来分析数据,从书中内容看出作者在陈列操作步骤过程中包括了大量的分析思维,对于那些想转型或者入门想从事数据分析的同学,是一步很好的教材级书本。 90 | 91 | by--赵良 中国统计网联合创始人 92 | --- 93 | 作为这几年最火的语言之一,Python在数据分析方面的能力几乎是无限的,可能唯一的限制就在于使用者本身的能力和认知。对数据分析师而言,用Python做数据分析已经成为必需技能。这本Python数据分析基于熟知的Excel做对照和解释,深入浅出,娓娓道来。既兼顾到不同工具的应用场景,又将使用技巧融入其中。推荐刚入门的数据分析师阅读。 94 | 95 | by--宋天龙 《Python数据分析与数据化运营》作者 96 | --- 97 | Excel与Python都是数据分析利器,本书从Excel与Python的实际作用出发,书中的知识都是作者多年一线工作的经验总结。 98 | 99 | by-- 王颖祥 永辉超市大数据合伙人 100 | 101 | # 7.本书样章 102 | 103 | 全书采用对比Excel操作的方式来讲解Python代码,以下为书中介绍数据透视表的部分内容: 104 | 105 | 数据透视表实现的功能与数据分组相类似但又不同,数据分组是在一维(行)方向上不断进行拆分,而数据透视表是在行列方向上同时进行拆分。 106 | 107 | 下图为数据分组与数据透视表的对比图: 108 | 109 | ![](https://ws1.sinaimg.cn/large/006JdmJily1fuvf0sw8qcj30tf0ep0th.jpg) 110 | 111 | 数据透视表不管是在Excel还是Python中都是一个很重要的功能,大家都需要熟练掌握。 112 | 113 | **Excel实现** 114 | 115 | Excel中的数据透视表在插入菜单栏中,选择插入透视表以后就会看到下图的界面。下图左侧为数据表中的所有字段,右侧为数据透视表选项,把左侧字段拖到右侧对应的框中即完成了数据透视表的制作。 116 | 117 | ![](https://ws1.sinaimg.cn/large/006JdmJily1fuvf6i1dafj30hs0c8q51.jpg) 118 | 119 | 下图为让客户分类作为行标签,区域作为列标签,用户ID作为值,且值字段的计算类型为计数的结果。 120 | 121 | ![](https://ws1.sinaimg.cn/large/006JdmJily1fuvf84m0r9j30c703xwek.jpg) 122 | 123 | 在数据透视表中把多个字段作拖到行对应的框作为行标签,把多个字段拖到列对应的框作为列标签,把多个字段拖到值对应的框作为值,且可以对不同的值字段选择不同的计算类型,大家自行练习。 124 | 125 | **Python实现** 126 | 127 | 在Python中的数据透视表制作原理与Excel制作原理是一样的。Python中的数据透视表用到的是pivot_table()方法。 128 | 129 | pivot_table的全部参数如下: 130 | ``` 131 | pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', 132 | fill_value=None, margins=False, dropna=True, margins_name='All') 133 | 134 | #data表示要做数据透视表的整个表 135 | #values对应Excel中值那个框 136 | #index对应Excel中行那个框 137 | #columns对应Excel中列那个框 138 | #aggfunc表示对values的计算类型 139 | #fill_value表示对空值的填充值 140 | #margins表示是否显示合计列 141 | #dropna表示是否删除缺失,一整行全为缺失值 142 | #margins_name表示合计列列名 143 | ``` 144 | 145 | 接下来看一些具体实例: 146 | 147 | 客户分类作为index,区域作为columns,用户ID作为values,对values执行count运算运行结果: 148 | ``` 149 | >>>pd.pivot_table(df,values = "用户ID",columns = "区域",index = "客户分类",aggfunc='count') 150 | 区域 一线城市 三线城市 二线城市 151 | 客户分类 152 | A类 1.0 NaN 2.0 153 | B类 NaN 2.0 NaN 154 | C类 1.0 NaN NaN 155 | ``` 156 | 157 | 上面的运行结果和Excel的不同的就是没有合计列,Python透视表中的合计列默认是关闭,让其等于True就可以显示出来。 158 | ``` 159 | pd.pivot_table(df,values = "用户ID",columns = "区域",index = "客户分类",aggfunc='count',margins = True) 160 | 区域 一线城市 三线城市 二线城市 All 161 | 客户分类 162 | A类 1.0 NaN 2.0 3 163 | B类 NaN 2.0 NaN 2 164 | C类 1.0 NaN NaN 1 165 | All 2.0 2.0 2.0 6 166 | ``` 167 | 168 | 合计列名称默认为All,可以通过设置参数margins_name的值进行修改。 169 | 170 | ``` 171 | pd.pivot_table(df,values = "用户ID",columns = "区域",index = "客户分类",aggfunc='count',margins = True,margins_name = "总计") 172 | 区域 一线城市 三线城市 二线城市 总计 173 | 客户分类 174 | A类 1.0 NaN 2.0 3 175 | B类 NaN 2.0 NaN 2 176 | C类 1.0 NaN NaN 1 177 | 总计 2.0 2.0 2.0 6 178 | ``` 179 | 180 | NaN表示缺失值,我们可以通过设置参数fill_value的值对缺失值进行填充。 181 | 182 | ``` 183 | #将缺失值填充为0 184 | pd.pivot_table(df,values = "用户ID",columns = "区域",index = "客户分类",aggfunc='count',margins = True,fill_value = 0) 185 | 区域 一线城市 三线城市 二线城市 All 186 | 客户分类 187 | A类 1 0 2 3 188 | B类 0 2 0 2 189 | C类 1 0 0 1 190 | All 2 2 2 6 191 | ``` 192 | 193 | aggfunc用来表示计算类型,当只传入一种类型时,表示对所有的值字段都进行同样的计算;如果需要对不同的值进行不同的计算类型,需要传入一个字典,键为列名,值为计算方式,下面对用户ID进行计数、对7月销量进行求和: 194 | 195 | ``` 196 | pd.pivot_table(df,values = ["用户ID","7月销量"],,columns = "区域",index = "客户分类",aggfunc={"用户ID":"count","7月销量":"sum"}) 197 | 7月销量 用户ID 198 | 区域 一线城市 三线城市 二线城市 一线城市 三线城市 二线城市 199 | 客户分类 200 | A类 6.0 NaN 50.0 1.0 NaN 2.0 201 | B类 NaN 46.0 NaN NaN 2.0 NaN 202 | C类 7.0 NaN NaN 1.0 NaN NaN 203 | ``` 204 | 205 | 为了便于进一步的分析与处理,我们一般对数据透视表的结果也会重置索引,利用的方法同样是reset_index()。 206 | 207 | ``` 208 | pd.pivot_table(df,values = "用户ID",columns = "区域",index = "客户分类",aggfunc='count') 209 | 区域 一线城市 三线城市 二线城市 210 | 客户分类 211 | A类 1.0 NaN 2.0 212 | B类 NaN 2.0 NaN 213 | C类 1.0 NaN NaN 214 | pd.pivot_table(df,values = "用户ID",columns = "区域",index = "客户分类",aggfunc='count').reset_index() 215 | 区域 客户分类 一线城市 三线城市 二线城市 216 | 0 A类 1.0 NaN 2.0 217 | 1 B类 NaN 2.0 NaN 218 | 2 C类 1.0 NaN NaN 219 | ``` 220 | 221 | # 8.福利时刻 222 | **福利1** 223 | 在微信公众号后台回复『我想试读』,即可获得本书试读部分+Python数据分析师知识图谱电子版一份。 224 | ![这样输入](https://i.loli.net/2019/02/19/5c6b4e7fd31f7.png) 225 | 226 | **福利2** 227 | 购买纸质书可获得以下福利: 228 | 1、赠送纸质Python数据分析师知识图谱一份 229 | 2、赠送价值89元的『入职数据分析师』电子书一份 230 | 3、赠送价值99元的『数据分析师入职第一课』视频课程一套 231 | 4、加入读者群与作者随时交流 232 | 5、加入我组建的打卡圈子,30天学会Python数据分析 233 | tip:可加入读者群咨询上述福利获取方式 234 | ![Python数据分析师知识图谱](https://i.loli.net/2019/02/17/5c68ef1340ec8.jpg) 235 | ![数据分析师入职第一课](https://i.loli.net/2019/02/19/5c6b52708f03b.jpg) 236 | 237 | # 9.购买方式 238 | 目前书籍已经在京东、淘宝、当当网全面上线,大家搜索『对比Excel,轻松学习Python数据分析』即可进行购买,请认准小黄书哦。也可以直接扫描下方二维码进行购买,本书目前在当当网可以**享受满100减50**的活动哦。 239 | ![](https://i.loli.net/2019/02/19/5c6c12fc9bc0d.jpg) 240 | ![](https://i.loli.net/2019/02/19/5c6c12fc98218.jpg) 241 | ![](https://i.loli.net/2019/02/20/5c6d3a50b8442.jpg) 242 | ![当当.jpg](https://i.loli.net/2019/02/23/5c715a915e80a.jpg) 243 | 如果你已经购买了纸质书,可添加我为好友(请备注“读者”),我会邀请你进读者群,同时也会邀请你进入打卡圈子,30天带你学会Python数据分析,有任何关于书相关的问题也都可以咨询我。 244 | ![个人微信](https://i.loli.net/2019/02/20/5c6d3adbda39c.jpg) 245 | -------------------------------------------------------------------------------- /本书额外教程/python包的安装方式.md: -------------------------------------------------------------------------------- 1 | ![](https://i.loli.net/2019/02/17/5c690ff1cff5f.jpg) 2 | 3 | 我们知道Python之所以很流行,有一个很重要的原因是因为它有很多包可以供我们使用,但是这些包很多都不是自带的,需要手动去安装,本篇我们就讲一下安装Python包的几种方式。 4 | 5 | # 1.前言 6 | 7 | 我们平常用到的包都是在`https://pypi.org/`这个网站获取的,开发者按照一定的开发标准将包发布到`Pypi`中,然后用户也就是使用包的我们通过不同的方式从该网站进行包的下载并安装。 8 | ![Pypi官网](https://i.loli.net/2019/02/17/5c69246401d10.png) 9 | 10 | Python包主要有`.whl`和`.tar.gz`两种格式,下面是Pandas包两种格式文件: 11 | 12 | ![.whl](https://i.loli.net/2019/02/17/5c6924640852a.png) 13 | 14 | ![.tar.gz](https://i.loli.net/2019/02/17/5c692463b48b2.png) 15 | 16 | # 2.在线安装 17 | 18 | 在线安装是比较简单的一种方式,直接运行下面代码即可: 19 | 20 | ``` 21 | pip install xxx 22 | ``` 23 | `xxx`表示具体的包的名字,那么具体在哪里运行这一行代码呢?主要有两个地方可以运行这一行代码。 24 | 25 | 如果你的`Python`有配置环境变量,那么你可以通过组合快捷键`Win+R`调用电脑自带的终端(cmd),然后输入上面的代码,敲回车运行即可。 26 | ![cmd运行](https://i.loli.net/2019/02/17/5c69284a78ba6.png) 27 | 28 | 如果你用的是`Anaconda`且你的`Python`没有配置环境变量,那么你需要在`Anaconda`自带的`Anaconda Promt`中运行上面的代码,敲击回车。 29 | ![Anaconda promt运行](https://i.loli.net/2019/02/17/5c69284a7300c.png) 30 | 31 | 在线安装很简单,只要输入pip命令敲击回车以后,就等着就好了,不需要其他的操作。但是在线安装也有一个不好处就是下载比较慢,对于那些比较大的包可能就会出现连接超时的报错,导致最后安装失败。 32 | 33 | 所以除了在线安装以外,我们还有必要学习一下手动安装。 34 | 35 | # 3.whl文件安装 36 | 前面说过`.whl`格式的文件是Python包的其中一种类型,你可以在`https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype`这里找到几乎所有的`.whl`格式的文件。 37 | 38 | ![首页](https://i.loli.net/2019/02/17/5c693bcf3d61f.png) 39 | 40 | 这里需要注意一下每个文件后面的cp部分,这一部分是用来说明你要下载包的版本,包的版本需要与你Python的版本是一致的,`cp36`就表示`Python3.6`对应的包。`win32`表示系统是`x32`位的,`win_amd64`表示系统位数是`x64`位的。 41 | 42 | 将文件下载好以后,打开命令窗口,这里的命令窗口也是有两个,就是在线安装中用到的两个窗口,大家根据自己的情况进行选择即可,打开命令窗口以后利用cd命令切换到到`whl`文件所在的路径下。 43 | 44 | 我这里把`pandas包`下载到D盘中: 45 | ![文件路径](https://i.loli.net/2019/02/17/5c693bce60474.png) 46 | 47 | 利用cd命令切换到D盘,然后运行`pip install xxx.whl`即可完成安装。 48 | ![安装步骤](https://i.loli.net/2019/02/17/5c693bcef3073.png) 49 | 50 | # 4.tar.gz文件安装 51 | `tar.gz`文件需要到`https://pypi.org/`中选择对应格式的文件进行下载,下载下来以后是一个压缩包,需要进行解压,解压完以后打开命令窗口,同样需要切换到文件所在的路径下,然后运行`python setup.py install`命令进行安装即可。 52 | 53 | ![](https://i.loli.net/2019/02/17/5c696da224256.png) 54 | 55 | 其实安装`.whl`和`.tar.gz`格式的文件用到的方法基本一致,只不过两者用到的命令不同。 -------------------------------------------------------------------------------- /本书额外教程/原来你竟然是这样的txt?.md: -------------------------------------------------------------------------------- 1 | ![](https://i.loli.net/2019/03/03/5c7b2421ca838.jpg) 2 | ##### 总第134篇/张俊红 3 | # 1.前言 4 | 经常有同学问我,老师为啥同样的格式的两个文件我用同样的方法导入到Python里面,一个可以正常导入,一个却会报错,这是为什么呢?你应该也有遇到过这种情况,就是表面相同的文件,文件名完全相同,格式完全相同(至少肉眼看上去是),而且里面的内容也是一样的,但是你用同样的代码却不能打开每一个文件。 5 | > memberinfo.txt 6 | memberinfo.txt 7 | memberinfo.txt 8 | memberinfo.txt 9 | 10 | 我们本篇就来讲讲这是为什么? 11 | 12 | # 2.生成txt文件 13 | 要弄懂为什么会出现上面那种看起来完全一样的文件,但实际上却不能用同样的代码打开每一个文件的原因,我们首先看看这些看起来完全一样的文件是如何生成的。 14 | 15 | 主要是利用Excel中另存为格式,进行txt文件的生成。 16 | ![excel文件另存为格式选择](https://ws1.sinaimg.cn/large/006JdmJily1frouxj8h25j30jz0euabi.jpg) 17 | 18 | ## 2.1生成文本文件 19 | 将Excel文件另存为`文本文件(制表符分隔(*.txt))`格式的文件,这样就生成第一个memberinfo.txt文件。 20 | 21 | ## 2.2生成Unicode文本 22 | 将Excel文件另存为`Unicode文本(*.txt)`格式的文件,这样就生成了第二个memberinfo.txt文件。 23 | 24 | ## 2.3生成CSV文件 25 | 先将Excel文件另存为`CSV(逗号分隔)(*csv)`格式的文件`memberinfo.csv`,然后直接将文件名强制更改成`memberinfo.txt`,这样就生成第三个memberinfo.txt文件了。 26 | 27 | ## 2.4生成CSV UTF-8文件 28 | 先将Excel文件另存为`CSV UTF-8(逗号分隔)(*csv)`格式的文件`memberinfo.csv`,然后直接将文件名强制更改成`memberinfo.txt`,这样就生成第四个memberinfo.txt文件了。 29 | 30 | 这样大家就知道了为什么表面上看起来一样的文件,却不能用同样的代码打开,主要是因为生成的方式(内部存储格式)是不一样的。 31 | 32 | # 3.导入文件 33 | 我们主要讲述一下如何用Python导入这四种不同格式的txt文件。 34 | 35 | ## 3.1导入文本文件 36 | 因为文本文件是用制表符(\t)进行分隔的,所以我们在`read_table`的时候令`sep = '\t'`即可。 37 | ```python 38 | df = pd.read_table(r"C:\Users\Desktop\memberinfo.txt",sep="\t",engine = "python",encoding="gbk") 39 | ``` 40 | ## 3.2导入Unicode文本 41 | 因为**Pandas不支持读写`unicode`和`ascii`编码方式**的文件和数据,所以要读写这两类文件时,需要先将文件格式转换成**Pandas支持的`utf-8`或者`gbk`格式**,更改方式如下: 42 | - step1:打开txt文件,选择另存为,我们可以看到红框部分的编码格式是`Unicode`。 43 | ![第一步打开txt文件](https://ws1.sinaimg.cn/large/006JdmJily1frova65q7gj30k604f3yl.jpg) 44 | - step2:将文件编码格式修改为`utf-8`。 45 | ![第二步修改txt文件编码格式](https://ws1.sinaimg.cn/large/006JdmJily1frovebbjamj30l406e3yx.jpg) 46 | 47 | 这样就可以进行正常导入了,只需要将上述的encoding从`gbk`改成`utf-8`就可以。 48 | 49 | ```python 50 | df = pd.read_table(r"C:\Users\Desktop\memberinfo.txt",sep="\t",engine = "python",encoding="gbk") 51 | ``` 52 | ## 3.3导入CSV文件 53 | 因为这个txt文件是直接将CSV文件格式进行更改的,文件格式和CVS文件格式一致,逗号分隔(sep=","),gbk编码(encoding="gbk"),所以,导入txt文件时也需要遵循这样的格式。 54 | ```python 55 | df = pd.read_table(r"C:\Users\Desktop\memberinfo.txt",sep=",",engine = "python",encoding="gbk") 56 | ``` 57 | ## 3.4导入CSV UTF-8文件 58 | 这个文件和上面的CSV文件唯一不同的就是编码格式不同,这个编码格式是`utf-8`,所以导入的时候只需要在CSV文件的基础上改一下编码格式即可。 59 | ```python 60 | df = pd.read_table(r"C:\Users\Desktop\memberinfo.txt",sep=",",engine = "python",encoding="utf-8") 61 | ``` 62 | 现在你应该很清楚txt外表一样,内心不一样的原因了吧。 63 | -------------------------------------------------------------------------------- /本书额外教程/实战-用户价值模型搭建.md: -------------------------------------------------------------------------------- 1 | ### 前言 2 | 最近在做一个用户评分模型的项目,这个模型的目的就是用来判断用户的价值。希望通过各种指标来给用户综合打分,每个用户最后会得到一个分值,分值越高,说明用户的价值越高。这是一个总的目标,一个用户可以创造的价值由两部分决定:创造价值的能力和创造价值的意愿,前者是能不能的问题、后者是愿不愿意的问题。定了两个主线以后再次进行目标拆解,根据业务经验分别找到那些能够判断用户创造价值的能力和意愿的指标,然后给不同的指标赋予不同的权重/分值,最后将各指标的权重/分值相加就是用户最后的总得分。 3 | 4 | 上面的这个过程有两个关键步骤,一个是**选择合适的指标**,另一个是**给不同的指标赋予不同的权重**,关于指标的选取,这个根据业务经验直接拍脑袋就可以,但是这个不同指标的权重问题,可能直接拍脑袋就不是太好了,当然了,也不是不可以。不过,做数据是一个严谨的工作(咳咳咳),还是希望能够找到一套理论来代替拍脑袋,所以就在网上找啊找,终于找到了今天的主角,就是AHP。 5 | 6 | ### AHP介绍 7 | 先来看看比较官方的解释: 8 | 9 | >AHP(Analytic Hierarchy Process-解析阶层的过程)又叫层次分析法,是一种定性与定量相结合的分析方法,是一种将决策者对复杂系统的决策思维过程模型化、数量化的过程。 10 | 11 | 是不是有点看不太明白,我来说几句大白话让你理解理解。让我们与前言里面的内容对应一下,AHP其实就是一种**把复杂问题**通过定性(人为去判断各指标之间的重要性)与定量(再通过计算判断矩阵求出各指标权重)的方法进行**拆解成若干个小问题以及小指标的问题,并能够计算出各个小问题以及小指标对整个大目标的影响程度。** 12 | ![image](https://ws1.sinaimg.cn/large/7602070dly1fqcabg8gc3j20vk08e3ys.jpg) 13 | 来看张图,你就更清楚了,这张图正好可以表达我在前言里面说到的东西。我们的最终目标就是要确定每个用户的一个用户价值,那么我们可以把这个目标进行拆解,首次拆解成购买忠诚度和消费能力这两个小问题,进而再对这两个小问题进行拆解,分别得到下面的各个指标,这其实就是一个定性的过程(问题拆解,指标拆解都是需要我们依据业务经验,人为去指定),至于各问题和各指标的权重计算就是一个定量过程,其实**AHP主要是做定量这一部分。** 14 | 15 | ### AHP流程 16 | 知道了AHP是什么以后,我们来具体看看AHP的一个具体流程。 17 | - 明确问题 18 | - 问题及指标拆解 19 | - 建立指标两两判断矩阵 20 | - 层次单排序 21 | - 层次总排序 22 | 23 | 24 | #### 明确问题 25 | 就是首先你要确定你要解决什么问题,我们这里就是要构建用户价值模型,希望通过这个模型看出每个用户的一个价值,然后依据价值不同给与不同的运营策略。 26 | #### 问题及指标拆解 27 | 将搭建用户价值模型这个总目标拆解成用户购买忠诚度以及用户消费能力两部分,然后再对这两部分进行指标拆解,就是上面图表中看到的各指标。 28 | #### 构造判断矩阵 29 | 所谓的判断矩阵就是将任意两指标进行对比得出一个重要性结果,然后将这个结果以矩阵的形式进行呈现,其中重要程度差别等级如下: 30 | 31 | |标度|含义| 32 | |--|--| 33 | |1|表示两个指标相比,具有同样的重要性| 34 | |3|表示两个指标相比,前者比后者稍重要| 35 | |5|表示两个指标相比,前者比后者明显重要| 36 | |7|表示两个指标相比,前者比后者极其重要| 37 | |9|表示两个指标相比,前者比后者强烈重要| 38 | |2,4,6,8|表示上述两指标判断结果的中间值,比如2是介于1和3之间的| 39 | 40 | 数值越大,表示前者比后者越重要;指标A和指标B判断结果与指标B与指标A和指标B判断结果互为倒数,即当指标A比指标B的重要程度是3的时候,那么指标B比指标A的重要程度就是3的倒数,即1/3。 41 | 42 | 不知道你有没有注意到,其实上面的这种方法也有一定的主观判断(拍脑袋),比如两指标之间的稍微重要,明显重要,极其重要也是需要你人为去指定的,你可能会疑问,既然都是拍脑袋,那还要这个干啥,直接拍脑袋不久得了,还搞这么复杂干嘛,哈哈哈,关于好处接下来会讲到。 43 | 44 | 判断矩阵A构造出来了,我们就可以开始计算各指标对目标问题的影响程度(即各指标的权重值)。 45 | 46 | #### 各指标权重计算步骤 47 | - 将矩阵A的每一列向量归一化 48 | - 对归一化后的矩阵按行求和,得到一列值 49 | - 对上述求和的一列值再次进行归一化得到矩阵w 50 | - 计算最大特征根 51 | ![image](https://ws1.sinaimg.cn/large/7602070dly1fqcagot3vqj20pm0h6405.jpg) 52 | 注意:这里的归一化只是把每一列的值的和当作1,然后计算每一个值在1中的占比。 53 | 54 | 上述步骤中归一化后得到的矩阵w就是各个指标的权重情况,这个权重是根据我们主观上构造的判断矩阵的出来的,但是这个权重是否准确,还是有待确定的,为什么要去确定呢,因为判断矩阵很有可能得出的相互矛盾的结论,比如**说A指标重要性大于B指标,B指标重要性大于C指标,但是A指标重要性又小于C指标重要性,这种互相矛盾的结论。**AHP就可以避免这种矛盾的发生。这里需要引入AHP中的另一个概念`一致性检验`,用来判断矩阵是否一致。 55 | 56 | #### 一致性检验的步骤如下 57 | - 根据判断矩阵计算最大特征根 58 | - 计算一致性指标CI 59 | - 根据n的值(指标的数量)找出随机一致性指标RI 60 | - 计算一致性比率`CR=CI/RI`,当CR<0.1时,不一致性程度在容许范围内,即各指标的重要性程度不存在上述互相矛盾的情况,可以使用。 61 | 62 | ![image](https://ws1.sinaimg.cn/large/7602070dly1fqcahe0mxvj20pp0gh761.jpg) 63 | 64 | 如果一致性比率符合使用条件,则可以直接使用计算出的各指标的权重值,如果不符合,则需要重新构造判断矩阵。 65 | 66 | #### 层次单排序 67 | 就是对单一层次计算权重情况,比如用户价值模型总目标的下一层就是用户忠诚程度和用户消费能力的权重情况。`用户忠诚程度:用户消费能力=0.67:0.33`。而用户忠诚程度和用户消费能力的下一层就是各个更加细致的指标。 68 | #5.层次总排序 69 | 层次总排序就是将各个层次的权重值相乘,最后就得到了各个指标的权重情况,就是层次总排序。 70 | 71 | ### AHP实例 72 | 还是以前面说到用户价值模型为例,走一遍完整的流程。这里我们计算用户忠诚度的AHP,因为只有三个指标及以上才会出现那种互相矛盾的情况,两个指标是不会出现的,两个指标的话直接人为指定权重占比就可以。 73 | 74 | #### 构造判断矩阵 75 | ||最近购买间隔|购买频率|购买商品种类| 76 | |--|--|--|--| 77 | |最近购买间隔|1|1/6|1/2| 78 | |购买频率|6|1|3| 79 | |购买商品种类|2|1/3|1| 80 | #### 计算各指标权重 81 | 将判断矩阵的每一列进行归一化得出下方的矩阵: 82 | 83 | |1/9|1/9|1/9| 84 | |--|--|--| 85 | |6/9|6/9|6/9| 86 | |2/9|2/9|2/9| 87 | 88 | 对归一化后的矩阵的每一行进行求和运算: 89 | 90 | |3/9| 91 | |--| 92 | |18/9| 93 | |6/9| 94 | 95 | 将上述求和的得到的矩阵再次进行归一化得到矩阵w: 96 | 97 | |0.11| 98 | |--| 99 | |0.67| 100 | |0.22| 101 | 102 | 该矩阵就表示了各指标的权重情况,最近购买间隔占比占比为0.11,购买频率占比0.64,购买商品种类占比0.24。 103 | 104 | 计算最大特征根: 105 | 在计算最大特征根我们需要先计算Aw值,Aw计算是将判断矩阵A与归一化得到的矩阵w相乘(公众号不支持公式,很烦),最后得到Aw值: 106 | 107 | |0.33| 108 | |--| 109 | |1.98| 110 | |0.66| 111 | 112 | 再进行计算最大特征根:`1/3*(0.33/0.11+1.98/0.67+0.66/0.22)=3` 113 | 114 | #### 一致性检验 115 | 计算一致性指标CI:`(3-3)/(3-1)=0` 116 | 根据指标数量n选择指标RI:这里n=3,所以RI=0.58 117 | 118 | 计算一致性比率CR=CI/RI=0<0.1符合,所以用户忠诚度的各指标权重值w矩阵可用。 119 | #### 层次单排序 120 | 因为总目标只拆解成了两个小问题,所以这里直接人为指定权重即可(用户忠诚度:用户消费能力=0.67:0.33),不需要进行一致性检验。 121 | 122 | 用户忠诚度拆解的指标有三个,需要进行一致性检验,且经过检验后符合CR<0.1的条件,所以用户忠诚度指标中各指标权重为:最近购买间隔占比占比为0.11,购买频率占比0.64,购买商品种类占比0.24。 123 | 124 | 用户消费能力拆解的指标也只有两个,直接人为指定权重即可。 125 | 126 | #### 层次总排序 127 | 最后将各层次的权重相乘就是每个指标的权重占比。 128 | 129 | |指标|计算|最后权值| 130 | |--|--|--| 131 | |最近购买间隔|0.67*0.11|0.07| 132 | |购买频率|0.67*0.67|0.45| 133 | |购买商品种类|0.67*0.22|0.15| 134 | |平均每次消费额|0.33*0.67|0.22| 135 | |单次最高消费额|0.33*0.33|0.11| 136 | ![image](https://ws1.sinaimg.cn/large/7602070dly1fqc9z991fzj20vl09t3yw.jpg) 137 | #### 进行评分 138 | 最后将每个指标**缩小到0-10的范围**(不一定缩小到0-10,但是必须把每个指标缩小到相同大小范围内),然后乘各指标所占权重,最后相加,就是每个用户的总价值得分。 139 | 140 | |用户|最近购买间隔|购买频率|商品种类|平均每次消费额|单词最高消费额|价值得分| 141 | |--|--|--|--|--|--|--| 142 | |用户A|3|5|2|5|9|4.85| 143 | |用户B|2|1|2|3|5|3.50| -------------------------------------------------------------------------------- /本书额外教程/将Chrome设置为Jupyter_notebook的默认浏览器.md: -------------------------------------------------------------------------------- 1 | # 1.前言 2 | 我们知道`jupyter_notebook`是在浏览器中打开的,这里建议大家都使用`Chrome`浏览器打开,因为其他浏览器可能会出现一些不兼容的问题。如果你电脑上有`Chrome`浏览器,而且平常已经习惯了使用`Chrome`浏览器,那么你打开`jupyter_notebook`的时候直接选择`Chrome`打开就行。如果你平常也不怎么使用`Chrome`,电脑上也没有安装,先去安装一个`Chrome`浏览器。 3 | ![就是这个](https://i.loli.net/2019/02/24/5c723d6381a41.png) 4 | 如果你在安装好`Chrome`浏览器之前已经用别的浏览器打开过`Jupyter_notebook`了,那么你就需要修改一下默认设置,让`Jupyter_notebook`用`Chrome`浏览器打开,具体设置方法如下。 5 | 6 | # 2.获取Jupyter_notebook配置文件 7 | 我们首先需要找到`Jupyter_notebook`的配置文件`jupyter_notebook_config.py`在哪里,配置文件里面保存着`Jupyter_notebook`的各种设置。打开`Anaconda Promt`,运行以下命令就可以得到配置文件的路径。 8 | ``` 9 | jupyter notebook --generate-config 10 | ``` 11 | ![配置文件路径](https://i.loli.net/2019/02/24/5c723d637f7f8.png) 12 | 来到对应的路径下我们就看到了配置文件,然后右键用记事本打开。利用`Ctrl+F`快捷键调出查找框查找`c.NotebookApp.browser`,找到对应位置。 13 | ![配置文件](https://i.loli.net/2019/02/24/5c723d639f57e.png) 14 | ![查找](https://i.loli.net/2019/02/24/5c723d63aa199.png) 15 | # 3.获取Chrome安装位置 16 | 右键已经安装好的`Chrome`浏览器的桌面图标,然后选择属性,即可获取到`Chrome`的安装位置。下面红框框住的部分就是`Chrome`浏览器的安装位置。 17 | ![chrome安装位置](https://i.loli.net/2019/02/24/5c723d638075d.png) 18 | 19 | # 4.加入设置语句块 20 | 在第2部分查找到的`c.NotebookApp.browser = ''`后面,即第2部分中红框框住的空白位置加入下面语句块: 21 | ``` 22 | import webbrowser 23 | 24 | webbrowser.register("chrome",None,webbrowser.GenericBrowser(u"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe")) 25 | 26 | c.NotebookApp.browser = 'chrome' 27 | ``` 28 | `GenericBrowser`后面放的是第3部分中获取到的`Chrome`浏览器的安装位置。 29 | 30 | 重启`Jupyter_notebook`就会默认使用`Chrome`浏览器打开了。 -------------------------------------------------------------------------------- /随书数据集/Python报表自动化数据集.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhongzhang/Excel-Python-DA/461d93a49f7d691c89085f8c4596e223af253ca5/随书数据集/Python报表自动化数据集.xlsx -------------------------------------------------------------------------------- /随书数据集/对比Excel,轻松学习Python数据分析数据集.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/junhongzhang/Excel-Python-DA/461d93a49f7d691c89085f8c4596e223af253ca5/随书数据集/对比Excel,轻松学习Python数据分析数据集.zip --------------------------------------------------------------------------------