我是一名django初学者,试图建立一个用于数据分析的django项目。来自某种类型实验的数据由两个模型“Dataset”和“GeneEntry”表示,其中每个数据集代表一个实验,每个GeneEntry是来自数据集的一行。每个数据集包含大约20000个条目。具有相同名称的基因可以在多个数据集中具有相同的基因符号。
class Dataset(models.Model):
dataset_name = models.CharField(max_length=200)
def __str__(self):
return self.dataset_name
class GeneEntry(models.Model):
dataset = models.ForeignKey(Dataset, on_delete=models.CASCADE)
gene_symbol = models.CharField(max_length=200)
Pval = models.FloatField(default=0)
x = models.IntegerField(default=0)
y = models.IntegerField(default=0)
def __str__(self):
return self.gene_symbol
在我的django项目中,用户可以选择其中一个数据集并绘制x与y的关系图。数据点的颜色应根据基因特定比率r = a / b的颜色标度进行分配。 b是该确切的gene_symbol出现在数据库中的次数(例如,10个实验中有8个具有该基因 - > a = 8),a是这些条目中有多少个具有Pval <1的数字。 0.05。
目前,我这样做是通过循环一个带有基因名称的列表并为所有这些名称调用以下方法:
def outlier(self, gene):
a = GeneEntry.objects.filter(gene_symbol__exact=gene)
b = len(q.filter(Pval__lt=0.05))/len(q)
return r
通过df.apply调用循环,并将比率写入pandas数据框的列,该数据框保存用于绘图的数据集。
df['ratio'] = df.apply(lambda x: self.outlier(x['gene_symbol'])
if x['Pval'] < 0.05
else 0.0, axis=1)
编辑:数据框最初看起来像这样(在添加比率列之前):
id dataset_id gene_symbol x y Pval
0 1 1 AAAA 90 1.041421 0.913037
1 2 1 AAAB 61 1.038197 0.894884
2 3 1 ABB 27 0.722224 0.550961
3 4 1 ABC 3 0.857641 0.534781
4 5 1 ACC 26 0.223732 0.007097
根据用户在开头选择的数据集,通过pandas read_sql_query填充数据框。
我已经通过仅对具有Pval <1的那些进行着色来限制要查询的基因的数量。在所选择的实验中为0.05,但这仍然导致每个绘图数百个查询达到数百秒的加载时间。
我的想法是使用额外的模型字段来获取当前比率。这样可以在绘图时避免大量查询,但每次将新数据集加载到数据库时,都必须更新所有条目中的比率字段。
这是解决这个问题的合理方法还是有更好的方法?我将如何实现此属性,特别是因为在加载新数据集时需要更新它?