데이터 분석

[day31] 어서와. Pandas 는 처음이지?

경 민 2025. 3. 18. 21:08
👩🏻‍💻  Point of Today I LEARNED 
📌 SQL
● 코드카타

📌 Python 
● pandas 과제 (1번~5번)
● 라이브세션 5회차 복습 (이상치 제거)

📌 아티클 미션
관계형 데이터베이스

 

 

우선 결측치 제거까지 복습 완료.. (제일 쉬운..)
내일 결측치 대체 + 이상치 개념 정리 하고 
실습 복습까지 가보자고.


1. SQL 

1-1. 코드카타 제한시간 두고 풀기
1) 코드카타 112번

https://leetcode.com/problems/count-salary-categories/description/

어제 고민한 내용

 
수평 결합은 생각도 못하고 수직 결합만 찾는 나 . . . . .
튜터님이 union 잊어버리지 말라고 하셨는데 잊어버린 나 . . .
재귀문이고 뭐고 그냥 union하셔요

 

  • 첫 번째 오답 : groupby 후 count(1)을 했다.
    • 문제 이유 : count(1)은 null 값을 무시하지 않고 센다. count(*)도 마찬가지 (이 기본적인 걸.. 핳) 
    • 해결 : count(1) → count(a.category)
with level as (
    select 'Low Salary' as category
    union
    select 'Average Salary' as category
    union
    select 'High Salary' as category
    )

select 
    l.category,
    coalesce(count(1),0) as accounts_count    -- ⚠️ count(1)
from level l
left join 
(select 
    case when income > 50000 then 'High Salary'
        when income >= 20000 then 'Average Salary'
        else 'Low Salary'
        end as category
from accounts) a
on l.category = a.category
group by l.category

2) 코드카타 115번

https://leetcode.com/problems/movie-rating/description/

  • 문제 포인트
    1. UNION
    2. RANK의 order by절에서 바로 집계 함수 적용 가능 (count,avg)
(select
    name as results
from
(select 
    u.name,
    rank() over(order by count(1) desc, u.name) as rnk
from users u
join movierating r
on u.user_id = r.user_id
group by u.user_id) a
where rnk = 1)
UNION
(select title as results
from
(select
    m.title,
    rank() over(order by avg(r.rating) desc, m.title) as rnk
from movies m
join movierating r
on m.movie_id = r.movie_id
where r.created_at < '2020-03-01'
group by m.movie_id) b
where rnk = 1)
Q. 이렇게 하면 안되려나?
rank() over(partition by u.user_id order by count(1) desc, u.name) as rnk
rank() over(partition by m.movie_id order by avg(r.rating) desc, m.title) as rnk

A. ❌ 값이 달라진다.
이유 : 저렇게 되면 그룹 내에서의 평균을 구해버림
내가 원하는 건 전체에서의 평균임! 그래서 바깥에서 group by 로 평균 구해주고 들어가야 함.

2. Python

2-1. pandas 과제
1) 5번

어제 빡세게 복습한 내용이다!

어제와 다른 점은

  1. dtstart, until 값 직접 만들어줘야 함(파생값)
  2. Date_of_Journey 컬럼 타입이 object 임

그렇다면 처음부터 형변환 해줘야하는군. (string → datetime)

이 때 힌트로 새로운 파라미터가 주어졌다.

🔻🔻🔻🔻🔻

 

 pd.to_datetime의 새로운 파라미터 

infer_datetime_format=True/False
: datetime이 어떤 형식인지 확인하고 자동으로 형변환해주는 파라미터
: 곧 없어질 예정
Q. 근데 dayfist=True랑 infer_datetime_format=True를 같이 써야하나?

dayfirst=True 를 해주면 이미 일/월/년 형식인걸 알려준 거기 때문에 굳이 infer~ 안 써줘도 됨
반대로 dayfirst=True 없이 infer~만 단독으로 사용하면 월/일/년 형식일 때에는 제대로 된 결과가 나오지 않을 수 있음.

 

🔻 문제에 적용해보자.

from dateutil.rrule import rrule, WEEKLY, WE

df['Date'] = pd.to_datetime(df['Date_of_Journey'], dayfirst=True, infer_datetime_format=True)
start_date = df['Date'].min()
end_date = df['Date'].max()

weekly_rule = rrule(WEEKLY, dtstart=start_date, until=end_date, byweekday=WE)

a=[]
for i in weekly_rule:
  a.append(i)

filter_wed = df[df['Date'].isin(a)]

average = filter_wed['Price'].mean()
print(average)
  • 해석
    1. pd.to_datetime으로 1차 형변환 (string → datetime)
    2. infer_datetime_format으로 원하는 형식으로 바뀐 거 확인
    3. 생긴 게 'YYYY-MM-DD'인 것 뿐이지 'Date' 컬럼은 datetime 형식이다.
    4. 따라서 min, max 함수 적용 가능!
    5. 어차피 원하는 형식으로 바뀌어있으니까 굳이 마지막에 string 으로 다시 변환해서 형식 바꿔줄 필요 없음!
  • dayfirst = true와 format 지정의 차이가 있을까?
    • df['Date'] = pd.to_datetime(df['Date_of_Journey'], format='%d/%m/%Y')
    • df['Date'] = pd.to_datetime(df['Date_of_Journey'], dayfirst=True)

 

모든 컬럼값이 / - ,  등 같은 형식으로 되어있으면 format으로 명확히 지정해줘도 되는데

하나라도 다른 형식이 있으면 오류가 난다. 그러니 dayfist=True를 범용적으로 사용해주자!

 


2-2. 라이브세션 5회차 복습
1) 결측치 제거 방법

## 열 단위 제거
df3.dropna(axis=1) #결측치가 하나라도 있으면 그 열 전부 삭제

df3.dropna(axis=1, how='all') #전체 열이 결측값이면 그 열 전부 삭제
df3 = df3.drop('Unnamed: 4', axis=1) #'Unnamed: 4' 컬럼 삭제 <- df.isna().sum() 으로 선파악 후삭제 case

## 행 단위 제거
df3.dropna(axis=0, how='all') #전체 행이 결측값이면 그 행 전부 삭제

df3.dropna()
df3.dropna(axis=0, how='any') #결측치가 하나라도 있으면 그 행 전부 삭제
  • 기타 옵션
    • inplace = True/False
      • True → 원본 바로 업데이트(덮어쓰기)
      • False(기본값)  → 원본 변경하지 않음/ 새로운 변수 필수

3. 아티클 미션

 

[아티클 미션] -16 관계형 데이터베이스

양질의 데이터를 판별하는 5가지 방법 : 3 관계형 데이터베이스인가? | 요즘IT보통 빅데이터의 특성을 이야기할 때 3V라는 단어를 언급하는 경우가 많습니다. Velocity(속도), Volume(양), Variety(다양성)

rosenps3.tistory.com