Your IP : 216.73.217.13


Current Path : /home/deltalab/PMS/recommendations/user_profiling/
Upload File :
Current File : //home/deltalab/PMS/recommendations/user_profiling/app.py

from components.ProfilingUsers import ProfilingUsers
from components.ProfileBased_RS import ProfileBased_RS

from _library.visual_utils import visualize_user_profile
from _library.data_loader import load_indacoProducts
from _library.mongodb_utils import simplified_SKUs
from _library.io_toolkit import saveComputationalTimes, read_settings
from _library.profiling_utils import write_profiles

if __name__ == '__main__':
    
    appSettings = read_settings()
    
    # Read data
    db_service,indacoProducts_df, indacoOrders_df, indacoCategories = load_indacoProducts("etl",visualize_aggregated_territories = True)
    import pdb;
    # pdb.set_trace()
    # ----------------------------------- PRE-PROCESSING ----------------------------------------------
    # [PRE-PROCESSING A] Simplify SKUs
    indacoProducts_df, product_names, sku_mapping = simplified_SKUs(indacoProducts_df, product_identifier = 'SKU')
    # [PRE-PROCESSING B] Add the simplified SKUs to the orders
    reversed_skuMapping = {indaco_sku: simplified_sku for simplified_sku, indaco_sku in sku_mapping.items()}
    indacoOrders_df.insert(loc = 4, column = 'SKU', value = indacoOrders_df['sku'].apply(
        lambda indaco_sku: reversed_skuMapping[indaco_sku]))
    indacoOrders_df.rename(columns = {'sku': 'indaco_sku'}, inplace = True)
    
    # Enhanced the order with information of the products
    duplicate_columns = ['Product Type', 'indaco_sku', 'Title']
    enhancedOrders = indacoOrders_df.merge(indacoProducts_df.drop(columns = duplicate_columns), how = 'left', on ='SKU')
    enhancedOrders = enhancedOrders.dropna(subset = ['SKU'])
    
    print(enhancedOrders)
    
    # Generate profile for the users users
    profiler = ProfilingUsers(orders = enhancedOrders)
    userProfiles = profiler.mine_orders()    
    # --------------------------- RECOMMENDER SYSTEM ----------------------------
    if appSettings['generate_recommendations']:
        
        verbose = False
        
        # Initialize
        userBased_recomSys = ProfileBased_RS(
            platformProducts = indacoProducts_df, 
            platfromOrders = enhancedOrders)
        
        # Generate recommendations
        userRecommendations_byUsers, computationalTime_byUser = dict(), dict()

        channels = indacoProducts_df['channel'].unique()
        collectionBased_bundleDim = 2

        for channel in channels:
            channel_products = indacoProducts_df[indacoProducts_df['channel'] == channel]

            # if(len(channel_products) < collectionBased_bundleDim):
            #     continue

            userBased_recomSys.platformProducts = channel_products
            userRecommendations_byUsers[channel] = {}
            for user_id, user_profile in userProfiles.items():
                    
                # Personalized recommendations
                user_recommendations, user_computationalTime = userBased_recomSys.userWise_recommendations(
                    user_id, user_profile, collectionBased_bundleDim, verbose)
                userRecommendations_byUsers[channel][user_id] = user_recommendations

            if(appSettings['generate_recommendations']):
                write_profiles(db_service,userRecommendations_byUsers[channel], sku_mapping=sku_mapping, collectionName = 'userbasedrecommendations', overwriteCollection = True,channel=channel)
                    #computationalTime[channel][user_id] = user_computationalTime

        #saveComputationalTimes(computationalTime_byUser)
    # ----------------------------------------------------------------------------

    # Visualize the user profiles
    print("\nUSER PROFILES:")
    for user_id, user_profile in userProfiles.items():
        
        # Visualize profile
        visualize_user_profile(user_id, user_profile)
        
        # Merge the user profile with the recommendended products 
        # if appSettings["generate_recommendations"]:
        #     visualize_user_profile(user_id, userRecommendations_byUsers[user_id])
    # Write profiles
    write_profiles(db_service,userProfiles, sku_mapping,collectionName = 'userprofiles', overwriteCollection = True)
    if appSettings['generate_recommendations']:
        print("\nGENERATING RECOMMENDATIONS")
        #write_recommendations(db_service,userRecommendations_byUsers, sku_mapping, overwriteCollection = True)