本文的目的在于教给
现充
我一点人生的经验,介绍一些 Jupyter Notebook 的良好体验。
知识准备:具有一定的人生经验
-1. Jupyter Pandas 是什么
Jupyter
一个在线 Python
编程环境,每行的代码在敲击 Shift + Enter
后单独执行,便于初学者快速掌握编程语言。
Jupyter 可以完美利用 Python 丰富的数据分析和科学计算的工具库,实现一些非大数据的分析计算需求。
Pandas
用于操作行列数据,方便地实现各种数据分析的形式。
0. 安装本地环境
(现充请跳过本节,直接访问线上地址,点击 Welcome to Python.ipynb
)
在命令行中输入:
pip install jupyter
pip install pandas
pip install matplotlib
cd到指定目录,启动:
jupyter notebook
1. 加载工具库
在 Jupyter Notebook 中,Pandas 是操作数据的工具,matplotlib 是执行作图的工具。
在 Cell 中输入并执行:
import pandas as pd
import matplotlib.pyplot as plt
2. 读取数据文件或数据库
在 Cell 中输入并执行:
df = pd.read_csv('[./data.csv](/assets/data.csv)', index_col='id')
由于在线环境无法创建文件,也可以执行以下语句创建一个 DataFrame
:
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
index_col
的作用是索引,是为了高效查询建立的特殊数据结构,简单说(不准确)是黄页
3. 想象这是Excel
现在想象你手边有Excel(当然你也可以真的开一个)显示如下表格:
date(索引) | A | B | C | D |
---|---|---|---|---|
2013-01-01 | 0.469112 | -0.282863 | -1.509059 | -1.135632 |
2013-01-02 | 1.212112 | -0.173215 | 0.119209 | -1.044236 |
2013-01-03 | -0.861849 | -2.104569 | -0.494929 | 1.071804 |
2013-01-04 | 0.721555 | -0.706771 | -1.039575 | 0.271860 |
2013-01-05 | -0.424972 | 0.567020 | 0.276232 | -1.087401 |
2013-01-06 | -0.673690 | 0.113648 | -1.478427 | 0.524988 |
- 行的选取
在 Cell 中输入并执行:
rows = df[0:3]
选择第0行至第3行,结果如灰色区域所示:
date(索引) | A | B | C | D |
---|---|---|---|---|
2013-01-01 | 0.469112 | -0.282863 | -1.509059 | -1.135632 |
2013-01-02 | 1.212112 | -0.173215 | 0.119209 | -1.044236 |
2013-01-03 | -0.861849 | -2.104569 | -0.494929 | 1.071804 |
2013-01-04 | 0.721555 | -0.706771 | -1.039575 | 0.271860 |
2013-01-05 | -0.424972 | 0.567020 | 0.276232 | -1.087401 |
2013-01-06 | -0.673690 | 0.113648 | -1.478427 | 0.524988 |
2.列的选取
cols = df[['A', 'B', 'C']]
选择列A,B,C,结果如灰色区域所示:
date(索引) | A | B | C | D |
---|---|---|---|---|
2013-01-01 | 0.469112 | -0.282863 | -1.509059 | -1.135632 |
2013-01-02 | 1.212112 | -0.173215 | 0.119209 | -1.044236 |
2013-01-03 | -0.861849 | -2.104569 | -0.494929 | 1.071804 |
2013-01-04 | 0.721555 | -0.706771 | -1.039575 | 0.271860 |
2013-01-05 | -0.424972 | 0.567020 | 0.276232 | -1.087401 |
2013-01-06 | -0.673690 | 0.113648 | -1.478427 | 0.524988 |
3.块的选取
df.loc['20130102':'20130104',['A','B']]
选择行和列组成的数据块,结果如灰色区域所示:
date(索引) | A | B | C | D |
---|---|---|---|---|
2013-01-01 | 0.469112 | -0.282863 | -1.509059 | -1.135632 |
2013-01-02 | 1.212112 | -0.173215 | 0.119209 | -1.044236 |
2013-01-03 | -0.861849 | -2.104569 | -0.494929 | 1.071804 |
2013-01-04 | 0.721555 | -0.706771 | -1.039575 | 0.271860 |
2013-01-05 | -0.424972 | 0.567020 | 0.276232 | -1.087401 |
2013-01-06 | -0.673690 | 0.113648 | -1.478427 | 0.524988 |
4. 操作行和块
Pandas 中的基本数据结构有二,Series
和 Dataframe
。
Series
用来创建行,也可以理解为一维数组。
Dataframe
用来创建块,或称为矩阵,表格。
创建一个数组[1,1,2,3,5]:
s = pd.Series([1,1,2,3,5])
创建一个 6x4
的表格块,单元格内容为随机数列名为 A,B,C,D。
pd.DataFrame(np.random.randn(6,4), columns=list('ABCD'))
从已有的列创建一个新的列
df['sumAB'] = pd.Series(df['A'] + df['B'], index=df.index)
df['10A'] = pd.Series(df['A']*10, index=df.index)
df['A'] + df['B']
表示两列对应单元格的相加
df['A']*10
表示列A每个单元格 *10
运算后df的值如下:
date(索引) | A | B | C | D | sumAB | 10A |
---|---|---|---|---|---|---|
2013-01-01 | 0.469112 | -0.282863 | -1.509059 | -1.135632 | 0.186249 | 4.69112 |
2013-01-02 | 1.212112 | -0.173215 | 0.119209 | -1.044236 | 1.038897 | 12.12112 |
2013-01-03 | -0.861849 | -2.104569 | -0.494929 | 1.071804 | -2.966418 | -8.61849 |
2013-01-04 | 0.721555 | -0.706771 | -1.039575 | 0.271860 | 0.014784 | 7.21555 |
2013-01-05 | -0.424972 | 0.567020 | 0.276232 | -1.087401 | 0.142048 | -4.24972 |
2013-01-06 | -0.673690 | 0.113648 | -1.478427 | 0.524988 | -0.560042 | -6.73690 |
根据条件过滤行
在方括号中加入判断条件来过滤行,条件必需返回 True
或者 False
df[(df.index >= '2013-01-01') & (df.index <= '2013-01-03')]
df[df['A'] > 0]
窥视数据
为了快速了解数据的结构,一些值得掌握的指令如下:
# 查看表头5行
df.head(5)
# 查看表末5行
df.tail(5)
# 查看列的名字
df.columns
# 查看表格当前的值
df.values
# 查看所有列的统计描述,包括平均值,标准差,最大最小值,以及25%,50%,75%的 percentile 值
df.describe()
# 对表按照A列升序排序
df.sort_values(by='A')
作图
Pandas 与 matplotlib 配合使用,可以支持几乎所有常用的图表形式,这里以常用的直方图为例,来观察一个典型的独立随机变量的正态分布:
# 首先打开图表行内显示
%matplotlib inline
# 生成600个随机数(符合正态分布),存放在 Series 或 DataFrame 的某一列中
nd = pd.Series(np.random.randn(600))
# bins 表示直方图的方块数
# range 表示图表显示的范围
nd.hist(bins=100, range=(-5,5))
结果如图所示:
More
Jupyter 的限制
由于 Python 本身的限制,如果需要计算的数据量太大,而无法一次载入内存,则需要分块导入数据,并对查询做相应的修改。
下一步
经过了这几节,想必现充们仅仅学会了例子中的代码,如果想进一步了解,请参考以下文档:
进一步的使用需要对 Python 和 Pandas 做全面的了解,可以参考以下书籍: