예제 #1
0
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
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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