카테고리 없음

TIL_20250610 (화) pandas 개인과제 5~10번 풀이과정

elya0919 2025. 6. 10. 21:56
# 문제 5: 이동 거리 구하기

- **배경**: 축구 경기 데이터 분석가로서, 선수들의 위치 데이터를 활용하여 그들의 활동 범위와 이동 효율성을 계산하고자 합니다. 선수들의 이동 패턴을 분석하고 이를 통해 그들의 총 누적 이동 거리를 계산하여 선수의 활동량을 평가해보겠습니다.
- **문제 의도**
- 수학적 공식을 파이썬으로 구현
- 튜플 자료형의 이해
- 중첩된 자료형에 대한 이해
- **요구 사항**
- 함수명: `calculate_total_distances`
- 유클리드 거리 공식을 사용하여 각 위치 간 이동 거리를 계산
player_positions = {
    "John Doe": [(0, 0), (1, 1), (2, 2), (5, 5)],
    "Jane Smith": [(2, 2), (3, 8), (6, 8)],
    "Mike Brown": [(0, 0), (3, 4), (6, 8)]
}

def calculate_total_distances(player_positions):
	records = []
	for name, positions in player_positions.items():
		total_distance = 0 
		for i in range(len(positions)-1): # 오류나지 말라고 ~~
			x1, y1 = positions[i]
			x2, y2 = positions[i+1]
			# print(name,positions[i],positions[i+1])  #### 
			distance = ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5
			total_distance += distance
		records.append((name, round(total_distance,2)))
	return records # 여기서 round 쓰면 오류 => name 문자열값도 있으니까 


print(calculate_total_distances(player_positions))

 

 

 

## 문제 6: Github에 있는 데이터 불러오기

# - **배경**: Pandas의 read_csv 함수는 로컬에 저장된 자료 이외에도 인터넷에 있는 자료를 바로 불러올 수 있는 기능을 지원합니다. 또한 구분자가 쉼표(,)가 아니더라도 받아올 수 있습니다.
# - **문제 의도**
#     - pandas의 read_csv 함수의 이해
#     - ‘sep’ 전달 인자의 이해
# - **요구 사항**
#     - 함수명: `get_csv`
#     - 다음 Github 에 대한 데이터를 pd.read_csv를 이용하여 데이터를 불러오세요
#     - Hint) url은 다음과 같습니다.
#     - [`https://raw.githubusercontent.com/llm-bot-sparta/sparta_coding/refs/heads/main/flight_data.csv`](https://raw.githubusercontent.com/llm-bot-sparta/sparta_coding/refs/heads/main/flight_data.csv)

import pandas as pd

url = 'https://raw.githubusercontent.com/llm-bot-sparta/sparta_coding/refs/heads/main/flight_data.csv'

def get_csv(url):
	df = pd.read_csv(url, sep = ';')
	return df

get_csv(url) #감사합니다.

 

 

## 문제 7: 결측치 확인

# - **배경:** 데이터를 불러 왔을 때 각 컬럼에 결측치 유무를 확인하는 것은 중요합니다. 컬럼의 결측치를 확인해보세요.
# - **문제 의도**
#     - DataFrame의 함수를 활용
# - **요구 사항**
#     - 함수명: `get_missing`
#     - 컬럼별 결측치 수를 예시 결과와 같이 출력
import pandas as pd
df = get_csv(url) # 1번에서 불러온 df

def get_missing(data):
	return data.isna().sum()

get_missing(df)

 

 

## 문제 8: 조건에 맞는 데이터 출력하기

# - **배경:** Destination 기준으로 price에 대한 평균과 중앙 값을 동시에 구해주세요. 단, 값은 소수점 첫 번째 자리까지 표현해주세요.
# - **문제 의도**
#     - DataFrame의 집계 함수를 사용
# - **요구 사항**
#     - 함수명: `get_price`
#     - Destination 을 인덱스로, 평균과 중앙값을 컬럼으로하는 데이터프레임 반환
#     - 소수점 첫 번째 짜리까지 반올림
#     - 정렬은 필수사항 아님

import pandas as pd
df = get_csv(url) # 1번에서 불러온 df
def get_price(df):
    result = df.groupby('Destination')['Price'].agg(['mean', 'median']).round(1) # 대소문자 중요 ....
    return result

get_price(df)

 

 

## 문제 9: 수요일에 예약된 비행기 표 값 평균 구하기

# - **배경:** 특정한 날짜(Ex 수요일) 에 대한 평균 예약 금액을 조회하겠습니다.
# - **문제 의도**
#     - 날짜형 자료형 이해
#     - 불리언 인덱싱 활용
#     - Hint
#         1. 기존 날짜형 자료형을 바꿀 함수 찾기
#         2. [**Series의 dt**](https://pandas.pydata.org/docs/reference/api/pandas.Series.dt.html)의 함수 알아보기
#     - 문제의 푸는 방법은 단 1개가 아니며 여러가지가 나올 수 있음
# - **요구 사항**
#     - 함수명: `get_wed_price`
#     - 결과 값은 소수 값 1개가 나와야합니다.
#     - 소수점 첫 번째 짜리까지 반올림

import pandas as pd
df = get_csv(url) # 1번에서 불러온 df

def get_wed_price(df):
    df['Date_of_Journey'] = pd.to_datetime(df['Date_of_Journey'], dayfirst=True)
    wed_df = df[df['Date_of_Journey'].dt.day_name() == 'Wednesday']
    return wed_df['Price'].mean().round(1)

get_wed_price(df)

 

 

## 문제 10**: 출발 시간 기준 비행기 수 집계하기**

# - **배경:** 출발 시간마차 비행기 출발의 편차가 있는지 확인해보려합니다. 요구사항에 맞춰 아침,밤,오후,저녁으로 분류하여 수를 세보세요.
# - **문제 의도**
#     - 날짜형 자료형의 이해
#     - .apply  함수를 통한 기존 자료 재정의
#     - lambda 혹은 함수를 DataFrame에 적용하기
# - **요구 사항**
#     - 함수명: `get_cat`
#     - Dep_Time 컬럼 기준 아침(5시 이상 12시 미만), 오후(12시 이상 18시 미만), 저녁(18시 이상 24시 미만), 그 외시간 밤
#     - Airline 수 기준으로 내림차순 정렬 해주세요.
#     - 최종 결과물은 예시 결과와 같이 `reset_index()` 를 적용해주세요.

def get_cat(df):
    # 시간 추출한 데이터프레임(컬럼)
    df['hour'] = df['Dep_Time'].apply(lambda x: int(x.split(':')[0])) 
    
    # 시간대 분류 #
    def classify_time(hour):
        if 5 <= hour < 12:
            return '아침'
        elif 12 <= hour < 18:
            return '오후'
        elif 18 <= hour < 24:
            return '저녁'
        else:
            return '밤'
    
    # 시간대 분류가 된 데이터프레임
    df['time_cat'] = df['hour'].apply(classify_time)
    
    # 시간대별 비행기 수 세기
    result = df.groupby('time_cat')['Airline'].count().reset_index()
    result = result.rename(columns={'Airline': 'count'})
    
    # count 기준 내림차순 정렬
    result = result.sort_values(by='count', ascending=False).reset_index(drop=True)
    
    return result

get_cat(df)