# 문제 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)