파이썬을 실무에서 어떻게 사용하는지 간단한 예제
웹의 데이터를 가져온 뒤 그래프로 그리는 방법
Windows에서는 pip로 패키지를 설치하더라도 중간에 에러가 나는 경우가 많습니다. 그러다보니 Windows에서는 주요 패키지가 포함된 파이썬 배포판을 사용
웹 브라우저에서 파이썬 코드를 작성하고 실행까지 해볼 수 있는 주피터 노트북(jupyter notebook)
C:\Users\dojang>pip install notebook
C:\Users\dojang>jupyter notebook
에러 발생할 수 있음.
오른쪽 New 버튼을 클릭한 뒤 Python 3을 클릭
설명추가 : 메뉴의 드롭다운 목록에서 Markdown을 선택하고 빈칸에 다음 내용을 입력
메뉴에서 ▶| 버튼을 클릭하면 설명이 적용되고 아래에 셀(Cell)에 코드 입력
기상청 웹 사이트에서 도시별 현재날씨 페이지의 HTML을 가져와보기
웹브라우져에서 해당 주소로 이동
http://www.kma.go.kr/weather/observation/currentweather.jsp
데이터 선별해서 가져오기 - 지점, 기온(현재기온), 습도만
!! 개편을 하므로 웹 페이지의 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])) # 지점,온도,습도를 줄 단위로 저장
결과:
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']]
# 특별시, 광역시만 모아서 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객체.컬럼이름
해당하는 칼럼의 값 가져옴
최대값, 최소값을 가진 인덱스 출력하기
df객체.칼롬이름.argmax()
df객체.칼롬이름.argmin()
해당 객체의 해당 칼럼의 최소/대 값이 있는 인덱스 불러옴
해당 인덱스가 위치한 행 가져오기
df객체.loc[df객체.칼럼이름.argmax()]
객체의 칼럽이름에서 최대값을 가진 인덱스의 데이터 가져올 수 있음.