
    Ch@                     |    d Z ddlZddlZddlmZmZ ddlmZm	Z	m
Z
mZmZ ddlmZ ddlmZmZmZmZ  G d d	      Zy)
z
Data Manager for the MAB Recommendation System.
Manages data needed by recommender, client, and helps setup users in the engine.
    N)datetime	timedelta)ListDictAnyOptionalTuple   )DataController)
FeedbackDBProductCatalogUserDemographicsSearchHistoryc            	          e Zd ZdZddefdZddededefdZdedee	ee
f      fd	Zdedefd
Zdede	ee
f   fdZdede	ee
f   fdZdedee	ee
f      fdZddedede	ee
f   fdZd dededej$                  fdZdede	ee
f   fdZdee	ee
f      de	ee
f   fdZde	ee
f   defdZdee	ee
f      defdZdededee	ee
f      fdZd!dedede
fdZde	ee
f   fdZy)"DataManagerzEManages data operations and user setup for the recommendation engine.db_pathc                 @    t        |      | _        i | _        i | _        y N)r   data_controlleruser_sessionsuser_states)selfr   s     \/Users/divyeshpatel/Desktop/sahana/Recommender/recommender_rl/recommender/db/data_manager.py__init__zDataManager.__init__   s    -g6    Nuser_id
session_idreturnc                    |+t        t        j                         j                               }|| j                  vrg | j                  |<   |t        j                         g dd}| j                  |   j                  |       |S )z4Create a new user session for tracking interactions.active)r   
start_timeinteractionscurrent_state)intr   now	timestampr   append)r   r   r   session_datas       r   create_user_sessionzDataManager.create_user_session   s{    X\\^5578J$,,,*,Dw' %",,.%	
 	7#**<8r   c                     || j                   v r8| j                   |   r)t        | j                   |         D ]  }|d   dk(  s|c S  y)z,Get the currently active session for a user.r#   r    N)r   reversed)r   r   sessions      r   get_active_sessionzDataManager.get_active_session*   sO    d(((T-?-?-H#D$6$6w$?@?+x7"N A r   c                     || j                   v r;| j                   |   D ](  }|d   |k(  sd|d<   t        j                         |d<    y yy)zEnd a user session.r   endedr#   end_timeN)r   r   r%   )r   r   r   r,   s       r   end_user_sessionzDataManager.end_user_session2   sT    d(((--g6<(J6/6GO,*2,,.GJ'	 7 )r   c                    	 | j                   j                  |      }|s| j                  |      }| j                   j                  |      }| j                   j	                  |d      }||||| j                  |      | j                  |      |j                  d      |j                  d      | j                  |      | j                  |      d
}|| j                  |<   |S # t        $ r}t        d|        i cY d}~S d}~ww xY w)z.Setup user state in the recommendation engine.2   limituser_cluster_idlast_active)
r   demographicsbehavior_summaryrecent_interactionscurrent_sessionpreferences
cluster_idr7   engagement_levelexploration_scoreu%   ❌ Error setting up user in engine: N)r   get_user_create_default_userget_user_behavior_summaryget_user_feedbackr-   _extract_user_preferencesget_calculate_engagement_level_calculate_exploration_scorer   	Exceptionprint)r   r   	user_infor9   recent_feedback
user_statees          r   setup_user_in_enginez DataManager.setup_user_in_engine=   s    	,,55g>I 55g>	  $33MMgV #22DDWTVDWO # )$4'6#'#:#:7#C#==oN'mm,=>(}}];$($D$DEU$V%)%F%F%WJ )3DW% 	9!=>I	s   CC   	D)C>8D>Dnew_interactionc                    || j                   v r| j                   |   }|d   j                  d|       t        |d         dkD  r|d   dd |d<   | j                  |d         |d<   | j                  j                  |      }| j                  |      |d<   | j                  |d         |d<   t        j                         |d<   yy)	z'Update user state with new interaction.r:   r   d   Nr<   r>   r?   r7   )
r   insertlenrD   r   rB   rF   rG   r   r%   )r   r   rO   rL   r9   s        r   update_user_statezDataManager.update_user_statea   s    d&&&))'2J ,-44QH :345;4>?T4UVZWZ4[
01 )-(F(FzRgGh(iJ}%  $33MMgV-1-M-MN^-_J)*.2.O.OPZ[pPq.rJ*+ )1J}%' 'r   c                 ^    || j                   v r| j                   |   S | j                  |      S )z)Get current user state for the RL engine.)r   rN   )r   r   s     r   get_user_statezDataManager.get_user_statex   s4    d&&&##G,, ,,W55r   
n_productsc                 D   	 | j                  |      }|si S | j                  ||      }||j                  d      |j                  di       |j                  dd      |j                  dd      |j                  di       |j                  dg       d	d
 |t        j                         j
                  t        j                         j                         t        j                         j                         dk\  dd	}|S # t        $ r}t        d|        i cY d	}~S d	}~ww xY w)z3Get context data needed for making recommendations.r=   r<   r>   lowr?         ?r;   r:   N
      )hourday_of_week
is_weekend)	r   user_clusterr<   r>   r?   session_contextr:   available_productstime_contextu*   ❌ Error getting recommendation context: )	rV    _get_available_products_for_userrE   r   r%   r]   weekdayrH   rI   )r   r   rW   rL   rb   contextrM   s          r   get_recommendation_contextz&DataManager.get_recommendation_context   s   	,,W5J	 "&!F!FwPZ![ # *| <)~~mR@$.NN3Eu$M%/^^4G%M#->>2CR#H'1~~6KR'PQTRT'U&8$LLN//#+<<>#9#9#;"*,,."8"8":a"?!G  N 	>qcBCI	s#   C< C$C< <	DDDDr5   c                 D   	 | j                   j                  ||      }|st        j                         S t        j                  |      }t        j                  |d         |d<   |d   j
                  j                  |d<   |d   j
                  j                  |d<   |d   j                  ddg      |d<   | j                  |      }|r)|j                  d	      |d
<   |j                  dd      |d<   t        j                  |d   dg d      |d<   |j                  d      }t        t        |            |d<   |d   j                         j
                  j!                         |d<   |S # t"        $ r,}t%        d|        t        j                         cY d}~S d}~ww xY w)z.Get training data formatted for RL algorithms.r4   r,   r&   r]   r^   r\      r_   r=   r`   r>   rY   price)very_lowrY   mediumhigh	very_high)binslabelsprice_rangeinteraction_sequencetime_since_lastu(   ❌ Error getting training data for RL: N)r   rC   pd	DataFrameto_datetimedtr]   	dayofweekisinrV   rE   cutsort_valuesrangerS   difftotal_secondsrH   rI   )r   r   r5   feedback_datadfrL   rM   s          r   get_training_data_for_rlz$DataManager.get_training_data_for_rl   s   "	" 00BB7RWBXM ||~% m,B !nnR	];B{OK++00BvJ "; 2 2 < <B}!-055q!f=B| ,,W5J%/^^L%A>")38JE)R%& !#r'{Cu vB} ,B).s2wB%&$&{O$8$8$:$=$=$K$K$MB !I 	"<QC@A<<>!	"s#   2E* D4E* *	F3!FFFc                     t        |d| ddd      }| j                  j                  |      }|dkD  r| j                  j                  |      S i S )zCreate a default user profile.User_N)r   namegenderager6   r   )r   r   add_userr@   )r   r   default_users      r   rA   z DataManager._create_default_user   s]    '	" 
 &&//=Q;''0099	r   r"   c                    |si S i i t        d      dddi i d}g }|D ]"  }|j                  d      }|r|d   j                  |d      dz   |d   |<   |j                  d      }|r|d	   j                  |d      dz   |d	   |<   |j                  d
      }|rF|dkD  rA|j                  |       t        |d   d   |      |d   d<   t	        |d   d   |      |d   d<   |j                  d      }|r|d   j                  |d      dz   |d   |<   |j                  d      }	|	s|d   j                  |	d      dz   |d   |	<   % |rt        |      t        |      z  |d   d<   t        t        |d   j                         d d      dd       |d<   t        t        |d	   j                         d d      dd       |d	<   |S )z2Extract user preferences from interaction history.infr   )minmaxavg)favorite_categoriesfavorite_brandsprice_preferenceevent_preferencesproduct_affinitycategoryr   r
   
brand_namer   rj   r   r   r   
event_typer   
product_idr   r   c                     | d   S Nr
    xs    r   <lambda>z7DataManager._extract_user_preferences.<locals>.<lambda>      !A$r   TkeyreverseNr\   c                     | d   S r   r   r   s    r   r   z7DataManager._extract_user_preferences.<locals>.<lambda>  r   r   )
floatrE   r'   r   r   sumrS   dictsorteditems)
r   r"   r<   pricesinteractionr   brandrj   r   r   s
             r   rD   z%DataManager._extract_user_preferences   sC   I $&!(-eQq I!# "
 'K"z2H?JK`?a?e?efnpq?ruv?v128<  OOL1E8CDU8V8Z8Z[`bc8dgh8h-.u5  OOG,Ee$9<[I[=\]b=cej9k./69<[I[=\]b=cej9k./6 %6J?JK^?_?c?cdnpq?ruv?v/0< %6J>IJ\>]>a>ablno>pst>t./
;5 (: 58[3v;5NK*+E2 .2&-.4463
 13 .)*
 *.f)*002/
 1/ *%&
 r   r9   c                 @    |j                  dd      }|dk\  ry|dk\  ryy)z Calculate user engagement level.recent_activityr      rm   r[   rl   rY   rE   )r   r9   r   s      r   rF   z'DataManager._calculate_engagement_level  s.    *../@!Db "r   c                     |syt        t        d |D                    }t        t        d |D                    }t        |      }|dk(  ry||z  }||z  }||z   dz  }t        dt        d|            S )z'Calculate user exploration score (0-1).rZ   c              3   b   K   | ]'  }|j                  d       s|j                  d        ) yw)r   Nr   .0r   s     r   	<genexpr>z;DataManager._calculate_exploration_score.<locals>.<genexpr>&  s+     #S_Kcncrcrs}c~KOOJ$?S_   //c              3   b   K   | ]'  }|j                  d       s|j                  d        ) yw)r   Nr   r   s     r   r   z;DataManager._calculate_exploration_score.<locals>.<genexpr>'  s+     Q]+alapapq}a~ =Q]r   r      g      ?g        )rS   setr   r   )r   r"   unique_categoriesunique_brandstotal_interactionscategory_diversitybrand_diversityr?   s           r   rG   z(DataManager._calculate_exploration_score   s      #S_#   ACQ]  A !.".1CC'*<< 0/AQF3C!2344r   c                    	 | j                  |      }|j                  di       }| j                  j                  d      }|sg S g }|D ]  }d}|j                  d      }	|	|j                  di       v r||d   |	   dz  z  }|j                  d      }
|
|j                  d	i       v r||d	   |
   d
z  z  }|j                  dd      }|j                  di       }|j                  dd      dkD  r!t	        ||d   z
        |d   z  }|d
k  r|d
z  }|j                  ||f        |j                  d d       |d| D cg c]  \  }}|	 c}}S c c}}w # t        $ r}t        d|        g cY d}~S d}~ww xY w)z9Get available products for recommendation (arms for MAB).r<     r4   r   r   r   g333333?r   r   g?rj   r   r   c                     | d   S r   r   r   s    r   r   z>DataManager._get_available_products_for_user.<locals>.<lambda>\  s    qtr   Tr   Nu&   ❌ Error getting available products: )	rV   rE   r   get_all_productsabsr'   sortrH   rI   )r   r   rW   rL   r<   all_productsscored_productsproductscorer   r   rj   
price_pref
price_diffrM   s                  r   rd   z,DataManager._get_available_products_for_user5  s   *	,,W5J$..;K  //@@t@LL	 !O' #;;z2{/DbII[)>?ICOOE  L1KOO,=rBB[):;EBSHHE  GQ/(__-?D
>>%+a/!$UZ->%>!?*UBS!SJ!C'&&'78+ (0   ^T B2A+:2NO2NG2NOOO 	:1#>?I	s7   AE C:E ?EE E 	E8E3-E83E8formatc                    	 | j                  |      }|sy|j                         dk(  r|S |j                         dk(  r#| j                  |      }|j                  d      S |S # t        $ r}t        d|        Y d}~yd}~ww xY w)z%Export user data in specified format.NjsoncsvF)indexu   ❌ Error exporting user data: )rV   lowerr   to_csvrH   rI   )r   r   r   rL   r   rM   s         r   export_user_datazDataManager.export_user_datae  s    	,,W5J||~'!!5(227;yyuy--!! 	3A378	s'   A# A# 5A# !A# #	B,A??Bc           
      T   	 t        | j                        t        | j                  j                         D cg c]  }t	        d |D              s| c}      t        | j
                  j                               ddS c c}w # t        $ r}t        d|        i cY d}~S d}~ww xY w)zGet overall system statistics.c              3   ,   K   | ]  }|d    dk(    yw)r#   r    Nr   )r   ss     r   r   z4DataManager.get_system_statistics.<locals>.<genexpr>  s%       VA~yzVWXgVhltVt~s   operational)total_usersactive_sessionstotal_productssystem_statusu%   ❌ Error getting system statistics: N)	rS   r   r   valuesanyr   r   rH   rI   )r   r   rM   s      r   get_system_statisticsz!DataManager.get_system_statisticsy  s    	  #4#3#34#&43E3E3L3L3N  (B3NaRU  VA~  VA  SA3N  (B  $C"%d&:&:&K&K&M"N!.	  (B  	9!=>I	s4   5B A?
A?
+B ?B 	B'B"B'"B')zrecommender_system.dbr   )r[   )r   )r   )__name__
__module____qualname____doc__strr   r$   r)   r   r   r   r-   r1   rN   rT   rV   rg   rt   ru   r   rA   r   rD   rF   r   rG   rd   r   r   r   r   r   r   r      s   O 3 C 3 $# (4S>2J   "C "DcN "H7 7tCH~ 7.6c 6htCH~.F 6# 3 PTUXZ]U]P^ B$" $"C $"2<< $"PC DcN 9d4S>6J 9tTWY\T\~ 9v	DcN 	s 	5d38n9M 5RW 5*, , ,QUVZ[^`c[cVdQe ,` S c (tCH~ r   r   )r   pandasrt   numpynpr   r   typingr   r   r   r   r	   r   r   modelsr   r   r   r   r   r   r   r   <module>r      s0   
   ( 3 3 + O Ox xr   