【发布时间】:2017-08-21 00:38:38
【问题描述】:
我有一个患者 ID 和药物名称列表以及一个患者 ID 和疾病名称列表。我想为每种疾病找到最具指示性的药物。
为了找到这一点,我想做 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)
【问题讨论】:
-
可以发布一小部分数据吗? stackoverflow.com/questions/20109391/…
-
使用
pandas和numpy这一事实比使用循环更重要。我相应地更改了您的标签。 -
每次迭代都打印到控制台会比你想象的慢得多。如果您绝对必须看到输出,那么我建议您写入文件。 stackoverflow.com/questions/13288185/…
-
您是否对您的迭代次数进行了“后台”计算? (
len(diseases_list) * len(rx_list))。你用过探查器吗? -
从上下文看来数据可能是 MEPS 处方药文件,meps.ahrq.gov/mepsweb/data_stats/…
标签: python pandas loops statistics associations