데이터분석 1주차 강의 노트정리 [국비지원_스파르타 코딩클럽]

    728x90

    스파르타 코딩클럽 데이터분석 1주차 강의 '핵심' 노트정리

    스파르타 코딩클럽 데이터분석 1주차 강의 '핵심' 노트정리

     

    1. 파이썬 기초

    1-1) 변수 : 값을 담는 박스 같은 것.

    1-2) 리스트형(list), 딕셔너리형(dict)

     

    *list (데이터 묶음) 

     

    a_list = ['사과', '배', ...] : 여러가지 문자열들을 묶어줌. 순서가 중요!

    a_list.append('딸기') : 원래 데이터 묶음에 데이터를 추가할 때 사용.

    a_list[1] 하면 사과가 아니라 배가 나옴. 코딩은 숫자를 0부터 세어줌.

    '  '(작은따옴표) 써야 함. ("  " 큰따옴표 X)

     

    a_list = ['사과','배','감','수박']
    
    a_list.append('딸기')
    
    a_list[4]

     

     

    *dict ( {'key' : 'value'} 형태 )

     

    a_dict = {'name' : '철수' , 'age' : 15}

    a_dict ['height'] =180 : 데이터를 추가할 때 사용.

     

    a_dict = {'name' : '철수' , 'age' : 15}
    
    a_dict['height'] = 180
    
    a_dict

     

     

    ↓  a_list랑 a_dict는 같이 자주 쓰임. (리스트 안에 딕셔너리형을 사용하는 방식으로)

     

    a_list = [{'name' : '철수' , 'age' : 15},{'name' : '영희' , 'age' : 25}]
    
    a_list[1]['name']

     

     

    1-3) 함수 (def)

    def : 정해진 동작을 반복시킬 때 사용.

    return : a+b를 sum(2,3)한 결과인 5로 변신시켜라

     

    def sum(a,b):
      return a+b  
      
    result = sum(2,3)
    
    result

     

     

    1-4) 조건문 (if~else~)

    if 조건 : else 조건 : 

    : 조건 걸 때 사용.

    :(콜론) 꼭 붙여줘야 함.

     

    age = 15
    
    if age > 20 :
      print ('성인')
    else :
      print ('청소년')

     

     

    ↓ def랑 if절 같이 쓰이는 경우

     

    age = 25
    
    def is_adult(age):
      if age > 20 :
        print ('성인')
      else :
        print ('청소년')
        
    is_adult(30)
    is_adult(25)
    is_adult(15)

     

     

     

    1-5) 반복문 (for문)

    for (찾을 key값) in (key값을 포함하는 데이터묶음)

    : 반복을 하려면 반복할 데이터 꾸러미가 있어야 함. 그래서 반복문은 항상 list랑 같이 쓰임.

    : for문은 리스트에 있는 데이터를 꺼내 쓰는 것

    → 리스트를 돌면서 데이터를 하나씩 꺼내와서 사용.

     

    ages = [15,25,30,13]
    
    for age in ages:
      is_adult(age)

     

    → ages에서 나이 데이터를 하나씩 꺼내와서 age에 넣는 것.

     

     


    2. 업무자동화_웹 스크래핑

    2-1) 라이브러리 설치문법

    !pip install bs4 requests

    ! (느낌표)를 꼭 써줘야 파이썬 이외의 문법인 것을 인지함.

     

    2-2) 웹 스크래핑

     

    ▶ 웹 스크래핑 기본코드 (크롤링 기본코드)

    import requests
    from bs4 import BeautifulSoup
    
    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('https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query=삼성전자',headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    
    soup

     

    2-2-0) 기사제목에 마우스 우클릭으로 '검사' 들어가서 코드로 짜여진 웹 구성요소들 구경해보기

     

    li 가 기사 한 칸을 의미함.
    01

    : li들을 포함하고 있는 상위 항목은 ul

    : li 는 기사 한 칸을 의미함.

    : li 안에 <a href = ~~> 부분은 기사제목 코드

    : 특정지어줄 때는 보통 a태그 중  <a href = ~~ class="news_tit"~~> class로 지어줌

     

     

    2-2-1) 기사 한 개 가져와보기

    import requests
    from bs4 import BeautifulSoup
    
    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('https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query=삼성전자',headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    
    a = soup.select_one('#sp_nws1 > div.news_wrap.api_ani_send > div > a')
    
    a['href']

    → a = soup.select_one ('#sp_nws1 > div.news_wrap.api_ani_send > div > a') 

    : 작은 따옴표 안에 있는 부분은 기사제목 코드 복사한 것.

     

     

    : 검색엔진에 키워드 검색 > 기사 제목에 마우스 우클릭 > '검사' 클릭 > 기사부분 코드 찾아서 마우스 우클릭 > Copy > Copy selector > colab에서 위 코드의 작은 따옴표 안에 붙여넣기

    a['href'] : 기사 링크가 출력됨.

    a.text : 기사 제목이 출력됨.

     

     

    2-2-2) 기사 여러 개 가져오기

    ① lis 정의하고, 시험삼아 lis[0]번째 기사 가져와보기

    import requests
    from bs4 import BeautifulSoup
    
    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('https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query=삼성전자',headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    
    lis = soup.select('#main_pack > section > div > div.group_news > ul > li')
    
    a = lis[0].select_one('a.news_tit')
    
    a.text , a['href']

     

     

    ② lis[0]번째 기사 뿐만 아니라 다른 기사들도 출력하려면 이 과정을 반복하면 됨.

    : 반복문 for 사용하기

    import requests
    from bs4 import BeautifulSoup
    
    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('https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query=삼성전자',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'])

     

     

    ③ 이번에는 '삼성전자' 말고 다른 키워드로 된 기사들 뽑아보기

    : '현대자동차'를 넣어도 똑같은 작업을 하고, 'LG전자'를 넣어도 똑같은 작업을 하게 하려면 함수화 시키면 됨.

    ※ '삼성전자'가 있던 부분을 {keyword}로 바꿔주는데 링크의 맨 앞에 f 도 같이 붙여줘야 함.

    → data = requests.get(f 'https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query={keyword}',headers=headers)

    import requests
    from bs4 import BeautifulSoup
    
    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('현대자동차')

     

     


    3. 업무자동화_엑셀다루기

    3-1) 라이브러리 설치문법

    !pip install openpyxl

    ! (느낌표)를 꼭 써줘야 파이썬 이외의 문법인 것을 인지함.

     

    3-2) 엑셀 읽기, 저장하기

    ▶ openpyxl 기본코드

    from openpyxl import Workbook
    
    wb= Workbook()
    sheet = wb.active
    
    sheet['A1'] = '안녕하세요!'
    
    wb.save("샘플파일.xlsx")
    wb.close()

     

    3-2-0) 위 코드로 샘플파일이 저장되면 열어보기

    01

     

    3-2-1) 샘플파일로 엑셀파일 읽어오기 연습

    ① 위에서 저장한 [A1]셀에 '안녕하세요!' 라고 쓰여있는 엑셀파일을 아래와 같이 수정하고 저장함.

     

    ② Colab에 저장되어 있던 샘플파일은 지우고, ①번에서 수정한 샘플파일을 드래그해서 [파일]에 옮기기.

     

    ③ 수정한 샘플파일 읽기

     

    ▶엑셀읽기 코드스니펫

    import openpyxl
    wb = openpyxl.load_workbook('샘플파일.xlsx')
    sheet = wb['Sheet']
    
    sheet['A1'].value

    : 여기서 Ctrl+Enter를 치면 수정한 샘플파일의 [A1]셀에 입력되어 있는 '번호'라는 문자가 출력됨.

    하지만 [A1], [B2] 이렇게 하나씩 지정해서 읽어주면 코드가 너무 길어짐.  →  ∴ for문 사용

     

    import openpyxl
    wb = openpyxl.load_workbook('샘플파일.xlsx')
    sheet = wb['Sheet']
    
    rows = sheet.rows
    
    for row in rows:
      print(row[0].value, row[1].value, row[2].value)

     

     

    : 위 결과물에서 번호, 상품, 가격 이라는 카테고리가 안 나오게 하려면 

    rows = sheet.rows를 리스트로 묶은 뒤에 [1:]를 붙여주면 됨.

     

     

    : 여기에서 만약 가격(row[2].value)이 300원보다 높은 것들만 골라내고 싶으면 if문 사용.

    ※ for문, if절, print() 들여쓰기 잘 안하면 오류나니까 주의!

     

    rows = list(sheet.rows)[1:]
    
    for row in rows :
      if row[2].value < 300 :
        print(row[0].value, row[1].value, row[2].value)

     

     

    3-2-2) 기사 받아온 것을 엑셀파일에 넣고, 저장해보기

    ① 2-2)의 웹 스크래핑 코드(2-2-2의 ③)에 3 -2)의 openpyxl 기본코드 섞어넣기

    + wb.save("샘플파일.xlsx") 부분은 앞에 f 넣고, {keyword}로 바꿔주기

    → wb.save(f "{keyword}.xlsx")

     

    import requests
    from bs4 import BeautifulSoup
    from openpyxl import Workbook
    
    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')
        print(a.text, a['href'])
    
      wb.save(f"{keyword}.xlsx")
      wb.close()

     

     

    ② a.text와 a['href']를 0번째와 1번째에 놓고, 데이터를 밑으로 쌓을 수 있게하기

     row = [a.text, a['href']]
           sheet.append(row)

     

     

    ③ def함수 >> get_news 이용해서 삼성전자랑 현대자동차 데이터 엑셀파일 만들어보기

    get_news('삼성전자')
    
    get_news('현대자동차')

     

     

    ④ 엑셀파일 이름에 날짜 추가해보기

     

    ▶파이썬 날짜 가져오기 코드스니펫

    from datetime import datetime
    
    datetime.today().strftime("%Y-%m-%d")

    : 위 코드스니펫도 웹 스크래핑 코드에 섞어넣기

     

    01

     

    ⑤ news라는 폴더에 저장해보기 (news라는 폴더를 먼저 생성해놔야 함)

    news/ 라고 쓰면 됨.

     


    4. 업무자동화_ 파일 다운로드 

    : 여러 개의 종목을 한 번에 파일로 만들어서 쭉 다운받는 법

     

    ▶회사리스트 코드스니펫

    ['삼성전자','LG에너지솔루션','SK하이닉스','NAVER','삼성바이오로직스','삼성전자우','카카오','삼성SDI','현대차','LG화학','기아','POSCO홀딩스','KB금융','카카오뱅크','셀트리온','신한지주','삼성물산','현대모비스','SK이노베이션','LG전자','카카오페이','SK','한국전력','크래프톤','하나금융지주','LG생활건강','HMM','삼성생명','하이브','두산중공업','SK텔레콤','삼성전기','SK바이오사이언스','LG','S-Oil','고려아연','KT&G','우리금융지주','대한항공','삼성에스디에스','현대중공업','엔씨소프트','삼성화재','아모레퍼시픽','KT','포스코케미칼','넷마블','SK아이이테크놀로지','LG이노텍','기업은행']

     

    ① 위 회사 keyword들을 리스트로 묶은 뒤에 for문을 사용해서 get_news함수의 keyword자리에 넣어주기

    keywords = ['삼성전자','LG에너지솔루션','SK하이닉스','NAVER','삼성바이오로직스','삼성전자우','카카오','삼성SDI','현대차','LG화학','기아','POSCO홀딩스','KB금융','카카오뱅크','셀트리온','신한지주','삼성물산','현대모비스','SK이노베이션','LG전자','카카오페이','SK','한국전력','크래프톤','하나금융지주','LG생활건강','HMM','삼성생명','하이브','두산중공업','SK텔레콤','삼성전기','SK바이오사이언스','LG','S-Oil','고려아연','KT&G','우리금융지주','대한항공','삼성에스디에스','현대중공업','엔씨소프트','삼성화재','아모레퍼시픽','KT','포스코케미칼','넷마블','SK아이이테크놀로지','LG이노텍','기업은행']
    
    for keyword in keywords :
      print(keyword)
      get_news(keyword)

     

    news 폴더에 엑셀파일로 다 저장됨

     

    ② 많은 종목들의 엑셀파일을 일일이 다운받으면 번거로우니까 폴더를 묶어서 다운받기

     

    ▶압축하기 코드스니펫

    !zip -r /content/files.zip /content/news

     

     


    5. 업무자동화_이름바꾸기

     

    ▶ 파일명 체크 코드스니펫

    import os
    
    path = '/content/news'
    files = os.listdir(path)
    
    for file in files:
      print(file)

     

    ⓛ 위 코드를 치면 나오는 여러 종목 엑셀파일들 중에 '2023-01-20_KB금융.xlsx' 하나만 엑셀파일 이름 바꿔보기

    name = '2023-01-20_KB금융.xlsx'
    new_name = name.split('.')[0]+'(뉴스).xlsx'

     

     

    * '2023-01-20_KB금융.xlsx' → '2023-01-20_KB금융(뉴스).xlsx'로 바꾸기

    : name.split으로  '2023-01-20_KB금융.xlsx' 에서 .(마침표)를 기준으로 앞/뒤로 나눌 수 있음.

    : name.split('.')[0] 하면 마침표를 기준으로 첫 번째를 출력하므로 '2023-01-20_KB금융'이 나옴.

    : 여기에 '+ (뉴스).xlsx'를 추가로 적어주고 new_name으로 설정해주면 끝!

     

    ② 파일명 체크 코드스니펫에 이름 코드 일반화해서 섞어넣기

    import os
    
    path = '/content/news'
    files = os.listdir(path)
    
    for name in files:
      new_name = name.split('.')[0]+'(뉴스).xlsx'
      print(name)
      os.rename(f'/content/news/{name}',f'/content/news/{new_name}')

     

    : for file in files → for name in files

    : os.rename(원래 이름, 바뀐 이름)

    : 앞에 f 적어주고 {name}, {new_name} 

     

    01

     


    6. 업무자동화_ 이미지 다운로드

     

    ▶ 파이썬 이미지 다운로드 

    import urllib.request
    
    url = '여기에 URL을 입력하기'
    urllib.request.urlretrieve(url, "test.jpg")

     

    ① '삼성전자' 한 종목의 이미지 다운 받아보기

    : finance.naver.com 에 접속해서 '삼성전자' 치기 (아무 종목이나 쳐봐도 됨) 

    : 3년으로 설정하고 마우스 우클릭 → 이미지 주소복사 누르기

    : 복사한 주소를 새 창으로 열기 ( ↓ ?뒤에는 지워도 됨)

     

     

    : ? (물음표) 앞에 있는 숫자 005930이 '삼성전자'를 나타내는 숫자.

    → 이 숫자를 바꾸면 다른 종목의 이미지도 볼 수 있음.

     

     

    * '삼성전자' 이미지 다운로드

    import urllib.request
    
    url = 'https://ssl.pstatic.net/imgfinance/chart/item/area/year3/005930.png'
    urllib.request.urlretrieve(url, "삼성전자.png")

     

    01

    ② 다양한 종목의 이미지 다운로드 받기

     

    >> 데이터분석 1주차 숙제 (데이터분석 1주차 후기에서 확인 가능!)

     

    ♣ 데이터분석 1주차 강의 후기 ♣  https://nasena.tistory.com/14
    728x90

    댓글