데이터프레임을 불러오고 필요없는 컬럼을 제거하고 합쳐준다.
import pandas as pd
import numpy as np
movie_df = pd.read_csv('Movie_Id_Titles.csv')
review_df = pd.read_csv('user_rating.csv')
df = pd.merge(movie_df, review_df, on='item_id', how='left')
각 영화별로 별점에 대한 기본 통계치 확인
df.groupby('movieId')['rating'].describe()
df.corr(numeric_only=True)
영화 제목이 컬럼 부분에 위치해야 상관계수를 뽑을 수 있다.
영화 제목은 컬럼으로, 유저아이디는 인덱스로, 유저가 준 별점은 데이터로
들어가도록 데이터프레임을 가공해야 한다.
df = df.pivot_table(index='user_id', columns='title', values='rating')
corr_movie = df.corr(min_periods=50)
my_review = review_df.loc[review_df['user_id'] == 0, ]
my_review = pd.merge(my_review, movie_df, on='item_id')[['title', 'rating']]
title = my_review['title'][0]
recom_movie = corr_movie[title].dropna().sort_values(ascending=False).to_frame()
recom_movie.columns = ['correlation']
recom_movie['weight'] = recom_movie['correlation'] * my_review['rating'][0]
비어있는 빈 데이터프레임을 만들고
내가 본 영화의 가중치까지 계산해서 추천 영화를 뽑고
이 추천 영화들을 위의 빈 데이터프레임에 추가하면 된다.
모두 추가한 후 정렬, 중복영화 제거하고, 이미 본 영화도 제거하면 된다.
movie_list = pd.DataFrame()
for i in range(my_review.shape[0]):
title = my_review['title'][i]
recom_movie = corr_movie[title].dropna().sort_values(ascending=False).to_frame()
recom_movie.columns=['correlation']
recom_movie['weight'] = recom_movie['correlation'] * my_review['rating'][i]
movie_list = pd.concat([movie_list, recom_movie])
# weight 컬럼으로 정렬
movie_list.sort_values(by='weight', ascending=False, inplace=True)
# 내가 이미 본 영화는 추천에서 제외한다.
for title in my_review['title']:
if title in movie_list.index:
movie_list.drop(title, axis=0, inplace=True)
# 중복된 영화는 weight 의 최대값으로 계산해서 중복 제거
movie_list.groupby('title')['weight'].max().sort_values(ascending=False).head(5)
'-' 카테고리의 다른 글
Firebase 채팅 기능 구현 (1) | 2024.06.21 |
---|