군침이 싹 도는 코딩
추천 영화 작업 자동화 파이프라인 본문
similar_movies_list = pd.DataFrame()
for i in range( myRatings.shape[0] ) :
movie_title = myRatings['Movie Name'][i]
recom_movies = corr_movie[movie_title].dropna().sort_values(ascending=False).to_frame()
recom_movies.columns = ['correlation']
recom_movies['weight'] = recom_movies['correlation'] * myRatings['Ratings'][i]
similar_movies_list = similar_movies_list.append( recom_movies )
# 추천 영화 작업 자동화 파이프라인이다 이것을 하나씩 풀어서 보자
similar_movies_list = pd.DataFrame()
# 비어있는 데이터 프레임을 만든다
for i in range( myRatings.shape[0] ) :
movie_title = myRatings['Movie Name'][i]
# myRatings 라는 데이터 프레임은 내가 본 영화의 데이터 프레임이다
이것의 영화제목이 필요하므로 이것만을 따로 억세스해서 반복문의 range 안에 넣어주도록한다
그리고 그것을 받아 변수에 저장한다
recom_movies = corr_movie[movie_title].dropna().sort_values(ascending=False).to_frame()
recom_movies.columns = ['correlation']
# 이제 전체 데이터 프레임의 상관관계에서 내가 본 영화의 제목을 집어넣어 그 영화들과의 상관관계만 뽑아낸다
그것에서 비어있는 데이터를 지우고(dropna) 내림차순 정렬( sort_values(ascending=False) )을 한 뒤
데이터 프레임으로 만들고(to_frame) 이것의 컬럼 이름을 바꿔준다 (recom_movies.columns)
recom_movies['weight'] = recom_movies['correlation'] * myRatings['Ratings'][i]
similar_movies_list = similar_movies_list.append( recom_movies )
# recom_movies 에 weight라는 새 컬럼을 만들어 correlation 컬럼에 내가 준 별점만큼의 가중치를 준 뒤 저장한다
마지막으로 만들었던 빈 데이터 프레임에 이것을 저장한다
similar_movies_list = similar_movies_list.sort_values('weight', ascending=False)
# 반복문을 통해 자동화를 했으면 이것을 새로만든 컬럼 weight로 내림차순 정렬을 해준다
여기서 문제가 생기는데 이렇게하면 가장 가중치가 높은것은 내가본 영화가 된다
이를 삭제해주어야한다
drop_index_list = myRatings['Movie Name'].to_list()
for name in drop_index_list :
if name in similar_movies_list.index :
similar_movies_list.drop(name, axis = 0, inplace=True)
# 먼저 내가 본 영화의 제목을 리스트로 만들어 변수에 저장해준다
반복문을 사용해 내가 본 영화의 제목이 similar_movies_list에 있다면 이것을 삭제하게한다
similar_movies_list
# 결과를 보면 가중치 순으로 내가 본 영화를 제외하고 잘 정렬이 되어있다 하지만 영화가
중복되어 들어가는 경우도 발생한다 따라서 중복된 영화가 있으면 이것을 제거해줘야한다
방법은 영화 이름별로 웨이트가 가장 높은 데이터를 가져오는것이다
similar_movies_list.reset_index()['title'].value_counts()
# 중복된 데이터가 있는지를 먼저 확인한다
similar_movies_list.groupby('title')['weight'].max().sort_values(ascending=False)
>>>
title
Being There (1979) 1.700037
Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb (1963) 1.571663
Independence Day (ID4) (1996) 1.555910
Clockwork Orange, A (1971) 1.552285
Citizen Kane (1941) 1.481653
...
Firm, The (1993) -0.670396
Fried Green Tomatoes (1991) -0.682234
Beauty and the Beast (1991) -0.686290
Last of the Mohicans, The (1992) -0.746177
Air Force One (1997) -1.131976
Name: weight, Length: 198, dtype: float64
# 그룹바이를 사용해서 웨이트의 max값만을 뽑아내 그것을 내림차순 정렬하면 된다
'Python > Pandas' 카테고리의 다른 글
데이터 프레임을 불러올때 ParserError 디버깅 (0) | 2023.01.03 |
---|---|
resample 함수의 사용법과 인덱스 설정법 (0) | 2023.01.03 |
Item based collaborative filltering 을 하기위해 데이터프레임의 corr 함수를 이용해 correlation 과 min_periods 파라미터 사용법 (0) | 2023.01.03 |
Pandas pivot_table 함수 사용법 (0) | 2023.01.03 |
Python pandas 날짜 처리 (datetime) (0) | 2022.11.30 |