-
SKN Family AI 15기 5월 5주차 회고기록../SKN Family AI 15기 2025. 5. 27. 17:01
✍️이번주 회고
전체 회고
월요일부터 앓고 있던 종기가 터져... 상당히 불안불안한 일주일이었다. 피곤하지만 수업 동안에는 최대한 정신 차리고 강의를 정리하려고 애썼다. 수업 중에 노션을 활용해서 수업 내용, 내가 배운 코드를 정리해 두면 이렇게 블로그에 회고록을 올릴 때 도움이 되는 것 같기도 해서 계속해서 노션 정리는 하게 될 것 같다.
Keep
- 기존 코드를 기반으로 응용해서 새로운 함수를 만들 수 있을 정도의 기반이 생겼다.
- 드디어 환경 세팅에서 문제가 생기지 않는다. 이제 편하게 노트북을 껐다 켤 수 있다 ^-^)b
- 수업 도중 학습 내용을 좀 더 깔끔하게 정리하는 것이 가능해졌다. 마크다운 언어에도 확실히 익숙해졌다.
Problem
- 아직 배우지 않은 새로운 알고리즘을 떠올리는 게 너무 어렵다. 알고리즘에 익숙해지려면 다른 방법을 찾아야 할 것 같은데... 아직은 쉽지 않다.
- Linux 언어에 익숙하지 않아 바로바로 코드를 치는 것이 힘들다.
Try
- Linux 관련 자료 찾아볼 수 있으면 찾아보고, 블로그 등에 정리해두기
✍️학습 내용 정리!
자료구조
피보나치 수열
피보나치 수열은 다음과 같이 정의된 수열이다.
- F(0) = 0
- F(1) = 1
- F(n) = F(n-1) + F(n-2) (n ≥ 2) 0, 1, 1, 2, 3, 5, 8, 13, 21, ...
- 피보나치 수열을 구현할 때에는 보통 함수의 재귀 호출을 사용하지만, 숫자가 너무 커질 경우 복잡도가 증가해 속도가 매우 느려진다는 단점이 있다.
트리
- 마치 나무와 같은 모양을 가진 계층적 자료구조이다.
- 하나의 루트에서 시작하여 여러 개의 하위 노드들로 뻗어져나가는 구조를 가지고 있다.
- 노드 (Node): 트리를 구성하는 기본 요소. 데이터를 저장하고 다른 노드와의 연결 정보를 가짐.
- 간선 (Edge): 노드와 노드 사이를 연결하는 선. 부모-자식 관계를 나타낼 수 있음.
- 루트 (Root): 최상위 노드.
- 부모 (Parent): 어떤 노드의 바로 위 레벨에 연결된 노드.
- 자식 (Child): 어떤 노드의 바로 아래 레벨에 연결된 노드.
연결 리스트
- 동적으로 크기가 변할 수 있는 자료구조
- 노드 (Node): 링크드 리스트의 기본 단위. 각 노드에는 두 가지 주요 정보가 담겨 있다.
- 데이터 (Data): 실제 저장하고자 하는 값.
- 포인터/참조 (Pointer/Reference): 다음 노드를 가리키는 주소 값. 이를 next 또는 next_node라고 부르기도 함
- 헤드 (Head): 링크드 리스트의 가장 첫 번째 노드를 가리키는 주소. 헤드를 통해 리스트의 모든 노드에 순차적으로 접근할 수 있다. 리스트가 비어있으면 헤드는 None 값을 가짐
- 테일 (Tail): 링크드 리스트의 가장 마지막 노드를 가리키는 주소. 마지막 노드의 포인터/참조 부분은 다음 노드가 없으므로 None 값을 가진다.
확률과 통계
평균
- 널리 퍼져있는 값을 대표하는 값.
- 데이터들은 평균값 주변에 분포되어있다.
중앙값
- 변량의 값을 크기 순으로 나열할 때 중앙에 오는 수치를 의미함.
- 평균값은 이상치의 영향을 받지만, 중앙값은 그렇지 않음.
- 홀수라면 (n+1)/2번째 데이터, 짝수라면 n/2번째 데이터와 n/2+1번째 데이터의 평균값이 중앙값이 된다.
최빈값
- 가장 빈도가 많은 데이터 값
- 이상치에 영향을 받지 않음
- 데이터에는 규칙성이 없기 때문에 불규칙한 통계량을 아는 것이 중요함.
분산
- 각 데이터가 평균값으로부터 어느 정도 큰가, 혹은 작은가를 나타낸 수치를 분산이라고 함.
- 표준 편차는 평균을 구하고 싶은 수치들을 각각 제곱하고 모두 합하여 총 개수로 나눈 뒤 그 제곱근을 구한 것이다.
- 분산은 표준 편차의 제곱이다.
- 딥 러닝을 다룰 때에는 분산, 표준 편차를 이용하여 데이터를 스케일링 해줄 필요가 있다.
- 가공된 데이터의 표준 편차
- 데이터 x의 모든 수에 같은 수를 더해서 새로운 데이터 y를 만든다면,
- y의 평균 = x + n
- y의 편차 = x
- y의 분산 = x
- y의 표준편차 = x
- 데이터 x의 모든 수에 같은 수를 곱해서 새로운 데이터를 만든다면,
- y의 평균 = x*n
- y의 편차 = x*n
- y의 분산 = x*(n^2)
- y의 표준편차 = x*n
표준 점수
- 데이터를 {데이터-평균값} / 표준편차로 가공하면, 이 데이터로 구한 평균값은 0이고 표준편차는 1이다.
- 이 연산을 표준화라고 한다.
- 이 값을 Z-score, 표준 점수라고한다.
표준 정규 분포
- 자연이나 사회에서 관측되는 데이터들 속에 자주 등장
- 사람이나 생물의 키 데이터등이 정규분포를 따른다
표준정규분포
- 데이터를 -∞부터 ∞까지 모든 수치의 데이터로 구성
- 평균값은 0이고, 표준편차는 1이다.
- 68%는 표준편차 내에 있다.
- 95%는 표준편차의 두 배 내에 있다.
- 99.7%는 표준편차의 세 배 내에 있다.
일반 정규분포
- 표준정규분포의 모든 데이터에 일정한 수를 곱하고 그 뒤에 일정한 수를 더하는 방법으로 얻을 수 있다.
- 곱하는 일정한 수를 σ(시그마,) 더하는 수를 μ(뮤)라고 한다.
- $일반정규분포의 데이터 = σx(표준정규분포의 데이터)+μ$
- 일반규분포를 표준정규분포로 바꾸는 식은 다음과 같다 $Z = (m-μ)/σ$
동전 던지기는 정규분포와 근사
- 동전 던지기 횟수를 히스토리그램으로 그리면 그 값은 정규분포와 근사
- 예측할 수 없다고 여겨지는 것들도 확률적으로 예측할 수 있을 수 있음!!
예언
- 95~99% 적중 범위를 사용하여 “예언”을 할 수 있음.
- 너무 적은 범위도 아니고, 그렇다고 전체 범위를 잡지도 않는 선에서 범위를 정해야 함.
- -1.96에서 1.96까지를 95%확률의 예언 범위로 설정
가설검정
- 정규분표를하고 있는 모집단의 모수에서 그 모수가 어떤 수치인지를 추측함
- 관측된 결과를 가지고 전체 데이터의 양을 헤아리기 위해서는, 관측된 데이터가 예언 범위에 들어가는지 확인하는 것이 좋다.
자유도
print(np.arange(1,11).mean()) print(np.arange(1,11).var()) print(pd.DataFrame(data=range(1,11)).mean()) print(pd.DataFrame(data=range(1,11)).var()) #둘은 평균이 같지만 분산은 다른 값을 가진다. 왜일까?- 자유도란 통계에서 자유롭게 취할 수 있는 숫자의 개수를 의미한다.
- 평균이 4인 데이터 5개를 채울 수 있다면, 처음 네 개 숫자는 원하는 만큼 고를 수 있지만 마지막 한 자리 만큼은 자동적으로 정해진다.
- 이때 자유도는 4가 될 것이다.
- pandas의 경우 분산을 계산할 때 자유도를 고려하여 n-1을 분모로 놓기 때문에 numoy의 값과 다르다.
Python & MySQL 실습 모음
numpy
- 텐서를 다룰 수 있는 파이썬 라이브러리.
- 텐서란 3차원 이상의 고차원 행렬을 의미한다.
import numpy as np np.array([1,2,3,4,5]) #넘파이 텐서를 만들 수 있다.np.arange(20).reshape(4,5) #0~19까지 2차원 행렬 np.array(20).reshape(-1,4,5) #0~19까지 3차원 행렬- 이미지, 영상등을 다룰 때에는 3차원 행렬로 입력 데이터를 받기 때문에 numpy를 유용하게 사용하는 것이 좋다.
np.array(20).reshape(-1,5) #-1은 자동으로 크기에 맞는 행과 열을 설정하라는 의미이다.numpy의 메서드들
a=[1,2,3,4,5] sum(a)/len(a) np.mean(a) #두 코드의 결과값은 같다- mean() : 평균
- var() : 분산
- std() : 표준편차
윈도우에 있는 프로그램 파일들 불러오기
f = open("./myfilelist.txt", "w", encoding='utf-8') for roots, dirs, files in os.walk("c:/windows/"): for file in files: f.write(f"{roots}{file}\\n") f.close()- 윈도우에서 리눅스 환경을 조성할 수 있는 WSL 설치
- VS code에서도 적용
Pandas - 데이터를 정형화된 프레임으로 정리하기
주식 데이터를 pandas를 통해 csv 파일로 정리하기
import requests from xml.etree import ElementTree as ET url = '<https://m.stock.naver.com/front-api/external/chart/domestic/notice?symbol=010140&startTime=20141017&endTime=20150702&requestType=0>' data = requests.get(url=url).text root = ET.fromstring(data) #데이터를 파싱할 준비- 해당 사이트에서 주식 차트는 비동기적으로 데이터를 받아온다.
- 날짜와 코드(symbol)를 이용하여 해당하는 데이터를 불러올 수 있다.
-
더보기
결과
결과: <?xml version="1.0" encoding="UTF-8" ?><protocol> <notice symbol="010140" count="35"> <item date="20141020" no="632656" src="KOSCOM"> <title><![CDATA[삼성중공업(주) 연결재무제표기준영업(잠정)실적(공정공시)]]></title> </item> <item date="20141027" no="633559" src="KOSCOM"> <title><![CDATA[삼성중공업(주) 임시주주총회 결과]]></title> </item> <item date="20141029" no="633899" src="KOSCOM"> <title><![CDATA[삼성중공업(주) 자기주식 취득 결정]]></title> </item> <item date="20141031" no="634600" src="KOSCOM"> <title><![CDATA[삼성중공업(주) 조회공시 요구(풍문 또는 보도)에 대한 답변(미확정)]]></title> </item> <item date="20141110" no="635757" src="KOSCOM"> <title><![CDATA[삼성중공업(주) 조회공시 요구(풍문 또는 보도)]]></title> </item> <item date="20141110" no="635785" src="KOSCOM"> ... </notice> </protocol> 이 중 날짜 데이터 'date'와 title 태그에 들어있는 데이터를 활용하여 csv표를 만들어보자
- ‘date’와 title 태그를 이용하기 위해서는 다음과 같이 구현할 수 있다.
items = root.iter(tag='item') total = [] for i in items: for x in i: total.append({'date' : i.get('date'), 'information' : x.text}) """ 혹은 리스트 컴프리헨션을 이용할 수도 있겠죠! total2 = [{'date': i.get('date'), 'information':x.text} for i in root.iter(tag='item') for x in i] """- 해당 리스트를 pandas를 이용해 csv 파일로 저장한다.
import pandas as pd pd.DataFrame(total).to_csv("./test.csv", index=False)응용 : 시작 날짜, 끝나는 날짜, 종목 코드, 저장 루트를 인자로 받아 위의 과정을 수행하는 함수를 구현해봅시다.
def find_data(code, startDate, endDate, root): url = f'<https://m.stock.naver.com/front-api/external/chart/domestic/notice?symbol={code}&startTime={startDate}&endTime={endDate}&requestType=0>' data = requests.get(url=url).text data = ET.fromstring(data) #데이터를 파싱할 준비 total_data = [{'date': i.get('date'), 'information':x.text} for i in data.iter(tag='item') for x in i] return pd.DataFrame(total_data).to_csv(f"{root}{startDate}-{endDate}.csv",index=False)find_data('010140','20140404','20150808','/home/user/workspace/')WSL 환경에서 가상 환경 만들기
cd ~/workspace pip install vitualenv virtualenv streamlit -> streamlit 환경으로 접속 . ./streamlit/bin/activate -> 가상환경 streamlit이 활성화 된 것을 vs code 내에서 확인할 수 있음.- streamlit
pip install -r requirments.txt #requirement에 적힌 라이브러리들을 일괄 install- streamlit 가상 환경을 설정하는 것을 통해 간단한 웹 동작들을 구현할 수 있다!
MySQL
- Ubunto 환경에서 MySQL실행하기
sudo service #백그라운드 demon을 사용하는 명령어sudo service mysql start sudo mysql -uroot # mysql 시작 mysql -uplay -p123 # 커맨드 창에서 내가 만든 계정으로 접속- 유저 생성 create user play@'%' identified by '123'; - 권한 부여 grant all privileges on *.* to play@'%';MySQL 문법
DDL
CREATE #테이블 만들기 DROP #테이블 삭제 TRUNCATE #테이블 내용 비우기DML
SELECT #검색 INSERT #삽입 DELETE #삭제 UPDATE #수정DCL
GRANT #권한 부여Python과 MySQL을 연결하기
- vs code에서 다음과 같은 코드를 실행한다.
import pymysql conn = pymysql.connect(host="127.0.0.1", user='play', passwd='123', database='sk17', port=3306) cur = conn.cursor() cur.execute("show tables") cur.fetchall()- 방금 만든 테이블에 insert 하기
sql= "INSERT INTO stock_day VALUES (%s, %s, %s, %s, %s, %s, %s)" cur.execute(sql, ['2025-05-29', 123, 456, 789, 123, 456, 789])한 주 마무리! MySQL과 streamlit을 이용하여, 웹에서 SQL문을 입력받아 해당 SQL문을 실행하고 반영하는 코드를 만들어보자!
더보기MySQL
전종목 기본정보를 테이블에 넣기
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",} request_headers = { "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Encoding": "gzip, deflate", "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7", "Connection": "keep-alive", "Content-Length": "88", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Host": "data.krx.co.kr", "Origin": "<http://data.krx.co.kr>", "Referer": "<http://data.krx.co.kr/contents/MDC/MDI/mdiLoader/index.cmd?menuId=MDC0201020201>", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", "X-Requested-With": "XMLHttpRequest" } r = requests.post(url, data=payload, headers=request_headers)- 데이터 받아오기
data = r.json()['OutBlock_1'] print(data[0].keys()) # 키로 사용할 컬럼들 확인.(데이터가 딕셔너리이기때문에 keys() 메소드를 사용하여 확인합니다.)- 테이블 작성하기
create TABLE IF NOT EXISTS `st_master`( `ISU_CD` varchar(12) not null, `ISU_SRT_CD` varchar(10) not null, `ISU_NM` varchar(100) not null, `ISU_ABBRV` varchar(100) not null, `ISU_ENG_NM` varchar(100) not null, `LIST_DD` date not null, `MKT_TP_NM` varchar(15) not null, `SECUGRP_NM` varchar(20) not null, `SECT_TP_NM` varchar(30) not null, `KIND_STKCERT_TP_NM` varchar(15) not NULL, `PARVAL` int null default null, `IST_SHRS` bigint not null, PRIMARY KEY(`ISU_SRT_CD`) )- 데이터 전처리 해주기
sql= "INSERT INTO st_master VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" for x in data: **ISU_CD, ISU_SRT_CD, ISU_NM, ISU_ABBRV, ISU_ENG_NM, LIST_DD, MKT_TP_NM, SECUGRP_NM, SECT_TP_NM, KIND_STKCERT_TP_NM, PARVAL, LIST_SHRS = x.values()** #각 키워드를 변수명으로 하는 x의 값을 할당함(순서대로 할당함) LIST_SHRS = LIST_SHRS**.replace(",", "")** PARVAL = None if PARVAL == "무액면" else PARVAL.**replace(",", "")** #숫자 데이터들의 경우 repliace를 통해 쉼표를 제거해준다. #쉼표만 제거하면 암시적으로 int 데이터로 변환하여 데이터를 삽입해준다. cur.execute(sql,**[ISU_CD, ISU_SRT_CD, ISU_NM, ISU_ABBRV, ISU_ENG_NM, LIST_DD, MKT_TP_NM, SECUGRP_NM, SECT_TP_NM, KIND_STKCERT_TP_NM, PARVAL, LIST_SHRS]** )- 완성된 테이블에서 검색하기
select * from st_master where MKT_TP_NM in ('KOSPI','KOSDAQ') order by list_dd desc- select : 테이블 내에서 자료를 검색하는 명령어입니다
- from : 어떤 테이블에서 검색할지를 결정합니다
- where : 조건을 설정합니다. 조건은 여러개 설정할 수 있습니다.
- order by : 정렬 순서를 결정합니다
- between / and / not:
- like : 해당 문자열이 “포함되는” 데이터를 가져옵니다. “%문자열%”에서 %의 위치에 따라 다른 문구를 가져옵니다.
streamlit 에서 sql문 입력받아서, 해당 sql문을 수행하는 코드 만들기
import streamlit as st import pandas as pd import pymysql conn = pymysql.connect(host="127.0.0.1", user='play', passwd='123', database='sk17', port=3306) cur = conn.cursor() #sql에 접속 st.title("공시 정보 데이터") st.header("SQL문을 사용하여 공시 정보 데이터를 입력하세요.") def get_sql(sql): cur.execute(sql) return cur.fetchall() # sql문을 실행하고 그 결과를 모두 반환하는 함수입니다 ! input_sql=st.text_input(label="SQL문을 입력하세요.", placeholder="예) select * from st_master") try: rt = get_sql(input_sql) #버튼을 만들어도 좋지만 저는 바로 엔터를 통해 쿼리문을 실행하도록 만들었어요 st.write(pd.DataFrame(rt)) #dataframe을 사용해야 표의 모습으로 예쁘게 나옵니다!! except: print("잘못된 쿼리문입니다.") #사용자가 잘못된 쿼리문을 입력할 경우를 대비해서 try문을 사용했습니다. st.write()'기록.. > SKN Family AI 15기' 카테고리의 다른 글
SKN Family AI 15기 6월 3주차 회고 (0) 2025.06.24 SKN Family AI 15기 6월 2주차 단위 프로젝트 회고 (0) 2025.06.15 SKN Family AI 15기 6월 1주차 회고 (1) 2025.06.08 SKN Family AI 15기 5월 4주차 회고(2) (0) 2025.05.23 SKN Family AI 15기 5월 4주차 회고(1) (0) 2025.05.20