ó
    Ú€£gE  ã                   óp   • S r SSKrSSKrSSKJr  SSKJrJrJr  \R                  " \	5      r
 " S S5      rg)u£   
Calculador de Integraciones - MVP v1.0

Implementa los cÃ¡lculos estadÃ­sticos para perÃ­odos de integraciÃ³n:
- Promedio
- MÃ¡ximo
- MÃ­nimo
- DesvÃ­o estÃ¡ndar
é    N)Údatetime)ÚListÚDictÚAnyc                   óÈ   • \ rS rSrS\\\\4      S\\\4   4S jr	SS\S\
S\4S jjrS\\\\4      S\4S jrS	\S
\S\S\4S jrS\\\\4      S\\\\4      4S jrSrg)ÚIntegrationCalculatoré   ÚmeasurementsÚreturnc                 ó®  ^
• U(       d  gU Vs/ sH  o"S   PM	     nn[        U5      nUS:X  a  g[        U5      nXT-  m
[        U5      n[        U5      nUS:”  a1  [        U
4S jU 5       5      n[        R
                  " X„S-
  -  5      n	OSn	U R                  T
5      U R                  U5      U R                  U5      U R                  U	S5      US.$ s  snf )	uÏ   
Calcula estadÃ­sticas para un grupo de mediciones.

Args:
    measurements: Lista de mediciones con al menos temp y fecha
    
Returns:
    dict: EstadÃ­sticas calculadas o None si no hay suficientes datos
NÚtempr   é   c              3   ó0   >#   • U H  oT-
  S -  v •  M     g7f)é   N© )Ú.0ÚxÚpromedios     €ÚD/var/www/blue/EV-Temp_rev04/src/processors/statistics/integration.pyÚ	<genexpr>Ú=IntegrationCalculator.calculate_statistics.<locals>.<genexpr>/   s   øé € Ð F¹g¸ h¡,°1Ö!4ºgùs   ƒç        r   )r   ÚmaximoÚminimoÚdesvioÚcantidad_mediciones)ÚlenÚsumÚmaxÚminÚmathÚsqrtÚ_round)Úselfr
   ÚmÚvaloresÚnÚ	valor_sumr   r   Úsuma_cuadradosr   r   s             @r   Úcalculate_statisticsÚ*IntegrationCalculator.calculate_statistics   sÓ   ø€ ö Øñ '3Ó3¡l �V”9¡lˆÐ3Ü�‹Lˆà�‹6Øô ˜“Lˆ	Ø‘=ˆÜ�W“ˆÜ�W“ˆð ˆq‹5Ü Ô F¹gÓ FÓFˆNÜ—Y’Y˜~°Q±Ñ7Ó8‰FàˆFð Ÿ™ HÓ-Ø—k‘k &Ó)Ø—k‘k &Ó)Ø—k‘k &¨!Ó,Ø#$ñ
ð 	
ùò' 4s   ŽCÚvalueÚdecimalsc           	      ó°   •  [        [        U5      U5      $ ! [        [        4 a.  n[        R                  SU S[        U5       35         SnAgSnAff = f)u¶   
Redondea un valor al nÃºmero especificado de decimales

Args:
    value: Valor a redondear
    decimals: Cantidad de decimales (default 1)
    
Returns:
    float: Valor redondeado
zError redondeando valor z: Nr   )ÚroundÚfloatÚ	TypeErrorÚ
ValueErrorÚloggerÚerrorÚstr)r$   r,   r-   Úes       r   r#   ÚIntegrationCalculator._round<   sN   € ð	Üœ˜u› xÓ0Ð0øÜœ:Ð&ó 	Ü�L‰LÐ3°E°7¸"¼SÀ»V¸HÐEÔFÜûð	ús   ‚ —A§$AÁAc                 ó  • U(       a  [        U5      S:  a  g[        US S9nSnSnUS   nUSS  H4  nUS   US   -
  R                  5       nUS::  a  M$  XES	   U-  -  nX7-  nUnM6     US:”  a  U R                  XC-  5      $ g)
zË
Calcula el promedio ponderado por tiempo entre mediciones

Args:
    measurements: Lista de mediciones ordenadas por fecha
    
Returns:
    float: Promedio ponderado o None si no hay suficientes datos
r   Nc                 ó   • U S   $ )NÚfechar   )r   s    r   Ú<lambda>Ú8IntegrationCalculator.weighted_average.<locals>.<lambda>[   s   € ÀÀ7Âó    )Úkeyr   r   r   r:   r   )r   ÚsortedÚtotal_secondsr#   )r$   r
   Úsorted_measurementsÚtotal_weightÚweighted_sumÚprev_measurementÚmeasurementÚ	time_diffs           r   Úweighted_averageÚ&IntegrationCalculator.weighted_averageM   sµ   € ö œs <Ó0°1Ó4Øô % \Ñ7KÑLÐàˆØˆØ.¨qÑ1Ðà.¨q¨rÓ2ˆKà$ WÑ-Ð0@ÀÑ0IÑI×XÑXÓZˆIØ˜A‹~Ùð ¨VÑ4°yÑ@Ñ@ˆLØÑ%ˆLØ*Òñ 3ð ˜!ÓØ—;‘;˜|Ñ:Ó;Ð;àr=   Úmeasurement_dateÚperiod_startÚ
period_endc                 ó   • X:  d  X:¼  a  gg)u	  
Calcula el porcentaje de una mediciÃ³n que pertenece a un perÃ­odo

Args:
    measurement_date: Fecha de la mediciÃ³n
    period_start: Inicio del perÃ­odo
    period_end: Fin del perÃ­odo
    
Returns:
    float: Porcentaje de pertenencia al perÃ­odo (0.0 - 1.0)
r   g      ð?r   )r$   rI   rJ   rK   s       r   Úcalculate_period_overlapÚ.IntegrationCalculator.calculate_period_overlapq   s   € ð Ó*Ð.>Ó.LØàr=   c                 óú   ^• / nU HZ  m[        U4S jS 5       5      (       d  M   [        TS   5      n[        TS   [        5      (       d  MH   UR                  T5        M\     U$ ! [        [
        4 a     Ms  f = f)z€
Filtra y valida mediciones

Args:
    measurements: Lista de mediciones a validar
    
Returns:
    List: Mediciones validadas
c              3   ó*   >#   • U H	  oT;   v •  M     g 7f)Nr   )r   ÚkrE   s     €r   r   Ú>IntegrationCalculator.validate_measurements.<locals>.<genexpr>�   s   øé € ÐCÑ1B¨A˜KÖ'Ò1Bùs   ƒ)r   r:   r   r:   )Úallr0   Ú
isinstancer   r1   r2   Úappend)r$   r
   Úvalid_measurementsr   rE   s       @r   Úvalidate_measurementsÚ+IntegrationCalculator.validate_measurements‚   sŠ   ø€ ð  Ðã'ˆKäÔCÑ1BÓC×CÑCÙðÜ˜[¨Ñ0Ó1�Ü! +¨gÑ"6¼×AÑAÙð Bð ×%Ñ% kÖ2ñ! (ð$ "Ð!øô œzÐ*ó Úðús   ¦&A&Á&A:Á9A:r   N)r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   r5   r   r0   r*   Úintr#   rG   r   rM   rW   Ú__static_attributes__r   r=   r   r   r      s¾   † ð'
°°d¸3À¸8±nÑ1Eð '
È$ÈsÐTYÈzÑJZô '
ñR˜Eð ¨Sð ¸õ ð""¨T°$°s¸C°x±.Ñ-Að "Àeô "ðH¸ð ÐQYð Ðgoð Ðtyô ð""°$°t¸CÀ¸H±~Ñ2Fð "È4ÐPTÐUXÐZ]ÐU]ÑP^ÑK_÷ "r=   r   )Ú__doc__r!   Úloggingr   Útypingr   r   r   Ú	getLoggerrY   r3   r   r   r=   r   Ú<module>rc      s7   ðñó Û Ý ß "Ñ "à	×	Ò	˜8Ó	$€÷N"ò N"r=   