파이썬 - Pandas 실습 - 4
Statistics from Stock Data
구글, 애플, 아마존의 주식을 분석할 것입니다. 구글은 GOOG.csv 애플은 AAPL.csv 아마존은 AMZN.csv 파일에 주식 정보가 있습니다.
다음 7개의 컬럼이 있습니다
Date Open High Low Close Adj_Close Volume
csv 파일을 읽어서 DataFrame 으로 처리할 것입니다.
# 판다스를 임포트 하세요.
import pandas as pd
# GOOG.csv 파일을 판다스로 읽어서 저장하세요.
df = pd.read_csv('GOOG.csv')
# 데이터의 처음 5줄을 화면에 출력하세요.
df.head(5)
Date | Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|---|
0 | 2004-08-19 | 49.676899 | 51.693783 | 47.669952 | 49.845802 | 49.845802 | 44994500 |
1 | 2004-08-20 | 50.178635 | 54.187561 | 49.925285 | 53.805050 | 53.805050 | 23005800 |
2 | 2004-08-23 | 55.017166 | 56.373344 | 54.172661 | 54.346527 | 54.346527 | 18393200 |
3 | 2004-08-24 | 55.260582 | 55.439419 | 51.450363 | 52.096165 | 52.096165 | 15361800 |
4 | 2004-08-25 | 52.140873 | 53.651051 | 51.604362 | 52.657513 | 52.657513 | 9257400 |
To Do
우리는, 각 date 에 해당되는 adj close 값만 관심이 있습니다. 따라서 컬럼은 두개만 사용하며, 이 두개 컬럼의 인덱스는 date로 만듭니다.
hints:
-
Use the
index_col
keyword to indicate which column you want to use as an index. For exampleindex_col = ['Open']
-
Set the
parse_dates
keyword equal toTrue
to convert the Dates into real dates of the form year/month/day -
Use the
usecols
keyword to select which columns you want to load into the DataFrame. For exampleusecols = ['Open', 'High']
Fill in the code below:
pd.read_csv("GOOG.csv",usecols=['Date','Adj Close'],index_col = ['Date'],parse_dates=True).head()
Adj Close | |
---|---|
Date | |
2004-08-19 | 49.845802 |
2004-08-20 | 53.805050 |
2004-08-23 | 54.346527 |
2004-08-24 | 52.096165 |
2004-08-25 | 52.657513 |
# We load the Google stock data into a DataFrame
google_stock = pd.read_csv("GOOG.csv",usecols=['Date','Adj Close'],index_col = ['Date'],parse_dates=True)
# We load the Apple stock data into a DataFrame
apple_stock = pd.read_csv("AAPL.csv",usecols=['Date','Adj Close'],index_col = ['Date'],parse_dates=True)
# We load the Amazon stock data into a DataFrame
amazon_stock = pd.read_csv("AMZN.csv",usecols=['Date','Adj Close'],index_col = ['Date'],parse_dates=True)
데이터 6개까지 출력해 봅니다.
apple_stock.head(6)
Adj Close | |
---|---|
Date | |
2000-01-03 | 3.596616 |
2000-01-04 | 3.293384 |
2000-01-05 | 3.341579 |
2000-01-06 | 3.052405 |
2000-01-07 | 3.196992 |
2000-01-10 | 3.140763 |
amazon_stock.head(6)
Adj Close | |
---|---|
Date | |
2000-01-03 | 89.3750 |
2000-01-04 | 81.9375 |
2000-01-05 | 69.7500 |
2000-01-06 | 65.5625 |
2000-01-07 | 69.5625 |
2000-01-10 | 69.1875 |
2000-01-01
부터 2016-12-31
년 까지의 데이터를 처리할것인데 pd.date_range()
함수를 이용해서 dates 변수를 만드세요. 그리고 나서 위의 dates 를 인덱스로 하여, 새로 all_stocks 란 데이터프레임을 만드세요
# We create calendar dates between '2000-01-01' and '2016-12-31'
dates = pd.date_range('2000-01-01','2016-12-31')
dates
DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
'2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08',
'2000-01-09', '2000-01-10',
...
'2016-12-22', '2016-12-23', '2016-12-24', '2016-12-25',
'2016-12-26', '2016-12-27', '2016-12-28', '2016-12-29',
'2016-12-30', '2016-12-31'],
dtype='datetime64[ns]', length=6210, freq='D')
pd.DataFrame(index= dates).head(5)
2000-01-01 |
---|
2000-01-02 |
2000-01-03 |
2000-01-04 |
2000-01-05 |
# We create and empty DataFrame that uses the above dates as indices
all_stocks = pd.DataFrame(index= dates)
all_stocks
2000-01-01 |
---|
2000-01-02 |
2000-01-03 |
2000-01-04 |
2000-01-05 |
... |
2016-12-27 |
2016-12-28 |
2016-12-29 |
2016-12-30 |
2016-12-31 |
6210 rows × 0 columns
To Do
각 google_stock
, apple_stock
, amazon_stock
, 을, all_stocks
의 날짜에 매칭하여 수정종가를 나오게 하기 위해, all_stocks와 각각의 데이터프레임을 join 할 것입니다. 그러나 일단은 먼저, 현재의 구글,애플, 아마존의 DataFrame에 있는 컬럼명을, 각각의 수정종가로 표현하기 위해, 각각의 adj close 를 google_stock, apple_stock, amazon_stock 로 바꿔주세요. pd.DataFrame.rename()
함수를 이용하세요.
google_stock.rename(columns={"Adj Close":"google_stock"})
google_stock | |
---|---|
Date | |
2004-08-19 | 49.845802 |
2004-08-20 | 53.805050 |
2004-08-23 | 54.346527 |
2004-08-24 | 52.096165 |
2004-08-25 | 52.657513 |
... | ... |
2017-10-09 | 977.000000 |
2017-10-10 | 972.599976 |
2017-10-11 | 989.250000 |
2017-10-12 | 987.830017 |
2017-10-13 | 989.679993 |
3313 rows × 1 columns
# Change the Adj Close column label to Google
google_stock = google_stock.rename(columns={"Adj Close":"google_stock"})
# Change the Adj Close column label to Apple
apple_stock = apple_stock.rename(columns={"Adj Close":"apple_stock"})
# Change the Adj Close column label to Amazon
amazon_stock = amazon_stock.rename(columns={"Adj Close":"amazon_stock"})
# We display the google_stock DataFrame
google_stock.head()
google_stock | |
---|---|
Date | |
2004-08-19 | 49.845802 |
2004-08-20 | 53.805050 |
2004-08-23 | 54.346527 |
2004-08-24 | 52.096165 |
2004-08-25 | 52.657513 |
# We display the apple_stock DataFrame
apple_stock.head()
apple_stock | |
---|---|
Date | |
2000-01-03 | 3.596616 |
2000-01-04 | 3.293384 |
2000-01-05 | 3.341579 |
2000-01-06 | 3.052405 |
2000-01-07 | 3.196992 |
# We display the amazon_stock DataFrame
amazon_stock.head()
amazon_stock | |
---|---|
Date | |
2000-01-03 | 89.3750 |
2000-01-04 | 81.9375 |
2000-01-05 | 69.7500 |
2000-01-06 | 65.5625 |
2000-01-07 | 69.5625 |
이제 all_stocks
DataFrame 를 기준으로, 각각의 구글,애플,아마존의 데이터프레임을 합치겠습니다. dataframe.join()
함수를 이용하세요. T dataframe1.join(dataframe2)
dataframe1
을 기준으로 dataframe2
를 합치는 함수입니다.
all_stocks.join([google_stock,apple_stock,amazon_stock]).head(5)
google_stock | apple_stock | amazon_stock | |
---|---|---|---|
2000-01-01 | NaN | NaN | NaN |
2000-01-02 | NaN | NaN | NaN |
2000-01-03 | NaN | 3.596616 | 89.3750 |
2000-01-04 | NaN | 3.293384 | 81.9375 |
2000-01-05 | NaN | 3.341579 | 69.7500 |
all_stocks
를 앞에서 10줄 출력하여 확인하세요.
all_stocks = all_stocks.join([google_stock,apple_stock,amazon_stock])
all_stocks.head(10)
google_stock | apple_stock | amazon_stock | |
---|---|---|---|
2000-01-01 | NaN | NaN | NaN |
2000-01-02 | NaN | NaN | NaN |
2000-01-03 | NaN | 3.596616 | 89.3750 |
2000-01-04 | NaN | 3.293384 | 81.9375 |
2000-01-05 | NaN | 3.341579 | 69.7500 |
2000-01-06 | NaN | 3.052405 | 65.5625 |
2000-01-07 | NaN | 3.196992 | 69.5625 |
2000-01-08 | NaN | NaN | NaN |
2000-01-09 | NaN | NaN | NaN |
2000-01-10 | NaN | 3.140763 | 69.1875 |
To Do
해당 년도의 데이터가 없는 경우도 있을것입니다. 즉, 데이터가 NaN 으로 나오면 해당년도 데이터가 없는것입니다. 그러므로 NaN이 포함되어 있는지 먼저 확인해 봅니다.
# Check if there are any NaN values in the all_stocks dataframe
all_stocks.isna().sum()
google_stock 3095
apple_stock 1933
amazon_stock 1933
dtype: int64
이제 NaN 값을 포함하는 행은 제거합니다.
all_stocks.dropna(inplace=True)
all_stocks
에 NaN 이 없어졌는지 체크해 보세요.
# Check if there are any NaN values in the all_stocks dataframe
all_stocks.isna().sum()
google_stock 0
apple_stock 0
amazon_stock 0
dtype: int64
all_stocks
를 화면에 출력하세요.
# We display the all_stocks DataFrame
all_stocks.head()
google_stock | apple_stock | amazon_stock | |
---|---|---|---|
2004-08-19 | 49.845802 | 1.973460 | 38.630001 |
2004-08-20 | 53.805050 | 1.979244 | 39.509998 |
2004-08-23 | 54.346527 | 1.997236 | 39.450001 |
2004-08-24 | 52.096165 | 2.053144 | 39.049999 |
2004-08-25 | 52.657513 | 2.123831 | 40.299999 |
이제 아래의 통계데이터를 얻어봅시다. 아래를 각각 채워서 실행해 보세요.
# 각 스톡의 평균을 출력하세요
all_stocks.mean()
google_stock 347.420229
apple_stock 47.736018
amazon_stock 216.598177
dtype: float64
# 각 스톡의 표준편차를 출력하세요.
all_stocks.std()
google_stock 187.671596
apple_stock 37.421555
amazon_stock 199.129792
dtype: float64
all_stocks.head(3)
google_stock | apple_stock | amazon_stock | |
---|---|---|---|
2004-08-19 | 49.845802 | 1.973460 | 38.630001 |
2004-08-20 | 53.805050 | 1.979244 | 39.509998 |
2004-08-23 | 54.346527 | 1.997236 | 39.450001 |
# 각 스톡의 correlation을 출력하세요. 상관관계
all_stocks.corr()
google_stock | apple_stock | amazon_stock | |
---|---|---|---|
google_stock | 1.000000 | 0.900242 | 0.952444 |
apple_stock | 0.900242 | 1.000000 | 0.886321 |
amazon_stock | 0.952444 | 0.886321 | 1.000000 |
# 상관분석의 결과로 나온 수치를 상관계수라고 부른다. (coefficient)
# 상관계수는 -1 ~ 1 사이의 실수
# 0 근처이면, 아무 관련 없다.
# 1로 갈수록, 강한 비례관계가 있다.
# -1로 갈수록, 강한 반비례관계가 있다.
from datetime import date
# 2007년 부터 2013년 까지의 데이터를 가지고,
#각 주식의 평균,표준변차, 상관관계를 분석해보세요.
all_stocks.loc['2007-01-01':'2013-12-31',].head()
google_stock | apple_stock | amazon_stock | |
---|---|---|---|
2007-01-03 | 232.284210 | 10.770167 | 38.700001 |
2007-01-04 | 240.068588 | 11.009220 | 38.900002 |
2007-01-05 | 242.020889 | 10.930819 | 38.369999 |
2007-01-08 | 240.227554 | 10.984798 | 37.500000 |
2007-01-09 | 241.181351 | 11.897308 | 37.779999 |
all_stocks.loc['2007-01-01':'2013-12-31',].mean()
google_stock 289.131730
apple_stock 38.548012
amazon_stock 154.003332
dtype: float64
all_stocks.loc['2007-01-01':'2013-12-31',].std()
google_stock 78.582106
apple_stock 22.089632
amazon_stock 85.059395
dtype: float64
all_stocks.loc['2007-01-01':'2013-12-31',].corr()
google_stock | apple_stock | amazon_stock | |
---|---|---|---|
google_stock | 1.000000 | 0.713646 | 0.854917 |
apple_stock | 0.713646 | 1.000000 | 0.899271 |
amazon_stock | 0.854917 | 0.899271 | 1.000000 |
댓글남기기