2.2.1 读取数据集
import os
import pandas as pd
import torch
创建一个人工数据集并存储在CSV文件../data/house_tiny.csv中。
调用 read_csv 函数读出该文件
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
f.write('NumRooms,Alley,Prince\n') # 列名
f.write('NA,Pave,127500\n') # 每行表示一个数据样本
f.write('2,NA,106000\n')
f.write('4,NA,178100\n')
f.write('NA,NA,140000\n')
data = pd.read_csv(data_file)
data
NumRooms | Alley | Prince | |
---|---|---|---|
0 | NaN | Pave | 127500 |
1 | 2.0 | NaN | 106000 |
2 | 4.0 | NaN | 178100 |
3 | NaN | NaN | 140000 |
2.2.2 处理缺失值
通过位置索引 iloc 将 data 分成 inputs(前两列)和 outputs(后一列),并使用列均值替代 NaN 项。
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
inputs
NumRooms | Alley | |
---|---|---|
0 | 3.0 | Pave |
1 | 2.0 | NaN |
2 | 4.0 | NaN |
3 | 3.0 | NaN |
将类型值或离散值的 NaN 视为一个类别,可将 Alley 列分解成 Alley_Pava 和 Alley_nan 两列。
inputs = pd.get_dummies(inputs, dummy_na=True)
inputs
NumRooms | Alley_Pave | Alley_nan | |
---|---|---|---|
0 | 3.0 | 1 | 0 |
1 | 2.0 | 0 | 1 |
2 | 4.0 | 0 | 1 |
3 | 3.0 | 0 | 1 |
2.2.3 转换为张量格式
X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
X, y
(tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=torch.float64),
tensor([127500, 106000, 178100, 140000]))
练习
# 整个更多数据的表
data_file2 = os.path.join('..', 'data', 'test_c2.csv')
with open(data_file2, 'w') as f:
f.write('col0,col1,col2\n') # 列名
f.write('1,Pave,127500\n') # 每行表示一个数据样本
f.write('2,NA,106000\n')
f.write('4,NA,178100\n')
f.write('3,NA,NA\n')
f.write('5,NA,140000\n')
f.write('NA,NA,NA\n')
f.write('9,NA,140000\n')
f.write('7,NA,NA\n')
f.write('9,NA,140000\n')
f.write('3,NA,140000\n')
data = pd.read_csv(data_file2)
data
col0 | col1 | col2 | |
---|---|---|---|
0 | 1.0 | Pave | 127500.0 |
1 | 2.0 | NaN | 106000.0 |
2 | 4.0 | NaN | 178100.0 |
3 | 3.0 | NaN | NaN |
4 | 5.0 | NaN | 140000.0 |
5 | NaN | NaN | NaN |
6 | 9.0 | NaN | 140000.0 |
7 | 7.0 | NaN | NaN |
8 | 9.0 | NaN | 140000.0 |
9 | 3.0 | NaN | 140000.0 |
(1)删除缺失值最多的列
调用 isnull 函数判断哪些值为缺失值,再调用 sum 函数求和,最后调用 idxmax 获取其中的最大值列的索引
data.isnull(), data.isnull().sum(), data.isnull().sum().idxmax() # 得到缺失值最多列的索引
( col0 col1 col2
0 False False False
1 False True False
2 False True False
3 False True True
4 False True False
5 True True True
6 False True False
7 False True True
8 False True False
9 False True False,
col0 1
col1 9
col2 3
dtype: int64,
'col1')
data = data.drop(data.isnull().sum().idxmax(), axis=1) # 删除
data
col0 | col2 | |
---|---|---|
0 | 1.0 | 127500.0 |
1 | 2.0 | 106000.0 |
2 | 4.0 | 178100.0 |
3 | 3.0 | NaN |
4 | 5.0 | 140000.0 |
5 | NaN | NaN |
6 | 9.0 | 140000.0 |
7 | 7.0 | NaN |
8 | 9.0 | 140000.0 |
9 | 3.0 | 140000.0 |
(2)处理剩余缺失值后转换为张量格式
data = data.fillna(data.mean())
data
col0 | col2 | |
---|---|---|
0 | 1.000000 | 127500.0 |
1 | 2.000000 | 106000.0 |
2 | 4.000000 | 178100.0 |
3 | 3.000000 | 138800.0 |
4 | 5.000000 | 140000.0 |
5 | 4.777778 | 138800.0 |
6 | 9.000000 | 140000.0 |
7 | 7.000000 | 138800.0 |
8 | 9.000000 | 140000.0 |
9 | 3.000000 | 140000.0 |
Y = torch.tensor(data.values)
Y
tensor([[1.0000e+00, 1.2750e+05],
[2.0000e+00, 1.0600e+05],
[4.0000e+00, 1.7810e+05],
[3.0000e+00, 1.3880e+05],
[5.0000e+00, 1.4000e+05],
[4.7778e+00, 1.3880e+05],
[9.0000e+00, 1.4000e+05],
[7.0000e+00, 1.3880e+05],
[9.0000e+00, 1.4000e+05],
[3.0000e+00, 1.4000e+05]], dtype=torch.float64)
标签:False,NA,NaN,data,write,True,2.2,数据,预处理
From: https://www.cnblogs.com/AncilunKiang/p/17425991.html