如何重塑患者用药日期数据并生成基于观测天数的可视化图表
数据重塑与可视化实现方案
1. 数据预处理(生成按首次观测后天数的宽表)
使用Pandas处理原始数据,计算每个患者首次服药日期,推导各记录对应的天数,再转成目标宽表格式:
import pandas as pd # 加载原始数据 data = { 'id': [1,1,1,2,2,2], 'medication_date': ['2000-01-01', '2000-01-04', '2000-01-06', '2000-04-01', '2000-04-02', '2000-04-03'] } df = pd.DataFrame(data) df['medication_date'] = pd.to_datetime(df['medication_date']) # 计算每个患者的首次服药日期及对应天数(首次日期为day1) df['first_date'] = df.groupby('id')['medication_date'].transform('min') df['day'] = (df['medication_date'] - df['first_date']).dt.days + 1 # 生成宽表并标记yes/no max_day = df['day'].max() pivot_df = df.pivot_table(index='id', columns='day', values='medication_date', aggfunc='count').fillna(0) pivot_df = pivot_df.applymap(lambda x: 'yes' if x > 0 else 'no') pivot_df.columns = [f'day{d}' for d in range(1, max_day+1)] pivot_df = pivot_df.reset_index() print(pivot_df)
运行后输出的结果就是你需要的格式:
id day1 day2 day3 day4 0 1 yes no no yes 1 2 yes yes yes no
2. 生成黑白块可视化图表
使用Matplotlib将宽表转换为热力图,用黑色表示"yes"、白色表示"no":
import matplotlib.pyplot as plt # 将yes/no转换为数值(1=黑色,0=白色) plot_matrix = pivot_df.set_index('id').replace({'yes': 1, 'no': 0}).values # 绘制可视化 fig, ax = plt.subplots(figsize=(8, 3)) ax.imshow(plot_matrix, cmap='binary', aspect='auto') # 设置轴标签 ax.set_xticks(range(max_day)) ax.set_xticklabels([f'day{d}' for d in range(1, max_day+1)]) ax.set_yticks(range(len(pivot_df['id']))) ax.set_yticklabels(pivot_df['id']) ax.set_xlabel('天数') ax.set_ylabel('患者ID') ax.set_title('患者服药记录分布') plt.tight_layout() plt.show()
运行代码后会生成一个横轴为天数、纵轴为患者ID的图表,黑色块代表该患者当天有服药记录,白色块代表无记录。
内容的提问来源于stack exchange,提问作者Economist_Ayahuasca
相关产品推荐
相关产品推荐

