본문 바로가기

Loopy's 개발일지

[Python] 주식 데이터를 활용한 데이터 분석 - 1주차

Python 데이터 분석
사실 데이터 분석 직무로 일을 할땐, SQL만 만지고 데이터 베이스 관리 및 시각화가 전부였다.
근데 이번에 PM으로 직무전환을 준비하면서 데이터 관련 기술 스택을 더 쌓으면 좋겠다고 생각했고,
스파르타를 통해 Python 데이터 분석을 공부해보려고 한다.
(사실 주식 데이터를 다룬다길래 좀 더 흥미로웠던 것도 있다.)

이번 강의에서는 기존에 사용하던 파이참, VS 코드가 아닌
온라인 환경 구글 Colab에서 작업을 진행한다.
사실 기존 개발 도구들은 라이브러리 다운 받아야하고, 준비해야될 게 많았는데
Colab 같은 경우는 인터넷만 되면 준비 완료이다.

Colab은 구글 내 로그인을 하고 사용하면 되고, 구글 드라이브에 내가 하던 작업들이 저장된다.
하지만 하루에 12시간 정도만 이용제한이 있고, 연속 연결시간은 90분이므로
항상 저장했는지 확인하면서 작업을 해야한다.

그렇다면 파이썬 문법 기초부터 시작해보자.

파이썬 기초 문법 정리

# 변수 & 기본 연산

a = 3      # 3을 a에 넣는다
b = a      # a를 b에 넣는다
a = a + 1  # a+1을 다시 a에 넣는다

num1 = a*b # a*b의 값을 num1이라는 변수에 넣는다
num2 = 99 # 99의 값을 num2이라는 변수에 넣는다

# 변수의 이름은 마음대로 지을 수 있음!
# 진짜 "마음대로" 짓는 게 좋을까? var1, var2 이렇게?

# 리스트형 (순서가 중요함)
a_list = ['사과','배','감','수박']

a_list[0]

a_list.append('귤')

a_list[4]

# Dictionary형 ({ key : value } 형태가 중요하다)
a_dict = {'name':'bob','age':21}

a_dict['age']

a_dict['height'] = 178

a_dict

# Dictionary, list 조합
people = [{'name':'bob','age':20},{'name':'carry','age':38}]

# people[0]['name']의 값은? 'bob'
# people[1]['name']의 값은? 'carry'

person = {'name':'john','age':7}
people.append(person)

# people의 값은? [{'name':'bob','age':20},{'name':'carry','age':38},{'name':'john','age':7}]
# people[2]['name']의 값은? 'john'

# 함수 기초
def sum(a,b): # 더하기
	return a+b

def mul(a,b): # 곱하기
	return a*b

result = sum(1,2) + mul(10,10)
# result라는 변수의 값은? -> 102

# 조건문
if age > 20:
	print('성인입니다')    # 조건이 참이면 성인입니다를 출력
else:
	print('청소년이에요')  # 조건이 거짓이면 청소년이에요를 출력
is_adult(30)

# 반복문
ages = [20,30,15,5,10]

for age in ages:
	print(age)
###
for age in ages:
	if age > 20:
		print('성인입니다')
	else:
		print('청소년이에요')
        
# 조건문 + 함수 + 반복문 예시
def check_adult(age):
	if age > 20:
		print('성인입니다')
	else:
		print('청소년이에요')

ages = [20,30,15,5,10]

for age in ages:
	check_adult(age)

파이썬 기본 문법을 끝내고,
웹 스크래핑 실습을 진행해보았다.


1. 검색어에 대한 뉴스 기사 제목들 가져와보기

2. 주식 종목들 읽어보기 (엑셀 파일 읽기)

3. 주식 종목들 관련 이미지 다운로드 하기

웹 스크래핑이란, 내가 웹페이지에서 보는 글을 원하는 대로 자동으로 가져오는 것.
예를 들어, 검색 포털에서 신문 기사의 제목을 검색한 후 나오는 모든 기사의 제목을 가져올 수도 있다.
(HTML 개발자 도구와 친해지자!)

사실 웹개발 종합반 포스팅에서도 언급했으니, 이번에는 바로 스크래핑을 진행해보도록 한다.
# 함수로 뉴스 기사 스크래핑

from bs4 import BeautifulSoup 
import requests
def get_news(keyword):
  headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
  data = requests.get(f'https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query={keyword}',headers=headers)

  soup = BeautifulSoup(data.text, 'html.parser')
  lis = soup.select('#main_pack > section > div > div.group_news > ul > li')

  for li in lis:
    a = li.select_one('a.news_tit')
    print(a.text, a['href'])

# get_news('현대자동차') -> 현대 자동차에 대한 뉴스 기사 긁어오기!

# 엑셀 파일 읽어보기
# 파일을 읽어오고, for문을 사용해서 각 컬럼과 로우값을 불러온다.
import openpyxl
wb = openpyxl.load_workbook('샘플파일.xlsx')
sheet = wb['Sheet']

rows = list(sheet.rows)[1:]

for row in rows:
	print(row[0].value, row[1].value, row[2].value)
    
# 함수로 뉴스 기사 스크래핑 한 뒤 엑셀로 저장
# get_news리는 함수를 사용하면 기사를 스크래핑한뒤 엑셀로 저장해준다.

from bs4 import BeautifulSoup 
import requests

def get_news(keyword):
  wb= Workbook()
  sheet = wb.active
  
  headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
  data = requests.get(f'https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query={keyword}',headers=headers)

  soup = BeautifulSoup(data.text, 'html.parser')
  lis = soup.select('#main_pack > section > div > div.group_news > ul > li')

  for li in lis:
    a = li.select_one('a.news_tit')
    row = [a.text, a['href']]
    sheet.append(row)

  today = datetime.today().strftime("%Y-%m-%d")
  wb.save(f"news/{today}_{keyword}.xlsx") # 뉴스라는 폴더에 쌓여라~
  wb.close()
  
# 주식 종목 이미지 다운 받기 코드 (1주차의 숙제!)
# 아래 코드로 하면 관리종목이라는 엑셀 내 종목들의 코드를 for문으로 반복적으로 입력하여
# 이미지들을 전부 다운받아준다.
import openpyxl
import urllib.request

wb = openpyxl.load_workbook('관리종목.xlsx')
sheet = wb['종목']

new_rows = list(sheet.rows)[1:]

for row in new_rows:
  print(row[0].value, row[1].value)
  url = f'https://ssl.pstatic.net/imgfinance/chart/item/area/day/{row[1].value}.png'
  urllib.request.urlretrieve(url, f"imgs/{row[0].value}.png")

 

 

### 2주차에서 계속 이어집니다.