本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Data_Analysis/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj
提取码:mnsj
-
前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis
根据《Python for Data Analysis 3rd Edition》翻译整理
—————————————————–
常见的模型开发工作流程是:首先使用pandas进行数据加载和清洗,然后再切换到建模库来构建模型本身。
因此,这一小节会简单介绍下面两个流行的建模工具包:
-
statsmodels(https://www.statsmodels.org/stable/index.html);
-
scikit-learn(https://scikit-learn.org/stable/)。
机器学习中,特征工程是模型开发过程的一个重要部分,指的是从原始数据集中提取可用于模型的有效信息的数据转换或分析过程。前述介绍的的数据聚合和GroupBy工具就经常用于特征工程。
本次仅展示一些方法,以使利用pandas进行数据操作和建模之间的切换尽可能无障碍。pandas和其他分析库之间的结合点通常是NumPy数组。
一些库有对pandas的本地支持,并自动为你做一些工作:将数据从DataFrame转换到NumPy,并将模型参数名称附加到输出表或Series的列中。在其他情况下,你将不得不手动执行这种 “元数据管理”。
要把一个DataFrame变成一个NumPy数组,需要使用to_numpy方法。
1>>> data = pd.DataFrame({'x': [1, 2, 3, 4, 5],'y': [6, 7, 8, 9, 10],'z': [11, 12, 13, 14, 15]})
2>>> data
3 x y z
40 1 6 11
51 2 7 12
62 3 8 13
73 4 9 14
84 5 10 15
9
10>>> data.columns
11Index(['x', 'y', 'z'], dtype='object')
12
13>>> data.to_numpy()
14array([[ 1, 6, 11],
15 [ 2, 7, 12],
16 [ 3, 8, 13],
17 [ 4, 9, 14],
18 [ 5, 10, 15]], dtype=int64)
要将一个数组转换回 DataFrame,你可能还记得前面章节中的内容,你可以传递一个含有列名的二维ndarray。
1>>> data2 = pd.DataFrame(data.to_numpy(), columns=['one', 'two', 'three'])
2>>> data2
3 one two three
40 1 6 11
51 2 7 12
62 3 8 13
73 4 9 14
84 5 10 15
to_numpy 方法一般在数据是同质化的时候使用,例如,均为数字类型。如果数据为异质性的,结果将是一个Python对象的ndarray。
1>>> data3 = data.copy()
2>>> data3['strings'] = ['a', 'b', 'c', 'd', 'e']
3>>> data3
4 x y z strings
50 1 6 11 a
61 2 7 12 b
72 3 8 13 c
83 4 9 14 d
94 5 10 15 e
10
11>>> data3.to_numpy()
12array([[1, 6, 11, 'a'],
13 [2, 7, 12, 'b'],
14 [3, 8, 13, 'c'],
15 [4, 9, 14, 'd'],
16 [5, 10, 15, 'e']], dtype=object)
对于某些模型,你可能希望只使用一部分列,此时推荐 to_numpy 和 loc 索引一起使用。
1>>> model_cols = ['x', 'y']
2
3>>> data.loc[:, model_cols].to_numpy()
4array([[ 1, 6],
5 [ 2, 7],
6 [ 3, 8],
7 [ 4, 9],
8 [ 5, 10]], dtype=int64)
在前面的分类数据中,介绍了pandas的Categorical 类型和pandas.get_dummies 函数。
假设在下面的示例数据中有一个非数字类型的列,如果我们想用虚拟变量替换 “category “列,我们首先需要创建虚拟变量,然后删除 “category “列,最后连接结果。
1>>> data['category'] = pd.Categorical(['a', 'b', 'a', 'b', 'a'],categories=['a', 'b'])
2>>> data
3 x y z category
40 1 6 11 a
51 2 7 12 b
62 3 8 13 a
73 4 9 14 b
84 5 10 15 a
9
10# 创建虚拟变量
11>>> dummies = pd.get_dummies(data.category, prefix='category')
12>>> dummies
13 category_a category_b
140 1 0
151 0 1
162 1 0
173 0 1
184 1 0
19
20# 删除 "category "列,然后连接结果
21>>> data_with_dummies = data.drop('category', axis=1).join(dummies)
22>>> data_with_dummies
23 x y z category_a category_b
240 1 6 11 1 0
251 2 7 12 0 1
262 3 8 13 1 0
273 4 9 14 0 1
284 5 10 15 1 0
用虚拟变量来拟合某些统计模型,有一些细微的差别。当拥有不止简单的数字类型列时,使用Patsy(下一篇的内容)可能会更简单,更少出错。
本篇文章来源于微信公众号: 码农设计师