데이터 분석

[day30] 파이썬 파이팅이다 이거야

경 민 2025. 3. 17. 21:26
👩🏻‍💻  Point of Today I LEARNED 
📌 Python 
● 코드카타 (리스트 컴프리핸션)
● 라이브세션 4회차 복습 (pivot, split+lambda, rrule) 확실하게 이해 안됐던 부분 이제 확실히 이해함!
● 전처리 강의 개념 정리 ➜ dataframe 활용법 이론+실습_찐_최종_이게진짜@ 

📌 SQL
● 코드카타 111번

 
점점 파이썬에 대한 이해도가 올라가는게 느껴진다.
뭐가 뭔지 이제 좀 알겠음..
내일은 시각화 이론 + 실습 도장깨보자잉


1. Python

2-1. 코드카타 
1) 9번 - 정수 n 이하의 짝수의 합
방법1. 원초적으로 풀었다.

def solution(n):
    total_sum = 0
    for i in range(n+1):
        if i % 2 == 0:
            total_sum += i
    return total_sum

 
방법2. if문 없이 step 파라미터를 활용

def solution(n):
    return sum([i for i in range(2,n+1,2)])

다른 풀이 보면서 배운 방법!
아예 처음부터 2부터 시작해서 2씩 건너뛰는 거다.
 

2) 14번 - 약수의 합
방법1. 약수 리스트에 담고 반복문으로 더하기

  • 첫 번째 오답
    • 원인1 : answer 을 반복문 안에 넣어버림
      • 이렇게 되면 약수 발생할 때마다 answer 값은 0으로 초기화됨.
      • 결국 마지막 약수값 반환하는 꼴이 됨
      • 해결 : 나는 모든 약수 값을 다 더하고싶으니까 → answer값을 바깥으로 빼자!
    • 원인2 : 두 번째 for문 들여쓰기 잘못함 ⭐️
      • 이렇게 되면 중첩으로 더해짐
      • ex) n= 6 / i = 2 일 때, 1+2 가 아니라 1 + (1+2) 가 되어버림.
      • 해결 : 일단 약수값 다 만들어놓고 한 번에 더하자 → for문 같은 라인으로 재배치

오답

  • 정답 코드
def solution(n):
    result = []
    answer = 0
    for i in range(1,n+1):
      if n % i == 0:
        result.append(i)
        
    for num in result:
      answer += num  
    return answer

 

 

  • 더 나은 버전

방법2. 리스트 컴프리핸션 + sum()

def solution(n):
    result = [i for i in range(1,n+1) if n % i == 0]
    return sum(result)

 
3) 15번 - 나머지 1을 만드는 가장 작은 자연수 구하기

def solution(n):
    answer = [i for i in range(1,n) if n % i ==1]
    return min(answer)

 

직전에 학습한 리스트컴프리핸션 활용!!

며칠 전까지만 해도 까막눈이었는데 10초만에 풀었당 오예 ˚。・゚✧


 
2-2. 라이브세션 4회차 복습
1) pivot

pd.pivot_table(df, index =' ', columns=' ' , values = ' ', aggfunc = ' ')
  • 내가 원하는대로, 내가 보고싶은 데이터프레임을 만들 수 있음.
  • 파라미터
    • index(축), colums(열), values(집계할 컬럼), aggfunc(집계함수)
    • fill_value(NaN 치환값 설정), dropna(결측치 삭제 여부), sort(index or columns 기준 정렬)
      • aggfunc : sum, mean, std, count, unuique, max, min, ...
      • sort 파라미터 사용 대신 마지막에 .sort_values() / .sort_index() 해도 됨 (내림차순 가능)
  • 리스트로 묶어서 복합적으로 생성할 수도 있음.

2) lambda, split 결합

✅ 주요 학습 포인트

  • series 형태일 때 split 쓰려면 df['컬럼명'][0] 붙여줘야한다.
    • 이유: seires 구조 그 자체는 split 안되니까 (당연)

  • 응용 👀
    • 상황 : aa, bb, cc, ... gg 값을 각각 다른 컬럼에 하나씩 집어넣고 싶다
    • 알고리즘 
      1. 컬럼 이름을 동적으로 붙여서 생성해준다. 'a{}'.format(i) 또는 f'a{i}'
      2. 그 컬럼을 어떻게 만들건지 apply 함수로 명령 (df2['x'] 는 series 형식)
      3. lambda(x: x.split('.')[i] if len(x.split('.')) > i else None)
        • "len(x.split('.'))값이 i보다 클 때까지만 x.split('.')의 인덱스 i 값을 보여줘"
        • ex) i = 1 일 때, 컬럼 a1에 x.split('.')[1] 즉, bb 집어 넣어줘

Q1. if 문이 꼭 필요한가?
A. YES. 
이유 : i=3일 때, len(x.split('.'))이 4면 마지막 하나 어디에다가 넣어. 넣어줄 컬럼이 없어
컬럼이 더 많으면 많았지 부족하면 안돼.

Q2. for i in range(len(df2['x'][0].split('.')):        이렇게 하면 안됨?
A. 응 안돼
이유 : 여기서는 컬럼 x의 모든 값이 동일해서 상관없지만, 행마다 '.' 개수가 달라지면 indexerror 남

 
3) rrule

from dateutil.rrule import rrule
rrule(freq, dtstart=datetime(y,m,d), until=datetime(y,m,d)
  • dateutil 라이브러리 함수
  • 날짜데이터를 원하는 기준에 맞춰서 가져올 수 있다.
  • 불러올 때 사용할 freq도 같이 불러와야 함
  • 주요 옵션
    • freq : 반복 주기 파라미터 (SECONDLY, MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY)
    • dtstart : 반복 시작 날짜, 시간
    • interval : 주기적으로 반복되는 간격 (step)
    • count : 생성할 날짜의 최대 수
    • until : 반복 끝 날짜, 시간
  • 예시
# 2024-03-01 부터 연 단위로 날짜 3개 구하기
from dateutil.rrule import rrule, YEARLY

from datetime import datetime

dates = rrule(YEARLY, dtstart=datetime(2024, 3, 1), count=3)

for date in dates:
  print(date.strftime('%Y-%m-%d'))
  
# 출력값
# 2024-03-01
# 2025-03-01
# 2026-03-01
Q1. 함수 불러올 때 , from dateutil import rrule 이렇게 하면 안되나?
A1. 안됨. dateutil = 라이브러리 , rrule = dateutil 안의 하위 모듈
from dateutil.rrule import rrule 이렇게 해야 정확히 rrule '함수'를 불러옴
  • 실습 (Dataframe ver.)

  • 상황 : Time stamp에서 수요일인 날짜만 가져오고 싶다.
  • 알고리즘
    1. 수요일인 날짜만 담은 리스트 a 생성
    2. Time stamp 형변환한 새로운 컬럼 Time stamp2 생성
      • (string → datetime  → string) 순서로 형변환 할거임
      • string → datetime 이유 : 비교할 리스트 값들이 datetime 형식이니까.
      • datetime → string 이유 : 원하는 날짜 형태로 출력하려고
    3. a 리스트에 있는지 확인하는 조건 만들어서 출력
# 수요일만 가져오는 리스트 a 생성
from datetime import datetime
from dateutil.rrule import rrule, WEEKLY, WE

start_date = datetime(2023, 2, 1)
end_date = datetime(2023, 3, 1)

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

a=[]
for date in weekly_rule:
  a.append(date.strftime('%Y-%m-%d'))

# Dataframe에 적용 
df3['Time stamp2'] = pd.to_datetime(df3['Time stamp'], dayfirst=True).dt.strftime('%Y-%m-%d') #series라서 dt.strftime

df3[df3['Time stamp2'].isin(a)]

 


 

2-3. 데이터 전처리 & 시각화 강의 복습
1) 전처리를 왜 하는지 목적과 목표, 효과를 명확하게 설정하고 인지하자.

2) 조건에 만족하는 행 추출 3가지 방법

 

    • 응용
      • 조건을 변수에 담아서 보기 (조건 여러 개일 때 직관적임) 👍🏼

 
3) loc / iloc 차이

loc iloc
.loc[x:y] = x행 이상 y행 이하 .iloc[x:y] = x행 이상 y행 미만
문자열 추출 가능 인덱스 번호로만 추출 가능
인덱스 번호로 열 추출 불가 행, 열 
조건 만족하는 행 추출 가능 조건 지정 불가

 
4) groupby 응용

  • .agg(list)

 

  • 컬럼마다 각각 다른 집계 하고싶을 때
data = {
    'Category': ['A', 'A', 'B', 'B', 'A', 'B'],
    'SubCategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
    'Value1': [1, 2, 3, 4, 5, 6],
    'Value2': [10, 20, 30, 40, 50, 60]
}
df = pd.DataFrame(data)

# 'Category','SubCategory'별 'Value1'의 합, 평균과 'Value2'의 합 계산
grouped_multiple = df.groupby(['Category', 'SubCategory']).agg({'Value1': ['sum', 'mean'], 'Value2': 'sum'})

print(grouped_multiple)

 


2. SQL 

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

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

 
재귀문 이용해서 컬럼 만들어주려고 했으나 실패
이유 : 스칼라 서브쿼리는 행 하나만 가능하니까.. 그렇다고 인라인뷰로 넣자니 어차피 account_id로 연결되니까 안됨.
혹시 그냥 크로스 조인해버릴까...?
까지 생각하고 일단 오늘은 여기까지. . .