✔ Python

[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()

boxplot 예시


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']]

boxplot 예시

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사분위, 최대값 등이 더 비교하기 수월합니다.

박스플롯을 활용한 연도별 데이터 특성 파악하기


읽을거리.  

  1.  http://python-graph-gallery.com/boxplot/
  2.  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

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.