Kaggle·데이터분석예제

[파시데]삼성전자 주가 데이터로 데이터프레임 연습 - pandas, dataframe, 데이터전처리

데이터요리사 2021. 6. 2. 09:17

안녕하세요. 데이터 요리사, 루나입니다.

 

pandas의 기본 기능을 얼마나 알고 계신가요?

다음 문제를 스스로 해결해보세요.

 

- 이 글은 '파이썬으로 시작하는 데이터 분석'에서 배우는 문제를 일부 소개합니다.
- pandas의 자세한 설명은 책의 내용을 참고해주세요.
- '더보기'를 클릭하시면 샘플 답안을 확인하실 수 있습니다.

- 제시한 답안은 샘플 답안입니다. 동일한 코드를 사용하지 않아도 정답일 수 있습니다.

 

 

 

 

 

 

 

1 준비 - 삼성전자 주가 데이터 불러오기

 

야후 파이낸스로부터 삼성전자 주가 데이터를 다운로드 받습니다. 

2020년 1월 1일부터 2021년 6월 30일 데이터를 다운 받았습니다. 

 

만약 다른 종목이나 날짜를 조정하고 싶다면 get_datat_yahoo()의 파라미터를 조절하여 설정해주세요.

!pip install yfinance

import numpy as np
import pandas as pd
import yfinance as yfin
from pandas_datareader import data

yfin.pdr_override()
df = data.get_data_yahoo('005930.KS', start = '2020-01-01', end = '2021-06-30')

 

※ 참고 ※
pandas-datareader가 2021년 7월부터 제대로 동작하지 않고 있습니다.
기존에 pandas-datareader만 사용하여 야후 파이낸스의 주가 데이터를 다운로드 받으셨던 분은
위의 수정된 코드를 사용하여 데이터를 다운로드 받아서 사용해주세요.

 

 

 

 

1 데이터프레임(df)의 평균, 표준편차, 사분위수 등 주요 통계 지표를 확인하세요.
더보기
df.describe()

 

 

 

 

 

 

 

 

 

2 종가('Close') 기준 최대값을 구하세요.
종가('Close') 기준 최소값을 구하세요.
종가('Close') 기준 평균값을 구하세요.
더보기
# 최대값 구하는 방법(1)
df['Close'].max()

# 최대값 구하는 방법(2)
max(df['Close'])

# 최소값 구하는 방법(1)
df['Close'].min()

# 최소값 구하는 방법(2)
min(df['Close'])

#평균값
df['Close'].mean()

 

 

 

 

 

 

 

 

3 총 데이터의 개수(row의 개수)를 확인해 보세요.
더보기
# 방법1 
df.shape[0]

# 방법2 
len(df)

 

 

 

 

 

 

 

4 특정 컬럼만 선택해 보세요(예: ‘Close’ 컬럼만 선택, ‘Higt’와 ‘Low’ 두 개의 컬럼 선택).
더보기
# 하나의 컬럼만 선택
df['Close']

# 두 개의 컬럼 선택
df[['High', 'Low']]

 

 

 

 

 

 

 

 

5 상위 3개의 로우만 선택해 보세요.
더보기
df[:3]

 

 

 

 

 

 

 

 

6 시작가('Open') 대비 종가('Close')가 높았던 날의 데이터만 선택하세요.
더보기
df[df['Open'] < df['Close']]

 

 

 

 

 

 

 

 

 

7 종가('Close') 기준 가장 주가가 높았던 날의 데이터(로우)를 선택하세요.
더보기
df[df['Close'] == max(df['Close'])]

 

 

 

 

 

 

 

 

 

8 종가('Close') 기준 주가가 90,000원 이상이었던 날짜를 반환하세요.
더보기
df[df['Close'] > 90000].index

 

 

 

 

 

 

 

 

 

 

 

 

9 2021년 1월 15일의 데이터를 반환하세요.
더보기
df.loc['2021-01-15']

 

 

 

 

 

 

10 2021년 1월 11일의 고가('High')와 저가('Low') 값을 반환하세요.
더보기
df.loc['2021-01-11', ['High', 'Low']]

 

 

 

 

 

 

 

11 데이터프레임(df)의 100번째 데이터를 선택하세요.
더보기
df.iloc[100]

 

 

 

 

 

 

 

12 데이터를 날짜 역순으로(최신 데이터가 위에 위치하도록) 정렬하세요.
더보기
df.sort_index(ascending=False)

 

 

 

 

 

 

 

13 종가('Close') 데이터를 가격이 높은 순서대로 정렬하세요.
더보기
df['Close'].sort_values(ascending=False)

 

 

 

 

 

 

 

14 인덱스 컬럼을 0부터 순차적으로 증가하는 정수로 변경하세요.
더보기
#방법 1: 인덱스 값이 신규 컬럼으로 생성
df.reset_index(inplace=True)

# 방법 2: 새로운 필드 df['Date']를 만들어 index를 할당
df['Date'] = df.index

 

 

 

 

 

 

 

15 컬럼명을 Date는 ‘날짜’로, ‘High’는 ‘고가’로, ‘Low’는 ‘저가’로 변경하세요.
더보기
df.rename(columns={'Date': '날짜', 'High': '고가', 'Low': '저가'})

 

 

 

 

 

 

 

16 날짜(‘Date’) 컬럼을 삭제하세요.
더보기
df.drop(columns=['Date'], inplace = True)

 

 

 

 

 

 

 

17 'diff' 컬럼을 생성하고, 종가(‘Close)와 시가(‘Open’)의 차이를 계산하여 채워주세요.
더보기
df['diff'] = df['Close']-df['Open']

 

 

 

 

 

 

 

18  'Date' 필드에 저장된 값을 파싱하여 'Year', 'Month', 'Day' 필드에 저장하세요.
더보기
df['Year'] = [d.year for d in df['Date']]
df['Month'] = [d.month for d in df['Date']]
df['Day'] = [d.day for d in df['Date']]

 

 

 

 

 

 

 

19 모든 데이터를 소수점 둘째자리까지 표시하세요.
더보기
format = lambda x: '%.2f' % x
df.applymap(format)

 

 

 

 

 

 

 

20 거래량 필드를 생성하고 세 자리수마다 콤마(,)가 들어가도록 변경하세요(예: 16949183-> 16,949,183).
더보기
df['거래량'] = df['Volume'].apply(lambda x : "{:,}".format(x))

 

 

 

 

 

 

 

21 주가 데이터를 월(“Month’)별로 그룹핑하고, 거래량(‘Volume’)의 평균값을 표시하세요.
더보기
df['Volume'].groupby(df['Month']).mean()

 

 

 

 

 

 

 

22 결측치가 있는지 확인하고, 결측치가 있을 경우 결측치를 처리하세요.
더보기
#결측치 확인
df.isnull().sum()

#결측치 삭제
df.dropna() 

#결측치가 있는 경우 값 치환
df.fillna({'High': 90000, 'Low': 50000})

 

 

 

 

 

 

 

23 12월의 데이터와 11월의 데이터를 별도의 데이터프레임(dec_df, nov_df)으로 만들고 두 데이터프레임을 하나의 데이터프레임으로 이어 붙이세요.
더보기
dec_df = df[df['Month']==12]
nov_df = df[df['Month']==11]

nov_dec_df = pd.concat([nov_df, dec_df])

 

 

 

 

 

 

pandas의 기능을 활용하시는데 친숙해지셨나요?

데이터프레임과 자주 만나다보면 자연스럽게 익숙해지실테니

너무 조급해마시구요~ 

 

오늘도 수고하셨습니다!

 

 

 

 

 

함께 보면 좋은 글

 


※ 이 글의 내용을 상업적으로 무단 활용, 편집하는 것은 금지하고 있습니다. 강의, 출판 등 상업적 이용이 필요하신 경우, 문의 바랍니다.

728x90