注:本代码在jupyter notebook上运行
读取数据集
创建人工数据集,存储在CSV(逗号分隔符)文件中 将数据按行写入CSV
import os
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')
加载原始数据集,有四行三列,描述了房间数量、巷子类型、房屋价格
import pandas as pd
data = pd.read_csv(data_file)
print(data)
输出结果:
处理缺失值
通过位置索引iloc,将data分成inputs和outputs
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean()) # 插值法,用同一列的均值替换NaN
print(inputs)
报错
TypeError: can only concatenate str (not “int”) to str
解决办法:
在 mean() 函数中添加 numeric_only=True
原理解释:
在Pandas库中,mean() 函数是一个常用的统计函数,用于计算数据的平均值。inputs.mean()操作中,则Pandas会尝试将所有数据转换为数值型以便计算平均值。对于无法转换为数值型的数据(如字符串或日期等),这将导致错误。因此,在包含多种数据类型的数据集上使用时,设置 numeric_only=True 可以避免这类错误,确保函数能够正确执行。
在 mean() 函数中添加 numeric_only=True 参数时,这个参数的作用是控制函数在计算平均值时是否仅考虑数值型(numeric)数据。
# 更改代码
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean(numeric_only=True)) # 插值法,用同一列的均值替换NaN
print(inputs)
输出结果:
pd.get_dummies(inputs, dummy_na=True) 将分类变量(categorical variables)转换为虚拟/指示变量(dummy/indicator variables) Alley列只接受两种类型的类别值“Pave”和“NaN”, pandas可以自动将此列转换为两列“Alley_Pave”和“Alley_nan”
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
import pandas as pd
# 创建一个包含分类变量的 DataFrame
data = pd.DataFrame({
'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', pd.NA],
'B': ['one', 'one', 'two', pd.NA, 'two', 'two', 'one'],
'C': [1, 2, 3, 4, 5, 6, 7],
})
# 使用 pd.get_dummies 转换 DataFrame
dummies = pd.get_dummies(data, dummy_na=True)
print(dummies)
转化为张量格式
import torch
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y
输出结果
练习:
创建包含更多行和列的原始数据
删除缺失值最多的列
将预处理后的数据集转化为张量格式
data_file = os.path.join('.', 'data', 'test.csv') # 目标文件地址
with open(data_file, 'w') as f:
f.write('品名,产地,净含量,价格\n') # 列名
f.write('矿泉水,湖里,550, 10\n') # 每行表示一个数据样本
f.write('矿,山里,湖里, NA\n')
f.write('矿泉水,NA,550, 10\n')
f.write('矿泉水,NA,550, 10\n')
f.write('矿泉水,湖里,550, 10\n')
import pandas as pd
# 注意:read_csv函数默认将'NA'视为NaN
df = pd.read_csv('./data/test.csv', na_values=['NA'])
# 计算每列的缺失值数量
missing_values_count = df.isnull().sum()
# 找到缺失值最多的列
column_with_most_missing = missing_values_count.idxmax()
# 删除该列
df_cleaned = df.drop(column_with_most_missing, axis=1)
# 显示清理后的DataFrame
print(df_cleaned)
# 将清理后的DataFrame保存回CSV文件
df_cleaned.to_csv('./data/test1.csv', index=False)
报错:UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xc3 in position 2: invalid continuation byte
在这里插入代码片
# 查了一下,原来中文要用utf-8编码 在open函数中加入编码信息
with open(data_file, 'w', encoding='utf8') as f:
f.write('品名,产地,净含量,价格\n') # 列名
f.write('矿泉水,湖里,550, 10\n') # 每行表示一个数据样本
f.write('矿,山里,湖里, NA\n')
f.write('矿泉水,NA,550, 10\n')
f.write('矿泉水,NA,550, 10\n')
f.write('矿泉水,湖里,550, 10\n')
import pandas as pd
# 注意:read_csv函数默认将'NA'视为NaN
df = pd.read_csv('./data/test.csv', na_values=['NA'])
# 计算每列的缺失值数量
missing_values_count = df.isnull().sum()
# 找到缺失值最多的列
column_with_most_missing = missing_values_count.idxmax()
# 删除该列
df_cleaned = df.drop(column_with_most_missing, axis=1)
# 显示清理后的DataFrame
print(df_cleaned)
# 将清理后的DataFrame保存回CSV文件
df_cleaned.to_csv('./data/test1.csv', index=False)
运行完成,删除了产地那一列
inputs = pd.get_dummies(df_cleaned, dummy_na=True)
print(inputs)
# 转换成张量格式
X = torch.tensor(inputs.to_numpy(dtype=float))
X
输出结果
本人学习地址https://zh-v2.d2l.ai/
欢迎探讨交流。