我有一份病人身份证和药物名的清单,还有一份病人证号和疾病名的清单。我想为每种疾病找到最有指导意义的药物。在
为了找到这一点,我想做一个Fisher精确测试,以得到每个疾病/药物对的p值。循环运行了10个多小时。有没有一种方法可以使循环更有效,或者更好地解决这个关联问题?在
我的循环:
import numpy as np
import pandas as pd
from scipy.stats import fisher_exact
most_indicative_medication = {}
rx_list = list(meps_meds.rxName.unique())
disease_list = list(meps_base_data.columns.values)[8:]
for i in disease_list:
print i
rx_dict = {}
for j in rx_list:
subset = base[['id', i, 'rxName']].drop_duplicates()
subset[j] = subset['rxName'] == j
subset = subset.loc[subset[i].isin(['Yes', 'No'])]
subset = subset[[i, j]]
tab = pd.crosstab(subset[i], subset[j])
if len(tab.columns) == 2:
rx_dict[j] = fisher_exact(tab)[1]
else:
rx_dict[j] = np.nan
most_indicative_medication[i] = min(rx_dict, key=rx_dict.get)
更快的运算速度是好的,但是更好的算法通常会胜过它;-)
补充一点
请注意,
rx_list
有很多重复项(例如,如果包含拼写错误,则为阿莫西林输入52个条目)。在那么
^{pr2}$现在在我的机器上运行大约18分钟,您可以将其与EM28的答案结合起来,将其速度提高4倍或更多。在
你需要多处理/多线程,我已经添加了代码
注:http://chriskiehl.com/article/parallelism-in-one-line/
相关问题 更多 >
编程相关推荐