<jupyter_start><jupyter_text>[krx]데이터 자동 수집을 위한 가이드이번에는 주식 데이터를 자동 수집을 해보자. 이번은 간단하게 crontab를 사용해 매일 17시에 실행을 하여 주식 데이터를 수집 할 것이다. 지금은 한가지 주식을 해보지만 다음에는 여러가지의 주식 정보를 수집하는 방법을 블로깅 해보겠다.목차는 다음과 같다.- 주피터 파일 생성 후 데이터 수집 코드 생성- 주피터 파일 파이썬 파일로 변경- crontab을 이용해 월~금 5시 주식 데이터 수집  1. 코드 작성  1-1 라이브러리 불러오기<jupyter_code>import pandas as pd
import datetime
import sqlite3 
from pykrx import stock<jupyter_output><empty_output><jupyter_text>1-2 datetime 불러오기<jupyter_code>today = datetime.datetime.now()
today
#datetime_df = pd.DataFrame({'year':[today.year],
                          # 'month':[today.month],
                          # 'day':[today.day],
                          # 'hour':[today.hour],
                          # 'minute':[today.minute]})
#datetime_df<jupyter_output><empty_output><jupyter_text>1-3 yesterday 데이터 추가<jupyter_code>yesterday = today - datetime.timedelta(days=1)
yesterday<jupyter_output><empty_output><jupyter_text>1-4 필요한 년,월,일 데이터 만들기<jupyter_code>yesterday = str(yesterday.year) + str(yesterday.month) + str(yesterday.day)
today = str(today.year) + str(today.month) + str(today.day)
yesterday
today<jupyter_output><empty_output><jupyter_text>1-6 주식 데이터 불러오기get_market_ohlcv_by_date() 메서드를 사용해 데이터를 데이터 프레임 형태로 다운<jupyter_code>df = stock.get_market_ohlcv_by_date(fromdate=yesterday, todate=today, ticker="005930")
df<jupyter_output><empty_output><jupyter_text>1-7 날짜 인덱스 컬럼으로 수정<jupyter_code>df = df.reset_index()
df<jupyter_output><empty_output><jupyter_text>1-8 날짜 컬럼 추가sqlite3는 datetime 타입을 지원하지 않아 int 타입으로 수정하기위해 나누었다.<jupyter_code>df["year"] = df["날짜"].dt.year
df["month"] = df["날짜"].dt.month
df["day"] = df["날짜"].dt.day
df.shape
df<jupyter_output><empty_output><jupyter_text>1-9 날짜 컬럼 삭제날짜 컬럼 삭제 inplace=True 명령어를 넣어주어야 데이터 프레임에 적용된다.<jupyter_code>df.drop(["날짜"], axis=1, inplace=True)
df<jupyter_output><empty_output><jupyter_text>2.SQlite3활용 db로 저장  2-1 DB 호출- crontab_db_stock가 없을 경우 새로 생성하며 연결- crontab_db_stock가 있을경우 해당 db로 연걸<jupyter_code>conn = sqlite3.connect("crontab_db_stock.db")<jupyter_output><empty_output><jupyter_text>2-2.cursor 생성- conn.cursor을 통해 Cursor를 하나 생성<jupyter_code>cur = conn.cursor()<jupyter_output><empty_output><jupyter_text>2-3.conn.execute를 통해 stock_data 테이블을 생성합니다.<jupyter_code>conn.execute('CREATE TABLE IF NOT EXISTS stock_data(open int, High int,Low int, Closing int, Volumn int, year int,month int, day int)')<jupyter_output><empty_output><jupyter_text>2-4.data int 변경dataframe에서 데이터 선택수 int로 변경 (SQL 테이블 생성시 자료형을 INT 로 했기 때문)<jupyter_code>open_value = int(df['시가'])
High_value = int(df['고가'])
Low_value = int(df['저가'])
Closing_value = int(df['종가'])
Volumn_value = int(df['거래량'])
year_value = int(df['year'])
month_value = int(df['month'])
day_value = int(df['day'])<jupyter_output><empty_output><jupyter_text>2-5.데이터 삽입 (insert)생성해둔 데이터 프레임 datetime_df에서 각각의 데이터를 삽입<jupyter_code>cur.execute('INSERT INTO stock_data VALUES(:open, :High, :Low, :Closing, :Volumn, :year, :month, :day);',
           {"open":open_value,"High":High_value,"Low":Low_value,"Closing":Closing_value,"Volumn":Volumn_value,"year":year_value,
            "month":month_value,"day":day_value})<jupyter_output><empty_output><jupyter_text>2-6 pandas사용하여 데이터 프레임 호출<jupyter_code># cur.execute를 이용해 SELECT 쿼리를 실행한다
cur.execute("SELECT * FROM stock_data")

# 행 데이터를 가져오기
rows = cur.fetchall()

# columns열 이름을 가져오기
cols = [column[0] for column in cur.description]

# 코드를 활요하여 DataFrame을 만들어주기
data_df = pd.DataFrame.from_records(data=rows, columns=cols)
data_df<jupyter_output><empty_output><jupyter_text>2-7.변경사항 저장 (commit)<jupyter_code>conn.commit()<jupyter_output><empty_output><jupyter_text>2-7.DB 종료<jupyter_code>conn.close()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13436063801027304, 'fraction_numerical': 0.013517166801838334, 'mean_word_length': 5.902985074626866, 'pattern_counts': {'":': 8, '<': 65, '<?xml version=': 0, '>': 65, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '258411', 'license': 'MIT', 'n_tokens_mistral': 1900, 'n_tokens_neox': 2204, 'n_words': 288, 'path': 'crontab_db_stock.ipynb', 'repo_name': 'choiuikang/stock_project', 'size': '3699'}