你们好,我是大鹏,城市数据团联合发起人,致力于Python数据分析、数据可视化的应用与教学。python
和不少同窗接触过程当中,我发现自学Python数据分析的一个难点是资料繁多,过于复杂。大部分网上的资料老是从Python语法教起,夹杂着大量Python开发的知识点,花了不少时间却始终云里雾里,不知道哪些知识才是真正有用的。原本觉得上手就能写爬虫出图,却在看基础的过程当中消耗了一周又一周,以致于不少励志学习Python的小伙伴牺牲在了入门的前一步。json
因而,我总结了如下一篇干货,来帮助你们理清思路,提升学习效率。总共分为三大部分:作Python数据分析必知的语法,如何实现爬虫,怎么作数据分析。ruby
Python能够直接定义变量名字并进行赋值的,例如咱们写出a = 4时,Python解释器干了两件事情:markdown
用一张示意图表示Python变量和赋值的重点:app
例以下图代码,“=”的做用就是赋值,同时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
在初级的数据分析过程当中,有三种数据类型是很常见的:工具
它们分别是这么写的:学习
#列表
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站', '抖音'], '瘦']
#字典
zidian={'刘强东':'46','章泽天':'36','周杰伦':'40','昆凌':'26'}
字典使用键-值(key-value)存储,无序,具备极快的查找速度。以上面的字典为例,想要快速知道周杰伦的年龄,就能够这么写:网站
zidian['周杰伦']
>>>'40'
dict内部存放的顺序和key放入的顺序是没有关系的,也就是说,"章泽天"并不是是在"刘强东"的后面。
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数据分析中用的最多的类型,基础语法到此结束,接下来就能够着手写一些函数计算数据了。
掌握了以上基本语法概念,咱们就足以开始学习一些有趣的函数。咱们以爬虫中绕不开的遍历url为例,讲讲你们最难理解的循环函数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函数。
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月十一年期间的单周票房、累计票房、观影人次、场均人次、场均票价、场次环比变化等信息。
除了爬虫,分析数据也是Python的重要用途之一,Excel能作的事,Python究竟怎么实现呢;Excel不能作的事,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,快速出图:
以上是一个简单的统计分析过程。接下来就讲讲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的鼠标点击模式,迈入高效分析的领域。
若是只有一小时学习,以上就是你们必定要掌握的Python知识点。