Агрегирование данных

Я использую django и django rest framework, пытаюсь сохранить ряд данных с цифрового устройства, т.е. датчика, принадлежащего клиенту, в базе данных PostgreSQL. База данных incoming data должна иметь следующую схему:

i. timestamp: RFC3339 timestamp
ii. reading: float
iii. device_id: UUIDv4
iv. customer_id: UUIDv4

Я создал модель устройства следующим образом:

from django.db import models
from django.contrib.postgres.fields import ArrayField
from customer.models import Customer
import uuid


class Device(models.Model):
    timestamp = models.DateTimeField(auto_now_add=True)
    reading = models.FloatField()
    device_id = models.UUIDField(primary_key=True)
    customer_id = models.ForeignKey(Customer, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.device_id)

и модель клиента, подобная этой:

from django.db import models


class Customer(models.Model):
    timestamp = models.DateTimeField(auto_now_add=True)
    customer_id = models.UUIDField(primary_key=True)

    def __str__(self):
        return str(self.customer_id)

CustomerSerializer выглядит следующим образом:

from rest_framework import serializers
from .models import Customer
from django.db.models import Avg, Max, Min, Count, Sum


class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = '__all__'

DeviceSerializer выглядит следующим образом:

from rest_framework import serializers
from .models import Customer


class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = '__all__'

Файл views.py для Customer выглядит следующим образом:

from rest_framework import generics
from .serializers import DeviceSerializer
from .models import Device


# Create a new device
class CreateDevice(generics.CreateAPIView):
    serializer_class = DeviceSerializer


# List all devices
class ListDevices(generics.ListAPIView):
    queryset = Device.objects.all()
    serializer_class = DeviceSerializer

А views.py для устройства выглядит следующим образом:

from rest_framework import generics
from .serializers import DeviceSerializer
from .models import Device


# Create a new device
class CreateDevice(generics.CreateAPIView):
    serializer_class = DeviceSerializer


# List all devices
class ListDevices(generics.ListAPIView):
    queryset = Device.objects.all()
    serializer_class = DeviceSerializer

Когда я взаимодействую с API через браузер, я могу делать все, что я создал, но я прошу помощи в следующем:

  1. Retrieving data from the API, in an aggregated form over time, where the “reading” data is aggregated by averaging (mean) it. The data should always be grouped by “device”, so that readings from one device are averaged only with other readings from that same device.

API должен иметь способы конфигурирования:

  • Время начала (самое старое время, включительно) (необязательно, по умолчанию не имеет нижнего предела, если отсутствует)
  • Время окончания (самое новое время, включительно) (необязательно, по умолчанию не имеет верхнего предела, если отсутствует)
  • Размер агрегации, в минутах (необязательно, по умолчанию 5 минут, если отсутствует)

Чтобы данные можно было извлечь с помощью:

  1. Device
  2. Customer(for all devices related to that customer)

output data должен иметь следующую форму:

Exported data: 
{
    "data":[ 
       {
           "device_id": "UUIDv4 string", 
           "customer_id": "UUIDv4 string", 
           "readings": [
             {
                "timestamp": "RFC3339 Datetime string", 
                "reading": float
             },
          ...
         ] 
       },
    ...
    ] 
  }
Вернуться на верх