kevin111234 / MarketVision_api

fast api를 통한 api 서비스 제작
0 stars 0 forks source link

뉴스 데이터 분석 코드 with Chat GPT #2

Open kevin111234 opened 3 months ago

kevin111234 commented 3 months ago

물론입니다! 코드를 자세하게 분석해 보겠습니다. 코드는 주식 데이터를 기반으로 관련 뉴스를 수집하고, 이 뉴스에서 핵심 키워드를 추출하여 주가 변동과 함께 시각화하는 작업을 수행합니다. 이 코드의 구성 요소와 작동 방식을 라이브러리 및 함수 설명을 포함해 단계별로 설명하겠습니다.

1. 필요한 라이브러리 임포트

import pandas as pd
import requests
import re
from bs4 import BeautifulSoup as bs
from fake_useragent import UserAgent
import plotly.express as px
from collections import Counter
from konlpy.tag import Hannanum
import FinanceDataReader as fdr

import warnings
warnings.filterwarnings(action='ignore')

2. 초기 설정 및 데이터 수집

hannanum = Hannanum() 
df_krx = fdr.StockListing('KRX')
fu = UserAgent()
user = fu.random
headers = {'User-Agent': user}

3. 사용자 입력 및 주가 데이터 수집

stock_name = str(input('종목명을 입력하시오: '))
stock_num = df_krx[df_krx['Name'] == stock_name]['Code'].values[0]
price = fdr.DataReader(stock_num).reset_index()[['Date', 'Close']]

4. 데이터 프레임 초기화

columns = ['Date', 'Close'] + ['Top' + str(i) for i in range(1, 11)] + ['Main_News' + str(i) for i in range(1, 11)]
keyword = pd.DataFrame(columns=columns)

keyword['Date'] = price['Date']
keyword['Close'] = price['Close']

5. 뉴스 수집 및 키워드 분석 함수

5.1 news_collector 함수

def news_collector(search, media, make_date1, make_date2):
    ...

5.2 each_day_news 함수

def each_day_news(date):
    ...

6. 뉴스 데이터 처리 및 시각화

list(map(each_day_news, keyword['Date']))
keyword2 = keyword.fillna(' ')
col = [i for i in keyword2.columns]
px.line(keyword2, x="Date", y="Close", title=stock_name+"(마우스를 그래프에 얹으면 상자가 뜹니다!!)", hover_data=col)

정리

이 코드의 목적은 주식 종목의 과거 주가 데이터와 관련 뉴스 데이터를 수집하고, 이를 바탕으로 주가와 뉴스 키워드의 변동을 시각화하는 것입니다. 네이버 뉴스와 네이버 금융에서 데이터를 수집하며, 한국어 텍스트 처리를 통해 중요한 키워드를 추출합니다. 이렇게 수집된 데이터를 사용하여 주가 변동과 뉴스 키워드 간의 연관성을 시각적으로 분석할 수 있습니다.

kevin111234 commented 3 months ago

물론입니다. 함수 부분의 코드 한 줄 한 줄을 자세히 분석해보겠습니다. 두 개의 주요 함수인 news_collectoreach_day_news를 순서대로 설명하겠습니다.

1. news_collector 함수

이 함수는 특정 검색어에 대해 네이버 뉴스에서 기사를 수집하고, 기사 본문을 텍스트로 추출합니다.

def news_collector(search, media, make_date1, make_date2):
    url = f'https://search.naver.com/search.naver?where=news&query={search}&sm=tab_opt&sort=0&photo=0&field=0&pd=3&ds={make_date1}&de={make_date2}&docid=&related=0&mynews=1&office_type=1&office_section_code=1&news_office_checked={media}&nso=so%3Ar%2Cp%3Afrom{make_date1.replace(".","")}%2Cto{make_date2.replace(".","")}&start=1'
    req = requests.get(url, headers=headers)
    soup = bs(req.text, 'html.parser')
    naver_news = soup.find_all('a', class_='news_tit')
    news_list = []
    for news in naver_news:
        url = news['href']
        req = requests.get(url, headers=headers)
        soup = bs(req.text, 'html.parser')
        try:
            article_body = soup.find('div', class_='go_trans _article_content').get_text()
            article_body = re.sub(r'\([^)]*\)', '', article_body)
            article_body = re.sub(r'\[[^]]*\]', '', article_body)
            article_body = re.sub(r'\<[^)]*\>', '', article_body)
            article_body = article_body.replace('\n', ' ').replace('\t', ' ').strip()
            news_list.append(article_body)
        except:
            pass
    return news_list

2. each_day_news 함수

이 함수는 주어진 날짜에 대해 news_collector 함수를 호출하여 뉴스 데이터를 수집하고, 그 데이터를 keyword 데이터프레임에 추가합니다.

def each_day_news(date):
    date = date.strftime('%Y.%m.%d')
    make_date = date.replace('.', '')
    make_date1 = date
    make_date2 = date
    mk = news_collector(stock_name, '1009', make_date1, make_date2) # 매일경제
    ed = news_collector(stock_name, '1018', make_date1, make_date2) # 이데일리
    yh = news_collector(stock_name, '1020', make_date1, make_date2) # 연합뉴스
    fn = news_collector(stock_name, '1015', make_date1, make_date2) # 파이낸셜뉴스
    ks = news_collector(stock_name, '1008', make_date1, make_date2) # 한국경제
    news = mk + ed + yh + fn + ks
    news_noun = []
    for i in news:
        noun = hannanum.nouns(i)
        news_noun += noun
    count = Counter(news_noun)
    top_10 = count.most_common(10)
    keyword.loc[keyword['Date'] == date, 'Top1':'Top10'] = [i[0] for i in top_10]

    main_news = news_collector(stock_name, '1001', make_date1, make_date2) # 네이버 금융 메인 뉴스
    main_news_noun = []
    for i in main_news: