大家好, 我是大鹏, 城市数据团联合发起人, 致力于 Python 数据分析, 数据可视化的应用与教学. 于是, 我总结了以下一篇干货, 来帮助大家理清思路, 提高学习效率. 总共分为三大部分: 做 Python 数据分析必知的语法, 如何实现爬虫, 怎么做数据分析.
大家好, 我是大鹏, 城市数据团联合发起人, 致力于 Python 数据分析, 数据可视化的应用与教学.
和很多同学接触过程中, 我发现自学 Python 数据分析的一个难点是资料繁多, 过于复杂. 大部分网上的资料总是从 Python 语法教起, 夹杂着大量 Python 开发的知识点, 花了很多时间却始终云里雾里, 不知道哪些知识才是真正有用的. 本来以为上手就能写爬虫出图, 却在看基础的过程中消耗了一周又一周, 以至于很多励志学习 Python 的小伙伴牺牲在了入门的前一步.
于是, 我总结了以下一篇干货, 来帮助大家理清思路, 提高学习效率. 总共分为三大部分: 做 Python 数据分析必知的语法, 如何实现爬虫, 怎么做数据分析.
1. 必须知道的两组 Python 基础术语
A. 变量和赋值
Python 可以直接定义变量名字并进行赋值的, 例如我们写出 a = 4 时, Python 解释器干了两件事情:
在内存中创建了一个值为 4 的整型数据
在内存中创建了一个名为 a 的变量, 并把它指向 4
用一张示意图表示 Python 变量和赋值的重点:
例如下图代码,"=" 的作用就是赋值, 同时 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('瘦')
- print(liebiao)
- # 结果 1
- >>>[1, 2.223, -3, '刘强东', '章泽天', '周杰伦', '昆凌', ['微博', 'B 站', '抖音'], '瘦']
- # 也可以把元素插入到指定的位置, 比如索引号为 5 的位置, 插入 "胖" 这个元素:
- liebiao.insert(5, '胖')
- print(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'
- })# 给姓名加上字段名
和 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 爬虫中经常被应用, 因为爬虫经常需要遍历每一个网页, 以获取信息, 所以构建完整而正确的网页链接十分关键. 以某票房数据网为例, 他的网站信息长这样:
该网站的周票房 JSON 数据地址可以通过抓包工具找到, 网址为 http://www.cbooo.cn/BoxOffice/getWeekInfoData?sdate=20190114
仔细观察, 该网站不同日期的票房数据网址 (url) 只有后面的日期在变化, 访问不同的网址 (url) 就可以看到不同日期下的票房数据:
我们要做的是, 遍历每一个日期下的网址, 用 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')
滑动滑块可以看到完整代码和中间的注释.
为了方便理解, 我给大家画了一个 for 函数的遍历过程示意图:
此处省略掉后续爬取过程, 相关爬虫代码见文末. 我们使用爬虫爬取了 5800 + 条数据, 包含 20 个字段, 时间囊括了从 2008 年 1 月开始至 2019 年 2 月十一年期间的单周票房, 累计票房, 观影人次, 场均人次, 场均票价, 场次环比变化等信息.
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
- # 查看数据
9 行代码, 我们完成了 Excel 里的透视表, 拖动, 排序等鼠标点击动作. 最后再用 Python 中的可视化包 matplotlib, 快速出图:
B. 函数化分析
以上是一个简单的统计分析过程. 接下来就讲讲 Excel 基础功能不能做的事 -- 自定义函数提效. 观察数据可以发现, 数据中记录了周票房和总票房的排名, 那么刚刚计算了周票房排名的代码, 还能不能复用做一张总票房分析呢?
当然可以, 只要使用 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:
学会函数的构建, 一个数据分析师才算真正能够告别 Excel 的鼠标点击模式, 迈入高效分析的领域.
来源: http://bigdata.51cto.com/art/201905/596463.htm