46. 실전예제: 웹의 데이터로 그래프 그리기

Joy·2020년 4월 8일
0

파이썬을 실무에서 어떻게 사용하는지 간단한 예제
웹의 데이터를 가져온 뒤 그래프로 그리는 방법

기상청(http://www.kma.go.kr)의 도시별 현재날씨 페이지에서 기온과 습도를 가져와서 그래프 그리기

아나콘다 설치

Windows에서는 pip로 패키지를 설치하더라도 중간에 에러가 나는 경우가 많습니다. 그러다보니 Windows에서는 주요 패키지가 포함된 파이썬 배포판을 사용

주피터 노트북

웹 브라우저에서 파이썬 코드를 작성하고 실행까지 해볼 수 있는 주피터 노트북(jupyter notebook)

아나콘다 없이 주피터 노트북

C:\Users\dojang>pip install notebook
C:\Users\dojang>jupyter notebook

에러 발생할 수 있음.

실행

  • C:\Users\<사용자계정>\Anaconda3\python.exe -m notebook

파이썬 노트북 만들기

오른쪽 New 버튼을 클릭한 뒤 Python 3을 클릭
설명추가 : 메뉴의 드롭다운 목록에서 Markdown을 선택하고 빈칸에 다음 내용을 입력
메뉴에서 ▶| 버튼을 클릭하면 설명이 적용되고 아래에 셀(Cell)에 코드 입력

html 가져와서 파일로 저장하기

기상청 웹 사이트에서 도시별 현재날씨 페이지의 HTML을 가져와보기

  1. 웹브라우져에서 해당 주소로 이동
    http://www.kma.go.kr/weather/observation/currentweather.jsp

  2. 데이터 선별해서 가져오기 - 지점, 기온(현재기온), 습도만

!! 개편을 하므로 웹 페이지의 HTML 구조도 바뀌면 실습 못하니까 원활한 실습을 위해 도시별 현재날씨 페이지를 복사해서 올려놓은 Bitbucket 주소를 사용하겠습니다.
https://pythondojang.bitbucket.io/weather/observation/currentweather.html


import requests                  # 웹 페이지의 HTML을 가져오는 모듈
from bs4 import BeautifulSoup    # HTML을 파싱하는 모듈
 
# 웹 페이지를 가져온 뒤 BeautifulSoup 객체로 만듦
response = requests.get('https://pythondojang.bitbucket.io/weather/observation/currentweather.html')
soup = BeautifulSoup(response.content, 'html.parser')
 
table = soup.find('table', { 'class': 'table_develop3' })    # <table class="table_develop3">을 찾음
data = []                            # 데이터를 저장할 리스트 생성
for tr in table.find_all('tr'):      # 모든 <tr> 태그를 찾아서 반복(각 지점의 데이터를 가져옴)
    tds = list(tr.find_all('td'))    # 모든 <td> 태그를 찾아서 리스트로 만듦
                                     # (각 날씨 값을 리스트로 만듦)
    for td in tds:                   # <td> 태그 리스트 반복(각 날씨 값을 가져옴)
        if td.find('a'):             # <td> 안에 <a> 태그가 있으면(지점인지 확인)
            point = td.find('a').text    # <a> 태그 안에서 지점을 가져옴
            temperature = tds[5].text    # <td> 태그 리스트의 여섯 번째(인덱스 5)에서 기온을 가져옴
            humidity = tds[9].text       # <td> 태그 리스트의 열 번째(인덱스 9)에서 습도를 가져옴
            data.append([point, temperature, humidity])    # data 리스트에 지점, 기온, 습도를 추가
            
 
# 웹 페이지를 가져온 뒤 BeautifulSoup 객체로 만듦
response = requests.get('https://pythondojang.bitbucket.io/weather/observation/currentweather.html')
soup = BeautifulSoup(response.content, 'html.parser')

with open('weather.csv', 'w',  encoding='utf-8') as file:    # weather.csv 파일을 쓰기 모드로 열기
    file.write('point,temperature,humidity\n', )                  # 컬럼 이름 추가
    for i in data:                                              # data를 반복하면서
        file.write('{0},{1},{2}\n'.format(i[0], i[1], i[2]))    # 지점,온도,습도를 줄 단위로 저장

결과:

데이터로 그래프 그리기

데이터 불러오기

  • 필요 라이브러리 불러오기
  • 파일 읽고 pandas의 DataFrame 객체로 만들기
  • 파일 읽을 때 인코딩은 같은것으로!! encoding='utf-8' or charset=euc-kr"
# %matplotlib inline을 설정하면 matplotlib.pyplot의 show 함수를 호출하지 않아도
# 주피터 노트북 안에서 그래프가 표시됨
%matplotlib inline
import pandas as pd                # 데이터를 저장하고 처리하는 패키지
import matplotlib as mpl           # 그래프를 그리는 패키지
import matplotlib.pyplot as plt    # 그래프를 그리는 패키지
 
# csv 파일을 읽어서 DataFrame 객체로 만듦. 인덱스 컬럼은 point로 설정
df = pd.read_csv('weather.csv', index_col='point')

df는 이런식으로 저장됨

데이터 분리하기

loc 속성 : 특정 인덱스만 가져오고 싶을 때
DataFrame객체.loc['인덱스']
DataFrame객체.loc[['인덱스1', '인덱스2']]

특별시 광역시만 모으기

  • loc 속성 이용해서 특정 인덱스의 데이터만 가져오기.
# 특별시, 광역시만 모아서 DataFrame 객체로 만듦
city_df = df.loc[['서울', '인천', '대전', '대구', '광주', '부산', '울산']]
city_df    # city_df 표시

그래프 그리기

  • matplotlib 한글 표시 설정해주기 : 그래프에 한글 지원 안하기 때문.

  • plot 매서드로 그래프 그리기 : 차트 종류, 제목, 차트 크기, 범례, 폰트 크기 설정

  • set_xlabel, set_ylabel 로 축 정보 표시해주기

  • legend 메서드에 범례 넣어주기 : 그래프의 값이 뭐를 의미하는지.

# Windows 한글 폰트 설정
font_name = mpl.font_manager.FontProperties(fname='C:/Windows/Fonts/malgun.ttf').get_name()
mpl.rc('font', family=font_name)
 
# 차트 종류, 제목, 차트 크기, 범례, 폰트 크기 설정
ax = city_df.plot(kind='bar', title='날씨', figsize=(12, 4), legend=True, fontsize=12)
ax.set_xlabel('도시', fontsize=12)          # x축 정보 표시
ax.set_ylabel('기온/습도', fontsize=12)     # y축 정보 표시
ax.legend(['기온', '습도'], fontsize=12)    # 범례 지정

참고

  • %matplotlib inline : 주피터 노트북에서 matplotlib.pyplot의 show 함수를 호출하지 않아도 주피터 노트북 안에서 그래프가 표시

  • show 메서드로 그래프를 표시 plt.show()
    주피터 사용하지 않으면..

    plt.show()
    %matplotlib inline을 지정하지 않았거나 IDLE, 파이썬 인터프리터에서
    그래프를 표시하려면 matplotlib.pyplot의 show 함수 호출

DataFrame 기본 기능

  • 접근하기 / 값 가져오기

    DataFrame객체['컬럼이름']
    DataFrame객체.컬럼이름
    해당하는 칼럼의 값 가져옴

  • 최대값, 최소값을 가진 인덱스 출력하기

    df객체.칼롬이름.argmax()
    df객체.칼롬이름.argmin()
    해당 객체의 해당 칼럼의 최소/대 값이 있는 인덱스 불러옴

  • 해당 인덱스가 위치한 행 가져오기

    df객체.loc[df객체.칼럼이름.argmax()]
    객체의 칼럽이름에서 최대값을 가진 인덱스의 데이터 가져올 수 있음.

profile
roundy

0개의 댓글