
    !+i              	          d Z ddlZddlmZmZmZ ddlmZmZ ddlm	Z	 ddl
mZ  ej                  e      Zdd	d
d	dddZi dddddd
ddddddddddddddddddddd d!d"dd#dd$d%d&dd'd(d)d*dd+Z G d, d-      Zy).zo
Hyper Forecast - Baseline Calculator Module
Calculates weighted baseline predictions using temporal hierarchy
    N)datetime	timedeltadate)DictOptional)Session   )DataCollectorg      ?g?g333333?g?)same_hour_yesterdaysame_hour_week_agosame_hour_2weeks_ago
average_7daverage_30dsame_hour_month_agog?         g{Gz?   gQ?         gffffff?	   gffffff?
   gffffff?   g      ?   g?   g333333?         g?      ?g?g?gffffff?g333333?)                     c                   |    e Zd ZdZdefdZddedeee	f   fdZ
	 dded	ee   defd
Z	 dd	ee   defdZde	fdZy)BaselineCalculatorzN
    Calculates baseline sales predictions using weighted historical data
    dbc                 N    || _         t        |      | _        d | _        d | _        y N)r*   r
   data_collector_hourly_curve_cache_dow_pattern_cache)selfr*   s     L/var/www/hypershopcomercio.com.br/hyper-ai/app/services/forecast/baseline.py__init__zBaselineCalculator.__init__)   s&    +B/#' "&    force_refreshreturnc                    | j                   r|s| j                   S 	 | j                  j                  d      }t        d |j	                         D              }|dk(  rt
        j                  d       t        S |dz  }i }t        d      D ]3  }||v r|dkD  r||   d   |z  ||<   t        j                  |d      ||<   5 || _         |S # t        $ r(}t
        j                  d	|        t        cY d
}~S d
}~ww xY w)z
        Get calibrated hourly sales curve based on actual data
        Falls back to default curve if not enough data
           	days_backc              3   &   K   | ]	  }|d      ywavg_revenueN .0ps     r1   	<genexpr>z6BaselineCalculator.get_hourly_curve.<locals>.<genexpr>;   s     KQ- 0K   r   z'No historical data, using default curve   r<   r    z Error calculating hourly curve: N)r.   r-   get_hourly_patternsumvaluesloggerwarningDEFAULT_HOURLY_CURVErangeget	Exceptionerror)r0   r4   patterntotal_revenue
avg_hourlycurvehoures           r1   get_hourly_curvez#BaselineCalculator.get_hourly_curve/   s   
 ##M+++	())<<r<JG  K'..:JKKM!HI++&+J Eb	 F7?zA~")$-">"KE$K"6":":4"EE$K	F (-D$L 	(LL;A3?@''	(s%   AC	 8AC	 		C:C5/C:5C:Ntarget_hourtarget_datec                    |"t        j                         j                         }i i }|t        d      z
  }| j                  j                  ||      }|d   dkD  r|d   d<   t        d   |d<   |t        d      z
  }| j                  j                  ||      }|d   dkD  r|d   d<   t        d   |d<   |t        d      z
  }| j                  j                  ||      }	|	d   dkD  r|	d   d	<   t        d	   |d	<   |t        d
      z
  }
| j                  j                  |
|      }|d   dkD  r|d   d<   t        d   |d<   | j                  j                  d      }||v r"||   d   dkD  r||   d   d<   t        d   |d<   | j                  j                  d
      }||v r"||   d   dkD  r||   d   d<   t        d   |d<   s?| j                         }| j                         }||j                  |d      z  dz  }|di ddS t        |j                               }|j                         D ci c]  \  }}|||z   c}}t        fdD              }t        dt              dz  dz        }||ddS c c}}w )z
        Calculate weighted baseline for a specific hour
        Uses temporal hierarchy with different weights for different historical periods
        r	   )daysrevenuer   r   r   r   r   r   r7   r   r8   r<   r   r   r    rC   g333333?fallback_curve)baseline
confidencedata_pointsmethodc              3   4   K   | ]  }|   |   z    y wr,   r=   )r?   keyr]   normalized_weightss     r1   rA   z8BaselineCalculator.calculate_baseline.<locals>.<genexpr>   s)      
 1#66
s   r   g?weighted_average)r[   r\   r]   weightsr^   )r   nowr   r   r-   get_hourly_salesTEMPORAL_WEIGHTSrD   rT   _estimate_daily_averagerK   rE   rF   itemsminlen)r0   rU   rV   weights_used	yesterday	yday_dataweek_ago	week_datatwo_weeks_agotw_data	month_ago
month_data
pattern_7dpattern_30drQ   estimated_dailyr[   total_weightkvr\   r]   ra   s                        @@r1   calculate_baselinez%BaselineCalculator.calculate_baselineQ   s    ",,.--/K   )"33	''88KP	Y!#1:91EK-.2BCX2YL./ !22''88;O	Y!#09)0DK,-1ABV1WL-. $iR&88%%66}kR9!29)2DK./3CDZ3[L/0  )"44	((99)[Q
i 1$1;I1FK-.2BCX2YL./ ((;;a;H
*$K)@)ORS)S(2;(?(NK%)9,)GL& ))<<r<J+%+k*B=*QTU*U)4[)A-)PK&*:=*IL' ))+E"::<O&;)DDrIH %!!*	  <..01>J>P>P>RSdaa\!11S  
"
 
 c+.2S89
 !$&)(
 	
 Ts   8Jc                     |"t        j                         j                         }g }d}d}t        d      D ]?  }| j	                  ||      }|j                  ||d   |d   d       ||d   z  }||d   z  }A |j                         ||dz  |dS )zB
        Calculate baseline for entire day (all 24 hours)
        r   rC   r[   r\   )rR   r[   r\   )r   total_baselineavg_confidencehourly)r   rd   r   rJ   rz   append	isoformat)r0   rV   hourly_baselinesr|   r}   rR   results          r1   calculate_day_baselinez)BaselineCalculator.calculate_day_baseline   s     ",,.--/K"I 	3D,,T;?F##":.$\2% 
 fZ00Nf\22N	3  ))+,,r1&	
 	
r3   c                     	 | j                   j                  d      }t        d |j                         D              }|S # t        $ r Y yw xY w)zB
        Estimate average daily revenue from last 30 days
        r7   r8   c              3   &   K   | ]	  }|d      ywr;   r=   r>   s     r1   rA   z=BaselineCalculator._estimate_daily_average.<locals>.<genexpr>   s     "N1]#3"NrB   g     @@)r-   rD   rE   rF   rL   )r0   rN   total_hourly_avgs      r1   rg   z*BaselineCalculator._estimate_daily_average   sP    	))<<r<JG""NW^^=M"NN## 		s   =A   	AA)Fr,   )__name__
__module____qualname____doc__r   r2   boolr   intfloatrT   r   r   rz   r   rg   r=   r3   r1   r)   r)   $   s    '7 ' (d  (tCJ?O  (J '+Y
Y
 d^Y
 
	Y
z '+
d^
 

>	 	r3   r)   )r   loggingr   r   r   typingr   r   sqlalchemy.ormr   r-   r
   	getLoggerr   rG   rf   rI   r)   r=   r3   r1   <module>r      s3    . . ! " )			8	$
    t $t $ t  $ !#D 	 $	 D	 #%d	
 
 Dd$Dd p pr3   