和很多同学接触过程中, 我发现自学 Python 数据分析的一个难点是资料繁多, 过于复杂. 大部分网上的资料总是从 Python 语法教起, 夹杂着大量 Python 开发的知识点, 花了很多时间却始终云里雾里, 不知道哪些知识才是真正有用的. 本来以为上手就能写爬虫出图, 却在看基础的过程中消耗了一周又一周, 以至于很多励志学习 Python 的小伙伴牺牲在了入门的前一步.
image
于是, 我总结了以下一篇干货, 来帮助大家理清思路, 提高学习效率. 总共分为三大部分: 做 Python 数据分析必知的语法, 如何实现爬虫, 怎么做数据分析.
Python 学习交流群: 556370268, 这里有资源共享, 技术解答, 还有小编从最基础的 Python 资料到项目实战的学习资料都有整理, 希望能帮助你更了解 python, 学习 python.
1. 必须知道的两组 Python 基础术语
A. 变量和赋值
Python 可以直接定义变量名字并进行赋值的, 例如我们写出 a = 4 时, Python 解释器干了两件事情:
在内存中创建了一个值为 4 的整型数据
在内存中创建了一个名为 a 的变量, 并把它指向 4
用一张示意图表示 Python 变量和赋值的重点:
image
例如下图代码,"=" 的作用就是赋值, 同时 Python 会自动识别数据类型:
- a=4 #整型数据
- b=2 #整型数据
- c="4" #字符串数据
- d="2" #字符串数据
- print("a+b 结果为",a+b)# 两个整数相加, 结果是 6
- print("c+d 结果为",c+d)# 两个文本合并, 结果是文本 "42"
- # 以下为运行结果
>>>a+b 结果为 6
>>>c+d 结果为 42
B. 数据类型
在初级的数据分析过程中, 有三种数据类型是很常见的:
列表 list(Python 内置)
字典 dic(Python 内置)
DataFrame(工具包 pandas 下的数据类型, 需要 import pandas 才能调用)
它们分别是这么写的:
列表(list):
- # 列表
- liebiao=[1,2.223,-3,'刘强东','章泽天','周杰伦','昆凌',['微博','B 站','抖音']]
list 是一种有序的集合, 里面的元素可以是之前提到的任何一种数据格式和数据类型(整型, 浮点, 列表......), 并可以随时指定顺序添加其中的元素, 其形式是:
- #ist 是一个可变的有序表, 所以, 可以往 list 中追加元素到末尾:
- liebiao.append('瘦')
- ptint(liebiao)
- # 结果 1
- >>>[1, 2.223, -3, '刘强东', '章泽天', '周杰伦', '昆凌', ['微博', 'B 站', '抖音'], '瘦']
- # 也可以把元素插入到指定的位置, 比如索引号为 5 的位置, 插入 "胖" 这个元素:
- liebiao.insert(5, '胖')
- ptint(liebiao)
- # 结果 2
- >>>[1, 2.223, -3, '刘强东', '章泽天', '胖', '周杰伦', '昆凌', ['微博', 'B 站', '抖音'], '瘦']
字典(dict):
- # 字典
- zidian={
- '刘强东':'46','章泽天':'36','周杰伦':'40','昆凌':'26'
- }
字典使用键 - 值 (key-value) 存储, 无序, 具有极快的查找速度. 以上面的字典为例, 想要快速知道周杰伦的年龄, 就可以这么写:
- zidian['周杰伦']
- >>>'40'
dict 内部存放的顺序和 key 放入的顺序是没有关系的, 也就是说,"章泽天" 并非是在 "刘强东" 的后面.
DataFrame:
DataFrame 可以简单理解为 Excel 里的表格格式. 导入 pandas 包后, 字典和列表都可以转化为 DataFrame, 以上面的字典为例, 转化为 DataFrame 是这样的:
- import pandas as pd
- df=pd.DataFrame.from_dict(zidian,orient='index',columns=['age'])# 注意 DataFrame 的 D 和 F 是大写
- df=df.reset_index().rename(columns={
- 'index':'name'
- })# 给姓名加上字段名
image
和 Excel 一样, DataFrame 的任何一列或任何一行都可以单独选出进行分析.
以上三种数据类型是 python 数据分析中用的最多的类型, 基础语法到此结束, 接下来就可以着手写一些函数计算数据了.
2. 从 Python 爬虫学循环函数
掌握了以上基本语法概念, 我们就足以开始学习一些有趣的函数. 我们以爬虫中绕不开的遍历 url 为例, 讲讲大家最难理解的循环函数 for 的用法:
A.for 函数
for 函数是一个常见的循环函数, 先从简单代码理解 for 函数的用途:
- zidian={'刘强东':'46','章泽天':'36','周杰伦':'40','昆凌':'26'}
- for key in zidian:
- print(key)
- >>>
刘强东
章泽天
周杰伦
昆凌
因为 dict 的存储不是按照 list 的方式顺序排列, 所以, 迭代出的结果顺序很可能不是每次都一样. 默认情况下, dict 迭代的是 key. 如果要迭代 value, 可以用 for value in d.values(), 如果要同时 #迭代 key 和 value, 可以用 for k, v in d.items()
可以看到, 字典里的人名被一一打印出来了. for 函数的作用就是用于遍历数据. 掌握 for 函数, 可以说是真正入门了 Python 函数.
B. 爬虫和循环
for 函数在书写 Python 爬虫中经常被应用, 因为爬虫经常需要遍历每一个网页, 以获取信息, 所以构建完整而正确的网页链接十分关键. 以某票房数据网为例, 他的网站信息长这样:
image
image
该网站的周票房 JSON 数据地址可以通过抓包工具找到, 网址为 http://www.cbooo.cn/BoxOffice/getWeekInfoData?sdate=20190114
仔细观察, 该网站不同日期的票房数据网址 (url) 只有后面的日期在变化, 访问不同的网址 (url) 就可以看到不同日期下的票房数据:
image
我们要做的是, 遍历每一个日期下的网址, 用 Python 代码把数据爬下来. 此时 for 函数就派上用场了, 使用它我们可以快速生成多个符合条件的网址:
- import pandas as pd
- url_df = pd.DataFrame({'urls':['http://www.cbooo.cn/BoxOffice/getWeekInfoData?sdate=' for i in range(5)],'date' :pd.date_range(20190114,freq = 'W-MON',periods = 5)})
- '''
- 将网址相同的部分生成 5 次, 并利用 pandas 的时间序列功能生成 5 个星期一对应的日期.
- 其中用到了第一部分提供的多个数据类型:
- range(5)属于列表,
- 'urls':[]属于字典,
- pd.dataframe 属于 dataframe
- '''url_df['urls'] = url_df['urls'] + url_df['date'].astype('str')
滑动滑块可以看到完整代码和中间的注释.
image
为了方便理解, 我给大家画了一个 for 函数的遍历过程示意图:
image
此处省略掉后续爬取过程, 相关爬虫代码见文末. 我们使用爬虫爬取了 5800 + 条数据, 包含 20 个字段, 时间囊括了从 2008 年 1 月开始至 2019 年 2 月十一年期间的单周票房, 累计票房, 观影人次, 场均人次, 场均票价, 场次环比变化等信息.
Python 学习交流群: 556370268, 这里有资源共享, 技术解答, 还有小编从最基础的 Python 资料到项目实战的学习资料都有整理, 希望能帮助你更了解 python, 学习 python.
3.Python 怎么实现数据分析?
除了爬虫, 分析数据也是 Python 的重要用途之一, Excel 能做的事, Python 究竟怎么实现呢; Excel 不能做的事, Python 又是否能实现呢? 利用电影票房数据, 我们分别举一个例子说明:
A.Python 分析
在做好数据采集和导入后, 选择字段进行初步分析可以说是数据分析的必经之路. 在 Dataframe 数据格式的帮助下, 这个步骤变得很简单.
比如当我们想看单周票房第一的排名分别都是哪些电影时, 可以使用 pandas 工具库中常用的方法, 筛选出周票房为第一名的所有数据, 并保留相同电影中周票房最高的数据进行分析整理:
- import pandas as pd
- data = pd.read_csv('中国票房数据爬取测试 20071-20192.csv',engine='python')
- data[data['平均上座人数']>20]['电影名']
- # 计算周票房第一随时间变化的结果, 导入数据, 并选择平均上座人数在 20 以上的电影为有效数据
- dataTop1_week = data[data['排名']==1][['电影名','周票房']]
- # 取出周票房排名为第一名的所有数据, 并保留 "电影名" 和 "周票房" 两列数据
- dataTop1_week = dataTop1_week.groupby('电影名').max()['周票房'].reset_index()
- # 用 "电影名" 来分组数据, 相同电影连续霸榜的选择最大的周票房保留, 其他数据删除
- dataTop1_week = dataTop1_week.sort_values(by='周票房',ascending=False)
- # 将数据按照 "周票房" 进行降序排序
- dataTop1_week.index = dataTop1_week['电影名']
- del dataTop1_week['电影名']
- # 整理 index 列, 使之变为电影名, 并删掉原来的电影名列
- dataTop1_week
- # 查看数据
image
9 行代码, 我们完成了 Excel 里的透视表, 拖动, 排序等鼠标点击动作. 最后再用 Python 中的可视化包 matplotlib, 快速出图:
image
image
B. 函数化分析
以上是一个简单的统计分析过程. 接下来就讲讲 Excel 基础功能不能做的事 -- 自定义函数提效. 观察数据可以发现, 数据中记录了周票房和总票房的排名, 那么刚刚计算了周票房排名的代码, 还能不能复用做一张总票房分析呢?
image
当然可以, 只要使用 def 函数和刚刚写好的代码建立自定义函数, 并说明函数规则即可:
- def pypic(pf):
- #定义一个 pypic 函数, 变量是 pf
- dataTop1_sum = data[['电影名',pf]]
- #取出源数据中, 列名为 "电影名" 和 pf 两列数据
- dataTop1_sum = dataTop1_sum.groupby('电影名').max()[pf].reset_index()
- #用 "电影名" 来分组数据, 相同电影连续霸榜的选择最大的 pf 票房保留, 其他数据删除
- dataTop1_sum = dataTop1_sum.sort_values(by=pf,ascending=False)
- #将数据按照 pf 进行降序排序
- dataTop1_sum.index = dataTop1_sum['电影名']
- del dataTop1_sum['电影名']
- #整理 index 列, 使之变为电影名, 并删掉原来的电影名列
- dataTop1_sum[:20].iloc[::-1].plot.barh(figsize = (6,10),color = 'orange')
- name=pf+'top20 分析'
- plt.title(name)
- #根据函数变量名出图
定义函数后, 批量出图 so easy:
image
image
学会函数的构建, 一个数据分析师才算真正能够告别 Excel 的鼠标点击模式, 迈入高效分析的领域.
4. 光看不练是永远不能入门的
如果只有一小时学习, 以上就是大家一定要掌握的 Python 知识点.
Python 学习交流群: 556370268, 这里有资源共享, 技术解答, 还有小编从最基础的 Python 资料到项目实战的学习资料都有整理, 希望能帮助你更了解 python, 学习 python.
来源: http://www.jianshu.com/p/303b3b329421