#!/usr/bin/env python
# coding: utf-8
# # **지난번 학습내용 정리하기**
# **Python 기본문법 정리
and Pandas**
# ### **review Data Datum**
# 1. Datum(숫자, "문자"), Data([list], {dict}, (tuple,))
# 1. (기본/외부/사용자) 모듈, 함수, 메소드
# 1. **문자**에서 **[]** 의 활용 ( [index], [:slicing])
# 1. **[list]** 객체에서 **[]** 의 활용 ( [index], [:slicing], [if 조건문])
# 1. [ List 포맷을 응용하여 for if ]
# 1. { Dict 포맷을 응용하여 for if }
# 1. for : 반복, if :판단,
# 1. enumerate() : [List] 자료를 for 반복시 인덱스 를 함께 Tuple로 출력
# 1. .item() : {dict} 자료를 for 반복시 key 와 value 를 Tuple로 출력
# 1. Web Crawling ==> type 변경 ==> list, dict, pandas 객체로 변환 ==> 시각화
# 1. ndarray, Series, Dataframe
# ### **review Series**
# 1. pd.Series( [ data ] , index = [ index ])
# 1. series 사칙연산
# 1. series [ Boolean 판단문 ]
# 1. series.index = [ list ]
# 1. series.isnull()
# 1. series.drop()
# ### **review Data Datum**
# 1. Datum(숫자, "문자"), Data([list], {dict}, (tuple,))
# 1. (기본/외부/사용자) 모듈, 함수, 메소드
# 1. **문자**에서 **[]** 의 활용 ( [index], [:slicing])
# 1. **[list]** 객체에서 **[]** 의 활용 ( [index], [:slicing], [if 조건문])
# 1. [ List 포맷을 응용하여 for if ]
# 1. { Dict 포맷을 응용하여 for if }
# 1. for : 반복, if :판단,
# 1. enumerate() : [List] 자료를 for 반복시 인덱스 를 함께 Tuple로 출력
# 1. .item() : {dict} 자료를 for 반복시 key 와 value 를 Tuple로 출력
# 1. Web Crawling ==> type 변경 ==> list, dict, pandas 객체로 변환 ==> 시각화
# 1. ndarray, Series, Dataframe
# ### **review DataFrame static**
# 1. .count()
# 1. .describe()
# 1. .min() .max()
# 1. .idxmin() .idxmax()
# 1. .quantile()
# 1. .sum()
# 1. .mean() .median()
# 1. .var() 분산 .std() 정규분산
# 1. .cumsum() .cumprod() 누적 합 누적 곱
# 1. .cummin() .cummax() 누적최소값, 누적최대값
# ### **review Series & DataFrame 결측치 제어하기**
# 1. df.dropna()
# 1. df.fillna(method='ffill', limit=2) # 결측치 대체
# 1. df.fillna(df.mean()['컬럼명'])
# 1. Series.interpolate(method='time') # 결측치 보간 (시계열적 특성을 부여가능)
# 1. Series.interpolate(method='values', limit=1, limit_direction='backward') # 'forward','backward','both'
# ### **review TimeSeries**
# 1. from datetime import datetime
# 1. pandas.date_range(end = '2017-07-01', periods=30, freq='BM')
# 1. pandas.date_range('2017/8/8 09:09:09', periods=5, normalize=True)
# 1. [str(date.date()) for date in pd.date_range('2017/01/01', '2017/01/11')]
#
# ## **Question About Pandas**
#
#
# ### **Question 1**
# Business Day 는 휴일이 포함되어 있나요?
# In[1]:
# DateTime Index를 생성한다
import pandas as pd
one_year = pd.date_range('2018-01-01',periods=365)
# In[2]:
data = [i for i in range(len(one_year))]
data = pd.Series(data, index=one_year)
# In[3]:
businessday = data.resample('B')
# In[4]:
(365 - len(businessday)) / 2
# In[5]:
# Tips
data.resample('M').mean()
# In[6]:
# Tips
data.resample('M').ohlc()
#
# ### **Question 2**
# 초단타 매매를 위한 초단위 생성도 가능한가요?
# In[7]:
pd.date_range('1/1/2011', periods=5, freq='H')
# In[8]:
pd.date_range('1/1/2011', periods=5, freq='min')
# In[9]:
pd.date_range('1/1/2011', periods=5, freq='s')
# In[10]:
pd.date_range('1/1/2011', periods=5, freq='ms')
# In[11]:
pd.date_range('1/1/2011', periods=5, freq='1ms')
# In[12]:
import numpy as np
# In[13]:
data = np.random.rand(110)
# In[14]:
date = pd.date_range('2018-06-06', periods=110, freq='ms')
# In[15]:
pd.Series(data, index=date)[:20]
#
# ### **Question 3**
# 1. https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
# 1. pd.date_range() 에서 생성한 데이터의 시간대 변경은 어떻게 하나요?
# In[16]:
import pandas as pd
# In[17]:
date_nan = pd.date_range('2018-06-01', periods=5, freq='h')
date_nan
# In[18]:
date_utc = pd.date_range('2018-06-01', periods=5, freq='h', tz='UTC')
date_utc
# In[19]:
date_kor = pd.date_range(start='2018-01-01', periods=5, tz='Asia/Tokyo')
date_kor
# In[20]:
date_kor.tz_convert('UTC')
# In[21]:
date_utc.tz_convert('Asia/Tokyo')
# In[22]:
# 처음 생성할때 UTC 정보가 없으면 수정이 어렵다
# date_nan.tz_convert(9)
# date_nan.tz_convert('UTC')
# In[23]:
data_nine = date_utc.tz_convert(9)
print(data_nine.tzinfo)
data_nine[:10]
# In[24]:
# 목록보기
# List of tz database time zones 을 위키에서 찾기
#
# ### **Question 4**
# 지난번 코스닥 자료를 보니까 빈 공간이 많던데 이유가 뭔가요?
# > **from** pandas_datareader **import** get_data_yahoo
# In[25]:
from pandas_datareader import get_data_yahoo
kosdaq = get_data_yahoo('031510.KQ', '2018-01-01').Close
# In[26]:
get_ipython().run_line_magic('matplotlib', 'inline')
kosdaq.plot()
# In[27]:
import pandas as pd
pd.DataFrame(kosdaq)
kosdaq.index = pd.DatetimeIndex(kosdaq.index)
kosdaq.tail(10)
# In[28]:
# 현재 Yahoo finance API가 중간 자료가 빈 구간이 존재한다
# 2018-02-01 부터 2018-06-03 4달 사이의 자료가 존재하지 않음
# 이를 고치려면 별도 Naver 크롤링 등 별도 경로를 활용하여 보완해야 한다
#
# ### **Question 5**
# pd.pct_change() 로 변환을 하는데 이유가 뭔가요?
# #### 데이터의 전처리
# 1. 표준화 : 해당 데이터 고유한 값을 기준으로 범위를 재조정 한다
# 1. 정규화 : 0 ~ 1 사이의 값으로 변환
# Q. voice, Signal 분석에서 중요한 데이터는?
# A. Raw 데이터 로 해당 데이터를 직접 표준화/ 정규화 한다
# Q. 금융분석에서 중요한 데이터는?
# A. Raw 데이터 (X)
# A. 이익/ 손실여부의 판단
# 때문에 해당 데이터를 **변화율**로 전환한 뒤 이를 **Log 수익률** 을 사용하면 기간별 분석에 용이하다
#
# ### **Question 6**
# Bitcoin 가격수집할때, 컬럼명에 찌꺼기들이 포함되어 있으면 어떻게 처리를 하나요?
# In[29]:
import pandas as pd
prices = pd.read_html("https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20180103&end=20180530")[0]
prices = prices[::-1]
prices.reset_index(inplace=True, drop=True)
prices.tail()
# In[30]:
prices.index = pd.DatetimeIndex(prices.Date)
prices.columns = [ col.replace('*', '') for col in prices.columns]
del prices['Date']
prices.head(3)
# In[31]:
prices.info()
# In[32]:
get_ipython().run_line_magic('matplotlib', 'inline')
prices.Close.plot(figsize=(16,4), grid=True)
prices.tail()
# In[2]:
from pandas_datareader import get_data_google
# In[4]:
get_data_google('KRX:KOSPI')
# In[5]:
from googlefinance.get import get_data
# In[6]:
get_data('KRX:KOSPI')
# In[ ]:
# In[ ]: