【发布时间】:2016-04-20 17:46:27
【问题描述】:
我正在使用 Django 1.9。我有一个 Django 表,它表示按月组织的特定度量值的值,并带有原始值和百分位数:
class MeasureValue(models.Model):
org = models.ForeignKey(Org, null=True, blank=True)
month = models.DateField()
calc_value = models.FloatField(null=True, blank=True)
percentile = models.FloatField(null=True, blank=True)
每月通常有 10,000 个左右。我的问题是我是否可以加快在模型上设置值的过程。
目前,我通过使用 Django 过滤器查询检索一个月的所有测量值,将其转换为 pandas 数据框,然后使用 scipy 的rankdata 设置排名和百分位数来计算百分位数。我这样做是因为 pandas 和 rankdata 高效,能够忽略空值,并且能够以我想要的方式处理重复值,所以我对这种方法很满意:
records = MeasureValue.objects.filter(month=month).values()
df = pd.DataFrame.from_records(records)
// use calc_value to set percentile on each row, using scipy's rankdata
但是,我需要从数据框中检索每个百分位值,并将其设置回模型实例。现在我通过迭代数据框的行并更新每个实例来做到这一点:
for i, row in df.iterrows():
mv = MeasureValue.objects.get(org=row.org, month=month)
if (row.percentile is None) or np.isnan(row.percentile):
row.percentile = None
mv.percentile = row.percentile
mv.save()
不出所料,这很慢。是否有任何有效的 Django 方法来加速它,通过编写单个数据库而不是数万?我有checked the documentation,但看不到一个。
【问题讨论】:
-
你看过
QuerySet.update()吗? -
@Two-BitAlchemist 我不确定它是否有帮助,因为我需要在每一行上设置不同的值...?
-
哦,我错过了这个要求,抱歉