文章目录
一、pandas与建模代码结合
用DataFrame.values属性将DataFrame转换为NumPy数组
import pandas as pd
import numpy as np
data = pd.DataFrame({
'x0': [1, 2, 3, 4, 5],
'x1': [0.01, -0.01, 0.25, -4.1, 0.],
'y': [-1.5, 0., 3.6, 1.3, -2.]})
data
x0 | x1 | y | |
---|---|---|---|
0 | 1 | 0.01 | -1.5 |
1 | 2 | -0.01 | 0.0 |
2 | 3 | 0.25 | 3.6 |
3 | 4 | -4.10 | 1.3 |
4 | 5 | 0.00 | -2.0 |
data.columns
'''Index(['x0', 'x1', 'y'], dtype='object')'''
# 用DataFrame.values属性将DataFrame转换为NumPy数组
data.values
'''
array([[ 1. , 0.01, -1.5 ],
[ 2. , -0.01, 0. ],
[ 3. , 0.25, 3.6 ],
[ 4. , -4.1 , 1.3 ],
[ 5. , 0. , -2. ]])
'''
向pd.DataFrame()传递含有列名的二维ndarray,可将数组转换为DataFrame
# 向pd.DataFrame()传递含有列名的二维ndarray,可将数组转换为DataFrame
df2 = pd.DataFrame(data.values, columns=['one', 'two', 'three'])
df2
one | two | three | |
---|---|---|---|
0 | 1.0 | 0.01 | -1.5 |
1 | 2.0 | -0.01 | 0.0 |
2 | 3.0 | 0.25 | 3.6 |
3 | 4.0 | -4.10 | 1.3 |
4 | 5.0 | 0.00 | -2.0 |
选取DataFrame列的子集转换为ndarray
# 用loc选取列子集
model_cols = ['x0', 'x1']
data.loc[:, model_cols].values
'''
array([[ 1. , 0.01],
[ 2. , -0.01],
[ 3. , 0.25],
[ 4. , -4.1 ],
[ 5. , 0. ]])
'''
# 用iloc选取列子集
data.iloc[:, :-2].values
# 直接选取列名
data[['x0', 'x1']].values
# 用reindex(),传递columns=[]
data.reindex(columns=['x0','x1']).values
用pd.Categorical([与行数相对应的每行的分类组成的列表], categories=[不同分类组成的列表])添加分类列
data['category'] = pd.Categorical(['a', 'b', 'a', 'a', 'b'], categories=['a', 'b'])
data
x0 | x1 | y | category | |
---|---|---|---|---|
0 | 1 | 0.01 | -1.5 | a |
1 | 2 | -0.01 | 0.0 | b |
2 | 3 | 0.25 | 3.6 | a |
3 | 4 | -4.10 | 1.3 | a |
4 | 5 | 0.00 | -2.0 | b |
用虚拟变量替换category列,要先创建虚拟变量,在删除category列,最后连接结果
# 用pd.get_dummies(df.category列名, prefix='category列名')创建虚拟变量,prefix设置新列名前缀
dummies = pd.get_dummies(data.category, prefix='category')
# df.drop('列名', axis=1)删除原来的分类列
# join将删除分类列的数据与虚拟变量连接
data_with_dummies = data.drop('category', axis=1).join(dummies)
data_with_dummies
x0 | x1 | y | category_a | category_b | |
---|---|---|---|---|---|
0 | 1 | 0.01 | -1.5 | 1 | 0 |
1 | 2 | -0.01 | 0.0 | 0 | 1 |
2 | 3 | 0.25 | 3.6 | 1 | 0 |
3 | 4 | -4.10 | 1.3 | 1 | 0 |
4 | 5 | 0.00 | -2.0 | 0 | 1 |
# the same as above
# pd.get_dummies(df)会将df中不是数值型的列全部转换为虚拟变量,并在结果中字段将数值型列放在虚拟变量前
data_with_dummies2 = pd.get_dummies(data)
data_with_dummies2
# 但是要注意,如果原df中的数据列类似于 【是否已婚,是用1表示,否用0表示】,则需要先将此列转换为字符串,再用上面的方法。涉及到的转换方法见:https://www.pypandas.cn/docs/getting_started/basics.html#数据类型
二、用patsy创建模型描述
Patsy是一用于描述统计模型(尤其是线性模型)的Python库,能够很好的支持statsmodels中特定的线性模型。
Patsy的公式是特殊字符串语法,如:y ~ x0 + x1,这里的相加表示为模型创建的设计矩阵。即y、x0、x1表示向量的意思。
data = pd.DataFrame({
'x0': [1, 2, 3, 4,