โ๐ป ๋ฐฐ์ด์
ssh ํค๋ฅผ ํตํ ์๊ฒฉ ์ ์์ ๋ํ ์ดํด๋ฅผ ํ ์ ์์๊ณ , mariaDB ์ sql, ํ์ด์ฌ์์์ sql ์ฌ์ฉ๋ฒ์ ์ตํ๊ณ ๊ทธ๋ฅผ ์์ฉํ์ฌ ํ๊ตญ ์ฃผ์ ์ ๋ณด์ ๋ค์ด๋ฒ ์ฃผ์ ๋ฐ์ดํฐ๋ฅผ ํฉ์น๋ ๊ฒ๊น์ง ๋ฐฐ์ธ ์ ์์๋ค.
๐ ๋ชฉ์ฐจ
1. ssh ๋ก PC ์ ์ฐ๋ถํฌ ์ฐ๊ฒฐํ๊ธฐ
2. MariaDB ์ธํ
3. pymysql
4. ํ๊ตญ ์ฃผ์ ์ ๋ณด ๋ฐ์ดํฐ ๊ฐ์ ธ์์ DB์ ์ ์ฅํ๊ธฐ
5. ๊ฒฐ์ธก์น ์ ๊ฑฐ
6. ๋ค์ด๋ฒ ์ฃผ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์์ ์ผ์ฑ์ ์ ์ฃผ์ ์ ๋ณด DB์ ์ ์ฅํ๊ธฐ
7. ํ๊ตญ ์ฃผ์ ์ ๋ณด์ ๋ค์ด๋ฒ ์ฃผ์ ์ ๋ณด๊ฐ ๋ด๊ธด ํ ์ด๋ธ ํฉ์น๊ธฐ
๋ค์ด๊ฐ๋ฉฐ
m2 ํ๊ฒฝ ์ธํ ๊ธฐ์ค์ผ๋ก ๊ธ์ ์์ฑํ์์ผ๋ ์ ์ ๋ถํ๋๋ฆฝ๋๋ค.
ssh ๋ก PC ์ ์ฐ๋ถํฌ ์ฐ๊ฒฐํ๊ธฐ
๋งฅ์ ssh ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ค์น๋์ด ์๋ค.
๋ฐ๋ผ์, ssh ์ ๊ธฐ์ด ์ธํ ๋ง ํด์ฃผ๋ฉด ๋๋ค.
ํ๋์ ์๋ฒ๊ฐ ๋์ด์ค ์ฐ๋ถํฌ์ ssh ์ค์ ๋ ๋ง์น๋ฉด, ๊ฐ๋จํ ์ ๋ ฅ์ผ๋ก ์ฐ๋ถํฌ์ ์ฐ๊ฒฐํ ์ ์๋ค.
ssh [user_name]@[ubuntu_ip]
๋งฅ๋ถ ํฐ๋ฏธ๋์ ์ ๋ ฅํ๋ฉด, ๋งฅ๋ถ์์๋ ์ฐ๋ถํฌ ํฐ๋ฏธ๋ ํ๊ฒฝ์์ ์์ ํ ์ ์๋ค.
MariaDB ์ธํ
์ฐ๋ถํฌ ์๋ฒ์์ mariaDB ๋ฅผ ๋ค๋ฃฐ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ฐ๋ถํฌ์ mariaDB ๋ฅผ ์ค์ ํ๊ธฐ๋ก ํ๋ค.
sudo apt install mariadb-server
sudo mysql_secure_installation
์ด๊ธฐ ์ธํ ์ ์๋ฃํ๊ณ , mariadb ์๋ฒ๊ฐ ์ ์คํ๋๊ณ ์๋ ์ง ํ์ธํ ์ ์๋ค.
sudo service mariadb status
์ฒซ ์ค์น์ธ ๊ฒฝ์ฐ, ์๋์ผ๋ก ์๋ฒ์ ๋ก๊ทธ์ธ ๋์ด ์๊ฒ ๋๋ค.
๋ง์ฝ, ์ฐ๋ถํฌ ์์คํ ์ ์ข ๋ฃํ๊ณ ์ถ๋ค๋ฉด
sudo shutdown -h now
๋ฅผ ์ ๋ ฅํ์ฌ ์์คํ ์ ์์ ๋๊ณ ์ข ๋ฃํ ์ ์๋ค.
๋์ค์ DB ์ ์์ ๋ค์ํ๊ณ ์ถ๋ค๋ฉด,
mysql -u root -p
๋ฅผ ์ ๋ ฅํ๋ฉด mariadb ์ ์ ์ํ ์ ์๋ค.
CREATE USER 'user_name'@'%' IDENTIFIED BY 'pass_word';
GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'%';
์ ์ํ ํ, mariadb ์ ๊ณ์ ์ ์์ฑํ๊ณ ๊ทธ ๊ณ์ ์ ๋ชจ๋ ๊ถํ์ ๋ถ์ฌํด์ค๋ค.
sudo systemctl enable mariadb
์ด๋ ๊ฒ ์์คํ ์ ๋ค์ ์ผฐ์ ๋ ์๋์ผ๋ก ์ ์ํ ์ ์๋๋ก ํ๋ ๋ช ๋ น์ด๋ ์๋ค.
pymysql
ํ์ด์ฌ์๋ ํ์ด์ฌ์ผ๋ก๋ mysql ์ ์คํํ ์ ์๋๋ก, pymysql ์ด๋ผ๋ ๋ชจ๋์ด ์๋ค.
import pymysql # ์์ผ๋ฉด pip install pymysql
์ด ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์ฐ๋ถํฌ์ ์ค์ ํ DB ์ ์ ์ํ ์ ์๋๋ก ํ๋ค.
try:
con = pymysql.conect(host='ip์ฃผ์', user='mariadb ๊ณ์ ์ด๋ฆ',
password='mariadb ๋น๋ฒ',
charset='utf8', db='db ์ด๋ฆ')
cur = con.cursor()
except Exception as e:
print("error -> ", e)
db ๊ณ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๋ ฅํด๋๊ณ , ์คํํ๊ฒ ๋๋ฉด ํด๋น db ์ ์ฐ๊ฒฐํ ์ ์๋ค.
(์์ฃผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, dbconnect.py ์ connection ํจ์๋ก ๋ง๋ค์ด ๋์.)
cur.execute("""CREATE TABLE 'test' (
`InvoiceNo` VARCHAR(30),
`StockCode` VARCHAR(30),
`Description` VARCHAR(255)
)""")
๊ทธ ํ, cur ์๊ฒ ์ ๋ฌํ์ฌ sql ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํด ์คํํ ์ ์๋ค.
(๊ทธ๋ฅ mariadb ์์ ๋ฐ๋ก ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํด๋ ๋๋ค.)
sql = "INSERT INTO new_table VALUES(%s, %s, %s, %s, %s, %s, %s, %s)"
with open("./data/dataset3.csv", "r", encoding='utf-8') as f:
for idx, line in tqdm(enumerate(f)):
if idx != 0:
cur.execute(sql, [x.replace('"', "") for x in line.split(";")])
์๋ก์ด ํ ์ด๋ธ์ ์ด๋ค ํ์์ผ๋ก ๋ฃ์ ๊ฒ์ธ์ง ์ค์ ํ๊ณ , cur ์๊ฒ ์ ๋ฌํ ์ ์๋ค.
con.commit()
์ ์ ๋ ฅํ์ง ์์ผ๋ฉด db ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ์ง ์์ผ๋, ๋ง์ง๋ง ๊ณผ์ ์ ๊ผญ ์คํํด์ฃผ์.
cur.fetchall()
์ ์ฌ์ฉํ์ฌ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊บผ๋ด์ฌ ์ ์๋ค.
ํ๊ตญ ์ฃผ์ ์ ๋ณด ๋ฐ์ดํฐ ๊ฐ์ ธ์์ DB์ ์ ์ฅํ๊ธฐ
ํ๊ตญ ์ฃผ์ ์ ๋ณด ๋ฐ์ดํฐ ์์คํ ํํ์ด์ง์์ ์ฃผ์ ์ ์ข ๋ชฉ์ ๊ธฐ๋ณธ ์ ๋ณด ํ์ด์ง์ ๋ค์ด๊ฐ ๊ฐ๋ฐ์ ๋ชจ๋๋ฅผ ํจ ํ, ์กฐํ ๋ฒํผ์ ๋๋ฅธ๋ค.
๋คํธ์ํฌ ํ์ด์ง์ getJsonData.cmd ๊ฐ ๋ณด์ธ๋ค.
request url ์ ํ์ธํ ์ ์๊ณ , method ๋ฐฉ์์ด post ๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ payload ์ ๋ค์ด๊ฐ๋ฉด ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ์์ ์ ์ ์๋ค.
krx_url = "http://data.krx.co.kr/comm/bldAttendant/getJsonData.cmd"
payload = {"bld" : "dbms/MDC/STAT/standard/MDCSTAT01901",
"locale" : "ko_KR",
"mktId" : "ALL",
"share" : "1",
"csvxls_isNo" : "false",}
r = requests.post(krx_url, data=payload)
rt = r.json()
rt ๋ฅผ ํ์ธํ๋ฉด ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๊ฐ dictionary ๊ตฌ์กฐ๋ก ๋์ด์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
CREATE TABLE KRX(
ISU_CD VARCHAR(200),
ISU_SRT_CD VARCHAR(200),
ISU_NM VARCHAR(200),
ISU_ABBRV VARCHAR(200), ISU_ENG_NM VARCHAR(200),
LIST_DD VARCHAR(200),
MKT_TP_NM VARCHAR(200), SECUGRP_NM VARCHAR(200), SECT_TP_NM VARCHAR(200), KIND_STKCERT_TP_NM VARCHAR(200), PARVAL VARCHAR(200),
LIST_SHRS VARCHAR(200),
PRIMARY KEY(ISU_SRT_CD)
);
mariadb ์ KRX ๋ผ๋ ํ ์ด๋ธ์ ๋ง๋ค์ด์ค๋ค.
sql = "INSERT INTO KRX VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
for data in rt['OutBlock_1']:
try:
cur.execute(sql, list(data.values())
except:
pass
con.commit()
๊ทธ ํ, ํ์ด์ฌ์ ํตํด KRX ํ ์ด๋ธ์ ๊ฐ์ ๋ฃ์ด์ค๋ค.
import pandas as pd
krx = pd.read_sql_queary("""SELECT * FROM KRX WHERE MKT_TP_NM IN ('KOSPI', 'KOSDAQ')""", con)
# 1๋ฒ ํ๋ถํฐ ๋๊น์ง ๋ค๋ณด๋๋ฐ, ํน์ ์ด๋ง ๋ณด๊ธฐ
krx.loc[1:, ['ISU_D', 'ISU_NM', 'ISU_SRT_CD']]
# 0๋ฒ ํ๋ถํฐ ๋๊น์ง ๋ค๋ณด๋๋ฐ, 1,2,3์ด ๋ง ๋ณด๊ธฐ
krx.iloc[0:, [1, 2, 3]]
# ๋ณดํต์ฃผ๋ง ๋ณด๊ธฐ
mask = krx['KIND_STKCERT_TP_NM'] == '๋ณดํต์ฃผ'
krx[mask]
# ๋ช๊ฐ์ ํ๊ณผ ์ด๋ก ์ด๋ฃจ์ด์ง์ง ํ์ธ
krx[mask].shape
# ํ ๋ณด๊ธฐ
krx[mask].columns
ํ์ด์ฌ์ ํตํด ๋ฐ์ดํฐ์ ์ ๊ทผํ์ฌ ํ์ธํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ฒฐ์ธก์น ์ ๊ฑฐ
DataFrame ํ์์ธ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ์ Nan ๊ฐ์ด ๋ค์ด์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
๊ทธ ๋, ์ฌ์ฉํ๋ ๋ฉ์๋๊ฐ dropna() ์ด๋ค.
pd.read_html(r.text)[index].dropna()
๊ฒฐ์ธก์น๊ฐ ์๋ ๊ฒฝ์ฐ, dropna ๋ฅผ ์ฌ์ฉํ๋ฉด Nan ๊ฐ์ด ์๋ ๋ฐ์ดํฐ๋ ์ ๊ฑฐ๋๋ค.
๋ค์ด๋ฒ ์ฃผ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์์ ์ผ์ฑ์ ์ ์ฃผ์ ์ ๋ณด DB์ ์ ์ฅํ๊ธฐ
๋ค์ด๋ฒ ์ฃผ์์ get ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ ์ฌ ์ ์๋ค.
requtests ์ get ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ read_html ๋ก ๋ง๋ ๋ค.
import requests
import pandas as pd
def get_stock(code, page):
naver_url = "https://finance.naver.com/item/sise_day.naver?code={}&page={}"
head = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"}
r= requests.get(naver_url.format(code,page),headers=head)
return pd.read_html(r.text)[0].dropna()
์ฌ๊ธฐ์ head ๋ ํญ์ ๊ณ ์ ๊ฐ์ผ๋ก, ๊ทธ๋ฅ ๋ค์ด๊ฐ๋ฉด ํ์ด์ฌ์ ์ ๊ทผ์ ๋ง๊ธฐ ๋๋ฌธ์ ํญ์ head ๋ฅผ ๊ธฐ์ตํด๋์ด์ผ ํ๋ค.
ํฌ๋กฌ์ ์ฌ์ฉํด์ผํ ๋, head ๋ ์ฝ๋๊ฐ ๋ฌ๋ผ์ง์ง ์๋๋ค๊ณ ํ๋ค.
์ฐธ๊ณ ๋ก ์ ์ฝ๋๋ ๋ฐ๋ก naver.py ๋ผ๋ ํ์ผ๋ก ๋ง๋ค์ด ์งํํ๋ค.
from naver import get_stock # naver.py ์ get_stock ๋ถ๋ฌ์ค๊ธฐ
import numpy as np
from dbconnect import connection # dbconnect.py ์ connection ๋ถ๋ฌ์ค๊ธฐ
samsung = get_stock("005930", 2) # 2ํ์ด์ง ์ผ์ ์ฃผ์ ๊ฐ์ ธ์ค๊ธฐ
samsung.columns # df ์ด ๊ฐ ํ์ธ
samsung.info # df ๋ฐ์ดํฐ ํ์ธ
์ผ์ฑ ์ ์์ ์ฃผ์ ์ ๋ณด ๋ฐ์ดํฐ๋ฅผ dataframe ์ผ๋ก ๊ฐ์ ธ์๋ค.
# ๋ฐ์ดํฐ๋ฅผ int64 ๋ก ๋ณํ
samsung[['์ข
๊ฐ', '์ ์ผ๋น', '์๊ฐ', '๊ณ ๊ฐ', '์ ๊ฐ', '๊ฑฐ๋๋']] = \
samsung[['์ข
๊ฐ', '์ ์ผ๋น', '์๊ฐ', '๊ณ ๊ฐ', '์ ๊ฐ', '๊ฑฐ๋๋']].astype(np.int64)
# ๊ฑฐ๋ ๊ธ์ก column ์๋์ผ๋ก ์์ฑ(๊ฐ ๊ณ์ฐ ํฌํจ)
samsung['๊ฑฐ๋๊ธ์ก'] = samsung['์ข
๊ฐ'] * samsung['๊ฑฐ๋๋']
# ์ข
๋ชฉ column ์๋์ผ๋ก ์์ฑ(๊ฐ ํฌํจ)
samsung['์ข
๋ชฉ'] = '005930'
# ๊ธฐ์กด samsung ์์ column ์ถ๊ฐํ ๋ฐ์ดํฐ๋ก ๋ฐ๊ฟ
samsung = samsung[['์ข
๋ชฉ', '๋ ์ง', '์ข
๊ฐ', '์ ์ผ๋น', '์๊ฐ', '๊ณ ๊ฐ', '์ ๊ฐ', '๊ฑฐ๋๋', '๊ฑฐ๋๊ธ์ก',]]
์๋กญ๊ฒ ๋ง๋ ๊ฑฐ๋ ๊ธ์ก๊ณผ ์ข ๋ชฉ ์ฝ๋๋ฅผ ํฌํจํ df ๋ก ๋ฐ๊พผ๋ค.
create table stock_day(
symbol varchar(200),
stock_date date,
close bigint,
`before` bigint,
open bigint,
high bigint,
low bigint,
vol bigint,
money bigint,
primary key(symbol,stock_date)
);
์ข ๋ชฉ -> symbol, ๋ ์ง -> stock_date, ์ข ๊ฐ -> close, ์ ์ผ๋น -> before, ์๊ฐ -> open, ๊ณ ๊ฐ -> high, ์ ๊ฐ -> low, ๊ฑฐ๋๋ -> vol, ๊ฑฐ๋๊ธ์ก -> money ๋ก ํ ์ด๋ธ์ ๋ง๋ค๊ณ ์ข ๋ชฉ๊ณผ ๋ ์ง๊ฐ primary key ๋ก ์ค๋ณต๋ ๊ฐ์ด ์๋๋ก ์ ์ฅํ๋ค.
(์ฐธ๊ณ ๋ก, `before` ์ ๋ฅผ ๋ถ์ด์ง ์์ผ๋ฉด ๊ตฌ๋ฌธ ์ค๋ฅ๊ฐ ๋์ ์ ๋ ๊ฒ ์์ฑํ๋๋ฐ, before_ ๋ก ํํํด๋ ํด๊ฒฐ์ด ๋๋ค๊ณ ํ๋ค.)
# stock_day ํ
์ด๋ธ ๊ฐ ๋ฃ๊ธฐ
sql = "INSERT INTO stock_day VALUES (%s , %s , %s , %s , %s , %s , %s , %s , %s)"
# db ์ฐ๊ฒฐ
cur, con = connection();
# db ์ sql ๋ฌธ์ ํตํด ๋ฃ๊ธฐ
for idx, row in samsung.iterrows():
try:
cur.execute(sql,list(row.values))
except:
pass
con.commit()
stock_day ํ ์ด๋ธ์ ์ผ์ฑ์ ์ ์ฃผ์ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
ํ๊ตญ ์ฃผ์ ์ ๋ณด์ ๋ค์ด๋ฒ ์ฃผ์ ์ ๋ณด๊ฐ ๋ด๊ธด ํ ์ด๋ธ ํฉ์น๊ธฐ
์ผ์ฑ ์ ์ ์ฃผ์ ์ ๋ณด ๊ธฐ๋ฐ์ผ๋ก, ํ๊ตญ ์ฃผ์ ์ ๋ณด์ ๋ค์ด๋ฒ ์ฃผ์ ์ ๋ณด๊ฐ ๋ด๊ธด ํ ์ด๋ธ์ ํฉ์น ์ ์๋ค.
SELECT *
FROM stock_day AS b
JOIN KRX AS c
ON c.ISU_SRT_CD = b.symbol;
์ด์ , stock_day ์ KRX ํ ์ด๋ธ์ join ํ๋ฉด, ๋ ํ ์ด๋ธ์ ์ข ๋ชฉ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๊ฐ ํฉ์ณ์ง ํ ์ด๋ธ์ ๋ณผ ์ ์๋ค.
'Python > [๊ธฐ์ด ๊ฐ์ ์ ๋ฆฌ]' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
python ๊ธฐ์ด 7 (0) | 2023.02.26 |
---|---|
python ๊ธฐ์ด 6 (0) | 2023.02.26 |
python ๊ธฐ์ด 4 (1) | 2023.02.25 |
python ๊ธฐ์ด 3 (0) | 2023.02.24 |
Python ๊ธฐ์ด 2 (0) | 2023.02.15 |