Python 如何在Django的每一行对时间序列进行二次采样?

Python 如何在Django的每一行对时间序列进行二次采样?,python,sql,django,time,Python,Sql,Django,Time,目标 我试图通过对timeseries进行二次采样来减少发送到应用程序前端的数据。最初,我只需要每N行一次,因为我还想优化速度 布局 我使用的是Django 2.1.5,带有PostgreSQL后端。 时间序列表每1-15分钟填写一次来自各种传感器的测量数据 models.py class Measurement(models.Model): sensor = models.ForeignKey(Category,on_delete=models.PROTECT,related_nam

目标

我试图通过对timeseries进行二次采样来减少发送到应用程序前端的数据。最初,我只需要每N行一次,因为我还想优化速度

布局

我使用的是Django 2.1.5,带有PostgreSQL后端。 时间序列表每1-15分钟填写一次来自各种传感器的测量数据

models.py

class Measurement(models.Model):
    sensor = models.ForeignKey(Category,on_delete=models.PROTECT,related_name='measurements')
    datapoint = models.DecimalField(max_digits=8, decimal_places=4)
    time = models.DateTimeField(auto_now_add=True)
相关问题

一些资源在这里找到了一个接近的解决方案 和 这是基于用“F”注释的,如下所示:

views.py
Measurement.objects.annotate(idmod2=F('id') % 2).filter(idmod2=0)
这在一定程度上仍然有效,但是,由于测量是由~5-25个不同的传感器进行的,并且每~1-15分钟进行一次,因此id字段的跟踪并不一致。只需想象一个简化的示例:

+----+--------+------+-------+
| id | sensor | data | time  |
+----+--------+------+-------+
|  1 | A      |  432 | 10:00 |
|  2 | A      |  534 | 10:15 |
|  3 | B      | 2342 | 10:20 |
|  4 | B      |   87 | 10:25 |
|  5 | B      |    2 | 10:30 |
|  6 | B      |  982 | 10:45 |
|  7 | A      |   23 | 10:45 |
|  8 | B      |  400 | 10:50 |
+----+--------+------+-------+
如果现在尝试使用%2筛选传感器“A”,则列表仅显示

|  2 | A      |  534 | 10:15 |
而对于“B”

|  4 | B      |   87 | 10:25 |
|  6 | B      |  982 | 10:45 |
|  8 | B      |  400 | 10:50 |
窗口函数

我想过使用Django的函数

 Measurement.objects.annotate(place=Window(expression=RowNumber(),partition_by=[F('sensor')], order_by=F('time').desc()))

django.db.utils.NotSupportedError: Window is disallowed in the filter clause.
这一点在报告中也提到过

默认为False。SQL标准不允许引用窗口 WHERE子句和Django中的函数在 构建一个查询集来实现这一点

源于,它首先经过SELECT之前的WHERE,因此无法执行此查询

问题:

为减少数据集,对该时间序列进行次采样的合理快速方法是什么?理想情况下,我会通过时间和传感器上的过滤器

.filter(sensor=thisSensor).filter(time__range=(rangeStart, rangeEnd))

并显示一个子样本,比如200条记录。

一种方法是,由于数据不一致,您可以在发送之前对数据进行量化,也可以选择所需的点,然后通过回归在浏览器中预测js中的缺失点。

背景多一点;每个传感器的数据点已经在浏览器中由js可视化,因此不需要回归来预测缺失的数据点。只是想限制数据传输到浏览器,因为viz每分钟都在更新。如果是实时更新,请尝试查找。此外,您还可以构建自己的算法来压缩、存储和检索数据库。这正是大公司在其网站上检索股票图表的方式。如果您切换到NoSQL、cassandra等,它们内置了这样的功能。