chapter2.2
import torch
import os
import numpy as np
import pandas as pd
# csv文件 一种以逗号,分隔开的数据文本 一种平面文件 是纯数据文件
# csv文件的读取是pandas的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,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')
# 将scsv文件的结果输出来
# 如果提示没有pandas这个包的话 就去pytorch环境下conda install pandas
import pandas as pd
date = pd.read_csv(data_file)
print(date)
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
# csv文件中出现了NaN这样的数据 要进行处理 通常的做法是进行插值和删除
inputs, outputs = date.iloc[:, 0:2], date.iloc[:, 2] # iloc函数是定位函数 前者定位到全部行的0到1列全部取出 后者是定位到全部行的第2列
inputs = inputs.fillna(inputs.mean()) # fillna函数将Na/NaN的数值进行指定的数值进行填充
print(inputs)
NumRooms Alley
0 NaN Pave
1 2.0 NaN
2 4.0 NaN
3 NaN NaN
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
# 在处理数据过程中 遇到类别值和离散值 将NaN看为一个类别
# get_dummines() 这个是实现one hot code的形式
# 将离散型特征的每一种取值都看成一种状态,若你的这一特征中有N个不相同的取值,那么我们就可以将该特征抽象成N种不同的状态,
# one-hot编码保证了每一个取值只会使得一种状态处于“激活态”,也就是说这N种状态中只有一个状态位值为1,其他状态位都是0。
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
# 将inputs putputs中的所有条目都是数值类型 类型转化为张量格式
import torch
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]))
# 作业
# 1. 删除缺失值最多的列。
os.makedirs(os.path.join('.', 'data1'), exist_ok=True)
data_file1 = os.path.join('.', 'data1', 'house_tiny1.csv')
with open(data_file1, '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')
date1 = pd.read_csv(data_file1)
print(date1)
def drop_maxcol():
count = 0
count_max = 0
labels = ['NumRooms','Alley','Price']
for label in labels:
count = date1[label].isna().sum() # 统计NAN元素
if count > count_max:
count_max = count
drop_label = label
# print(drop_label)
drop_data1 = date1.drop(drop_label, axis=1)
return drop_data1
drop_data1 = drop_maxcol()
drop_data1
NumRooms Price
0 NaN 127500
1 2.0 106000
2 4.0 178100
3 NaN 140000
# 作业2
# 将预处理后的数据集转化为张量
# 1.将NumRooms为NaM的元素进行填充
# 2.
inputs = drop_data1.iloc[:,0:1]
inputs = inputs.fillna(inputs.mean()) # 数据填充
input_tensor = torch.tensor(inputs.values)
print(input_tensor)
tensor([[3.],
[2.],
[4.],
[3.]], dtype=torch.float64)