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 example index_col = ['Open']

  • Set the parse_dates keyword equal to True 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 example usecols = ['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

댓글남기기