코딩 테스트/Pandas 19

Game Play Analysis IV

[문제]https://leetcode.com/problems/game-play-analysis-iv/description/  [풀이]1. player_id 별로 첫 로그인 날짜를 구하고2. player_id 별로 로그인 날짜가 첫 로그인 날짜보다 하루 뒤인 행의 개수를 구한다3. 전체 player_id 고유값으로 나눈다. Pandasdef gameplay_analysis(activity: pd.DataFrame) -> pd.DataFrame: activity['first'] = activity.groupby('player_id').event_date.transform(min) activity_second = activity[activity['first'] + pd.DateOffset(1) ==..

Immediate Food Delivery II

[문제]https://leetcode.com/problems/immediate-food-delivery-ii/description/ [풀이]1. 각 고객별로 첫주문을 가져오고, 해당 주문과 희망 배송 날짜가 같은 걸 찾고 더한 뒤 전체 개수로 나눠줌 Pandasimport pandas as pddef immediate_food_delivery(delivery: pd.DataFrame) -> pd.DataFrame: delivery = delivery.groupby('customer_id').min() return pd.DataFrame({'immediate_percentage' : [round((delivery['order_date'] == delivery['customer_pref_deliv..

Monthly Transactions I

[문제] https://leetcode.com/problems/monthly-transactions-i/description/ [풀이]1. state 컬럼이 'approved' 인 행에만 집계함수를 적용할 수 있도록 np.where 또는 apply 함수를 통해 새로운 컬럼을 생성2.  month 컬럼을 요구된 날짜포맷으로 변경3. month 컬럼과 country 컬럼으로 groupby 를 진행하는데 기준 컬럼이 null값 이어도 그룹화에서 제외하지 않도록dropna=False 설정4. agg 함수를 적용하고 reset_index 함수로 마무리 Pandasdef monthly_transactions(transactions: pd.DataFrame) -> pd.DataFrame: transactions..

Queries Quality and Percentage

[문제]https://leetcode.com/problems/queries-quality-and-percentage/description/  [풀이]1. rating 컬럼과 position 컬럼을 나눈 새로운 컬럼을 생성한다. 2. rating 컬럼이 3 미만인 조건을 통해 불리언 배열을 생성하고 이에 100을 곱해주는 새로운 컬럼을 생성한다. (비율이므로 미리 계산)3. query_name으로 그룹화한 뒤 두 컬럼을 평균해준다. 반올림도 진행해주는데 아마 틀렸다고 나올 것이다.4. 이는 판다스의 반올림에는 다른 규칙이 있기 때문인데, 예를들어 소수점 둘째짜리까지 반올림하는 경우 반올림할 숫자가 0.125라면 0.12로 반올림한다. 이는 편향을 줄이기 위한 방법인데 반올림할 값이 딱 중간인 5라면 가까운..

Percentage of Users Attended a Contest

[문제]https://leetcode.com/problems/percentage-of-users-attended-a-contest/description/  [풀이]1. register 테이블에서 contest_id 별로 유저 수를 계산한다.2. 계산한 유저 수를 총 유저 수로 나누어서 비율(percentage을 구해준다.3. percentage 를 내림차순 정렬, contest_id 를 오름차순 정렬 해준다. Pandasdef users_percentage(users: pd.DataFrame, register: pd.DataFrame) -> pd.DataFrame: grouped = register.groupby('contest_id')['user_id'].count().reset_index(nam..

Project Employees I

[문제]https://leetcode.com/problems/project-employees-i/description/  [풀이]1. project 테이블을 기준으로 left join 을 해준다.2. project_id 별로 experience_years의 평균을 구해주는데 소수점 둘째 자리까지 반올림 해준다.3. 컬럼명을 average_years 로 변경해준다. Pandasimport pandas as pddef project_employees_i(project: pd.DataFrame, employee: pd.DataFrame) -> pd.DataFrame: return project.merge(employee, how='left').groupby('project_id')['experie..

Average Selling Price

[문제]https://leetcode.com/problems/average-selling-price/description/  [풀이]시계열 조인 문제로 두 가지 방법이 있다. 일반적인 조인 방법(merge)과 투 포인터 접근법을 사용한 방법(merge_asof)이다.  일반적인 조인 방법은 모든 가능한 왼쪽-오른쪽 조합을 계산하는 것으로 O(M x N) 의 시간복잡도를 가지며, 이후 필터링 하는 것은 비용이 너무 크다. 반면, merge_asof는 O(N)의 투 포인터 접근법을 사용해 왼쪽과 오른쪽 데이터를 순회하는데, 이는 시간 정렬이 필요하지만, 시계열 데이터 처리에서는 일반적으로 시간 정렬을 필요로 하기 때문에 큰 문제가 되지 않는다.  1. merge 조인 방법먼저 일반적인 조인 방법으로 풀어보자..

Not Boring Movies

[문제]https://leetcode.com/problems/not-boring-movies/  [풀이]1. 조건1) 모듈 연산으로 id가 홀수인 행 필터링2. 조건2) != 연산으로 description이 boring이 아닌 행 필터링3. rating으로 내림차순 정렬 Pandasimport pandas as pddef not_boring_movies(cinema: pd.DataFrame) -> pd.DataFrame: cond1 = cinema['id'] % 2 == 1 cond2 = cinema['description'] != 'boring' return cinema[cond1 & cond2].sort_values(by='rating', ascending=False) SQL# Wri..

Confirmation Rate

[문제]https://leetcode.com/problems/confirmation-rate/description/  [풀이]1. 모든 user_id가 보여야 하므로 Signups 테이블을 기준으로 LEFT JOIN2. action 열에서 confirmed인 행과 아닌 행들을 1과 0으로 나눠서 comfirmation_rate을 mean 함수로 손쉽게 구할 수 있음3. user_id로 그룹화 해준뒤 mean과 round 함수 적용 Pandasimport pandas as pddef confirmation_rate(signups: pd.DataFrame, confirmations: pd.DataFrame) -> pd.DataFrame: df = pd.merge(signups, confirmations..