파이썬(Python)/에어컨 계절 수요 흐름

[무역|4|Plotly] 에어컨 계절 수출입 수요 - import plotly (2부)

JJ Goh[Certified customs broker] 2020. 6. 27. 06:00

[무역|4|Plotly] 에어컨 계절 수출입 수요 - import plotly (2부)

 

 

 

import 라이브러리와 모듈

 

 

import pandas as pd
import plotly.graph_objects as go
import pyautogui
from plotly.subplots import make_subplots
import plotly.offline

 

 먼저 import할 라이브러리부터 보시죠.

 

 1) data refining과 processing을 위해 pandas가 필요하구요. 

 

 2) plotly.graph_objects를 go라는 약칭으로 불러 들입니다. plotly의 plot에 관련한 다양한 메소드들이 이 모듈 안에 들어 있습니다. plotly.express가 더욱 간결하고 빠르게 결과물을 시각화 하는데 사용되는 모듈이라면 이 모듈은 가장 기본적으로 사용되어지는 모듈이라고 요약할 수 있겠습니다.

 

 3) pyautogui는 분석 대상인 raw data의 파일명을 받기 위해 들여 왔습니다. 

 

 

plotly.subplots.make_subplots()    plotly sublplot 만들기

 

 

 4) plotly.subplots 중 make_subplots 모듈도 들여 왔네요. make_subplots는 1개의 canvas에 다수의 plot을 넣고 싶을 때 사용합니다. matplotlib의 pyplot.subplot()과 같다고 보시면 되겠습니다.

 

 

plotly.offline     plotly의 offline 모드로의 실행

 

 

 5) plotly.offline은 plotly의 plot을 그리도록 명령할 때 plotly 서버 데이터를 받아서 하는게 아닌 local computer상에서 offline방식으로 plot을 그리고자 할 때 쓰게 됩니다.

 

    필자는 plotly를 익히기 위해 처음 사용시 offline사용 모드를 모르고서 plotly공식 사이트의 예문들을 돌려 보았습니다. 저는 brower로 chrome을 애용하는데요. plotly의 그래프를 그리도록 코드 실행을 해보면 chrome에서 자꾸 connection_denied 에러가 발생하였습니다.

 

    원인을 알 수 없는 와중에, 구글링을 통해 그러한 경우에 대한 대처법을 제시하는 정보가 있어 그대로 해보았는데요. 계속 에러가 발생하였는데요. 그런데, 한 6~7번 시도해 보다 어쩌다 1번씩 connection이 되어 그래프가 표출되었습니다. 

 

    현상을 보았을 때, 어찌되었든 된다는 것은 제 컴퓨터 설정에 문제가 있는게 아닐 수도 있다는 추정 결론을 내리고서, 구글링을 좀 더 해 보았습니다. 하여 이 offline 모드의 사용법에 대해 알게 되었는데요. offline으로 코드를 실행하면 대기시간 없이 곧바로 결과물이 표출되는 것이 확인되었습니다.

 

    제 생각에는 online 모드에서 connection_denied가 나는 것은 plotly서버쪽에서 발생된 부하 등의 요인인 것 같습니다. 여하튼, offline 모드를 돌렸을 때, 빠른 결과물 확인이 가능하기 때문에, 독자님들께서도 코드 작성 후 테스트 실행을 하실 때엔 이 offline 모드를 사용하시기를 권장 드립니다.

 

 

 

 

'함수 안의 함수'와 '함수 밖의 함수'

 

 그 다음 pandas 를 이용한 data processing 코드 부분은 수차례 반복되어 나왔기 때문에, 설명을 추가할 부분이 없습니다. 그럼에도 불구하고, 다시 한번 언급 드리는 이유는 이제 이 코드는 관세청 수출입실적 자료 분석에 있어서는 고정적으로 사용되어 지는 부분이고, 시각화 모듈을 변경하고 싶은 경우에는 시각화 코드부분만 변경해서 사용한다면 더욱 효율적인 시각화 처리가 가능해 집니다.

 

 하여 함수 안에 함수를 정의하는 방법을 소개해 드리고자 합니다.

 

 아래 코드를 보시면 변경사항은 매우 단순합니다.

 

def plotlyCal():

    def pdCal(project_Name = 'AirCon', hs_code = '841510', fileName = pyautogui.prompt('파일명을 입력하시오.')):
        global d8
        d1 = pd.read_excel('C:\\Users\\USER\\Desktop\\블로그\\example\\' + project_Name + '\\' + fileName + '''.xlsx''')
        d2 = d1.drop(d1.index[0:3])
        d3 = d2.drop(d1.index[4]).reset_index()
        d4 = d3.drop(['index'], axis=1)
        d5 = d4.rename(columns=d4.iloc[0])
        d6 = d5.drop(d5.index[0])
        d6['수출금액'] = d6['수출금액'].str.replace(pat=r',', repl=r'', regex=True)
        d6['수출금액'] = d6['수출금액'].astype('float64')
        d6['수입금액'] = d6['수입금액'].str.replace(pat=r',', repl=r'', regex=True)
        d6['무역수지'] = d6['무역수지'].str.replace(pat=r',', repl=r'', regex=True)
        d6['수입금액'] = d6['수입금액'].astype('float64')
        d6['무역수지'] = d6['무역수지'].astype('float64')
        d7 = d6[['기간', '수출금액', '수입금액', '무역수지']]
        d8 = d7.groupby(by='기간', as_index=False).sum()
        d8['기간'] = d8['기간'].str[0:4]+"-"+d8['기간'].str[5:7]
        d8.to_excel('C:\\Users\\USER\\Desktop\\블로그\\example\\' + project_Name + '\\' + 'python' + hs_code + '''.xlsx''',
                    sheet_name="sheet1")

    pdCal()

 

 def plotyCal() 안에 다시 def pdCal을 넣었습니가. 기존 인자들은 모두 새로운 함수 안의 함수에서 사용되는 값들이므로 전부 함수 안의 함수로 이동하였습니다. 

 

 그리고 이 함수의 최종 결과물인 d8에 대해 global d8이라고 썼는데요. 이건 d8이라고 하는 DataFrame형태인 변수에 대해 전역변수를 설정해 준 것입니다. 이러한 설정을 통해 함수 안의 함수에서 계산되어진 d8이라는 값은 메모리에 그대로 남아 함수 안의 함수에서 빠져 나오더라도 d8 메모리영역을 그대로 차지하고 있게 됩니다. 이 전체 코딩이 차지하고 있는 영역을 빠져나오기 전까지는요...

 

 전역변수를 선언해 주지 않게 되면, 함수 안의 함수코드가 끝나는 순간 해당 메모리는 버려지게 된다고 합니다. 따라서, 함수를 빠져 나오는 순간 결과물이 날아가 버리게 되는 것이지요. 함수안의 함수에서의 최종 결과물을 활용하셔야 한다면 이 전역변수 선언은 필수가 되겠습니다.

 

 그리고 이 함수안의 함수의 마지막 코드문이 끝나면 원래 함수로 돌아오게 되는데, 함수 안의 함수를 실행하도록 명령합니다. 그러면 

 

 

 

 

 또 다른 방법은 아래와 같이 함수 밖의 함수를 정의해 두고, 해당 함수안에서 밖에 정의해 둔 함수를 실행하도록 명령하는 것입니다. 마찬가지로 결과물에 대한 변수는 전역변수를 설정해 두면 함수 밖의 결과물이지만 그대로 사용이 가능합니다.

 

global d8

def pdCal(project_Name='AirCon', hs_code='841510', fileName=pyautogui.prompt('파일명을 입력하시오.')):
    global d8
    d1 = pd.read_excel('C:\\Users\\USER\\Desktop\\블로그\\example\\' + project_Name + '\\' + fileName + '''.xlsx''')
    d2 = d1.drop(d1.index[0:3])
    d3 = d2.drop(d1.index[4]).reset_index()
    d4 = d3.drop(['index'], axis=1)
    d5 = d4.rename(columns=d4.iloc[0])
    d6 = d5.drop(d5.index[0])
    d6['수출금액'] = d6['수출금액'].str.replace(pat=r',', repl=r'', regex=True)
    d6['수출금액'] = d6['수출금액'].astype('float64')
    d6['수입금액'] = d6['수입금액'].str.replace(pat=r',', repl=r'', regex=True)
    d6['무역수지'] = d6['무역수지'].str.replace(pat=r',', repl=r'', regex=True)
    d6['수입금액'] = d6['수입금액'].astype('float64')
    d6['무역수지'] = d6['무역수지'].astype('float64')
    d7 = d6[['기간', '수출금액', '수입금액', '무역수지']]
    d8 = d7.groupby(by='기간', as_index=False).sum()
    d8['기간'] = d8['기간'].str[0:4] + "-" + d8['기간'].str[5:7]
    d8.to_excel('C:\\Users\\USER\\Desktop\\블로그\\example\\' + project_Name + '\\' + 'python' + hs_code + '''.xlsx''',
                sheet_name="sheet1")


def plotlyCal():
    global d8

    pdCal()

 

 

 제게 있어서는 실질적인 활용도를 높이기 위한 skill 들이라 생각하기 때문에 할애를 조금 많이 해서 장황하게 설명하였습니다. 분명 더 쉽게 코딩하는 방법이 있으리라 생각합니다. 제가 IT 비전공 독학자라서 오류가 있어도 깨닫지 못하는 부분이 있습니다. 이 분야 실업무하시는 분께서 제 글을 보시고 교정해 주신다면 대환영이오니, 꼭 댓글 부탁 드리겠습니다.

 

이제 3부 부터는 본격적으로 plotly의 시각화 코드들을 살펴 보도록 하겠습니다.

 

 

(3부에서 계속..)

 

 

 

NPU(엔피유) 관세사무소

대표관세사 고장주

Tel) 031-986-7190

E-mail) sales@npucus.com

[NPU관세사무소 프로모션 페이지] https://www.tradenpu.com/npu_cus/

[무역비지니스 인텔리전스 서비스 | TradeNPU] https://www.tradenpu.com

[파이썬 실용 예제. 무역과 공공데이터] https://pdatinmylife.tistory.com

Certified Customs Broker JangJu Goh

Executive Customs Broker @ NPU Customs Consulting

CEO @ JG TradePlus

sales@npucus.com

Trade Compliance / Customs clearance management at foreign company

Working experience of Air export freight forwarding

Data Visualization / Independent development of business automation application – copyright of JGPO_Manager, JG Data Center, AutoCC and etc.

B2B consignment & direct export/import, B2C Overseas Buying Office consulting

Alibaba.com B2B trade / taobao B2C trade / Amazon.com global selling etc. Online trade regulation consulting.

Import license / Quarantine

English communication available

[TradeNPU for partnership proposal - JGTP] https://www.tradenpu.com/jgtp/

 

반응형