[25.03.19] 본캠프 21일차 코드카타+라이브세션 +개인과제+오늘 학습회고

김명서·2025년 3월 19일
2

TIL_sparta

목록 보기
42/60
post-thumbnail

코드카타

  1. Percentage of Users Attended a Contest
round(((count(r.user_id)/(select count(*) from users))*100),2)
        as percentage
where r.contest_id is not null
  1. Queries Quality and Percentage
select query_name
, round(avg(rating/position),2) as quality
, round(((sum(case when rating <3 then 1
else 0 end))/count(1)*100),2) as poor_query_percentage
from Queries 
where query_name is not null
group by 1
  1. Monthly Transactions I
select date_format(trans_date,'%Y-%m') as Month
, country
, count(*) as trans_count
,sum(case when state='approved'then 1
else 0 end) as approved_count
,sum(amount) as trans_total_amount 
,sum(case when state='approved'then amount
else 0 end) as approved_total_amount
from Transactions
group by 1,2

이게 best code라고 한다.

📌몰랐던 사실
:sum((state='approved') * amount) 처럼 작성할 수도 있구나...? 이부분 관련해서는 나중에 더 찾아봐야겠다.


라이브세션 복습

어제 배웠던 코드들을 실습으로 진행했다.

# Interaction type 의 결측치: 423개
df3.isnull().sum()

# 결측치 count ❌
df3.groupby('Interaction type')['product id'].count().reset_index()
#각각 1145,855,871이 나온다

#수치로 계속 올바르게 작성한게 맞는지 확인해보는게 매우 중요하다 !! ⭐ 
3294 - (1145+855+871)
#423
# 인덱스 번호를 매겨서 특정 행의 결측치만 확인해볼 수도 있다. 
df.isnull().sum()[13]

# str.split 을 통해 문자열을 분리하고, 
#그 값 중 첫번째 인덱스를 가져옴
# df['sw'] = dd['Shipping Weight'].str.split().str[1]과 비교!
df['sw'] = df['Shipping Weight'].str.split().str[0]

🔻

  • 결측치 대체: group by
# 이렇게 특정 변수에 담아주지 않으면 전체 필터링이 되고 
#가독성이 떨어질 수 있어서 da, db만들어서 담아주는 듯
da = df[df['Is Amazon Seller']=='Y']
db = df[df['Is Amazon Seller']=='N']

#마찬가지로 여기에서도 검증을 거쳤다.
# Is Amazon Seller 컬럼에 따른 sw 결측값 확인하기(검증과정)
df.isnull().sum()[28], da.isnull().sum()[28], db.isnull().sum()[28]

일단 과제 먼저 마무리 해야할 것 같아서 복습은 오늘 여기까지만 했다.
그치만 맨 아래 작성한 학습회고에 이후 복습 내용이 겹치는 게 몇개 있긴하다 !!


개인과제

필수 1. 데이터 불러오기

Python 라이브러리를 활용하여, 구글 드라이브의 CSV 파일을 DataFrame으로 읽어오는 코드를 작성해주세요.
테이블의 행과 열 개수를 확인해주세요.
테이블의 처음 5줄을 확인해주세요.

import pandas as pd

from google.colab import drive
drive.mount('/content/drive')

#Python 라이브러리를 활용하여, 구글 드라이브의 CSV 파일을 DataFrame으로 읽어오는 코드를 작성해주세요.
df = pd.read_csv("/content/drive/MyDrive/Python 라이브세션/flight_data_homework.csv")
#테이블의 행과 열 개수를 확인해주세요.
df.shape
#테이블의 처음 5줄을 확인해주세요.
df.head()

필수 2. 결측치 처리

import pandas as pd

df = pd.read_csv("/content/drive/MyDrive/Python 라이브세션/flight_data_homework.csv")

#각 컬럼별 결측치 개수를 구해주세요.
df.isna().sum()

#결측치가 있는 행을 모두 제거해주세요.
df.dropna()

필수 3. 조건에 맞는 데이터 추출하기

import pandas as pd

df = pd.read_csv("/content/drive/MyDrive/Python 라이브세션/flight_data_homework.csv")

#데이터프레임의 Destination 컬럼 기준 price의 평균값과 중앙값을 동시에 구해주세요. 
#단, 값은 모두 소수점 첫번째 자리까지 표현해주세요.
df.groupby('Destination')['Price'].agg(['mean','median']).round(1)

#데이터프레임의 Airline, Total_Stops 기준 Route 컬럼을 중복값 없이 추출해주시고, 인덱스를 재정렬해주세요. 
#이를 df2 라는 dataframe 으로 받아주세요.
df2 = df.groupby(['Airline','Total_Stops'])['Route'].unique().reset_index(drop=True)
#df2

필수 4. 조건에 맞는 데이터 추출하기2

import pandas as pd

df = pd.read_csv("/content/drive/MyDrive/Python 라이브세션/flight_data_homework.csv")

#피벗테이블을 구현하여 출발지와 도착지를 기준으로 한 Airline을 카운트해주세요. 그리고, 카운트 값을 기준으로 내림차순 정렬해주세요.
pd.pivot_table(df,index=['Source','Destination'], values='Airline', aggfunc='nunique').sort_values(by='Airline', ascending=False)

#Airline 컬럼이 Air India 이고, Price 컬럼이 7000 이상인 데이터를 필터링 해주세요.
mask = (df['Airline']=='Air India') & ((df['Price']>=7000))
df[mask]

첫번째 문제를 원래
aggfunc='count'로 풀었었다. 저번 조 팀원분들이 감사하게도 팀스터디를 제안해주셔서 같이 답을 맞춰봤는데, Airline (nunique값 12개)의 개수니까 4xxx개가 나오는게.. 이상하다라고 인사이트를 공유해주셨다.
나도 미처 이 생각은 못했던 것 같아, 중복제거로 수정해서 제출해보려한다..!

.
.

도전 1. 조건에 맞는 데이터 추출하기3

import pandas as pd
df_date = pd.read_csv("/content/drive/MyDrive/Python 라이브세션/flight_data_homework.csv", parse_dates=['Date_of_Journey'], dayfirst=True, infer_datetime_format=True)
#df_date.head()

min_Date_of_Journey = df_date['Date_of_Journey'].min()

from datetime import datetime
from dateutil.rrule import rrule, WEEKLY, WE

start_date = min_Date_of_Journey

weekly_rule = rrule( DAILY, dtstart=start_date,byweekday=WE )
df_wed = df_date[df_date['Date_of_Journey'].isin(weekly_rule)]
#df_wed.head()

answer = df_wed['Price'].mean().round()
print(answer)

9278.0

반올림 하지 않으면,
9277.51418951419

도전 2. 조건에 맞는 데이터 추출하기4

import pandas as pd
#import numpy as np

df = pd.read_csv("/content/drive/MyDrive/Python 라이브세션/flight_data_homework.csv")

time = pd.to_datetime(df['Dep_Time'], infer_datetime_format=True)
df['time2']=  time.dt.hour
#df['time2']
df['Dep_Time_Zone']= df['time2'].apply(lambda x: '밤' if 0 <= x < 5 else ('아침' if 5 <= x < 12 else ('낮' if 12 <= x < 18 else '오후')))
df['Dep_Time_Zone'].value_counts()

🔻
count
Dep_Time_Zone
아침 4912
오후 2702
낮 2604
밤 465

dtype: int64

과제하면서 참고했던 링크들

byweekdy

lambda함수에서 if 사용


오늘 학습회고

  1. daa = da[da['sw'].isnull()==True] 이 코드에서 ==True 이게 없으면?

코드 가독성을 높이기 위해 사용되기도 하지만,
da['sw'].isnull() 자체가 이미 불리언(Boolean) 시리즈를 생성
=> == True는 불리언 시리즈의 각 값이 True인지 다시 확인하는 단계

결론: da['sw'].isnull()이 이미 불리언이므로, ==True 없이도 da[da['sw'].isnull()]로 충분히 동작함.

  1. df1 데이터프레임에서 '이상치여부' 열에 있는 '이상치' 값만 카운트하려면
count_outliers = df1['이상치여부'].value_counts()['이상치']

3.df이름['칼럼이름'].unique()와 drop_duplicates 는 같은 기능인가?

  1. df['칼럼이름'].unique()
    기능: 지정한 열(칼럼이름)의 고유 값들을 넘파이 배열(Numpy array) 형태로 반환
    대상: 단일 열(Series)에만 적용 가능.
    결과: 중복 없는 값들만 담긴 배열. 예: array([1, 2, 3]).

  2. df['칼럼이름'].drop_duplicates()
    기능: 지정한 열에서 중복을 제거한 판다스 시리즈(Pandas Series)를 반환
    대상: 단일 열(Series)에 적용하며, 데이터프레임 전체에도 사용 가능(df.drop_duplicates()).
    결과: 중복 없는 값들을 시리즈로 반환. 예: 0 A, 1 B, 2 C (인덱스 포함).

결과적으로 중복 없는 값을 추출한다는 점은 비슷하지만, 반환 형식과 사용 맥락이 다르다.

.unique()는 간단히 고유 값 배열이 필요할 때, .drop_duplicates()는 시리즈 형태로 작업을 이어가거나 데이터프레임 전체를 다룰 때 유리 !!!

단순히 고유 값 확인은 .unique()로, 데이터 구조를 유지하며 다룰 땐 .drop_duplicates()를 활용하면 되겠다!!

df2 = df.groupby(['Airline','Total_Stops'])['Route'].unique().reset_index(drop=True) 이렇게 작성한 코드는 인덱스가 0부터 27까지,
df2 = df.groupby(['Airline','Total_Stops'])['Route'].nunique() 이렇게 작성한 코드는 209개가 나온다.

왜 결과가 다를까?

.unique(): 고유 값 자체를 나열 → 결과 행 개수는 그룹 수(28개).
🔻🔻
.unique(): 'Route'의 중복 없는 값 리스트를 추출 → 데이터프레임으로 고유 경로를 확인하고 싶을 때 적합.

.nunique(): 고유 값의 개수를 계산 → 결과는 각 그룹별 숫자. 실제로는 .nunique() 결과를 .sum()하면 전체 고유 'Route' 개수를 알 수 있겠다.
🔻🔻
.nunique(): 'Route'의 중복 없는 값 개수를 추출 → 통계나 개수 분석이 목적일 때 적합.

핵심 차이: .unique()는 값을, .nunique()는 개수를 다룸.

python에서 평균은 avg가 아니라 mean이다.

도전1 문제 풀면서 반복문 썼다가, 반복문을 잘못썼는지 무한 반복됐다. 강제 종료시켰다..

lambda함수에서 elif를 못쓰는 대신, else이후 괄호를 열고 inline if문을 이어서 작성해나갈 수 있다.



느낀점& 회고

오늘자 라이브 세션을 다 복습하지 못한게 아쉬움이 남지만,
과제를 풀면서 + 같이 팀 스터디를 진행하면서 다시 복기한 내용들이 소중하게 느껴지기도 한다.
내일 해설 세션을 듣고 이상치 후반부터 다시 복습해봐야겠다. 꼭 시각화도 남은 2개 듣고 !!!
얼른 내일 해설이 듣고싶다 !!
그리고 .. 기초 프로젝트 발제 뭔가 떨린다.......ㅎㅎ..
QR 체크인 잊지말자 !!!!🚀💨🍀

profile
경영학도의 데이터분석 성장기💥

0개의 댓글

관련 채용 정보