팀 프로젝트/Python

[ToyProject] Data Chart Create

개발자가 되고 싶은 곰 2024. 12. 2. 21:06

이번 ToyProject 는 Python 으로 강수량과 부침개 검색량에 따른

상관관계에 대한 차트를 만들어 보는 Project를 진행하게 되었다.

 

우선 사용할 모듈을 import 해주자.

import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
import pandas as pd
import os

 

Python 에서 차트를 사용하기 위해 matplotlib에 pyplot 사용해줍니다.

pyplot 설정은 한글 설정이 깨지기 때문에 fon_manager 메서드를 받습니다.

 

차트를 사용할때 데이터 정제를 편하게 하기 위해 pandas를 받아옵니다.

 

def resource_path(relative_path):
	base_path = os.path.abspath(".")
	return os.path.join(base_path, relative_path)

 

각 PC 마다 프로젝트 위치가 다르기 때문에 os에 따른 파일 주소를 받아옵니다.

 

#================= plot 폰트설정 시작 ============================
# 그래프 마이너스 기호 깨짐을 방지하기 위해 설정
# matplotlib에 - 기호는 유니코드로 되어 있기에 깨짐이 발생할 수 있어 false로 지정
plt.rcParams['axes.unicode_minus'] = False
# 원하는 font 파일 위치를 지정
fontPath = resource_path("font/Freesentation-9Black.ttf")
# font를 참조하기 위해 이름을 추출
fontName = fm.FontProperties(fname=fontPath).get_name()
# pyplot rc 설정으로 추출한 font를 적용
plt.rc('font', family=fontName)
#================== plot 폰트 설정 끝 ============================

 

한글 font를 사용하기 위해 커스텀 font를 불러옵니다.

 

#===================== 날짜 변환 함수 시작 ========================
#str 타입 날짜 데이터를 date 타입으로 변환하는 함수
def dateType(arr):
    return pd.to_datetime(arr)
#===================== 날짜 변환 함수 끝 =========================

csv 파일에서 문자열로 불러온 날짜 데이터를 Date Type으로 변환시켜줄 함수를 제작합니다.

 

def plotKoreanPancake(koreanPancakeCSVArr,weatherArr,yearDate):
    #================ 데이터 타입 날짜로 변경 시작 ===================
    ################### 기상청 날짜, date Type로 변환 ###################
    weatherArr['일시'] = dateType(weatherArr['일시'])
    print(weatherArr['일시'])

    #searchYear == 년도별 강수량
    searchYear = []
    # 강수량 출력
    for i in range(len(yearDate)):
        #일시 열의 연도가 yearDate에 있는 년도와 같을 때 배열로 저장
        searchYear.append(weatherArr[weatherArr['일시'].dt.year == yearDate[i]])

    ################### 검색량 날짜 , date Type로 변환 ###################
    # 검색량 출력
    for i in range(len(koreanPancakeArr)):
        # pd로 csv파일을 읽는다
        koreanPancakeArr[i] = pd.read_csv(koreanPancakeCSVArr[i])
        # period 열 데이터를 날짜 형식으로 변환
        koreanPancakeArr[i]['period'] = dateType(koreanPancakeArr[i]['period'])
    #================ 데이터 타입 날짜로 변경 끝 ===================

    #======================== 표 설정 및 생성 시작 ==========================
    # 그래프 크기를 설정, 가로 15, 세로 10
    plt.figure(figsize=(15, 10))
    for i in range(len(yearDate)):
        #그래프: 2021-2024년 검색량과 강수량을 함께 표시
        #2*2 플롯 생성 / 위치를 지정
        plt.subplot(2, 2, i+1)
        #각 연도별 검색량 및 강수량 제목을 설정
        plt.title(f'{yearDate[i]} 검색량 및 강수량')
        #검색량 선 그래프를 위한 설정
        plt.plot(
        koreanPancakeArr[i]['period'].dt.day.astype(dtype='str'), # x축 YY-mm-dd 중 d(일자)만 출력
            koreanPancakeArr[i]['searchVolume'], # y축 검색량 출력
            color='#FF0000', # 빨간색으로 선색을 지정
            label=f'{yearDate[i]} 검색량', # 그래프 설명문 지정
            marker='o', # 고점에 마커를 설정
            linestyle='-', # 선 스타일을 실선으로 지정
            alpha=0.7 # 선 투명도를 지정
        )
        plt.ylabel('검색량') # Y축 라벨이름을 지정
        plt.tick_params(axis='y', labelcolor='#FF0000') # Y축 라벨 색을 지정
        plt.legend(loc='upper left') # 검색량 그래프 설명을 왼쪽 위로 지정

        # 강수량 막대그래프
        plt.twinx()  # y축을 공유하는 또 다른 축 생성
        plt.bar(
            searchYear[i]['일시'].dt.day.astype(dtype='str'), # x축 YY-mm-dd 중 d(일자)만 출력
            searchYear[i]['강수량(mm)'], # y 축 강수량으로 출력
            color='#0000D9', # 파란색으로 막대색을 지정
            label=f'{yearDate[i]} 강수량', # 막대 설명문을 지정
            alpha=0.3 # 막대 투명도를 지정
        )
        plt.ylabel('강수량 (mm)') # Y축 라벨이름을 지정
        plt.tick_params(axis='y', labelcolor='#0000D9') # Y축 라벨 색을 지정
        plt.legend(loc='upper right') # 강수량 그래프 설명을 오른쪽 위로 지정

    # dataFram 내에 날짜 형식의 값중 월만 가져옵니다.
    # 배열중 0번째(1번) 값만 추출해옵니다.
    monthNum = koreanPancakeArr[0]['period'].dt.month.astype(dtype='str')[0]
    # 전체 제목 설정
    plt.suptitle(f"검색량 및 강수량 (2021-2024) / {monthNum}월", fontsize=25)
    plt.tight_layout() # 플롯 간의 레이아웃을 자동 조정, 겹치지 않도록 지정
    plt.subplots_adjust(top=0.9)  # 제목과 서브플롯 간격 조정
    #======================== 표 설정 및 생성 끝 ==========================

 

표를 만들 함수를 제작할 수 있도록 제작해줍니다.

 

import ToyProject1

Start.py 를 제작하여 이전에 만들어 둔 표 제작 함수를 불러와줍니다.

 

def csvFile(file_path):
    ################### 검색량 csv 파일 주소 ##################
    return [file_path+"2021_부침개_네이버_일간검색트렌드.csv",file_path+"2022_부침개_네이버_일간검색트렌드.csv"
        ,file_path+"2023_부침개_네이버_일간검색트렌드.csv",file_path+"2024_부침개_네이버_일간검색트렌드.csv"]

################### 기상청 dataFrame 데이터 생성 ###################
def pandasDataFrame(file_path):
    ################### 기상청 csv 파일 주소 ###################
    return pd.DataFrame(pd.read_csv(file_path+"기상청_강수량.csv",encoding="cp949"))

각 동일한 파일명칭으로 불러오기 위해

동일 명칭으로 함수를 생성해줍니다.

 

#월별 폴더 주소
file_path = ToyProject1.resource_path("csvFile/07/")
koreanPancakeCSVArr07 = csvFile(file_path)
weatherArr07 = pandasDataFrame(file_path)
#월별 폴더 주소
file_path = ToyProject1.resource_path("csvFile/09/")
koreanPancakeCSVArr09 = csvFile(file_path)
weatherArr09 = pandasDataFrame(file_path)

scvFile메서드로 csv 데이터를 가져옵니다.

 

yearDate = [2021,2022,2023,2024]
ToyProject1.plotKoreanPancake(koreanPancakeCSVArr07,weatherArr07,yearDate)
ToyProject1.plotKoreanPancake(koreanPancakeCSVArr09,weatherArr09,yearDate)

표 제작 함수를 통해 표를 생성해줍니다.

 

최종적으로 설정이 완료되었다면 표를 활성화 해주게됩니다.

# 그래프 출력
plt.show()
728x90