1.筛选需求的报告id
基于REAC14Q4文件,筛选出需求报告的id,该文件格式如下,其中pt字段描述了患者在事件中所有的不良信息,注意此处一个报告id可以对应复数条信息。
primaryid$caseid$pt$drug_rec_act
初步统计约有4500种不良反应,总计60W条数据,其中绝大多数不良反应都是个例,由于当前网络暂时需求是预测常规副作用,这里取出现频率前100的症状作为预测目标,最后获取349252条数据,约占原数据集的55%,对应134954项报告,约占原报告数64%
删选原则:
取出现频率最高的pt反应前100位,筛选包含这些pt的报告号,将这些报告号对应的其他非高频症状统一变更为rare symptoms字段,然后去除重复项。最后保存id文件以及涉及的pt字段文件。(ps:去除重复项我是用excel实现的,这个只需要导入生成的basedata.xlsx然后选择去除重复项就行)
df = pd.read_excel(r'E:\xml数据处理\data\exceldata\REAC14Q4.xlsx')
pt_counts = df['pt'].value_counts()
# 获取前100pt
top_50_pt = pt_counts.head(100).index.tolist()
with open("pt_data.txt", 'w') as file:for id in top_50_pt:file.write(str(id) + '\n')
# 筛选出具有前50高频率的"pt"对应的"primaryid"
get_id = df.loc[df['pt'].isin(top_50_pt), 'primaryid'].unique()
# 将"primaryid"写入文件
with open("getid.txt", 'w') as file:for id in get_id:file.write(str(id) + '\n')# 将非前50高的"pt"数据更改为"Rare symptoms"
df.loc[~df['pt'].isin(top_50_pt), 'pt'] = 'Rare symptoms'
# 筛选出具有前50高频率的"pt"对应的所有条目
filtered_data = df[df['primaryid'].isin(get_id)]
# 将筛选后的数据输出到Excel文件
filtered_data.to_excel('basedata.xlsx', index=False)
2.基于筛选出的id初步筛选7个txt文件的
定义了一个函数来完成该功能,输入是getid.txt路径以及需要处理的文件路径
def clean_txt(path_getid:str,path_txt:str):with open(path_getid, 'r') as file:primaryid_list = [line.strip() for line in file]count = 0with open(path_txt, 'r') as file:first_line = file.readline().strip()filtered_data = pd.DataFrame(columns=first_line.split('$'))for line in file:count +=1if count%1000 == 0 : print(count)data = line.strip().split('$')data = [item.strip() for item in data]if data[0] in primaryid_list:filtered_data.loc[len(filtered_data)] = data[:25]filtered_data.to_excel('data_cleaned.xlsx', index=False, header=True)
不过越到后面处理越慢,实验了几次发现是DataFrame格式产生了不少的开销,这专用list存储数据最后再转换成DataFrame格式,然后加上分块处理,清洗速度有了质的飞跃,当然list转换成DataFrame也需要一些时间(大概1-2分钟,10W条数据),可以考虑使用numpy或许会更快些。
def clean_txt2(path_getid: str, path_txt: str):# 读取getid.txt文件,获取需要筛选的primaryid列表with open(path_getid, 'r') as file:primaryid_list = [line.strip() for line in file]count = 0chunksize = 20000with open(path_txt, 'r') as file:first_line = file.readline().strip()headers = first_line.split('$')filtered_data = []while True:chunk = file.readlines(chunksize)if not chunk:breakfor line in chunk:count += 1if count % 1000 == 0:print(count)data = line.strip().split('$')data = [item.strip() for item in data] # 移除换行符if data[0] in primaryid_list:filtered_data.append(data[:25])#list转DataFramefiltered_df = pd.DataFrame(filtered_data, columns=headers)filtered_df.to_excel('data_cleaned.xlsx', index=False, header=True)
明天继续
ps:
数据集见附件资源或下方网盘链接
链接:https://pan.baidu.com/s/1zJeFS48DvZydHk1SfuIQHg?pwd=6666
提取码:6666