학습 정리 - SQL, pandas (1) (2025.02.05)

수아·2025년 2월 5일
0

학습 정리

목록 보기
19/51
post-thumbnail

회고 리스트

1.아래처럼 데이타가 나오도록 데이타 프레임을 만들어 보시오

            시가	고가	저가	종가
삼성전자		980		80		70		90
카카오		980		80		70		90
네이버		980		80		70		90

import pandas as pd

index = ["삼성전자", "카카오", "네이버"]
data = {
            "시가" : [980, 980, 980],
            "고가" : [80, 80, 80],
            "저가" : [70, 70, 70],
            "종가" : [90, 90, 90],
        }

df_stock = pd.DataFrame(data = data, index = index)

2. 아래와 같이 출력이 나오도로 하시오.

close = [42500, 42550, 41800, 42550, 42650]
open = [42600, 42200, 41850, 42550, 42500]
index = ['2019-05-31', '2019-05-30', 
			'2019-05-29', '2019-05-28', '2019-05-27']

open = Series(data=open, index=index)
close = Series(data=close, index=index)

# 출력 : 
# 종가가 시가보다 높을 때만 출력
#2019-05-30    42550
#2019-05-27    42650
#dtype: int64

cond = close > open

print(close[cond])
# print(open[cond])시 종가가 시가보다 높을 때의 시가가 출력

3. 아래의 데이터를 정렬하시오.

data = [3.1, 2.0, 10.1, 5.1]
index = ['000010', '000020', '000030', '000040']
s = Series(data=data, index=index)


# 출력 : 
# dtype: float64
# 000030    10.1
# 000040     5.1
# 000010     3.1
# 000020     2.0
dtype: float64

4. 아래의 데이터가 아래와 같이 출력 되도록 하시오.

s = pd.Series([1234, 5678, 9876])

#==출력
# 0    작다
# 1    크다
# 2    크다
# dtype: object

def is_over_5000(x) : 
    if x > 5000 : 
        result = "크다"
    elif x < 5000 : 
        result = "작다"
    else : 
        result = "같다"

    return result

print(s.map(is_over_5000))

5. 데이타 프레임을 생성하는 3가지 방법은 ?

1) 딕셔너리(dict) 사용

: 칼럼명을 키로 하고 값을 리스트 형태로 만들어 DataFrame 생성

import pandas as pd

data = {
          "이름": ["김은수", "박정민", "이하나"],
          "나이": [35, 30, 28],
          "직책": ["과장", "대리", "대리"]
      	}

df = pd.DataFrame(data)
print(df)

2) 리스트(list)의 리스트를 사용

: 2차원 리스트를 이용해서 DataFrame 생성

data = [
          ["김은수", 35, "과장"],
          ["박정민", 30, "대리"],
          ["이하나", 28, "대리"]
      	]

df = pd.DataFrame(data, columns=["이름", "나이", "직책"])
print(df)

3) 리스트(list)와 딕셔너리(dict) 사용

: 각 행을 딕셔너리로 만들어 리스트로 감싸서 DataFrame 생성

data = [
          {"이름": "김은수", "나이": 35, "직책": "과장"},
          {"이름": "박정민", "나이": 30, "직책": "대리"},
          {"이름": "이하나", "나이": 28, "직책": "대리"}
		]

df = pd.DataFrame(data)
print(df)

데이터 베이스

1. 부서별 급여의 총합을 출력

select deptno, sum(sal) as sal
from emp
group by deptno;

2. 급여가 1000인 이상인 사원들의 부서별 평균 급여를 출력해보세요.

단, 부서별 평균 급여가 2000이상인 부서만 출력하세요

select deptno, round(avg(sal), 2) as avg
from emp
group by deptno
having avg(sal) >= 2000;

문제를 잘못 읽어서

select deptno, round(avg(sal), 2) as avg
from emp
where sal >= 2000
group by deptno;

이렇게 짠 다음 왜 위에는 having이지?? 싶어서 where로 바꿨다가 에러났다.
avg()같은 집계 합수는 where절에서 사용할 수 없다는 이유였다.
몰랐던 걸 알게 됐구만...


3. 카테이션 곱이란?

카테시안 곱(Cartesian Product)은 두 테이블의 모든 조합을 생성하는 연산이다.
SQL에서 JOIN 조건 없이 FROM table1, table2 또는 CROSS JOIN을 수행하면 발생한다.
두 테이블의 모든 행을 조합하여 결과(M x N 개)를 생성한다.

4.커미션이 null이 아닌 사원의 이름, 입사일, 부서명을 출력해보세요

select e.ename, e.hiredate, d.dname
from emp e join dept d
on e.deptno = d.deptno
where e.comm is not null;

5. 각 사원의 이름과 매니저 이름을 출력하세요.

select e1.ename, e2.ename as mgr
from emp e1 join emp e2		# 셀프 조인
on e1.mgr = e2.empno;

3줄요약
1. group by 는 해당 컬럼명으로 먼저 분류를 시킨다.
2. 조인이란 두개의 테이블에 대한 카테이션 곱을 의미한다.
3. 데이타 프레임은 시리즈를 1개이상 만들고 컬럼명을 붙인다.

0개의 댓글