You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重塑患者用药日期数据并生成基于观测天数的可视化图表

数据重塑与可视化实现方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:33:34