
    i                         d dl Z d dlmZmZ d dlmZmZmZmZ d dlm	Z	 d dl
mZ ddlmZ ddlmZmZmZmZ  ee      Z G d	 d
      Zy)    N)datetime	timedelta)DictAnyListOptional)DataFetcher)
get_logger   )CONCENTRATION_WINDOW_DAYS)entropy_from_countshhi_from_countsweighted_recencymath_confidencec            
       6   e Zd ZdZddZdeeef   deeef   fdZdeeef   deeef   fdZ	dd	eeef   d
e
e   deeef   fdZd
edeeef   fdZd	eeef   deeef   fdZd	eeef   deeef   deeef   deeef   fdZdeeef   deeef   defdZy)StatisticalAnalyzerz
    Computes mathematical indicators of user behavior.
    Strictly deterministic and descriptive (Entropy, HHI, Variance, Ratios).
    Nc                 F    || _         |rt        |      | _        y d | _        y N)
db_sessionr	   fetcher)selfr   s     L/var/www/html/userprofiledev.eatanceapp.com/statistical_analysis/analyzer.py__init__zStatisticalAnalyzer.__init__   s    $2<{:.$    profile_jsonreturnc                 B   |j                  di       }|j                  di       }|j                  di       }|j                  di       }|j                  di       }|j                  d      }t        j                  d|        |j                  di       }|j                  d	      xs i }	| j                  ||      }
| j	                  |      |
| j                  |      | j                  |||      t        |j                  d
i       j                  d            | j                  ||
      |	j                  dd      |	j                  dd      |	j                  dd      |	j                  dd      |	j                  dd      dd}t        j                  d|d           |S )Nsignalsorderactivity
impressionmetadatauser_idz&Running Statistical Analysis for User cartadd_to_cart_statsvelocitylast_order_days_ago#add_to_cart_events_per_item_ordered        ,count_distinct_items_added_but_never_orderedr   1count_distinct_items_added_then_removed_from_cart"total_add_to_cart_events_in_windowtotal_items_ordered_in_window)r(   r*   r+   r,   r-   )temporalconcentration	stability
engagementrecency
confidencer$   z+Statistical Analysis Complete. Confidence: r3   )	getloggerinfo_analyze_concentration_analyze_temporal_rhythm_analyze_stability_analyze_engagementr   _calculate_math_confidence)r   r   r   order_signalsactivity_signalsimpression_signalsr"   r#   cart_signalsr%   r/   statss               r   analyzezStatisticalAnalyzer.analyze   s   ""9b1GR0";;z26$[[r:##J3,,y)<WIFG{{62.(,,-@AGR33M7K556FG*00?22=BRTfg'(9(9*b(I(M(MNc(de99,V7H7L7LMrtw7x@Q@U@U  WE  GH  AIEVEZEZ  \O  QR  FS6G6K6KLprs6t1B1F1FGfhi1j
 	A%BUAVWXr   r    c                 (   |j                  di       j                  di       }|j                  dd      }|dk(  s|sdddS t        |j                               }t        ||z  d      }t	        ||      }||d}t
        j                  d|        |S )Ntemporal_distributionhourtotal_eventsr   )dominant_hour_shareentropy   zTemporal Analysis: )r4   maxvaluesroundr   r5   r6   )r   r    	hour_distrE   max_hour_valdominant_shareentresults           r   r8   z,StatisticalAnalyzer._analyze_temporal_rhythm=   s    LL!8"=AA&"M	||NA61I+,;;9++-.|l:A>!)\:)7CH)&23r   ordersr#   c                    d}d}| j                   rF|rD| j                  |      }|d   }|dkD  rt        |d   |      }|d   }|dkD  rt        |d   |      }n|j                  di       j                  dg       }|j                  d	i       j                  dd      }|dkD  r$|r"|D 	ci c]  }	|	d   |	d
    }
}	t        |
|      }|j                  di       j                  dg       }|j                  di       j                  dd      }|dkD  r$|r"|D ci c]  }|d   |d
    }}t        ||      }||d}t        j                  d|        |S c c}	w c c}w )Nr)   total_ordersr   restaurant_countstotal_itemsitem_countsloyaltytop_restaurantsmetricsr   	inventory	top_itemstotal_items_ordered)restaurant_hhiitem_hhizConcentration Analysis (HHI): )r   _fetch_full_concentration_datar   r4   r5   r6   )r   rQ   r#   rest_hhir^   	full_datarS   rU   	top_restsrrest_countsr[   irV   rP   s                  r   r7   z*StatisticalAnalyzer._analyze_concentrationL   sz   <<G;;GDI$^4La*95H+I<X#M2KQ*9]+C[Q

9b1556GLI!::i488KLaI3<=9aqtQqTz9=*;E

;377RHI **["599:OQRSKQ93<=9aqtQqTz9=*;D$,(C4VH=> > >s   &EEc                 0   t        j                         }|t        t              z
  }|j	                  d      }|j	                  d      }| j
                  j                  |||      }|D cg c]%  }|j                  d      s|j                  d      ' }}| j
                  j                  |      }	t        j                  |D cg c]%  }|j                  d      s|j                  d      ' c}      }
t        j                  |	D cg c]I  }|j                  d      s|j                  d      s&|j                  d      xs |j                  d      K c}      }t        |
      t        |      t        |      t        |	      dS c c}w c c}w c c}w )N)daysz%Y-%m-%d %H:%M:%Sidrestaurant_name	menu_name	item_name)rT   rV   rS   rU   )r   nowr   r   strftimer   fetch_ordersr4   fetch_order_itemscollectionsCounterdictlen)r   r#   end_date
start_date	str_startstr_endrQ   o	order_idsitemsrd   re   rV   s                r   r_   z2StatisticalAnalyzer._fetch_full_concentration_datai   sX   <<>	/H II
''(;<	##$78**7IwG*0@&QAEE$KQUU4[&	@..y9!))V*pVWXW\W\]nWo1551B+CV*pq!))?Dsu!{I[_`_d_dep_qQUU;5155#55us

 "&k!2,Ku:	
 	
 A +qss$   +F	F	FF	'F1&Fc                     |j                  di       }|j                  d      |j                  d      d}t        j                  d|        |S )Nr&   avg_days_between_ordersstd_dev_days_between_orders)avg_order_gaporder_gap_std_devzStability Analysis: )r4   r5   r6   )r   rQ   r&   rP   s       r   r9   z&StatisticalAnalyzer._analyze_stability   sN    ::j"-%\\*CD!).K!L
 	*6(34r   impressionsc                 @   |j                  di       j                  dd      }|j                  dd      }|j                  dg       }t        d |D              }|dkD  rt        ||z  d      nd|dkD  rt        ||z  d      ndd	}t        j	                  d
|        |S )NrY   rS   r   total_impressionstop_searchesc              3   &   K   | ]	  }|d      yw)r   N ).0ss     r   	<genexpr>z:StatisticalAnalyzer._analyze_engagement.<locals>.<genexpr>   s     48aQqT8s      rH   )browse_to_order_ratiosearch_to_order_ratiozEngagement Analysis: )r4   sumrK   r5   r6   )	r   rQ   r    r   rS   
total_imprsearchestotal_searchesrP   s	            r   r:   z'StatisticalAnalyzer._analyze_engagement   s     zz)R044^QG __%8!<
<<34844 MWYZNU<*+Da%H`aP\_`P`U>L+H!%Lfg
 	+F845r   profiler/   c                 b    |d   d   d   j                  dd      }|dk(  ryt        ||d         S )Nr   r   rY   rS   r   r)   r]   )r4   r   )r   r   r/   rS   s       r   r;   z.StatisticalAnalyzer._calculate_math_confidence   sD     y)'29=AA.RST1|];K-LMMr   r   )__name__
__module____qualname____doc__r   r   strr   rA   r8   r   intr7   r_   r9   r:   floatr;   r   r   r   r   r      sA   
GDcN tCH~ Bc3h DcN T#s(^ hsm _cdgildl_m :
c 
d38n 
,c3h DcN S#X sCx. #s(^	
 
c3h$NCH~N6:38nN	Nr   r   )rp   r   r   typingr   r   r   r   data_fetcherr	   core.logger_configr
   	constantsr   helpersr   r   r   r   r   r5   r   r   r   r   <module>r      s>     ( , , $ ) 0  
H	NN NNr   