주 제 : 데이터 병합
데이터 : 기상자료개방포털(데이터>날씨예보>동네예보>실황분석자료의 1시간 자료)
관측소지역은 강릉의 21개지역
1. 데이터 병합
상기 기상자료개방포털을 통해서 강릉의 21개의 관측소 데이터를 다운로드할 수 있습니다. 제가 지금부터 작업하고자 하는 것은 하나의 station의 최근 8년간의 데이터로 Boxplot*를 그리고자 합니다. 데이터는 연도별로 다운로드할 수 있으며, 8년간의 데이터를 가지고 Boxplot를 그리려면 데이터 병합하는 작업이 필요합니다. 그럼, 2가지 방법으로 데이터 병합을 진행해보도록 하겠습니다.
1.1. 박스플롯(Boxplot*)
우선, 박스플롯에 대해 간단하게 짚고 넘아가겠습니다. 어원에서 파악할 수 있듯이 박스플롯은 "박스"로 수치적 자료를 표현하는 그래프의 방식입니다. 이를 기술통계학(Descriptive Statistics)에서는 "box-and-whisker plot" 또는 "boxplot"이라고 하며, 탐색적 데이터분석(Exploratory Data Anaylsis, EDA)작업 시 사용합니다. 박스플롯을 통해서 데이터의 개략적인 정보를 확인할 수 있습니다. ▶ 최솟값, 제 1사분위, 제 2사분위, 제 3사분위, 최대값
2. glob.glob() 적용
파일이 하나 이상임으로 for문을 활용해보록 하겠습니다.
%matplotlib inline #그래프를 그리기위한 설정
mpl.rcParams['axes.unicode_minus'] = False #그래프에서 마이너스 폰트 이슈 해결방안
import glob
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm # 필요한 패키지와 라이브러리 import
input_path = "/home/park/PROJ_무더위쉼터/DATA/*교1동.csv"
for f in glob.glob(input_path):
print(f)
print(f) 결과 : /home/park/PROJ_무더위쉼터/DATA/17교1동.csv
/home/park/PROJ_무더위쉼터/DATA/15교1동.csv
/home/park/PROJ_무더위쉼터/DATA/13교1동.csv
/home/park/PROJ_무더위쉼터/DATA/14교1동.csv
/home/park/PROJ_무더위쉼터/DATA/11교1동.csv
/home/park/PROJ_무더위쉼터/DATA/16교1동.csv
/home/park/PROJ_무더위쉼터/DATA/18교1동.csv
/home/park/PROJ_무더위쉼터/DATA/12교1동.csv
print(f)결과를 보면, 정렬된 상태가 아닙니다. sorted()를 이용해서 변경하겠습니다.
input_path = "/home/park/PROJ_무더위쉼터/DATA/*교1동.csv"
output_file = "/home/park/PROJ_무더위쉼터/DATA/교1동11-18.csv"
all_data = pd.DataFrame()
for f in sorted(glob.glob(input_path)) :
df = pd.read_csv(f, names = ['Day','Hour','TEM'], skiprows=[0])
all_data = all_data.append([df],ignore_index=True, sort= False)
#all_data.to_csv(output_file)
#print(all_data)
DATA=[all_data['TEM']]
print(DATA)
주석처리한 부분(#print(all_data))를 확인해보시면 정렬이 된 것을 확인할수 있습니다. 그럼, 병합된 데이터를 이용해서 "교1동"의 boxplot를 그려보록 하겠습니다.
sns.boxplot(data=DATA, linewidth =3, notch= True, palette="Blues", width= 0.2)
plt.xticks([0], ['교1동'], fontproperties= fontprop)
plt.show()
3. pd.concat() 적용
여기서는 코드의 이해를 돕기 위해, For문을 사용하지않았습니다.
# 그래프를 노트북 안에 그리기 위해 설정
%matplotlib inline
# 필요한 패키지와 라이브러리를 가져옴
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False
TEM1= pd.read_csv('../DATA/11주문진.csv', names = ['Day','Hour','TEM'], skiprows=[0])
TEM2= pd.read_csv('../DATA/12주문진.csv', names = ['Day','Hour','TEM'], skiprows=[0])
TEM3= pd.read_csv('../DATA/13주문진.csv', names = ['Day','Hour','TEM'], skiprows=[0])
TEM4= pd.read_csv('../DATA/14주문진.csv', names = ['Day','Hour','TEM'], skiprows=[0])
TEM5= pd.read_csv('../DATA/15주문진.csv', names = ['Day','Hour','TEM'], skiprows=[0])
TEM6= pd.read_csv('../DATA/16주문진.csv', names = ['Day','Hour','TEM'], skiprows=[0])
TEM7= pd.read_csv('../DATA/17주문진.csv', names = ['Day','Hour','TEM'], skiprows=[0])
TEM8= pd.read_csv('../DATA/18주문진.csv', names = ['Day','Hour','TEM'], skiprows=[0])
C= pd.concat([TEM1,TEM2,TEM3,TEM4,TEM5,TEM6,TEM7,TEM8])
#print(G)
C2 = [C['TEM']]
4. 연도별 데이터 확인
8년간의 데이터를 합쳐서 boxplot으로 표현하다보니 의미를 찾기가 어렵습니다. 연도별로 데이터를 다시 그려보록 하겠습니다.
plt.figure(figsize=(12,5))
T_list = []
for t in range(11, 19):
TEM = pd.read_csv('../DATA/%s교1동.csv' %str(t), names = ['Day','Hour','TEM'], skiprows=[0])
T = [TEM['TEM']]
T_list.append(T)
sns.boxplot(data=T_list, linewidth =3, notch= False, palette="Blues", width= 0.2)
plt.xticks([0,1,2,3,4,5,6,7],[2011,2012,2013,2014,2015,2016,2017,2018],
fontproperties= fontprop)
plt.yticks(np.arange(0,50,10))
plt.ylim(0,51)
plt.title('BOXPLOT_교1동_2011-2018', fontproperties= fontprop)
plt.show()
연도별로 그려보니, 최솟값, 제 1사분위, 제 2사분위, 제 3사분위, 최대값 등이 더 비교하기 수월합니다.
읽을거리.
- http://python-graph-gallery.com/boxplot/
- https://www.varsitytutors.com/hotmath/hotmath_help/topics/box-and-whisker-plots
Boxplot is probably one of the most common types of graphics. It gives a nice summary of one or several numeric variables. The line that divides the box into 2 parts represents the median of the data. The end of the box shows the upper and lower quartiles. The extreme lines show the highest and lowest value excluding outliers.
'Python' 카테고리의 다른 글
[Python] 도표 중첩 (0) | 2023.01.27 |
---|---|
[Python] 점프투파이썬(기초) 정리 (2) | 2023.01.16 |
[Google Colaboratory] 코랩으로 GPU, TPU 사용법 (0) | 2022.01.31 |
Python &Machine Learning, Numpy, Pandas (1) | 2022.01.02 |
[Python]os 또는 glob를 활용한 파일리스트 가져오기 (0) | 2020.11.08 |