Python 실습 | 데이터 조회, 정렬, 조건 필터 / 데이터 합치기 / iris 데이터 활용 / 삼성전자 주가 데이터 처리

2024. 12. 24. 17:19·Python

문제1.  데이터 조회, 정렬, 조건 필터

  1. 출제의도
    • 데이터를 조회, 정렬, 조건에 따른 필터링을 할 수 있다.
  2. 배경
    • 타이타닉 데이터는 타이타닉호 생존자, 사망자에 관한  데이터입니다. 다음 컬럼 설명을 참고하여, 요구사항에서 요구하는 데이터를 조회하세요.
    • 컬럼(column) 설명 
      • survivied: 생존여부 (1: 생존, 0: 사망)
      • pclass: 좌석 등급 (1등급, 2등급, 3등급)
      • sex: 성별
      • age: 나이
      • sibsp: 형제 + 배우자 수
      • parch: 부모 + 자녀 수
      • fare: 좌석 요금
      • embarked: 탑승 항구 (S, C, Q)
      • class: pclass와 동일
      • who: 남자(man), 여자(woman), 아이(child)
      • adult_male: 성인 남자 여부
      • deck: 데크 번호 (알파벳 + 숫자 혼용)
      • embark_town: 탑승 항구 이름
      • alive: 생존여부 (yes, no)
      • alone: 혼자 탑승 여부
  3. 요구사항
    • 나이가 20살 이상 40살 미만인 승객
    • pclass가 1등급 혹은 2등급인 승객
    • 열(column)은 survived, pclass, age, fare 만 나오게 출력
    • 10개만 출력
  4. 다음 조건을 만족하는 코드를 입력하세요.
  5. Skeleton code
import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

💡 문제 풀이 

`내 풀이`

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

df = df[['survived','pclass','age','fare']]

condition1 = (df['age'] >= 20) & (df['age'] < 40)
condition2 = (df['pclass'] == 1) | (df['pclass'] == 2)
condition = condition1 + condition2

df[condition]

df.head(10)

`모범답안`

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

condition1 = (df['age'] >= 20) & (df['age'] < 40)
condition2 = (df['pclass'] < 3)
df.loc[condition1 & condition2, ['survived', 'pclass', 'age', 'fare']].head(10)

`오답노트`

  • 아직도 ==을 =으로 써서 오류남..ㅎ

문제 2.  데이터 합치기 및 컬럼 생성

  1. 출제의도
    • 데이터를 합치고 조건에 따른 컬럼을 생성할 수 있다.
  2. 배경
    • 간단한 고객 데이터와 주문 데이터를 합치고, 주문여부에 따라 고객을 분류하고자 합니다.
  3. 요구사항
    • 고객 테이블(customers)를 기준으로 주문 테이블(orders)를 합쳐주세요. 주문 금액이 없는 고객도 모두 포함되어야 합니다.
    • 주문 금액이 없는 경우, 0으로 표현하세요.
    • 주문금액이 있는 경우 "구매", 주문금액이 0인 경우 "미구매"로 분류하는 "구매여부" 칼럼을 생성하세요.
      • df출력 (결과칼럼: 고객번호, 이름, 금액, 구매여부)
  4. Skeleton code
import pandas as pd
import numpy as np

#고객 테이블
customers = pd.DataFrame({

    '고객번호': [1001, 1002, 1003, 1004, 1005, 1006, 1007],

    '이름': ['승철', '동경', '예나', '혜연', '장훈', '채운', '다연']

})

#주문 테이블
orders = pd.DataFrame({

    'cno': [1001, 1001, 1005, 1006, 1008, 1001],

    '금액': [10000, 20000, 15000, 5000, 100000, 30000]

})

💡 문제 풀이 

`내 풀이`

import pandas as pd
import numpy as np

#고객 테이블
customers = pd.DataFrame({

    '고객번호': [1001, 1002, 1003, 1004, 1005, 1006, 1007],

    '이름': ['승철', '동경', '예나', '혜연', '장훈', '채운', '다연']

})

#주문 테이블
orders = pd.DataFrame({

    'cno': [1001, 1001, 1005, 1006, 1008, 1001],

    '금액': [10000, 20000, 15000, 5000, 100000, 30000]

})

df = pd.merge(customers, orders, left_on='고객번호', right_on='cno', how='left')

df = df.fillna(0)

df['구매여부'] = '미구매'
df['구매여부'] = df['구매여부'].where((df['cno']==0),'구매')

df[['고객번호','이름','금액','구매여부']]

 

`모범답안`

import pandas as pd
import numpy as np

#고객 테이블
customers = pd.DataFrame({

    '고객번호': [1001, 1002, 1003, 1004, 1005, 1006, 1007],

    '이름': ['승철', '동경', '예나', '혜연', '장훈', '채운', '다연']

})

#주문 테이블
orders = pd.DataFrame({

    'cno': [1001, 1001, 1005, 1006, 1008, 1001],

    '금액': [10000, 20000, 15000, 5000, 100000, 30000]

})

# 방법1
orders.rename(columns = {'cno':'고객번호'}, inplace = True)
df = pd.merge(customers, orders, on = "고객번호", how = "left")

# 방법2
# df = pd.merge(customers, orders, left_on = "고객번호", right_on = "cno", how = "left")
# df.drop(columns = "cno", inplace = True)

df['금액'] = df['금액'].fillna(0).astype(int)
df["구매여부"] = "구매"
df.loc[df["금액"]==0, "구매여부"] = "미구매"
#df["구매여부"] = np.where(df["금액"] > 0, "구매", "미구매")
df

`오답노트`

  • 결측값 처리 함수 fillna() ex)df = df.fillna(0)
  • .astype(int) 뒤에 붙여서 바꿔주면 소수점 형태 사라지고 정수로만 결과 나옴
  • 여러 칼럼 불러올 때 대괄호 한번 더 써야 하는데 자꾸 까먹음 ex) df[['고객번호','이름','금액','구매여부']]
  • pandas의 where는 조건을 만족하지 않는 경우, 특정값으로 대체하는 함수
  • [참고] numpy where function
    pandas where는 조건에 만족하지 않는 경우 값을 할당했으나,
    numpy where는 조건에 만족하는 경우의 값과 그렇지 않은 경우의 값을 동시에 할당
# set defalut value
df['새로운 칼럼명'] = 3

# apply conditions step by step
df['새로운 칼럼명'] = df['새로운 칼럼명'].where( (df['조건이 될 칼럼명1'] == 0)
                                              |(df['조건이 될 칼럼명2'] <= 0), 2)
                                              
# numpy 예시
df['YN_March_Usage'] = np.where(df['Amount_Mar'] > 0, 1, 0)
 

pandas DataFrame 컬럼에 if-else 조건 적용하여 새로운 컬럼 만들기

Raw Data를 추출하여 pandas의 DataFrame으로 만든 다음, 하고자 하는 일이 모델링이던, 시각화던간에 필요한 항목을 파생해내는 일이 가장 중요하고, 일의 상당한 부분을 차지합니다. DataFrame의 Column을

matthew-of-green-gables.tistory.com

  • 'cno' 컬럼 빼고 출력해야 하는데 drop 생각 안 나서 loc으로 컬럼 불러왔음

  • 내가 where로 푼 '구매여부' 컬럼 부분 이렇게 풀 수도 있음


문제 3. iris 데이터 활용

  1. 출제의도
    • 집계용 함수를 이용할 수 있다.
    • 기초 통계량을 구할 수 있다.
    • 상관관계의 개념을 이해하고, 코드를 이용해 상관관계를 구할 수 있다.
    • 간단한 시각화를 할 수 있다.
  2. 배경
    • iris 데이터셋은 붓꽃(iris) 품종 중 Setosa, Versicolor, Virginica 분류에 대한 로널드 피셔의 1936년 논문에서 사용된 데이터 셋입니다.
    • 꽃받침(Sepal)과 꽃잎(Petal)의 길이 너비로 세개 품종을 분류하고 있습니다. 분류에 앞서, 꽃받침 넓이와 길이, 꽃잎의 넓이와 길이에 대한 기초 통계량을 확인하고자 합니다.
    • 가장 상관관계가 높은 변수가 무엇인지를 찾고, 이를 시각화하고자 합니다.
  3. 요구사항
    • 3-1) species별 sepal length, sepal width, petal length, petal width의 평균과 표준편차를 구하세요.
    • 3-2) sepal length, sepal_width, petal_length, petal_length 4가지 변수 중 가장 상관관계가 높은 두 변수를 찾으세요.
    • 3-3) 위에서 구한 두 변수를 x,y축으로 두고 species에 따라 분류하는 산점도를 생성하세요.
  4. Skeleton 코드
import pandas as pd
import numpy as np
import seaborn as sns

iris= sns.load_dataset("iris")

💡 문제 풀이 

`내 풀이`

import pandas as pd
import numpy as np
import seaborn as sns

iris= sns.load_dataset("iris")

df = iris

print('3-1번 답안')
grouped = df.groupby('species').agg({'sepal_length':['mean', 'std'], 'sepal_width':['mean', 'std'], 'petal_length':['mean', 'std'], 'petal_width':['mean', 'std']})
print(grouped)

print('3-2번 답안')
df_corr = df[['sepal_length','sepal_width','petal_length','petal_width']].corr()
print(df_corr)

print('3-3번 답안')
sns.scatterplot(x='petal_length',y='petal_width',data=df)

`모범답안`

import pandas as pd
import numpy as np
import seaborn as sns

iris= sns.load_dataset("iris")

# 3-1)
# 방법1
iris.groupby("species").agg(['mean', 'std'])

# 방법2
iris.pivot_table(values = ['sepal_length', 'sepal_width',
													'petal_length', 'petal_width'],
                    index = 'species', aggfunc = ['mean', 'std'])
                    
# 3-2)
iris[['sepal_length', 'sepal_width','petal_length','petal_width']].corr()
# petal_length, petal_width

# 3-3)
sns.scatterplot(x = "petal_length", y = "petal_width",
								data = iris, hue = "species")

 

`오답노트`

  • species별로 구분하라 했는데 hue=species 안했다!
  • 참고) 상관계수는 1(양의 상관관계)이나 -1(음의 상관관계)일 수록 상관관계가 높은 거고, 0일 수록 상관관계가 낮은 것.
  • 내가 푼 것처럼 일일이 컬럼 나열 안 하고 아래와 같이 간단하게 해도 됨.
# 내 코드
df.groupby('species').agg({'sepal_length':['mean', 'std'], 'sepal_width':['mean', 'std'], 'petal_length':['mean', 'std'], 'petal_width':['mean', 'std']})
# 모범 코드
df.groupby('species').agg(['mean','std'])


문제 4.  삼성전자 주가 데이터 처리

1. 출제의도

  • 새로운 라이브러리를 통해 문제를 해결할 수 있다.
  • 정보를 불러와 데이터프레임으로 가공할 수 있다.

2. 배경

  • FinanceDataReader는 한국 주식 가격, 미국 주식 가격, 지수, 환율, 암호 화폐 가격, 종목 리스트 등을 제공하는 API 패키지입니다. 아래 주소를 참고하여, 해당 라이브러리에 대해서 알아보시길 바랍니다. https://wikidocs.net/172650
  • 종목코드와 조회 날짜를 이용하면, 다음과 같이 불러와집니다.
    • Open: 시작가 (해당일 주식장이 시작했을 때의 해당종목 가격)
    • High: 최고가
    • Low: 최저가
    • Close: 종가 (해당일 주식장이 마감했을 때의 해당종목 가격)
    • Volume: 거래량 (해당일 거래된 해당종목 주식의 수)
    • Change: 전일 대비 증감율

3. 요구사항

  • 4-1) FinanceDataReader 라이브러리를 활용하여 2019-01-01부터 2024-12-16까지의 삼성전자(종목코드: 005930)의 주가정보를 불러온 후, 월평균 종가를 구하세요.
    • Close 칼럼 이용
    • "samsung_mean" 새로운 데이터 프레임에 저장
  • 4-2) 평균 종가(Close)의 전월대비 증감율을 구하세요.
    • samsung_mean 데이터프레임에 "전월대비(%)" 컬럼 생성
    • 소수점 첫째자리 반올림
  • 4-3) 평균 종가(Close)의 전년동월대비 증감율을 구하세요.
    • samsung_mean 데이터 프레임에 "전년동월대비(%)" 컬럼 생성
    • 소수점 첫째자리 반올림
    • 3단계 까지 완성후, samsung_mean을 출력하세요.

4. Skeleton 코드

!pip install -U finance-datareader
import FinanceDataReader as fdr

💡 문제 풀이 

`내 풀이`

!pip install -U finance-datareader
import FinanceDataReader as fdr

print('4-1번 답안')
df_krx = fdr.StockListing('KRX')

df = fdr.DataReader('005930', '2019-01-01','2024-12-16')

df.reset_index(inplace=True)

df['year'] = df.Date.dt.year
df['month'] = df.Date.dt.month

samsung_mean = df.groupby(['year','month'])['Close'].mean()
samsung_mean

print('4-2번 답안')
samsung_mean = samsung_mean.to_frame()

samsung_mean['Close'].shift()

samsung_mean['전월'] = samsung_mean['Close'].shift()

samsung_mean['전월대비(%)'] = round((samsung_mean['Close']/samsung_mean['전월'] *100),1)
samsung_mean

print('4-3번 답안')
samsung_mean['전년동월'] = samsung_mean['Close'].shift(12)
# samsung_mean.head(36)

samsung_mean['전년동월대비(%)'] = round((samsung_mean['Close']/samsung_mean['전년동월'] *100),1)
samsung_mean

`모범답안`

!pip install -U finance-datareader
import FinanceDataReader as fdr

# 4-1)
samsung = fdr.DataReader('005930', "2019-01-01", "2024-12-16")
samsung

samsung.index

samsung2['Date'].dt.strftime("%Y-%m")

samsung.index.strftime("%Y-%m")

samsung2 = samsung.reset_index()
samsung2['Year'] = samsung2['Date'].dt.year
samsung2['Month'] = samsung2['Date'].dt.month
samsung2

samsung_mean = samsung2.groupby(["Year","Month"])["Close"].mean()
samsung_mean = pd.DataFrame(samsung_mean)
samsung_mean

# 4-2)
samsung_mean['전월'] = samsung_mean['Close'].shift()
samsung_mean["전월대비(%)"] = \
round((samsung_mean["Close"] - samsung_mean["전월"]) / samsung_mean["전월"] * 100, 1)
samsung_mean

# 4-3)
samsung_mean["전년동월"] = samsung_mean['Close'].shift(periods = 12)
samsung_mean["전년동월대비(%)"] = \
round((samsung_mean["Close"] - samsung_mean["전년동월"]) / samsung_mean["전년동월"] * 100, 1)
samsung_mean

`오답노트`

  • 4-1까지 풀고 4-2 풀려는데 groupby와 mean 결과는 DataFrame이 아닌 Series라서 컬럼이 안 불러와짐. 다시 DataFrame에 저장하고 작업해야 함!
  • 전월,전년동월 대비 퍼센트 구할 때 원래 전월 대비 90% 이런 식으로 구했는데 -10%와 같이 나오는게 직관적
#처음풀이
samsung_mean['전월대비(%)'] = round((samsung_mean['Close']/samsung_mean['전월'] *100),1)
#바꾼풀이
samsung_mean['전월대비(%)'] = round((samsung_mean['Close']/samsung_mean['전월'] *100 -100),1)
  • 월평균 종가 구하기 -> 일자 데이터에서 연, 월 데이터 뽑아낼 때 strftime()함수 사용 가능

  • sql의 lag함수를 파이썬에서 쓴다면 shift함수 사용하면 됨
'Python' 카테고리의 다른 글
  • Python 실습 | 자릿수 더하기
  • Python 실습 | 문자열 데이터 딕셔너리로 변환
  • Python 실습 | 짝수와 홀수, 평균 구하기
  • Python 실습 | 웹 크롤링
초담
초담
4년차 마케터입니다
  • 초담
    그로스마케터의 기록
    초담
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (117)
      • Data Analytics Project (3)
      • SQL (55)
      • Python (43)
      • GA4 (0)
      • Tableau (8)
      • 아티클 스터디 (7)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
초담
Python 실습 | 데이터 조회, 정렬, 조건 필터 / 데이터 합치기 / iris 데이터 활용 / 삼성전자 주가 데이터 처리
상단으로

티스토리툴바