이번 포스팅에서는 웹 페이지에 있는 table 태그를 읽어서 데이터프레임(DataFrame)에 담는 과정을 설명드리겠습니다.

 

네이버 금융에서 시간별 시세(분봉)를 가져와 보도록 하겠습니다.

 

삼성전자(005930)을 조회합니다. 시세 탭을 클릭 후 '시간별 시세'의 데이터가 표시된 곳에서 마우스 오른쪽 클릭하여 프레임 소스 보기를 클릭합니다.

소스 보기에서 view-source: 를 지우고 finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201204161047 만 남겨두고 접속합니다.

그러면 시간별 시세만 페이지에 표시됩니다.

 

첫 페이지에 있는 table을 DataFrame에 담아보겠습니다.

파이썬 코드는 다음과 같습니다.

import pandas as pd

url = 'https://finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201204161047'
df = pd.DataFrame() # (1)
df = df.append(pd.read_html(url, header=0)[0]) # (2)
df = df.dropna() # (3)
print(df)

(1) DataFrame 변수 df를 선언하고 

(2) pandas로 html을 읽어오는데 header=0은 table의 첫 행을 DataFrame 컬럼으로 설정하라는 것이고 다음 [0]은 해당 url의 첫 번째 table을 가져오라는 것입니다.

(3) 비어 있는 행을 삭제하라는 것입니다.

 

결과는 다음과 같습니다.

이번에는 마지막 페이지를 구한 후 해당 일자의 전체 분봉 정보를 가져오겠습니다.

 

마지막 페이지를 구하기 위해 '맨뒤'를 마우스 위치시키고 마우스 오른쪽 클릭 후 '검사'를 선택합니다. 

아니면 Ctrl + Shift + c 하면 element를 선택할 수 있는 상태가 되는데 그 상태에서 '맨뒤'를 마우스 클릭합니다.

'맨뒤'의 url 주소는 /item/sise_time.nhn?code=005930&thistime=20201204161047&page=40 입니다.

뒤에 &page=40 이런 식으로 파라미터가 붙는 것을 알 수 있고 마지막 페이지는 40임을 알게 되었습니다.

 

이제 마지막 페이지를 구하는 파이썬 코드를 구현해 보도록 하겠습니다.

from urllib.request import urlopen
from bs4 import BeautifulSoup

url = 'https://finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201204161047'
with urlopen(url) as doc:
    html = BeautifulSoup(doc, 'lxml')
    pgrr = html.find('td', class_='pgRR') # (1)
    s = str(pgrr.a['href']).split('=') # (2)
    last_page = s[-1] # (3)
print(last_page)

(1) 'pgRR' 클래스를 가지는 td 태그를 찾아서 pgrr에 담습니다.

(2) pgrr 아래 a 링크 주소를 '=' 기준으로 split 합니다. a 링크 주소는 /item/sise_time.nhn?code=005930&thistime=20201204161047&page=40인데 '=' 기준으로 split하면 s에는 ['/item/sise_time.nhn?code', '005930&thistime', '20201204161047&page', '40']이 될 것입니다.

(3) 리스트 데이터의 마지막 데이터를 가져옵니다.

 

이제 마지막 페이지까지 루프를 돌아 전체 페이지를 읽어오는 로직을 구현해 봅시다.

파이썬 코드는 다음과 같습니다.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd

url = 'https://finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201204161047'
df = pd.DataFrame()
with urlopen(url) as doc:
    html = BeautifulSoup(doc, 'lxml')
    pgrr = html.find('td', class_='pgRR')
    s = str(pgrr.a['href']).split('=')
    last_page = s[-1]

for page in range(1, int(last_page)+1):
    page_url = '{}&page={}'.format(url, page) # (1)
    df = df.append(pd.read_html(page_url, header=0)[0]) # (2)

df = df.dropna()
print(df)

(1) page 파라미터에 1부터 last_page 까지 for문을 돌아 url을 갱신합니다.

(2) 각 페이지마다 읽은 데이터를 DataFrame에 append 합니다.

 

결과는 다음과 같습니다.

이제 분봉 데이터를 이용할 수 있게 되었습니다.

이번 포스팅에서는 웹 페이지에서 크롤링 후 원하는 데이터의 태그 위치를 찾는 방법에 대해 알아보겠습니다.(크롬을 이용합니다)

 

네이버 증권 일별 시세에서 원하는 데이터를 가져오는 방법으로 설명드리겠습니다.

 

네이버 증권에 들어가 삼성전자(005930)를 검색하고 시세 탭에 들어갑니다. 다른 종목으로 하셔도 됩니다.

 

일별 시세에서 마우스 오른쪽을 클릭해서 프레임 소스 보기를 클릭합니다.

 

일별시세 프레임의 소스가 표시됩니다.

url 주소창에 view-source:를 삭제하고 엔터키를 누릅니다.

그러면 다음과 같이 일별시세만 화면에 표시됩니다.

이제부터 원하는 데이터의 위치 찾기입니다.

날짜 필드의 첫번째 날짜 위치를 찾아보겠습니다.

날짜 필드의 첫번째 날짜에 마우스를 갖다대고 마우스 오른쪽 클릭하여 검사 버튼을 누릅니다.

그러면 크롬 창 오른쪽에 해당 데이터의 태그를 찾아갑니다.

 

파이썬으로 해당 위치를 찾아가 보도록 하겠습니다.

먼저 해당 페이지에서 span태그가 몇개 있는지 살펴보겠습니다.

from urllib.request import urlopen
from bs4 import BeautifulSoup

naver_index = 'https://finance.naver.com/item/sise_day.nhn?code=005930'
source = urlopen(naver_index).read()
source = BeautifulSoup(source, 'lxml')
span = source.find_all('span')
print(len(span))

해당 페이지에서 span은 71개가 나왔습니다.

 

이렇게 같은 태그가 많은 페이지에서 원하는 데이터의 위치를 찾을  때 사용하는 방법이 있습니다. 바로 XPath 입니다.

 

다음 그림처럼 Elements탭에서 가져오고자 하는 데이터를 선택 후 마우스 오른쪽 클릭하여 Copy -> Copy XPath를 클릭합니다.

붙여넣기(Ctrl + v) 해보면 다음과 같은 정보가 나옵니다.

/html/body/table[1]/tbody/tr[3]/td[1]/span 

앞에서부터 html -> body -> table -> tr -> td -> span으로 찾아가라는 것입니다.

 

XPath 상의 tbody는 실제 코드상에 있는 것이 아니라 여기에서부터 테이블이 시작된다고 표시하는 것이기 때문에 tbody는 제외해야 합니다.

from urllib.request import urlopen
from bs4 import BeautifulSoup

naver_index = 'https://finance.naver.com/item/sise_day.nhn?code=005930'
source = urlopen(naver_index).read()
source = BeautifulSoup(source, 'lxml')
span = source.find_all('table')[0].find_all('tr')[2].find_all('td')[0].find('span')
print(span)

결과로 <span class="tah p10 gray03">2020.12.04</span> 가 나옵니다.

 

여기서 span.text를 print하면 2020.12.04 값만 추출되는 걸 볼 수 있습니다.

 

웹페이지에서 크롤링하여 원하는 데이터를 추출하는 방법에 대해 알아보았습니다.

 

 

이번 포스팅에서는 엑셀로 회귀분석 해보는 시간을 갖도록 하겠습니다.

 

회귀분석이란 간단히 말해 두 데이터의 상관관계를 알아보는 것입니다.

 

우선 아래 포스팅에서 파이썬을 이용해 S&P500 지수와 KOSPI200 지수를 불러와서 엑셀로 저장하였습니다.

 

2020/12/03 - [프로그래밍/┗ Pandas] - [Pandas] S&P500 지수와 KOSPI200 지수 불러와서 엑셀로 저장

 

[Pandas] S&P500 지수와 KOSPI200 지수 불러와서 엑셀로 저장

이번 포스팅에서는 S&P500 지수와 KOSPI200 지수의 상관관계를 알아보기에 앞서 각각의 데이터를 불러온 후 엑셀파일로 저장하는 과정을 설명드리겠습니다. 먼저 소스는 다음과 같습니다. import Finan

grand-unified-engine.tistory.com

파이썬 과정을 건너 뛰고 아래 첨부파일로 해보셔도 됩니다.

 

S&amp;P500-KOSPI200.xlsx
0.02MB

엑셀 파일을 열고 A2 셀을 선택 후 Ctrl + Shift + 아래 방향키를 누르면 열을 일괄 선택할 수 있습니다. 

마우스 오른쪽 클릭하여 셀 서식을 누르거나 Ctrl + 1을 누르면 셀 서식이 나타납니다.

날짜만 표시되도록 형식을 yyyy-mm-dd로 변경해줍니다.

Ctrl + A를 눌러 전체 셀을 선택 하고 삽입 -> 차트 -> 2차원 꺾은선형을 클릭하면 다음과 같이 그래프가 표시됩니다.

그런데 S&P500에 비해 KOSPI200 지수가 작아서 비교하기가 쉽지 않습니다. 

이럴 때 값이 다른 것을 비교하기 위해 지수화 작업을 해줘야 합니다.

D2 셀을 클릭 후 =B2/B$2*100를 입력합니다.

E2 셀을 클릭후 =C2/C$2*100를 입력합니다.

 

D2와 E2셀을 선택하고 선택한 영역 오른쪽 아래 점을 클릭해 +모양으로 바뀌면 더블 클릭합니다.

그러면 마지막 행까지 수식이 반영되어 데이터가 채워집니다. 

 

지수화 한 데이터로 그래프를 그리기 위해 B열과 C열을 선택해서 숨김처리합니다.

Ctrl + A를 선택후 삽입 -> 차트 -> 2차원 꺾은선형을 클릭하면 다음과 같이 그래프가 표시됩니다.

이제 두 데이터 간 비교를 할 수 있게 되었으므로 회귀분석을 해보겠습니다.

 

엑셀에서 회귀분석을 하려면 엑셀 기능을 추가해야 합니다. 

1. 엑셀의 상단 메뉴에서 파일 -> 옵션 메뉴를 클릭합니다.

2. 'Excel 옵션'창이 열리면 추가 기능 옆에 이동 버튼을 누릅니다.

3. 추가 기능 팝업이 뜨면 분석 도구에 체크하고 확인 버튼을 누릅니다.

엑셀 상단 메뉴에 보면 '데이터 분석'이 활성화 되었습니다.

데이터 분석을 눌러 '회귀 분석'을 찾아 선택합니다.

회귀 분석 창에서 'Y축 입력 범위'에는 KOSPI200 데이터를 선택하고, 'X축 입력 범위'에는 S&P500 데이터를 선택합니다. 이 창에서는 Ctrl을 눌러 데이터 선택하는 기능이 작동하지 않으므로 마우스로 드레그 해야 합니다.

입력이 완료된 후 확인 버튼을 누릅니다.

Sheet2에 회귀분석한 결과가 표시됩니다.

추세선 방정식은 y = 0.033x + 97.31이고 결정계수는 0.002로, 거의 상관관계가 없다는 결과가 나왔습니다.

이번 포스팅에서는 S&P500 지수와 KOSPI200 지수의 상관관계를 알아보기에 앞서 각각의 데이터를 불러온 후 엑셀파일로 저장하는 과정을 설명드리겠습니다.

 

먼저 소스는 다음과 같습니다.

import FinanceDataReader as fdr
import pandas as pd

df500 = fdr.DataReader("US500", '2017-05-01')
df200 = fdr.DataReader("KS200", '2017-05-01')

df500 = df500['Close']
df200 = df200['Close']

concat = pd.concat([df500, df200], axis=1, keys=['S&P500','KOSPI200'])

final = concat.dropna()

print(final)
#final.to_excel('S&P500-KOSPI200.xlsx')

FinanceDataReader를 이용해서 S&P500 지수와 KOSPI200 지수를 불러옵니다. 

S&P500는 'US500', KOSPI200는 'KS200' 을 첫번째 파라미터로 넣어줍니다.

 

두번째 파라미터는 시작 날짜를 의미합니다. 

세번째 파라미터는 마지막 날짜인데 입력하지 않으면 오늘 날짜까지로 설정이 됩니다.

 

concat 를 이용하여 두 지수의 종가를 합칩니다.

print를 하면 다음과 같이 데이터가 콘솔창에 출력됩니다.

주석처리된 것을 풀고 실행하면 다음과 같이 엑셀 파일이 생성됩니다.

 

이번 시간에는 Oracle Express Edition 최신 버전인 XE 18c설치 후 HR 스키마를 생성하는 방법을 알아보겠습니다.

 

우선 HR 스키마 스크립트 파일 위치는 다음과 같습니다.

HR 스키마 설치

 

11g 버전에서는 hr 스키마를 사용하기 위해서 Run SQL Command Line을 사용했었습니다.

 

18c 버전에서는 SQL Plus를 사용합니다. SQL Plus를 실행해서 사용자명에 sys as sysdba를 입력하고 설치시 설정했던 비밀번호를 입력합니다.

Oracle에 접속하면 먼저 alter session set "_ORACLE_SCRIPT"=true; 라고 입력해줍니다.

이건 다음과 같이 hr_main.sql 스크립트를 실행하면 발생하는 오류를 방지하기 위함입니다.

 

SQL실행창에서 @?/demo/schema/human_resources/hr_main.sql을 입력합니다.

첫번째로 HR계정의 패스워드를 입력합니다.

두번째로 HR스키마의 기본 테이블스페이스 이름을 지정합니다.

세번째로 HR스키마의 임시 테이블스페이스 이름을 지정합니다.

네번째로 log 경로를 지정합니다.

성공적으로 스크립트가 실행되었습니다.

성공적으로 스크립트가 실행되었는지 확인해보겠습니다.

다음과 같이 입력합니다.

잘 실행되고 있습니다.

 

이번에는 SQL DEVELOPER에서 스키마에 접속하는 방법을 알아보겠습니다.

왼쪽 상단 + 버튼을 누르고 데이터베이스 접속을 합니다.

 

다음과 같이 접속 정보를 입력 후 저장 버튼을 누릅니다.

테스트 버튼을 누르면 성공 메시지가 나옵니다.

 

다음 사이트를 참고했습니다.

jhnyang.tistory.com/274

 

[오라클] Oracle XE 18c 샘플데이터 HR 스키마 생성 과정 정리~! (sql developer)

안녕하세요! 이번엔 오라클 샘플 데이터를 생성해보도록 할게요. 오라클은 예전부터 오라클을 설치하면 샘플 데이터(DB계정을 공유해서 사용할 수 있음!)를 껴줬었어요. 이전에는 보통 설치하면

jhnyang.tistory.com

 

+ Recent posts