| Current Path : /proc/thread-self/root/home/deltalab/PMS/recommendations/user_profiling/ |
| Current File : //proc/thread-self/root/home/deltalab/PMS/recommendations/user_profiling/app_testMultiProcessing.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 write_profiles, saveComputationalTimes
import multiprocessing as mp
import os
GENERATE_RECOMMENDATIONS = True
if __name__ == '__main__':
# Read data
indacoProducts_df, indacoOrders_df, indacoCategories = load_indacoProducts(visualize_aggregated_territories = True)
# ----------------------------------- 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'])
# Generate profile for the users users
profiler = ProfilingUsers(orders = enhancedOrders)
userProfiles = profiler.mine_orders()
# --------------------------- RECOMMENDER SYSTEM ----------------------------
if GENERATE_RECOMMENDATIONS:
verbose = False
# Initialize
userBased_recomSys = ProfileBased_RS(
platformProducts = indacoProducts_df,
platfromOrders = enhancedOrders)
# Multiprocessing
num_cpu = mp.cpu_count()
pool = mp.Pool(num_cpu)
print("Num CPU:", num_cpu)
# Generate recommendations
userRecommendations_byUsers, computationalTime_byUser = dict(), dict()
# Multiprocessing
worker_manager = mp.Manager()
queue = worker_manager.Queue()
sys_processes = []
args = []
for user_id, user_profile in userProfiles.items():
args.append((queue, user_id, user_profile, verbose))
#process = mp.Process(
# target = userBased_recomSys.userWise_recommendations_multiProcess,
# args = (queue, user_id, user_profile, verbose))
#process.start()
#sys_processes.append(process)
with pool:
workers = pool.apply_async(userBased_recomSys.userWise_recommendations_multiProcess, args)
while(not queue.empty()):
user_recommendations, user_computationalTime = queue.get_nowait()
userRecommendations_byUsers.update(user_recommendations)
computationalTime_byUser.update(user_computationalTime)
# Save the results
#for p in sys_processes:
# user_recommendations, user_computationalTime = queue.get()
# userRecommendations_byUsers.update(user_recommendations)
# computationalTime_byUser.update(user_computationalTime)
# Wait all processes
# Save computational times
saveComputationalTimes(computationalTime_byUser)
# ----------------------------------------------------------------------------
# Visualize the user profiles
print("\nUSER PROFILES:")
for user_id, user_profile in userProfiles.items():
# Merge the user profile with the recommendended products
if GENERATE_RECOMMENDATIONS:
user_recommendations = userRecommendations_byUsers[user_id]
user_profile.update(user_recommendations)
# Visualize profile
visualize_user_profile(user_id, user_profile)
# Write the user profiles
write_profiles(userProfiles, sku_mapping)