Python 如何在Django的每一行对时间序列进行二次采样?
目标 我试图通过对timeseries进行二次采样来减少发送到应用程序前端的数据。最初,我只需要每N行一次,因为我还想优化速度 布局 我使用的是Django 2.1.5,带有PostgreSQL后端。 时间序列表每1-15分钟填写一次来自各种传感器的测量数据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
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等,它们内置了这样的功能。