본문 바로가기
코딩과 알고리즘

파도!(8) - 아보카도 판매량

반응형

지난 게시글에 연재되는 글입니다 - https://itadventure.tistory.com/548

 

파이스크립트 도전기(7) - 한글 그래프!

지난 게시글에 이어지는 연재글입니다 : https://itadventure.tistory.com/547 파이스크립트 도전기(6) - 파이썬 인터프리터(2편) 지난 게시글에서 연재되는 글입니다 : https://itadventure.tistory.com/546 파이..

itadventure.tistory.com

제목이 너무 길어 이름을 '파도!'로 바꾸었습니다.
이스크립트 전기의 앞글자를 각각 땄습니다 :)

지난 게시글에서는 단순한 인구변화 데이터의 그래프를 불러오는 부분을 작업했었는데요.
데이터가 그리 많지 않아 좀 시시할 수도 있었을것 같네요.

 

데이터 선정

 

그래서 오늘은 비교적 많은 데이터를 다루고자 합니다.
캐글에는 많은 데이터가 제공되고 있는데요.
아래 URL 에서 아보카드 판매량 날짜별 18,000 건의 데이터를 만나 보실 수 있습니다.
인기있는 데이터라 무려 16만명이 다운로드를 받아간 자료입니다.

https://www.kaggle.com/datasets/neuromusic/avocado-prices

 

 

데이터 준비

 

여기서 캐글에 등록된 csv 데이터를 바로 사용할 수는 없고, 압축된 자료만 다운받을 수 있습니다.
아마도 캐글 웹서버에 이 파일을 사용하기 위해 자주 접근하면 트래픽 요금이 많이 발생하기 때문인듯 한데요.

그래서 캐글에서 다운받은 이 csv 데이터 파일 1개를 크레이의 홈페이지 계정에 업로드했습니다.
URL은 아래와 같습니다. 이 파일을 이제 사용하시면 되는데요.

http://dreamplan7.cafe24.com/pyscript/csv/avocado.csv

웹브라우저에서 주소를 열어보시면 아래와 같이 보이실 건데 스크롤 압박이 좀 있을 겁니다 :)



음? 이 파일을 사용하면 크레이 홈페이지에 트래픽 요금이 발생하지 않냐구요?
뭐.. 이 파일이 2Mbyte 가량되고 하루 500번 정도 이 데이터가 사용된다면
추가 비용이 150원 정도 나오긴 할텐데, 뭐 광고비로 충당될 것 같습니다 :)

csv데이터 불러오기 소스 구성


자, 우선 이 파일을 파이스크립트에서 불러와 볼까요?

지난번과 동일한 방법이 사용되겠지만, css 스타일 소스를 나누어 보았습니다.

css 파일은 pytable.css 라는 이름을 짓고, 아래와 같이 웹서버에 저장을 해놓았습니다.

- pytable.css

table.dataframe th {
  background-color: #EA6153 !important;
  color: white !important;
  text-align:center !important;
  padding: 5px 15px;
  font-size:9pt !important;
}
table.dataframe td {
  color: black !important;
  text-align:center !important;
  padding: 5px 15px;
  font-size:9pt !important;
}

table.dataframe tr {
    background-color: #FFFFFF !important;
}

table.dataframe tr:nth-child(odd) {
    background-color: #E9E9E9 !important;
}


이어서 HTML 소스와 파이 스크립트를 아래와 같이 구성해보았는데요.

<html> 
    <head> 
      <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" /> 
      <script defer src="https://pyscript.net/alpha/pyscript.js"></script> 
      <py-env>
        - pandas
        - matplotlib
        - paths:
          - ./NANUMMYEONGJO.TTF
          - ./NANUMMYEONGJOBOLD.TTF
      </py-env>
    </head>
  <body> 
    <link rel="stylesheet" href="pytable.css"/>
    <py-script>
      def createElementDiv(name):
          element = document.createElement('div')
          element.id = name
          document.body.append(element)
          return Element(name)
          
      import pandas as pd
      from pyodide.http import open_url
      
      # 판다스에서 csv 를 데이터 프레임으로 읽어옴
      df = pd.read_csv(open_url("http://dreamplan7.cafe24.com/pyscript/csv/avocado.csv"))
      
      createElementDiv('output1').write(df)      
    </py-script> 
  </body> 
</html>

표를 HTML 화면에 추가하는 부분을 파이썬 함수로 단순화하였습니다.
아래와 같이 함수를 한번 정의해 놓으면

def createElementDiv(name):
    element = document.createElement('div')
    element.id = name
    document.body.append(element)
    return Element(name)

데이터를 화면에 표시할 때 아래와 같이 단순하게 사용할 수가 있지요.

createElementDiv('output1').write(df)

결과 화면은 아래와 같습니다.

데이터건수가 무려 18,248행이라니 만만치 않지요?

이 표의 주요 항목만 살펴보자면 아래와 같이 확인되는데요.

- Date : 판매 날짜
- AveragePrice :  평균 판매 가격
- Total Volumn : 총 판매량

뒷 부분의 4046, 4225 이런건 아보카도 종류에 관한 거라고 하더라구요.

이제 월별 매출량을 조사해볼텐데요. 표를 살펴보면 아무리 봐도 월이 존재하지 않습니다.
날짜만 있을 뿐이지요.

 

월이라는 항목을 추가해볼까요?

 

월별 매출을 구하기 위해서는 표에 월을 추가해 주어요 하는데요.
아주 간단한 명령어 한줄이면 월을 추가할 수 있습니다.
( 방법을 알아내는 데는 꽤 고생했습니다 ㅎ.. )

df.insert(2, 'month', df['Date'].str[:7], True)

날짜에서 앞의 7글자를 떼내어 월이라는 항목을 추가해라~ 라는 기능인데요.
이 명령을 실행하고 표를 출력하면 표에 없었던 month 항목이 추가됩니다.

 

월별 매출량 산출

 

이제 이 것으로 월별 매출량을 구해볼까요?
월별로 그룹을 지은 다음, 그 합계를 구하면 되는데요. 해당 코드는 아래와 같습니다.

# 월별 매출량 조사
df_group = df.fillna(0).groupby('month')[['Total Volume']].sum().sort_values(by='month', ascending=True)

위 2가지 수정내용이 반영된 HTML코드는 아래와 같으며,

<html> 
    <head> 
      <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" /> 
      <script defer src="https://pyscript.net/alpha/pyscript.js"></script> 
      <py-env>
        - pandas
        - matplotlib
        - paths:
          - ./NANUMMYEONGJO.TTF
          - ./NANUMMYEONGJOBOLD.TTF
      </py-env>
    </head>
  <body> 
    <link rel="stylesheet" href="pytable.css"/>
    <py-script>
      def createElementDiv(name):
          element = document.createElement('div')
          element.id = name
          document.body.append(element)
          return Element(name)
          
      import pandas as pd
      from pyodide.http import open_url
      
      # 판다스에서 csv 를 데이터 프레임으로 읽어옴
      df = pd.read_csv(open_url("http://dreamplan7.cafe24.com/pyscript/csv/avocado.csv"))
      
      df.insert(2, 'month', df['Date'].str[:7], True)
      
      createElementDiv('output1').write(df)
      
      # 월별 매출량 조사
      df_group = df.fillna(0).groupby('month')[['Total Volume']].sum().sort_values(by='month', ascending=True)
      
      createElementDiv('output1').write(df_group)      
    </py-script> 
  </body> 
</html>

출력결과에는 2개의 표가 나올텐데요. 2번째 표에는 월별 매출통계량이 추가되었습니다.
3.180852e+08 이라는 좀 이상한 기호가 표시되었군요?

숫자가 너무 단위가 커서 자릿수가 많을 때 이렇게 함축적으로 표시를 하는데요.

첫줄의 자료에서 앞 부분은 ( 3.180852e+08 ) 3.180852 를 말하고,
뒷 부분은 ( 3.180852e+08 ) 10의 8승을 의미하는 것이기 때문에 
결론은 3.180852 x 10의 8승 이란 뜻입니다.

2015년 1월 아보카도 판매량이 .
헉, 3억개가 팔린걸까요! 어마 무시하군요!

크레이 홈페이지에 마련된 아래 URL에서도 결과를 확인해보실 수 있습니다.

http://dreamplan7.cafe24.com/pyscript/py9-1.html

마무~리

 

오늘은 18,000건 가량의 비교적 작지 않은 데이터를 핸들링해보았는데요.
특히 월별로 그룹을 짓기 위해 월이라는 데이터 항목을 추가하면서 날짜의 앞의 7가지를 커팅하는 부분과
월별로 그룹지어 합계를 구하는 부분을 다뤄보았습니다.
다음에는 이를 그래프로 표시해주는 부분에 대해 도전해봐야겠네요 ( 사실은 미리 만들어 놯습니다 ㅎ.. )


방문하시는 모든 분들, 감사합니다.
유익하셨다면, 공감 한방, 댓글은 굿잡!
감사합니다~


다음 게시글 : https://itadventure.tistory.com/550

 

파도!(9) - 아보카도 판매량 그래프

'파도'는 파이스크립트 도전기의 줄임말입니다. 지난 게시글에 연재되는 글입니다 - https://itadventure.tistory.com/549 파도!(8) - 아보카도 판매량 지난 게시글에 연재되는 글입니다 - https://itadventure.t..

itadventure.tistory.com

 

반응형