susinlee 님의 블로그

115. Movie Rating 본문

코드카타/Pandas

115. Movie Rating

susinlee 2025. 1. 30. 10:58

[문제]

https://leetcode.com/problems/movie-rating/description/

 

[풀이]

1. 영화 평점 테이블에서 각 유저별로, 영화별로, 평가수와 평균점수를 구하고 각각 새로운 테이블을 생성

2. 평가수 테이블과 유저 테이블을 조인해서 유저의 이름을 구하고

3. 평균점수 테이블과 영화 테이블을 조인해서 영화 이름을 구한 뒤

4. 두 데이터로 테이블을 만들어서 반환

 

Pandas

import pandas as pd

def movie_rating(movies: pd.DataFrame, users: pd.DataFrame, movie_rating: pd.DataFrame) -> pd.DataFrame:
	
    user_rating_counts = (
    	movie_rating
        .groupby('user_id')
        .size()
        .reset_index(name='cnt')
    )
    
    user_name = (
    	user_rating_counts
        .merge(users, on='user_id')
        .sort_values(['cnt', 'name'], ascending=[False, True])
        .iloc[0]['name']
    )
    
    movie_avg_ratings = (
    	movie_rating[
        	movie_rating.created_at.dt.to_period('M') == '2020-02'
        ]
        .groupby('movie_id')['rating']
        .mean()
        .reset_index()
    )
    
    movie_title = (
    	movie_avg_ratings
        .merge(movies, on='movie_id')
        .sort_values(['rating', 'title'], ascending=[False, True])
        .iloc[0]['title']
    )
    
    return pd.DataFrame({'results: [user_name, movie_title]})

 

SQL

WITH UserRatingCounts AS (
    SELECT user_id, COUNT(*) AS cnt
    FROM MovieRating
    GROUP BY user_id
),
MovieAvgRatings AS (
    SELECT movie_id, AVG(rating) AS avg_rating
    FROM MovieRating
    WHERE created_at BETWEEN '2020-02-01' AND '2020-02-29'
    GROUP BY movie_id
)

(SELECT name as results
FROM Users 
JOIN UserRatingCounts USING (user_id)
ORDER BY cnt DESC, name
LIMIT 1)

UNION ALL

(SELECT title as results
FROM Movies
JOIN MovieAvgRatings USING (movie_id)
ORDER BY avg_rating DESC, title
LIMIT 1)

'코드카타 > Pandas' 카테고리의 다른 글

117. Friend Requests II: Who Has the Most Friends  (0) 2025.02.10
116. Restaurant Growth  (0) 2025.02.09
114. Exchange Seats  (0) 2025.01.30
113.  (0) 2025.01.20
111. Last Person to Fit in the Bus  (0) 2025.01.19