Python数据分析之路(一)查询和统计
0. 如何入门数据分析
关注沙漠之鹰的同学一定看过沙漠君写得很多篇数据分析文章,比如分析房价,车价,预测机动车摇号这些话题。其实文章中所有的分析都使用了Python和它非常强大的数据分析库Pandas。一些机器学习和预测的功能则用到了sklearn库。掌握了这些工具,就能应对绝大多数的分析需求。
纸上得来终觉浅,即使你看了很多书和代码,也未必比得上多接触例子多敲一些代码,三四个中等规模(约一两百行代码的)的案例就能让你有整体的把握。至于数据采集,沙漠之鹰有开源的数据抓取工具Hawk,网上也有众多如何获取数据的教程,因此本文不再详述。
系列文章分为三个部分:
- 查询与统计
- 可视化和高级用法
- 分类和预测(估计会分为几篇文章)
好了,废话不多说,进入正题。
1. 找到好的问题
好的问题其实比答案更重要。人认识问题,分为四种级别:
- 我们知道自己知道的(房价在涨)
- 知道自己不知道的(可度量的信息,如房价平均涨幅)
- 不知道自己知道的(如证明摇号系统漏洞)
- 不知道自己不知道的(最有价值,蕴含着最大的机会)
沙漠君期待于寻找3-4层级的问题,可是多数情况只能在第1和第2档上徘徊。当你发现一个问题之后,还需要思考3个问题:
- 我是否找到了一个值得解决的问题?
- 我是否提出了一个足够好的解决方案
- 我真的想去解决这个问题吗?
最后的动机往往反映了你能解决该问题的最大极限,很多人也许仅仅是完成任务,因此有了一点成果便停滞不前,错过了最大的金矿。数据的质量比数量更重要,如果不知道什么样的数据更重要,即使拥有更多的数据也只会造成呕吐。数据分析需要专注,需要从纷繁的图表和信息中找到问题核心。
通常来说,人们对变化的指标更感兴趣,因此比率和增长幅度比静态的数据更有说服力。而变化又分长短期,不同维度得出的结论往往全然不同。相关性很好,因果性更佳。有了因果性,便有了改变未来的能力。
下图展示了数据分析的一般流程(图片来自网络):
统计的三大核心:分组(map),聚合(reduce),排序(sort)。它们用的是如此普遍,因此MapReduce管道框架成了数据分析的标准,也非常适合做多机并行化。分组和排序很好理解,聚合指的是对各组内容做求和,分组等。
绝大部分数据分析操作,都可以通过查询,分组,聚合,排序四个元素进行级联组合进行。因此掌握这四大天王,应付一般的场景就都无问题了。 (这应该是这篇文章最重要的一句话了)
2. 查询和过滤
DataFrame是pandas的核心数据结构,可以理解为Excel里的二维矩阵,它更高级,能表达3维或更高维的数据,支持多索引。在内存中存取,效率极高,绝大多数操作都和DataFrame相关。维度为2的DataFrame,行(column)和列(row)的axis分别为0和1。可以针对某些列做索引(index),高维DataFrame是相当少见的。
2.1 查询
下面的表展示了Pandas对索引的介绍:
符号 | 说明 | 例子 |
---|---|---|
[] | 列值索引 | df['房价'] ,df[['房价','车价']] |
loc | 行值索引 | df.loc[0], df['2013':'2015'] |
iloc | 行号索引 | df.iloc[0], df.iloc[2:10] |
ix | 行索引 | df.ix[0], df.ix[2:10] |
时间也是比较重要的index,比较好用的是Timestamp,接受2016-12-24
这种字符串,字符串到时间转换代码如下:
weather.index= weather[u'日期'].map(lambda x:Timestamp(x))
Pandas的索引功能非常强大,补充如下:
loc
也能支持先行后列的查询:df.loc['20130101':'20130103' , ['A','B']]
,类似的如iloc
- 个人感觉ix的有些冗余,和
ix
和iloc
类似
- 个人感觉ix的有些冗余,和
所有索引都支持字符串和数组,以及切片(slice)用于指定范围,索引还能传递一个bool类型的lambda表达式,或返回和其shape一致的bool数组
这种用法可以用在过滤上,这非常重要,我们再给几个例子:
2.2 过滤
过滤有两方面需求:找出特定数据进行针对性分析,或
- 针对特定数据做分析,
- 过滤异常值。
异常值非常重要,应该细致分析导致它们产生的原因,如果真是异常值,应该提早过滤,否则做聚合时会严重影响结果,如天价的房价。
先讨论按行过滤:非空过滤,过滤掉col
列为空的内容:
df=df[!data.col.isnull()]
字符串过滤:
db[db.city.str.contains(u'市')]
若需要对df对某个键去重:
qq['id'].unique()
isin
能判断单元格中的值是否在给定的数组内,若希望对多个列做过滤,Pandas提供了现成的方法df.filter,还支持正则。还能进行逻辑操作,实现更复杂的需求。
2.3 遍历
有了索引和列操作,为何还要有遍历?因为遍历更加灵活,当然性能相对会差一些:
函数 | 遍历目标 | lambda参数 | 说明 |
---|---|---|---|
map | 一列的cell | cell | 最为常见 |
apply | 列/行 | 列或行的Series | axis:不填写cell,1:行,2:列 |
applymap | cell | cell | element-wise最为灵活 |
iterrows | 行遍历 | 提供行号 | 见备注 |
iteritems | 列遍历 | 提供列名 | 见备注 |
itertuples | 行遍历 | 提供index | 见备注 |
map, apply,applymap是只返回单元格或行列本身的,参数都是lambda,本节假设读者对python的lambda表达式有足够的了解。
但这样不能实现如“奇数偶数行做分别作不同处理的需求,则这三个函数就无能为力。因此就有后面iterrows等三个函数。如iterrows,它会将行号和行迭代出来,从而方便自定义逻辑,示例如下:
for i,row in data.iterrows():
pass
2.4 求值和合并
一张表可能很难包含所有的信息,因此需要计算新值(求值)或join其他表(合并),但Pandas本身的Join并不好用,经常出错。
如果某个属性可以通过计算获得,可对各个列当做变量来处理,由于内部使用了C++和numpy加速,效率远比for循环更高,下面是处理房价的一个例子:总价/单价
,并做小数点截取:
table['面积']= np.round(table['总价']*10000/table['单价'])
numpy提供了绝大多数常见的函数算子,能满足大部分需求。下面是合并:
- 横向合并(需保证行数一致)- 横向合并
df = pd.concat([data_train, dummies_Cabin])
- 删除列
df.drop(['Pclass', 'Name', 'Sex')]
- 纵向合并(join操作)
data.merge(right=prop_rates, how='inner',left_on='Property_Area',right_index=True, sort=False)
如果不加参数,则可以自动通过列名合并。join的参数比较复杂,建议直接参考Pandas官方文档。
3. 分组,排序,聚合
排序,分组和聚合的组合都有无数种,这在技术层面不难。但如果要写报告,避免大而全,因为客户的注意力很容易浪费在没有意义的图表上。将客户真正关心的搞出来,行业背景分析,用户画像,竞品监测,销售行为分析...如果是写通俗文章,多问几个人,你想要知道什么。
由于分组是基础,我们先介绍分组:
3.1 分组
分组就是按照一个或多个键,将数据分为几个组的过程。你可以直接传列名做分组,df.groupby('column_name')
也可以传递相同行数的Series甚至DataFrame。下面的例子是按日期里的年做分组:
df2.groupby(df2.日期.map(lambda x:x.year))
Pandas也能支持传递多个列的数组,除了切片以外,能在索引上使用的基本都能在group,sort上使用,一致性的API上手非常容易。
值得注意的是,由于时间索引分组比较困难,例如每五个月一组,可以用针对TimeStamp特定优化的方案,如resample:
下面计算了北京按年平均的AQI:
db[db.city==u'北京'][u'平均值'].resample('12M').aqi.mean()
3.2 排序
Pandas的排序非常之快,大部分操作都能在瞬间完成。排序分为两类:
对一般数据排序
一般排序,直接用sort
即可,传递lambda,列名或多个列,或长度一致的Series,这与groupby等其他API一致,此处从略。
可指定ascending=True|False
来指定升序,降序。
对分组后数据排序
groupby之后的数据,和一般的DataFrame不同,而像个字典(dict)。对键排序,需使用sort_index,值排序,需使用sort_values。
3.3 聚合
聚合可将分组后的数据按需求重新打平。如求每个分组的最大值(max),最小值(min),或数量等,例如:
df2.groupby(df2.日期.map(lambda x:x.year)).size()
我们来写几个例子大家说说是什么意思:
car.groupby(car.年月.map(lambda x:x.month)).销量.sum().plot(kind='bar',title='汽车市场月度销量汇总')
将汽车数据按照月份分组,按销量求和。然后绘制直方图:
Pandas支持直接将聚合结果绘图输出(虽然丑但是方便啊),下一节我们将详细介绍它的使用细节。
这条语句统计了广西省东风MPV的各车型总体销量情况,并按数量降序:
df[(df.省=='广西') & (df.车型分类=='MPV') & (df.品牌=='东风')].groupby('车型').size().sort_values(ascending=False)
3.4 数据透视表
如果我想一次性地针对多种分组方式实行多种聚合策略,有没有更方便的API? 答案是数据透视表(pivot_table)。Excel也有该功能,异常强大,有了它,一般需求几乎都能实现。
有篇文章讲的非常详细,此处就不班门弄斧了,参考:
下面是同时按Name rep manager
分组,按价格分别以总价和数量聚合,并将空值填为0.
pd.pivot_table(df,index=["Name","Rep","Manager"],values=["Price"],aggfunc=[np.sum,len],fill_value=0)
pivot之后,生成的DataFrame是multiindex的,处理起来稍显繁琐,用xs可将某个子index的数据“提升”出来,例如:
df_pivot.xs(('12AM新坐标',2011))
至于更复杂的访问和采样,可配合loc和PD.IndexSlice, 可自行查看官方文档。
4. 总结
Pandas本身异常强大,功能非常繁杂,笔者仅仅掌握了其中非常小的一部分。但是对于一般的需求都能通过简单的操作组合出来。API的一致性非常重要,Pandas(包括numpy等)都继承了Python的优良特性,因此只要能举一反三,就能进步神速。
文章不能太长,否则就没人看得完了。不过相信我,掌握文中说的用法,基本上就足够混口饭吃了。因为写SQL的速度和灵活性是远远不及Pandas语法的。下一篇是数据可视化,我们来讨论如何做可视化,还有对应的Python库。
有任何问题,欢迎交流。
Python数据分析之路(一)查询和统计的更多相关文章
- 【Python高级工程师之路】入门+进阶+实战+爬虫+数据分析整套教程
点击了解更多Python课程>>> 全网最新最全python高级工程师全套视频教程学完月薪平均2万 什么是Python? Python是一门面向对象的编程语言,它相对于其他语言,更加 ...
- [Python数据分析]新股破板买入,赚钱几率如何?
这是本人一直比较好奇的问题,网上没搜到,最近在看python数据分析,正好自己动手做一下试试.作者对于python是零基础,需要从头学起. 在写本文时,作者也没有完成这个小分析目标,边学边做吧. == ...
- 【读书笔记与思考】《python数据分析与挖掘实战》-张良均
[读书笔记与思考]<python数据分析与挖掘实战>-张良均 最近看一些机器学习相关书籍,主要是为了拓宽视野.在阅读这本书前最吸引我的地方是实战篇,我通读全书后给我印象最深的还是实战篇.基 ...
- 零基础学习Python数据分析
网上虽然有很多Python学习的教程,但是大多是围绕Python网页开发等展开.数据分析所需要的Python技能和网页开发等差别非常大,本人就是浪费了很多时间来看这些博客.书籍.所以就有了本文,希望能 ...
- 《Python 数据分析》笔记——pandas
Pandas pandas是一个流行的开源Python项目,其名称取panel data(面板数据)与Python data analysis(Python 数据分析)之意. pandas有两个重要的 ...
- Python数据分析-Pandas(Series与DataFrame)
Pandas介绍: pandas是一个强大的Python数据分析的工具包,是基于NumPy构建的. Pandas的主要功能: 1)具备对其功能的数据结构DataFrame.Series 2)集成时间序 ...
- python学习之路-day2-pyth基础2
一. 模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...
- Python 数据分析(一) 本实验将学习 pandas 基础,数据加载、存储与文件格式,数据规整化,绘图和可视化的知识
第1节 pandas 回顾 第2节 读写文本格式的数据 第3节 使用 HTML 和 Web API 第4节 使用数据库 第5节 合并数据集 第6节 重塑和轴向旋转 第7节 数据转换 第8节 字符串操作 ...
- Python学习之路-Day2-Python基础2
Python学习之路第二天 学习内容: 1.模块初识 2.pyc是什么 3.python数据类型 4.数据运算 5.bytes/str之别 6.列表 7.元组 8.字典 9.字符串常用操作 1.模块初 ...
随机推荐
- laravel5.2之logout注销账号无效
问题描述:laravel5.2的框架,使用框架auth用户认证后,进行账号注销退出的时候,无法实现. 只有清除浏览器缓存,才能实现账号退出. 解决办法: 改变路由 Route::get('auth/l ...
- THE R QGRAPH PACKAGE: USING R TO VISUALIZE COMPLEX RELATIONSHIPS AMONG VARIABLES IN A LARGE DATASET, PART ONE
The R qgraph Package: Using R to Visualize Complex Relationships Among Variables in a Large Dataset, ...
- 基于R语言的梯度推进算法介绍
通常来说,我们可以从两个方面来提高一个预测模型的准确性:完善特征工程(feature engineering)或是直接使用Boosting算法.通过大量数据科学竞赛的试炼,我们可以发现人们更钟爱于Bo ...
- Interactive pivot tables with R(转)
I love interactive pivot tables. That is the number one reason why I keep using spreadsheet software ...
- JS实现鼠标移上去图片停止滚动移开恢复滚动效果
这是在做个人站的时候展示项目成果,因为不光需要展示,还需要介绍详细内容,就在滚动展示的地方做了这个效果以便于点开想要看的项目. 首先,要做的是一个需要滚动的区域.我前边写过一个关于图片循环滚动的示例, ...
- 自研框架wap.js实践
示例 使用分为3个步骤: 1, 配置模板渲染中心,方便别人可以看到你的模板渲染,请求是什么关系,复杂度怎样 2, 配置事件分发中心 方便观察事件分发,事件复杂度 3,写对应的请求方法.渲染方法. ...
- 基于Express+Socket.io+MongoDB的即时聊天系统的设计与实现
记得从高中上课时经常偷偷的和同学们使用qq进行聊天,那时候经常需要进行下载qq,但是当时又没有那么多的流量进行下载,这就是一个很尴尬的事情了,当时就多想要有一个可以进行线上聊天的网站呀,不用每次痛苦的 ...
- 堆结构的优秀实现类----PriorityQueue优先队列
之前的文章中,我们有介绍过动态数组ArrayList,双向队列LinkedList,键值对集合HashMap,树集TreeMap.他们都各自有各自的优点,ArrayList动态扩容,数组实现查询非常快 ...
- Maximum Subarray Sum
Maximum Subarray Sum 题意 给你一个大小为N的数组和另外一个整数M.你的目标是找到每个子数组的和对M取余数的最大值.子数组是指原数组的任意连续元素的子集. 分析 参考 求出前缀和, ...
- windows embedded compact 2013 正版免费下载
不知道wince2013是不是真的免费了,不过可以试一下! 下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=39268 你仍然 ...