같은경로안에 두가지 (실시간,주기적업데이트) 만들어놓고 때때로 클래스이름만 바꿔서 활용한다
class MovieRecommendRealTimeResource(Resource) :
@jwt_required()
def get(self) :
user_id = get_jwt_identity()
try :
connection = get_connection()
select m.title, r.user_id, r.rating
from movie m
left join rating r
on r.movie_id = m.id;
쿼리문으로 이동 ㄱㄱ
movie_correlations = pd.read_csv('data/movie_correlations.csv',index_col='title')
영화 추천 코드를 따로 csv로 뽑아낸게(batch) 아니라 실시간 작업
df = pd.DataFrame(data=result_list)
movie_correlations = df.pivot_table(index='user_id',columns= 'title', values='rating')
df.corr(min_periods=50)
movie_correlations = df.corr(min_periods=50)
둘의 결과가 같다
connection이 한번 연결되면 쿼리가 두세개가 연결되도 된다.
# 내 별점정보를 가져와야, 나의 맞춤형 추천 가능.
# 내 별점정보를 가져와야, 나의 맞춤형 추천 가능.
query = ''' select m.title, r.rating
from rating r
join movie m
on r.movie_id = m.id
where user_id = %s; '''
record = (user_id, )
cursor = connection.cursor(dictionary=True)
cursor.execute(query, record)
result_list = cursor.fetchall()
cursor.close()
connection.close()
except Error as e :
print(e)
cursor.close()
connection.close()
return {"error" : str(e)}, 500
복사
# 4. db로부터 가져온 내 별점정보를
# 데이터프레임으로 만든다.
my_rating = pd.DataFrame(data=result_list)
#5. 내 별점 정보 기반으로, 추천영화 목록을 만든다.
similar_movie_list = pd.DataFrame()
for i in range( my_rating.shape[0] ) :
movie_title = my_rating['title'][i]
similar_movie = movie_correlations[movie_title].dropna().sort_values(ascending=False).to_frame()
similar_movie.columns=['correlations']
similar_movie['Weight'] = my_rating['rating'][i] * similar_movie['correlations']
similar_movie_list = similar_movie_list.append(similar_movie)
#6. 내가본 영화 제거
drop_index_list = my_rating['title'].to_list()
for name in drop_index_list :
if name in similar_movie_list.index :
similar_movie_list.drop(name,axis = 0 , inplace=True)
# 7. 중복된 추천된 영화는, weight가 가장 큰값으로만 중복제거하기
recommend_movie_list = similar_movie_list.reset_index().groupby('title')['Weight'].max().sort_values(ascending=False).head(count)
recommend_movie_list = recommend_movie_list[recommend_movie_list>0]
print(recommend_movie_list)
# 8. json으로 보내야댐
recommend_movie_list = recommend_movie_list.to_frame()
recommend_movie_list = recommend_movie_list.reset_index()
recommend_movie_list = recommend_movie_list.to_dict('records')
return {"result" : "success" ,
"items" : recommend_movie_list ,
"count" : len(recommend_movie_list)}, 200
#쿼리 스트링으로 받는 데이터는 전부 문자열로 처리해버린다
count = request.args.get('count')
count = int(count)
또 복사
그후 app에 연결해주기
실시간이기때문에 상관계수 테이블이 바뀐다.
실시간 결과물이기때문에 시간이 더 오래걸린다
'Api 개발 > flask' 카테고리의 다른 글
API 소스코드 lambda에 배포하기 (0) | 2023.01.10 |
---|---|
영화추천 api 만들기 즐겨찾기 기능 (0) | 2023.01.10 |
MySQL에서 admin 계정만들기 (0) | 2023.01.04 |
플라스크 프레임워크 설치 및 가상환경 구축 (0) | 2023.01.03 |
RestFul(Representational State Transfer) API (0) | 2023.01.03 |