세조목

TIL(Today I Learned)8일차(23.12.07) 본문

데이터 분석 공부/TIL(Today I Learned)

TIL(Today I Learned)8일차(23.12.07)

세조목 2023. 12. 7. 21:39

1. SQL

 1) 프로그래머스 42번 문제

https://school.programmers.co.kr/learn/courses/30/lessons/151136

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

42번 문제 요구사항이다.

 - 자동차 종류 : SUV

 - 평균 일일 대여 요금

    * 소수 첫 번째 자리에서 반올림

    * 컬럼명은 AVERAGE_FEE

select round(avg(daily_fee)) 'AVERAGE_FEE'
from car_rental_company_car
where car_type = 'SUV'

입력해야하는 코드 자체는 간단하다.

하지만 이번 문제에서 반올림 기능이 있는 ROUND 함수에 대해서 처음 알게 됐다.

입력해야하는 인자는 아래와 같다.

ROUND(값, 몇번째 소수점까지 표시할지)

문제에서는 소수 첫 번째 자리에서 반올림(=소수점 표시 X)이기 때문에 두번째 인자 자리에 별도의 숫자는 입력하지 않았다.

 

 2) 프로그래머스 43번 문제

43번 문제 요구사항이다.

 - 완료된 중고 거래

 - 총금액이 70만원 이상

43번 문제의 경우 이전에 한번 정리한적이 있는데

where절에 집계함수나 별칭으로 만든 함수를 사용할 수 없다는 점을 놓쳤다.

요구사항 중 하나인 '총 금액이 70만원 이상'을 코드로 작성하면 'total(price) >= 700000' 인데 집계함수이기때문에

where 절에 작성할 수 없다. 그래서 이 코드는 having 절에 적어주고

where절에는 status='DONE'을 적어줘야한다.

그렇게 했을때 코드는 아래와 같다.

select b.user_id,
       b.nickname,
       sum(a.price) 'TOTAL_SALES'
from used_goods_board a join used_goods_user b on a.writer_id = b.user_id
where status = 'DONE'
group by 1
having sum(a.price) >=700000
order by sum(a.price)

 

 3) 프로그래머스 44번 문제

https://school.programmers.co.kr/learn/courses/30/lessons/131530

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제에서는 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL문을 작성하라고 요구한다.

동시에 가격대 정보는 각 구간의 최소금액(EX. 10,000 이상~20,000 미만 구간의 경우 10,000 표시)으로 표시해야한다.

처음에는 CASE WHEN으로 각각의 구간을 모두 나눠봤는데 너무 코드가 길어져서 다른 코드를 찾아보던 중

CASE WHEN을 사용하지 않고도 요구사항을 충족할 수 있는 코드가 있었다.

바로 '% 10000'를 사용하는 것이다.

%는 나눗셈 했을때 나머지를 나타내는 기호이다.

SELECT (PRICE - (PRICE % 10000)) 'PRICE_GROUP',
       COUNT(PRODUCT_ID) 'PRODUCT'
FROM PRODUCT
GROUP BY 1
ORDER BY 1

%를 적용했을때의 코드는 위와 같은데

예를 들어 PRICE가 13000원이라고 했을때 나머지는 3000이다.

3000을 13000에다가 빼주면 남는 값은 10000이된다.

어떤 숫자를 입력해도 각 구간의 최소금액이 나온다.

 

 4) 프로그래머스 45번 문제

https://school.programmers.co.kr/learn/courses/30/lessons/131120

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

45번 문제 요구사항이다.

 - 생일이 3월

 - 성별이 여성

 - 전화번호가 NULL인 경우는 제외

모두 WHERE절에 작성하는데 전화번호가 NULL인 경우는 제외해야하기때문에

WHERE TLNO IS NOT NULL 로 적어준다.

알고 있던 내용이긴하나 보통 WHERE 절에서 = 를 많이 쓰는 나이기에 IS NOT을 사용하는걸

깜박할수도 있을것 같아서 이렇게 정리해본다.

 

2. PYTHON

https://youtu.be/u_X6a61KQNQ?si=-srPxCGfHc-JX9sr

 

 

어제와 마찬가지로 오늘도 코드 뜯어보기 영상을 보면서 python공부를 했다.

 

1.

cluster[cluster['price_per_sqft'] < 756]
 → cluster['price_per_sqft'] < 756 인 애들을 인덱싱 해주는 코드임
테이블명[ ] 이 인덱싱하는 코드니까


2.

if절에서 print만 작성하면 저장은 안 됨
저장하려면 return을 적어줘야 함


3.

def로 새로 만든 get_group(x)에는 하나의 값만 입력할 수 있기때문에
x에 sf.neighborhood를 넣으면 error가 난다.

여러개의 값을 넣고자 할 때 필요한 것이 apply함수이다.
sf['group'] = sf.neighborhood.apply(get_group)


4.

def get_group2(x):
  if x['price_per_sqft'] < 756:
    return 'low_price'
  elif (x['price_per_sqft'] >= 756) & (x['freq'] < 123):
    return 'high_price_low_freq'
  else:
    return 'high_price_high_freq'

cluster.apply(get_group2)
apply로 함수를 적용해주면 indexing값을 행단위로 먼저 검색하기때문에 오류가 남
그래서 axis = 1을 적어줘서 열 순서로 검색하게끔 만들어줘야함
cluster.apply(get_group2, axis = 1)


5.

sf.merge(group2)
sf테이블에 group2 테이블을 결합


6.

pd.get_dumies( )
텍스트로된 변수들을 0과 1로 변환