[python] 기상청데이터 파싱 분석 및 시각화

eunhye_·2022년 6월 20일
0

Python

목록 보기
2/9
post-thumbnail

모듈 import

from bs4 import BeautifulSoup
import urllib.request as REQ
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
import matplotlib
import seaborn as sns
rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False

자료 불러오기

1.중앙일보 전체기사.xml

jurl = 'https://rss.joins.com/joins_news_list.xml'
response = REQ.urlopen( jurl )
soup = BeautifulSoup( response, 'html.parser') #html.parser , html5lib
soup
for item in soup.select('item'):
    print("기사제목:", item.title.string)
    print('기사내용:', item.description.string)
    print("==================")

2.기상청 데이터 xml

kurl ='http://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109'
kresponse = REQ.urlopen( kurl )
ksoup = BeautifulSoup( kresponse, 'html.parser') #html.parser , html5lib
ksoup
for location in ksoup.select('location'):
    print(location.city.string)
for location in ksoup.select('location'):
    print(location.city.string)
    print("======================")
    for data in location.select('data'):
        print('날짜:',  data.tmef.string )
        print('날씨 : ',data.wf.string)
        print('최저 : ',data.tmn.text)
        print('최고 : ',data.tmx.text)
        print("--------------------------")
kList = []
for location in ksoup.select('location'):
    for data in location.select('data'):
        kList.append( {'도시':location.city.string,
                      '날짜':data.tmef.string,
                      '날씨':data.wf.string,
                      '최저':int(data.tmn.string),
                      '최고':int(data.tmx.string)}  )
  1. DataFrame
kdf = pd.DataFrame( kList)
kdf

예제 풀어보기

#1. 도시와 날짜를 인덱스로 설정하시오.
kdf.set_index(['도시', '날짜'], inplace=True)
kdf

# 2.도시별 최고, 최저기온 평균을 구하시오.
kdf.groupby('도시')[['최저', '최고']].mean()

#3.'비'이 오는 도시 날짜 날씨를 구하시오.
kdf[kdf['날씨']=='흐림'][['날씨']]

#4. 최저기온이 가장낮은 도시, 날짜, 최고기온을 구하시오.
kdf[kdf['최저']==kdf['최저'].min()]

#5. 도시를 입력받아 해당도시 데이터를 구하시오
x =input()
kdf.loc[x]

#느낌 컬럼에 사용할 함수
def feel(v):
    if v>=28:
        return '매우 더움'
    elif 27>=v>=25:
        return '더움'
    else:
        return '보통'

#6. 느낌 컬럼을 추가하고 최고기온에 따라 표시하시오.
kdf['느낌'] = kdf['최고'].apply(feel)
kdf.head()

#7. 서울지역의 날짜별 최고 최저기온을 바차트로 그리시오.
kdf.loc['서울'][['최저','최고']].plot(kind='bar', figsize=(15,7))

#8. 여주지역 최저기온이 22 도 이하인데이터를 구하시오.
kdf[kdf['최저']<=22].loc['여주']

#9. 여주지역 전체 최고기온 중 최고기온이 28 도 이상이 차지하는비율을 구하시오.
above_28 = kdf.loc['여주'].query('최고>=28')['최고'].count()
total= kdf.loc['여주']['최고'].count()
(above_28/total)*10


#10. 일교차 컬럼을 추가하고,최고기온과 최저기온의 차이가 가장높은 도시,날짜,최저,최고,일교차를 구하시오.
kdf['일교차'] = kdf['최고'] - kdf['최저']
kdf.sort_values('일교차', ascending=False).head(5)

아래의 사이트를 참고하였습니다.
https://makeit.tistory.com/112?category=904614

memo

iloc 과 loc에 들어가는 매개변수의 차이 알기!
자료 전처리 과정의 각각의 의미 알기

코드의 오류나 수정사항은 댓글로 남겨주시면 감사하겠습니다.😊

0개의 댓글