跳转到主要内容
2.1.4 · 建议 20 分钟 · 满分 19

医疗研究数据清洗和标注设计

背景

随着医学技术的进步和医疗资源的丰富,医疗研究在改善患者治疗效果、提升医疗服务质量方面起到了重要作用。研究人员通过分析大量患者的治疗数据,能够评估不同治疗方案的效果,发现潜在的健康问题,并提出针对性的治疗建议。这不仅可以帮助患者获得更好的治疗效果,还能为医疗机构优化资源配置、提升服务水平提供重要依据。 现提供一份医疗研究数据集,训练集样本数据一共 5441 条记录。请补全 2.1.4.ipynb 代码,完成数据预处理任务。 注意:medical_data.csv 文件为 GBK 编码。

工作任务

  1. 加载数据集,查看表的数据类型,表结构和显示每一列的空缺值数量。
  2. 将“就诊日期”和“诊断日期”规范为“yyyy-mm-dd”格式,并将“病人ID”列名改为“患者ID”,显示修改后的表结构。
  3. 增加“诊断延迟”(诊断日期-就诊日期)和“病程”(当前日期-诊断日期)两列,删除不合理的数据(如负数,年龄为几百岁等)。
  4. 检查数据集中的重复值并删除所有重复值,并记录删除的行数。
  5. 对数据段[年龄,体重,身高]进行归一化处理。
  6. 统计不同疾病类型的治疗结果分布,并画出柱状图。
  7. 分析年龄和疾病严重程度的关系,绘制出散点图。
  8. 保存处理后的数据,并命名为:2.1.4_cleaned_data.csv。

素材预览

medical_data.csv
病人ID,年龄,性别,地区,就诊日期,疾病类型,诊断日期,疾病严重程度,治疗方案,治疗结果,药物名称,药物分类,用药剂量,用药时长,检查项目,检查结果,参考范围,体重,身高,吸烟情况,饮酒情况,遗传病史
20413,45,女,重庆,2023-4-4,感冒,2023-4-25,不严重,放疗,病情稳定,维生素C,非处方药,每周一次,2个月,尿常规,105,正常,67,184,是,偶尔,是
...

代码填空

import pandas as pd

# 加载数据集并指定编码为gbk
data = 

# 查看数据类型
print(data.dtypes)
# 查看表结构基本信息
print()

# 显示每一列的空缺值数量
print(data.isnull().sum())

# 规范日期格式
data['就诊日期'] = pd.to_datetime(data['就诊日期'])
data['诊断日期'] = pd.to_datetime(data['诊断日期'])

# 修改列名
(, inplace=True)

# 查看修改后的表结构
print(data.head())

from datetime import datetime

# 增加诊断延迟和病程列
data['诊断延迟'] = .dt.days
data['病程'] = (datetime(2024, 9, 1) - data['诊断日期']).dt.days

# 删除不合理的数据
data = [( >= 0) & ( > 0) & ( < 120)]

# 查看修改后的数据
print(data.describe())

# 删除重复值并记录删除的行数
initial_rows = data.shape[0]
(inplace=True)
deleted_rows = initial_rows - data.shape[0]

print(f'删除的重复行数: {deleted_rows}')

from sklearn.preprocessing import MinMaxScaler

# 对需要归一化的列进行处理
scaler = MinMaxScaler()
columns_to_normalize = []
data[columns_to_normalize] = 

# 查看归一化后的数据
print(data.head())

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm


# 统计治疗结果分布
treatment_outcome_distribution = data.groupby('疾病类型')['治疗结果'].value_counts().unstack()

# 设置中文字体
font_path = 'C:/Windows/Fonts/simhei.ttf'  # 根据你的系统调整字体路径
my_font = fm.FontProperties(fname=font_path)

# 绘制柱状图
(, stacked=True)
plt.title('不同疾病类型的治疗结果分布', fontproperties=my_font)
plt.xlabel('疾病类型', fontproperties=my_font)
plt.ylabel('治疗结果数量', fontproperties=my_font)
plt.xticks(fontproperties=my_font)  # 设置x轴刻度标签的字体
plt.yticks(fontproperties=my_font)  # 设置y轴刻度标签的字体
plt.legend(prop=my_font)  # 设置图例字体
plt.show()

# 绘制散点图
(, )
plt.title('年龄和疾病严重程度的关系', fontproperties=my_font)
plt.xlabel('年龄', fontproperties=my_font)
plt.ylabel('疾病严重程度', fontproperties=my_font)
plt.xticks(fontproperties=my_font)  # 设置x轴刻度标签的字体
plt.yticks(fontproperties=my_font)  # 设置y轴刻度标签的字体
plt.legend(prop=my_font)  # 设置图例字体
plt.show()

# 保存处理后得数据
output_path = '2.1.4_cleaned_data.csv'
(, index=False)