[Python] 데이터 병합 - glob.glob() / pd.concat()
주 제 : 데이터 병합
데이터 : 기상자료개방포털(데이터>날씨예보>동네예보>실황분석자료의 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
Box-and-Whisker Plots
Box-and-Whisker Plots To understand box-and-whisker plots, you have to understand medians and quartiles of a data set. The median is the middle number of a set of data, or the average of the two middle numbers (if there are an even number of data points).
www.varsitytutors.com
Boxplot | The Python Graph Gallery
A collection of boxplot examples made with Python, coming with explanation and reproducible code
www.python-graph-gallery.com
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.