数据预处理

1.创建csv文件

1.1 创建目录

os.makedirs(): 这是一个用于递归创建目录的函数。它接受一个路径作为输入,并创建路径中所有缺失的目录

exist_ok=True: 这是os.makedirs()函数的一个可选参数。当设置为True时,如果目标目录已经存在,函数不会引发错误,而是默默地继续执行。

os.path.join():函数来连接两个路径部分:”..”(表示父目录) 和 “data”

1
2
3
4
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
#创建一个名为"data"的目录,该目录位于当前工作目录的父目录中
data_file = os.path.join('..', 'data', 'house_tiny.csv')
#创建一个名为data_file的变量,指向当前工作目录的上一级目录中的"data"目录下的"house_tiny.csv"文件

注:如果目录不存在,它将被创建。这样,代码在运行时,如果”data”目录已经存在,它不会抛出异常,而是继续执行。

1.2 创建新文件

1
2
3
4
5
6
with open(data_file, 'w') as f:#打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
f.write('NumRooms,Alley,Price\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')

2.数据预处理

2.1 读取文件

1
2
3
import pandas as pd
data = pd.read_csv(data_file)
print(data)

2.2 数据切片

iloc方法用于基于整数位置对数据进行索引和切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
inputs, outputs = data.iloc[:,0:2], data.iloc[:,2]#iloc方法用于基于整数位置对数据进行索引和切片
print(inputs)
print(outputs)

out:
NumRooms Alley
0 NaN Pave
1 2.0 NaN
2 4.0 NaN
3 NaN NaN

0 127500
1 106000
2 178100
3 140000
Name: Price, dtype: int64

2.3 缺失值填充

fillna() 方法用指定的值(在这里是 inputs.mean() 即每列的均值)替换DataFrame中的缺失值。

1
2
3
4
5
6
7
8
9
#对筛选出的数值类型列使用 mean() 方法计算各自列的均值进行填充
inputs = inputs.fillna(inputs.select_dtypes(include='number').mean())

out:
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN

pd.get_dummies()函数对inputs DataFrame 进行独热编码(One-Hot Encoding)处理。

dummy_na=True: 这是pd.get_dummies()函数的一个可选参数。当设置为True时,它会为原始数据中的缺失值创建一个额外的二进制列。

1
2
3
4
5
6
7
8
inputs = pd.get_dummies(inputs, dummy_na=True)

out:
NumRooms Alley_Pave Alley_nan
0 3.0 True False
1 2.0 False True
2 4.0 False True
3 3.0 False True

注:独热编码的过程会将inputs DataFrame 中的分类变量转换成二进制的向量表示。对于每个分类变量,它会为每个类别创建一个新的列,其中类别出现的位置为1,其余位置为0。如果某一行数据的分类变量具有某个类别,则该类别对应的列为1,其他类别对应的列都为0。如果原始数据中有缺失值,独热编码会在对应的缺失值列中标记为1。

2.4 类型转换

inputs和outputs中的所有条目都是数值类型,可以转换为张量格式

1
2
3
4
5
6
7
8
9
10
11
import torch
inputs = inputs.astype('float64')
x, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
x, y

out:
(tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=torch.float64),
tensor([127500, 106000, 178100, 140000]))