Table: Activity
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| machine_id | int |
| process_id | int |
| activity_type | enum |
| timestamp | float |
+----------------+---------+
이 테이블은 공장 웹사이트에서의 사용자 활동을 보여줍니다.
(machine_id, process_id, activity_type)는 이 테이블의 기본 키입니다 (세 컬럼의 조합이 유일한 값을 가짐).
- machine_id는 기계의 ID입니다.
- process_id는 해당 기계(machine_id)에서 실행 중인 프로세스의 ID입니다.
- activity_type은 'start', 'end' 중 하나의 값을 가지는 ENUM(열거형) 타입입니다.
- timestamp는 현재 시간을 **초 단위의 실수(float)**로 나타낸 값입니다.
'start'는 해당 시점에 기계가 프로세스를 시작했다는 의미이고,
'end'는 해당 시점에 기계가 프로세스를 종료했다는 의미입니다.
모든 (machine_id, process_id) 쌍에 대해
- 'start' 시간은 항상 'end' 시간보다 이전이며,
- 'start'와 'end'는 각각 정확히 하나씩 존재하는 것이 보장됩니다.
문제
공장 웹사이트에는 여러 대의 기계가 있으며, 각 기계는 동일한 개수의 프로세스를 실행합니다.
각 기계가 하나의 프로세스를 완료하는 데 걸리는 평균 시간을 구하는 해결 방법을 작성하세요.
- 프로세스를 완료하는 데 걸리는 시간은 'end'의 timestamp에서 'start'의 timestamp를 뺀 값입니다.
- 평균 시간은 해당 기계에서 실행된 모든 프로세스의 총 처리 시간을 프로세스 개수로 나눈 값입니다.
결과 테이블은 다음 정보를 포함해야 합니다:
- machine_id
- processing_time (소수점 셋째 자리까지 반올림된 평균 처리 시간)
결과 테이블의 정렬 순서는 상관없습니다.
결과 형식은 다음 예시와 같습니다.
Example 1:
Input:
Activity table:
+------------+------------+---------------+-----------+
| machine_id | process_id | activity_type | timestamp |
+------------+------------+---------------+-----------+
| 0 | 0 | start | 0.712 |
| 0 | 0 | end | 1.520 |
| 0 | 1 | start | 3.140 |
| 0 | 1 | end | 4.120 |
| 1 | 0 | start | 0.550 |
| 1 | 0 | end | 1.550 |
| 1 | 1 | start | 0.430 |
| 1 | 1 | end | 1.420 |
| 2 | 0 | start | 4.100 |
| 2 | 0 | end | 4.512 |
| 2 | 1 | start | 2.500 |
| 2 | 1 | end | 5.000 |
+------------+------------+---------------+-----------+
Output:
+------------+-----------------+
| machine_id | processing_time |
+------------+-----------------+
| 0 | 0.894 |
| 1 | 0.995 |
| 2 | 1.456 |
+------------+-----------------+
설명 :
총 3개의 기계가 있고, 각각 2개의 프로세스를 실행하고 있습니다.
기계 0의 평균 시간:
((1.520 − 0.712) + (4.120 −3.140)) / 2 = 0.894
기계 1의 평균 시간:
((1.550 − 0.550) + (1.420 − 0.430)) / 2 = 0.995
기계 2의 평균 시간:
((4.512 − 4.100) + (5.000 − 2.500)) / 2 = 1.456
✏️ 풀이
import pandas as pd
def get_average_time(activity: pd.DataFrame) -> pd.DataFrame:
result = activity.pivot_table(index=['machine_id', 'process_id'], columns='activity_type', values='timestamp').assign(processing_time=lambda x:x['end'] - x['start']).reset_index()
result = result.groupby(['machine_id'])['processing_time'].mean().reset_index(name='processing_time')
return result
📚 개념정리
pivot_table() ? 데이터를 집계, 요약하는데 사용되는 함수. 주로 데이터를 그룹화하고, 특정 컬럼에 대한 값을 요약해서 보기 쉽게 테이블 형식으로 변환할 때 사용
# 기본 구조 #
df.pivot_table(
index=None, # 그룹화할 행을 지정
columns=None, # 그룹화할 열을 지정
values=None, # 계산할 값의 열을 지정
aggfunc='mean', # 집계 함수 (기본값은 평균)
fill_value=None, # 결측값을 채울 값
)
- index: 데이터를 그룹화할 행 기준을 지정. 예를 들어, 특정 id나 날짜로 그룹화할 때 사용.
- columns: 데이터를 그룹화할 열 기준을 지정. 예를 들어, type을 기준으로 그룹화할 수 있음.
- values: 집계할 값을 지정하는데, 예를 들어 'time' 컬럼의 값들을 집계하고 싶으면 이 부분에 'time'을 지정.
- aggfunc: 데이터를 집계하는 방법을 지정. 기본값은 'mean' (평균)이고, sum, count, min, max 등도 사용할 수 있음.
'[코딩테스트] > [Pandas]' 카테고리의 다른 글
[LeetCode - Pandas] (Easy) 1587. Bank Account Summary II (0) | 2025.04.14 |
---|---|
[LeetCode - Pandas] (Easy) 1633. Percentage of Users Attended a Contest (0) | 2025.04.14 |
[LeetCode - Pandas] 1667. Fix Names in a Table (0) | 2025.04.11 |
[LeetCode - Pandas] (Easy) 1683. Invalid Tweets (0) | 2025.04.10 |
[LeetCode - Pandas] (Easy) 1693. Daily Leads and Partners (0) | 2025.04.10 |