def recommend_similar_place_user_viewed(user_id): try: sql = "SELECT count(*) as times, place_id FROM place_user_log where user_id=%(user_id)s and place_id!='' group by place_id;" params = {"user_id" : int(user_id)} ds = read_data_from_db(sql, params) sql2 = "SELECT event_type FROM place_user_log where user_id=%(user_id)s and event_type!='VIEW_DETAIL';" ds2 = read_data_from_db(sql2, params) chosen_cats_as_string = ' '.join(set(map(lambda x: x.split(': ')[1], ds2['event_type']))) if (len(ds) == 0 and (not chosen_cats_as_string)): return "not found", 404 else: df_cat_per_item = get_cat_per_item() if chosen_cats_as_string: get_liked_cats_at_the_first_time(chosen_cats_as_string, df_cat_per_item, ds) user_data_with_cat_of_items = df_cat_per_item.reset_index().merge(ds, on='place_id') recommendations, simi_list = similar_to_user_profile(user_data_with_cat_of_items, df_cat_per_item) place_ids = df_cat_per_item.loc[recommendations, 'place_id'].tolist() recommended_items = df_cat_per_item.loc[recommendations] x = recommended_items.reset_index().join(simi_list) simi_items = tuple(int(x) for x in place_ids) similar_places = get_list_db_objects_from_ids(simi_items) return Response(similar_places.to_json(orient="records"), status=200, mimetype='application/json') except Exception as e: print(str(e)) return "", 500
def recommend_place(user_id): try: find_user_rating = 'SELECT * FROM rating_place where user_id=%(user_id)s;' params = {"user_id" : int(user_id)} user_rating = read_data_from_db(find_user_rating, params) sql = 'SELECT user_id, place_id, rating FROM rating_place' ds = read_data_from_db(sql, None) if len(ds) > 0 and len(user_rating) >0: reader = Reader() data = Dataset.load_from_df(ds[['user_id', 'place_id', 'rating']], reader=reader) alg = SVD() alg.fit(data.build_full_trainset()) iids = ds['place_id'].unique() rated_iids = ds.loc[ds['user_id'] == user_id, 'place_id'] iids_to_pred = np.setdiff1d(iids, rated_iids) testset = [[user_id, iid, 4.] for iid in iids_to_pred] predictions = alg.test(testset) evaluate_surprise_alg(predictions) predictions.sort(key=lambda x: x.est, reverse=True) list_of_ids = [] for i in range(50 if len(predictions) >= 50 else len(predictions)): list_of_ids.append(int(predictions[i].iid)) similar_places = get_list_db_objects_from_ids(tuple(list_of_ids)) return Response(similar_places.to_json(orient="records"), status=200, mimetype='application/json') return "not found", 404 except Exception as e: print(str(e)) return "", 500
def get_cat_per_item(): cuisine_sql = 'SELECT id, cuisine_id, res_id FROM cuisine_restaurant where stt=1;' ds = read_data_from_db(cuisine_sql, None) df_cuisine_per_item = ds.groupby('res_id')['cuisine_id'].agg( _concatenate_cuisine_of_item) feature_sql = 'SELECT id, feature_id, res_id FROM feature_restaurant where stt=1;' ds = read_data_from_db(feature_sql, None) df_feature_per_item = ds.groupby('res_id')['feature_id'].agg( _concatenate_feature_of_item) meal_sql = 'SELECT id, meal_id, res_id FROM meal_restaurant where stt=1;' ds = read_data_from_db(meal_sql, None) df_meal_per_item = ds.groupby('res_id')['meal_id'].agg( _concatenate_meal_of_item) type_sql = 'SELECT id, type_id, res_id FROM foodtype_restaurant where stt=1;' ds = read_data_from_db(type_sql, None) df_type_per_item = ds.groupby('res_id')['type_id'].agg( _concatenate_type_of_item) df_data = pd.merge(df_cuisine_per_item, df_feature_per_item, how='left', on='res_id') df_data = pd.merge(df_data, df_meal_per_item, how='left', on='res_id') df_data = pd.merge(df_data, df_type_per_item, how='left', on='res_id') serie_data = df_data[df_data.columns[0:]].apply( lambda x: ' '.join(x.dropna().astype(str)), axis=1) df_cat_per_item = pd.DataFrame({ 'res_id': serie_data.index, 'item_cats': serie_data.values }) return df_cat_per_item
def get_cat_per_item (): sql = 'SELECT id, place_id, activity_id FROM activity_place where stt=1;' ds = read_data_from_db(sql, None) df_cat_per_item = ds.groupby('place_id')['activity_id'].agg(_concatenate_cats_of_item) df_cat_per_item.name = 'item_cats' df_cat_per_item = df_cat_per_item.reset_index() df_cat_per_item[~df_cat_per_item.item_cats.isnull()].reset_index(drop=True) return df_cat_per_item
def get_list_db_objects_from_ids(tuple_of_item): simi_items_as_string = ','.join(map(str, tuple_of_item)) get_simi_items_query = "SELECT * FROM tour where id in %(simi_items)s ORDER BY FIND_IN_SET(id, %(ordered_list)s);" params = { "simi_items": tuple_of_item, "ordered_list": simi_items_as_string } ds = read_data_from_db(get_simi_items_query, params) return ds