es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

(Django agregado) cómo obtener el tiempo promedio invertido y las fechas correspondientes

mi modelo


class UserRetention(models.Model): user = models.ForeignKey('users.User', on<em>delete=models.PROTECT,null=True, blank=True,related</em>name='user<em>retention') in</em>date = models.DateTimeField(auto<em>now</em>add=True) out<em>date = models.DateTimeField(blank=True, null=True) @property def duration(self): try: return self.out</em>date - self.in_date except: pass <pre><code>class Meta: get_latest_by = 'in_date' </code></pre>

mi objetivo

  1. primero necesito agrupar los datos por semana.
  2. Necesito hacer algo como esto UserRetention.objects.all().aggregate(..... para obtener un objeto diccionario con la duración promedio semanal calculada en horas?

    [
    {
    "semana": 1,
    "duración_semanal_promedio": "3",
    },
    {
    "semana": 2,
    "duración_semanal_promedio": "10",
    },
    {
    "semana": 3,
    "duración_semanal_promedio": "8",
    },
    {
    "semana": 4,
    "duración_semanal_promedio": "15",
    }
    ]
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr tu objetivo, puedes utilizar las anotaciones y agregaciones de Django junto con la función TruncWeek para agrupar los datos por semana. Aquí tienes una posible solución:

    from django.db.models.functions import TruncWeek
    from django.db.models import Avg
    
    weekly_data = UserRetention.objects.annotate(
        week=TruncWeek('in_date')
    ).values('week').annotate(
        avg_weekly_duration=Avg('duration')
    ).values('week', 'avg_weekly_duration')
    

    La función TruncWeek trunca el campo in_date a la semana más cercana y lo agrega como un nuevo campo llamado week. La función Avg calcula la duración promedio de los datos de cada semana y lo almacena como un nuevo campo llamado avg_weekly_duration.

    El resultado weekly_data será una lista de diccionarios, donde cada diccionario contiene los valores week y avg_weekly_duration para esa semana. Puedes serializar estos datos en formato JSON y devolverlos como respuesta a tu API.

    Ten en cuenta que tendrás que convertir el campo duration (que es un delta de tiempo) a un número de horas antes de calcular el promedio. Puedes hacer esto utilizando el método total_seconds() del objeto timedelta y alguna división.

    from datetime import timedelta
    
    # dentro de la propiedad `duration`
    return (self.out_date - self.in_date) / timedelta(hours=1)
    

    Esto convertirá la duración a un número decimal de horas.

Comments are closed.