-
웹의 데이터로 그래프 그리기Python 2023. 10. 31. 12:45
주피터 노트북 사용
기본 code로 되어 있는 것 markdown으로 바꿔서 작성하면
위와 같이 사용 가능
웹 페이지의 HTML 가져와 파일로 저장하기
웹 브라우저에서 F12 누르고 개발자 도구 표시
주피터 노트북 만들기
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 class="table_develop3">을 찾음 table = soup.find('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'): # 지점인지 확인 point = td.find('a').text temperature = tds[5].text # <td> 태그 리스트의 여섯 번째(인덱스5)에서 기온 가져옴 humidity = tds[9].text # <td> 태그 열 번째에서 습도를 가져옴 data.append([point, temperature, humidity]) # data 리스트에 지점, 기온, 습도 추가 data # 실행 결과 [['서울', '25.6', '30'], ['백령도', '18.4', '62'], ['인천', '20.8', '54'], ['수원', '25.0', '41'], ['동두천', '24.9', '34'], ['파주', '25.1', '39'], ['강화', '20.0', '56'], ['양평', '25.5', '32'], ['이천', '25.6', '28'], ['북춘천', '24.6', '36'], ['북강릉', '19.9', '56'], ['울릉도', '16.8', '77'], ['속초', '19.1', '75'], ['철원', '23.9', '37'], ['대관령', '17.9', '49'], ['춘천', '25.7', '39'], ['강릉', '22.7', '41'], ['동해', '19.5', '77'], ['원주', '23.4', '36'], ['영월', '24.2', '34'], ['인제', '24.3', '31'], ['홍천', '25.4', '25'], ['태백', '19.6', '43'], ['정선군', '23.0', '32'], ['서산', '23.6', '49'], ['청주', '24.3', '33'], ['대전', '25.1', '37'], ['충주', '24.4', '32'], ['추풍령', '23.0', '35'], ['홍성(예)', '24.3', '46'], ['제천', '24.2', '32'], ['보은', '23.7', '28'], ['천안', '23.5', '35'], ['보령', '21.4', '56'], ['부여', '23.9', '37'], ['금산', '23.7', '30'], ['전주', '24.9', '44'], ['광주', '24.0', '35'], ['목포', '22.8', '51'], ['여수', '22.8', '49'], ['흑산도', '19.2', '93'], ['군산', '21.8', '55'], ['완도', '23.2', '45'], ['고창', '22.7', '53'], ['순천', '22.5', '40'], ['진도(첨찰산)', '22.2', '48'], ['부안', '22.9', '44'], ['임실', '22.8', '40'], ['정읍', '23.8', '47'], ['남원', '23.8', '35'], ['장수', '22.0', '33'], ['고창군', '23.7', '48'], ['영광군', '22.4', '40'], ['순창군', '23.5', '38'], ['보성군', '23.7', '34'], ['강진군', '24.1', '33'], ['장흥', '25.5', '33'], ['해남', '24.6', '40'], ['고흥', '24.4', '34'], ['광양시', '24.6', '43'], ['진도군', '21.9', '58'], ['제주', '20.7', '60'], ['고산', '19.1', '74'], ['성산', '23.1', '33'], ['서귀포', '24.0', '43'], ['안동', '25.0', '32'], ['포항', '19.0', '83'], ['대구', '25.7', '31'], ['울산', '19.7', '70'], ['창원', '20.6', '63'], ['부산', '20.2', '66'], ['울진', '17.6', '84'], ['상주', '25.0', '32'], ['통영', '20.0', '71'], ['진주', '23.8', '30'], ['김해시', '21.9', '60'], ['북창원', '22.8', '50'], ['양산시', '21.4', '63'], ['의령군', '25.1', '40'], ['함양군', '23.3', '38'], ['봉화', '22.0', '38'], ['영주', '23.0', '36'], ['문경', '25.5', '26'], ['청송군', '17.9', '71'], ['영덕', '19.4', '57'], ['의성', '25.7', '25'], ['구미', '25.7', '32'], ['영천', '21.8', '47'], ['경주시', '23.8', '49'], ['거창', '22.7', '38'], ['합천', '25.1', '32'], ['밀양', '24.7', '34'], ['산청', '24.8', '41'], ['거제', '23.1', '57'], ['남해', '24.5', '40']]
데이터를 csv 파일에 저장하기
with open('weather.csv', 'w') 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])) # 지점, 온도, 습도를 줄 단위로 저장
메모장이나 기타 텍스트 편집기로 열어 보면
이런 형태로 저장된 것 확인 가능
데이터로 그래프 그리기
# %matplotlib inline을 설정하면 matplotlib.pyplot의 show 함수 호출 없이도 주피터 노트북 안에서 그래프가 표시됨 %matplotlib inline import pandas as pd # 데이터 저장, 처리하는 패키지 import matplotlib as mpl # 그래프 그리는 패키지 import matplotlib.pyplot as plt # 그래프 그리는 패키지 # csv 파일을 읽어 DataFrame 객체로 만듦, 인덱스 컬럼은 point로 설정, 인코딩은 euc-kr로 설정 df = pd.read_csv('weather.csv', index_col='point', encoding='euc-kr') df
실행 결과
주피터 노트북은 pandas 패키지의 DataFrame을 표 형태로 보여 주므로 편리
DataFrame
pandas의 DataFrame은 엑셀 형태의 자료형인데 열(컬럼)과 행(로우)으로 구성되어 있음
csv 파일의 내용을 별도의 처리 없이 그대로 DataFrame으로 가져올 수 있어 편리함
단, csv 파일의 첫 줄에는 point, temperature, humidity처럼 컬럼 이름이 들어 있어야 함
특별시 광역시만 모으기
# 특별시, 광역시만 모아 DataFrame 객체 만듦 city_df = df.loc[['서울', '인천', '대전', '대구', '광주', '부산', '울산']] city_df
· DataFrame객체.loc['인덱스]
· DataFrame객체.loc[['인덱스1', '인덱스2']]
df.loc['서울']
df.loc[['서울', '부산']]
특별시, 광역시만 그래프 그리기
# 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) # 범례 지정
'Python' 카테고리의 다른 글
넘파이 기본: 배열과 벡터 연산 (0) 2023.11.07 파이썬 기초와 Ipython, jupyter notebook (0) 2023.10.31 모듈과 패키지 만들기 (0) 2023.10.30 모듈과 패키지 사용 (0) 2023.10.30 정규표현식 (0) 2023.10.25