http://python.jobbole.com/85394/
Python 在数据科学领域越来越流行了。它的流行不无道理。 Python 容易学,有超强数据科学库,并且和 Hadoop 以及 Spark 等数据库和工具整合得非常好。Python 可以从头至尾完成一个数据科学项目,无论是读取数据、分析数据、数据可视化还是用机器学习来做预测都可以。
本文介绍如何用 Python 上手数据科学。如果想要了解更多内容请访问 Dataquest, 那里有使用 Python 完成数据科学任务的深入讲解。
本文使用的是关于 2016 美国总统大选政治资助的数据集(链接 在此)。文件是 csv 格式,每行代表对一个候选人的一次捐赠。这个数据集有几列比较值得一提,比如:
cand_nm – 接受捐赠的候选人姓名
contbr_nm – 捐赠人姓名
contbr_state – 捐赠人所在州
contbr_employer – 捐赠人所在公司
contbr_occupation – 捐赠人职业
contb_receipt_amount – 捐赠数额(美元)
contb_receipt_dt – 收到捐款的日期
安装 Python
要分析这些数据,首先要安装 Python。利用 Anaconda 这个工具来安装 Python 是非常简单的。Anaconda 在安装 Python 的同时还会安装一些流行的数据分析库。点击 这里 下载 Anaconda。建议安装最新的 Python 3.5 版本。这个链接 里介绍了一些 Python 2 与 Python 3 的对比。
Anaconda 会自动安装一些这篇文章会用到的库,包括 Jupyter、Pandas、scikit-learn 和 matplotlib。
Jupyter 入门
都安装好之后可以启动 Jupyter notebook (原名 IPython notebook)。Jupyter notebook 是个强有力的数据分析工具。它能够帮助快速查看数据、将结果可视化以及把结果分享给他人。谷歌、IBM、微软的数据科学家都用它来分析数据以及组内协作。
在命令行里输入 ipython notebook 来运行 Jupyter。如果遇到问题可以去它的 官方文档 里查找答案。
启动后会出现一个可以查看文件的浏览器界面,在这个页面上可以创建新的 notebook。请创建一个叫 Python 3 的 notebook,一会儿的数据分析中会用到它。如果刚才的安装还没成功,这篇文章 也许有帮助。
Notebook 工作区块
每个 Jupyter notebook 都包含多个区块(cell),区块可以运行代码也可以只包含文档。每个 notebook 开始时都自带一个区块,如有需要可以自行增加多个区块,比如:
代码区块示例。产生的输出会在下方显示。
可以建立多个区块,每个代码区块可以根据分析的需求跑任意次
Jupyter notebook 中一个很赞的功能是每个区块跑出来的结果会被缓存起来, 这样一个区块可以利用另一个区块跑出来的结果。
print(b * 10)
如果想要了解更多关于 Jupyter 的知识请阅读作者提供的更深入的 教程。
Pandas 入门
Pandas 是 Python 上的一个数据分析库。它能读取包括 csv 在内的不同格式的数据,分析数据也很有效。可以通过下面的代码来读取数据:
上面的区块用 import pandas as pd 这个语句导入了 Pandas 库,然后用 read_csv() 这个函数把 political_donations.csv 这个文件读入了变量 donations 中。变量 donations 现在就是一个 Pandas DataFrame。Pandas DataFrame 可以被看做是加强版的矩阵,它自带数据分析函数,并且允许不同的列包含不同的数据类型。
可以通过变量 donations 的 shape 属性来打印它多少行多少列。每个区块的最后一行语句或变量都会自动显示,这个功能超赞!下一个区块用了 DataFrames 的 head() 函数打印出了变量 donations 的头两行,这样就能看里面的数据了。
如想更深入地了解 Pandas 请参阅作者提供的 课程。
每个候选人收到的捐款总额
使用Pandas 中的 groupby() 函数能计算出每个候选人的整体统计数据。根据变量 cand_nm(候选人姓名)来把变量 donations 分成不同的子集就可以针对每个候选人分别统计数据。首先要算的是捐款总额。把候选人的 contb_receipt_amount 这一列加起来就可以得到收到的捐款总额了。
上面的代码首先用donations.groupby(“cand_nm”) 根据cand_nm 把donations 分成了不同的组。这个语句返回的是 GroupBy 对象,GroupBy 类型自带一些专门用来整合数据的函数。其中就包含sum() 函数,在这个问题中可以用来计算每组中每一列中数据的和。
Pandas 在读取数据的时候就会自动识别每一列的数据类型,在进行求和时只会针对数字类型的列来操作。这样就得到了一个包含每个候选人contb_receipt_amt列中所有数字之和及file_num 列中所有数字之和的 DataFrame。最后使用 DataFrames 中的 sort() 函数将contb_receipt_amt 的和从小到大排序。这样就得到了每个候选人收到的捐款总额。
将捐款总额可视化
Python 中最主要的可视化包就是 matplotlib,可以用它来画图。Jupyter notebook 能够在浏览器中直接渲染 matplotlib 的图表。这个功能需要通过激活 matplotlib 的 inline 模式来开启。可以利用 Jupyter magics 中的命令来激活它就能直接在 notebook 中看图表了。
Magics 就是以 % 或者 %% 开头的、能改变 Jupyter notebook 本身的命令。它们是为了让能够通过命令行改变 Jupyter 的设置,同时尽量不与 Python 代码混淆而存在的。要想在浏览器里直接看 matplotlib 的图表,需要在代码区块里运行 %matplotlib inline。更多关于用 Jupyter 画图的内容可以 在此 阅读。
用下面的代码来导入 matplotlib 库并且开启 inline 模式:
Pandas 中的 DataFrames 自带对可视化的支持,调用 plot() 函数就可以生成 matplotlib图表。这么用一般会比调用 matplotlib 更方便快捷。先给之前的 DataFrame 赋值给一个变量 total_donations,再利用 indexing 来选择 DataFrame 中的一列: contb_receipt_amt。这样就生成了一个 Pandas 中的 Series 类型的变量。
Pandas 中的 Series 和 DataFrames 包含的函数都差不多,但是 Series 只能存一维数据,比如单一行或者单一列。调用 Series 的 plot() 函数就生成了一个显示每个候选人收到的捐款总额的柱状图。