본문 바로가기

API

[공공데이터_data API] 1++ 한우 경매가 월별 트렌드 확인

반응형

공공데이터 포털 API의 축산물 등급 판정 정보를 이용해서 1++ 한우 경매 가격의 

2022년 월별 트렌드를 확인해보겠습니다.

 

가입 및 API 사용에 대한 방법에 대해 필요하신분은 아래 참고 부탁드립니다.

 

1. 가입 및 API 사용법(Skip가능)

2. 1++ 한우 경매가 확인

3. 2022년 월별 트렌드 확인

 

 

1. 가입 및 API 사용법(Skip가능)

https://yenpa.tistory.com/35

 

[공공데이터포털 API] 가입하기 및 인증키(APPKey) 발급, 확인

1. 공공데이터포털(data.go.kr) 가입 2. 인증키(APPKey) 발급 3. 인증키(APPKey) 확인 1. 공공데이터포털(data.go.kr) 가입 공공데이터포털 사이트에 접속합니다. https://www.data.go.kr/ 공공데이터 포털 국가에서

yenpa.tistory.com

 

 

2. 1++ 한우 경매가 확인

2022년 9월의 1++ 한우의 결과를 가져오는 코드입니다.

startYmd, endYmd는 시작날짜와 종료 날짜이고, breedCd = '024001'는 한우 번호입니다.

데이터 확인을 위해서는 본인의 apikey가 필요합니다.

import requests
import math
import pandas as pd
import xmltodict

startYmd='20220901'
endYmd='20220930'
breedCd='024001'
qgradeYn='N'
#apikey='YOUR_APIKEY'

url = 'http://data.ekape.or.kr/openapi-data/service/user/grade/auct/cattleDetail'
params ={'serviceKey' : apikey, 'startYmd' : startYmd, 
          'endYmd' : endYmd, 'breedCd' : breedCd, 'qgradeYn':qgradeYn }

response = requests.get(url, params=params)

if result['response']['header']['resultCode']=='00':
    result=xmltodict.parse(response.content)
    df=pd.DataFrame(result['response']['body']['items']['item'])

qgradeYn을 'N'으로 지정하면 등급이 1++A, 1++B, 1++C로 나오게 되고, 'Y'로 지정하면 1++ 만 나오게 됩니다.

resultCode 가 '00' 정상일때만 데이터를 수집합니다.

if result['response']['header']['resultCode']=='00':
    result=xmltodict.parse(response.content)
    df=pd.DataFrame(result['response']['body']['items']['item'])

response.content에는 xml 형식으로 수집이 되는데 xmltodict를 이용해서 json 형태로 변환했습니다.

실제 데이터가 result['response']['body']['items']['item']에 있어 이 부분만 DataFrame으로 저장했습니다.

 

 

3. 2022년 월별 트렌드 확인

위의 코드를 변형해서 2022년 1월에서 10월까지의 데이터를 수집하는 코드입니다.

import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
plt.rc('font', family='NanumGothic') 
plt.rcParams['axes.unicode_minus']=False

year=2022
months=list(range(1,11))

df_all=pd.DataFrame()

for month in months:
    startYmd= datetime(year,month,1).strftime("%Y%m%d")
    endYmd= (datetime(year,month+1,1) + timedelta(days=-1)).strftime("%Y%m%d")
    breedCd='024001'
    qgradeYn='N'
    
    url = 'http://data.ekape.or.kr/openapi-data/service/user/grade/auct/cattleDetail'
    params ={'serviceKey' : apikey, 'startYmd' : startYmd, 
              'endYmd' : endYmd, 'breedCd' : breedCd, 'qgradeYn':qgradeYn }

    response = requests.get(url, params=params)
    result=xmltodict.parse(response.content)

    df=pd.DataFrame(result['response']['body']['items']['item'])
    
    df_all = pd.concat([df_all,df])
    
df_all.columns = ['근내지방도 번호','가격(중부권)','두수(중부권)','가격(수도권)','두수(수도권)',
             '가격(영남권)','두수(영남권)','가격(전체)','두수(전체)','가격(호남권)','두수(호남권)',
             '가격(부경축공)','두수(부경축공)','가격(협신식품)','두수(협신식품)',
             '가격(도드람)','두수(도드람)','가격(농협부천)','두수(농협부천)',
             '가격(농협음성)','두수(농협음성)','가격(관성)','두수(관성)',
             '가격(농협포크빌)','두수(농협포크빌)','가격(농협나주)','두수(농협나주)',
             '가격(농협고령)','두수(농협고령)','가격(김해축공)','두수(김해축공)',
             '가격(신흥산업)','두수(신흥산업)','가격(삼성식품)','두수(삼성식품)',
             '종료일','등급코드','등급명','등급구분','품종코드','품종','성별','육질등급구분',
             '시작일','가격(삼성식품)','두수(삼성식품)']

월별로 1일에서 월말까지 데이터를 구해서 for문을 실행하는 부분입니다.

 

year=2022
months=list(range(1,11))

df_all=pd.DataFrame()

for month in months:
    startYmd= datetime(year,month,1).strftime("%Y%m%d")
    endYmd= (datetime(year,month+1,1) + timedelta(days=-1)).strftime("%Y%m%d")

각 월별의 결과를 df_all 이라는 DataFrame으로 합쳤습니다.

df_all = pd.concat([df_all,df])

column명이 영어로 되어 있는데 알기 쉽게 한글로 변경했습니다.

df_all.columns = ['근내지방도 번호','가격(중부권)','두수(중부권)','가격(수도권)','두수(수도권)',
             '가격(영남권)','두수(영남권)','가격(전체)','두수(전체)','가격(호남권)','두수(호남권)',
             '가격(부경축공)','두수(부경축공)','가격(협신식품)','두수(협신식품)',
             '가격(도드람)','두수(도드람)','가격(농협부천)','두수(농협부천)',
             '가격(농협음성)','두수(농협음성)','가격(관성)','두수(관성)',
             '가격(농협포크빌)','두수(농협포크빌)','가격(농협나주)','두수(농협나주)',
             '가격(농협고령)','두수(농협고령)','가격(김해축공)','두수(김해축공)',
             '가격(신흥산업)','두수(신흥산업)','가격(삼성식품)','두수(삼성식품)',
             '종료일','등급코드','등급명','등급구분','품종코드','품종','성별','육질등급구분',
             '시작일','가격(삼성식품)','두수(삼성식품)']

 

월별 가격을 조회하기 위해서 groupby의 key를 시작일, 등급명으로 사용합니다.

price_col=['가격(중부권)','가격(수도권)','가격(영남권)','두수(영남권)',
           '가격(전체)','가격(호남권)','시작일','등급명']
df_price=df_all[price_col]
df_price=df_price.astype({'가격(중부권)':'int','가격(수도권)':'int','가격(영남권)':'int',
                 '가격(영남권)':'int','가격(전체)':'int','가격(호남권)':'int'})

df_price=df_price.groupby(['시작일','등급명']).mean().reset_index()
df_price

전체 데이터 중에서 지역별 가격정보만 따로 저장합니다.

price_col=['가격(중부권)','가격(수도권)','가격(영남권)','두수(영남권)',
           '가격(전체)','가격(호남권)','시작일','등급명']
df_price=df_all[price_col]

groupby로 가격 평균을 구하기 위해서 사전작업으로 column type을 object -> int로 변경합니다.

df_price=df_price.astype({'가격(중부권)':'int','가격(수도권)':'int','가격(영남권)':'int',
                 '가격(영남권)':'int','가격(전체)':'int','가격(호남권)':'int'})

지역별 가격 평균 정보를 확인합니다.

df_price=df_price.groupby(['시작일','등급명']).mean().reset_index()
df_price

 

그래프를 그리기 편한 형태로 melt를 이용해서 변형을 시킵니다.

regions=['가격(중부권)','가격(수도권)','가격(영남권)','가격(영남권)',
           '가격(전체)','가격(호남권)']

df_price=df_price.melt(id_vars=['시작일','등급명'], value_vars=regions).rename(columns={'variable':'지역','value':'가격'})
df_price

 

그럼 이제 그래프로 확인해볼까요.

우선 월별 1++ 등급의 가격 평균 데이터 입니다.

plt.figure(figsize=(8,4))
sns.barplot(data=df_price, x='시작일', y='가격')

plt.xticks(rotation=90)
plt.title('월별 1++ 등급의 가격 평균')
plt.show()

 

지역별로 나누어서 확인해보겠습니다.

등급이 1++A, 1++B, 1++C로 나뉘어 있는데 각각 그래프를 그려보겠습니다.

df=df_price.loc[df_price['등급명']=='1++A']
plt.figure(figsize=(8,3))
sns.lineplot(data=df, x='시작일', y='가격',hue='지역')

plt.legend(loc=2,bbox_to_anchor = (1,1))
plt.xticks(rotation=90)
plt.title('1++A등급의 월별 가격변동 추이')
plt.show()

 

데이터가 지역별로 확인도 가능하지만, 회사별 데이터 확인도 가능하니, 응용해서 그려보셔도 좋을 것 같습니다.

 

이상으로 1++ 한우 경매 가격의 2022년 월별 트렌드를 확인해봤습니다.

반응형