이번 포스팅에서는 데이터프레임(DataFrame)에 있는 데이터를 SQLite 테이블에 넣는 방법에 대해 설명드리겠습니다.

 

SQLite는 서버없이 사용하는 가벼운 DB 엔진이고 Data Base가 파일로 구성되어 있습니다.

복잡하지 않고 가벼운 DB시스템을 원한다면 SQLite는 적절한 선택이 될 것입니다.

 

SQLite 테이블에 Insert할 데이터프레임 정보는 다음을 참고하시기 바랍니다. 

 

2020/12/06 - [프로그래밍/┗크롤링과 스크레이핑] - [Python] 웹 페이지에 있는 table 읽어서 데이터프레임(DataFrame)에 담기

 

[Python] 웹 페이지에 있는 table 읽어서 데이터프레임(DataFrame)에 담기

이번 포스팅에서는 웹 페이지에 있는 table 태그를 읽어서 데이터프레임(DataFrame)에 담는 과정을 설명드리겠습니다. 네이버 금융에서 시간별 시세(분봉)를 가져와 보도록 하겠습니다. 삼성전자(005

grand-unified-engine.tistory.com

SQLite를 사용하기 위해 DB Browser for SQLite를 설치합니다. 경로는 다음과 같습니다.

 

DB Browser for SQLite (sqlitebrowser.org)

 

DB Browser for SQLite

DB Browser for SQLite The Official home of the DB Browser for SQLite Screenshot What it is DB Browser for SQLite (DB4S) is a high quality, visual, open source tool to create, design, and edit database files compatible with SQLite. DB4S is for users and dev

sqlitebrowser.org

설치 후 프로그램을 열면 아주 쉬운 인터페이스로 구성되어 있음을 알 수 있습니다.

 

1. 먼저 새 데이터베이스를 생성합니다. 새 데이터베이스를 클릭합니다.
   다음과 같이 데이터베이스가 파일로 저장되는 것을 확인할 수 있습니다.

2. 원하는 데이터베이스 이름을 지정하고 저장을 클릭합니다.

 

3. 테이블을 생성하기 위해 테이블 생성하기 버튼을 클릭합니다.

   다음과 같이 테이블 정의 팝업이 뜹니다.

"필드 추가" 버튼을 눌러 필드를 계속 추가할 수 있고 아래쪽에 스크립트가 자동생성되는 것을 볼 수 있습니다.

확인 버튼을 눌러 테이블을 생성합니다.

 


이제 파이썬 코딩을 해보겠습니다.

 

우선 DataFrame에 있는 데이터를 print해서 확인하는 것까지 해보겠습니다.

 

소스는 다음과 같습니다.

 

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

url = 'https://finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201210153000'
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)
    df = df.append(pd.read_html(page_url, header=0)[0])

df = df.dropna()
df = df[['체결시각', '체결가', '거래량', '변동량']]
df[['체결가', '거래량', '변동량']] = df[['체결가', '거래량', '변동량']].astype(int)

df.insert(len(df.columns), "코드", '005930')

today = datetime.datetime.today().strftime('%Y-%m-%d')
for row in df.itertuples():
    print("코드 : {}, 체결시각: {}, 체결가: {}, 거래량: {}, 변동량: {}".format(row[5], today + " " + row[1] + ":00", row[2], row[3], row[4]))

 

결과는 다음과 같습니다.

데이터가 잘 들어가 있으니 SQLite 테이블에 Insert 하겠습니다.

 

먼저 sqlite3를 import합니다. 파이썬에 내장되어 있어 바로 import되는 것을 볼 수 있습니다.

 

아래 코드를 추가하고 실행합니다.

 

con = sqlite3.connect("D:/PycharmProject_32bit/Kiwoom/sqlite/stock_jarvis.db")
cur = con.cursor()

for row in df.itertuples():
    sql = "insert into minute_price(code, time, close, volume, diff) values (?, ?, ?, ?, ?)"
    cur.execute(sql, (row[5], row[1], row[2], row[3], row[4]))
con.commit()

 

먼저 DB Browser for SQLite를 이용해서 데이터가 잘 들어갔는지 확인해 보도록 하겠습니다.

파이썬으로도 확인해보겠습니다.

 

cur.execute("select * from minute_price")
 
# 데이타 Fetch
rows = cur.fetchall()
for row in rows:
    print(row)
 
# Connection 닫기
con.close()

튜플 형태로 데이터를 반환하는 것을 확인할 수 있습니다.

 

지금까지 DataFrame 데이터를 SQLite 테이블에 Insert 하는 과정을 살펴봤습니다.

 

 

아나콘다에서 pandas를 설치 후 파이썬을 실행하면 No module named 'numpy.core._multiarray_umath' 라고 에러가 발생하는 경우가 있습니다.

위 메시지는 파이썬 버전보다 numpy 버전이 상위 버전이라서 오류가 발생하는 것입니다. 

현재(2020년12월1일) 아나콘다에서 파이썬 3.7 버전을 설치 후 pandas를 설치하면 문제가 생깁니다.

아나콘다에서 파이썬 3.7 버전을 설치하면 pandas를 따로 설치해줘야 하는데 python 3.8 이상에서는 기본으로 함께 설치됩니다. 

아나콘다에서 pandas를 사용하고자 한다면 파이썬 3.8 이상을 설치하시기 바랍니다.

이번 시간에는 파이썬 표준 라이브러리인 datetime을 정리해보도록 하겠다.

 

api를 이용해서 주식데이터를 가져오거나 날짜 관련 데이터를 스크레이핑 할 때 문자열 타입으로 주어지는 경우가 대부분이다. 다음은 문자열로 되어 있는 날짜와 시간을 datetime 형식으로 바꾸는 방법이다.

import datetime
format = '%Y-%m-%d %H:%M:%S' 
datetime_str = '2020-11-15 12:34:56'
datetime_dt = datetime.datetime.strptime(datetime_str, format)
print(type(datetime_dt)) # <class 'datetime.datetime'>
print(datetime_dt) # 2020-11-15 12:34:56

datetime의 strptime 함수는 텍스트형식을 datetime 형식으로 변환해주는 역할을 한다.

 

datetime 형식을 텍스트 형식으로 변환하려면 다음과 같이 strftime 함수를 사용하면 된다.

datetime_str = datetime_dt.strftime('%Y-%m-%d %H:%M:%S')

print(type(datetime_str)) # <class 'str'>
print(datetime_str)       # 2020-11-15 12:34:56

데이터포맷은 docs.python.org/ko/3/library/datetime.html 포맷 코드를 참조하자.

 

datetime을 이용해서 다음과 같이 D-day도 계산할 수 있다.

오늘부터 우리는 연애를 시작한다고 해보고 100일이 언제인지 계산해보자. 이 때 datetime 인스턴스 간의 차이를 구하는 timedelta를 이용하면 된다.

import datetime
td = datetime.timedelta(days=100) # 100일
datetime.datetime(2020,11,15) + td # datetime.datetime(2021, 2, 23, 0, 0)

 이번에는 두 날짜의 차이를 계산해보자.

dt1 = datetime.datetime(2020, 11, 1)
dt2 = datetime.datetime(2020, 11, 15)
td = dt2 - dt1
td  # datetime.timedelta(days=14)

 

 

pandas를 사용할 때 ImportError: Missing required dependencies ['numpy'] 에러가 발생하면 아래 페이지 참고


https://stackoverflow.com/questions/41859939/python-pandas-missing-required-dependencies-numpy-1


참고로 python 3.5.6 32비트 환경이고

pip install --upgrade numpy

pip install --upgrade pandas 실행하여 해결함.



+ Recent posts