본문 바로가기

API

[농림축산식품 API] 농수축산물 물가조사가격 수집 및 가격비교

반응형

농림축산식품 API를 이용해서 농수축산물 물가가격조사 데이터를 수집하고 비교해 보겠습니다.

확인을 위해서는 농림축산식품 API에 가입이 되어 있어야 합니다.

 

1. 농림축산식품 API 가입

2. 데이터 수집 및 전국 배추가격 비교

 

 

1. 농림축산식품 API 가입

https://yenpa.tistory.com/97

 

[농림축산식품 API] 가입하기 및 인증키(APPKey) 확인, API 데이터 신청

농림축산식품 공공데이터의 홈페이지 가입 및 Open API 신청하는 방법을 알아보겠습니다. 1. 농림축산식품 공공데이터(data.mafra.go.kr/main.do) 가입 2. 인증키(APPKey) 확인 3. Open API 데이터 신청 1. 농림

yenpa.tistory.com

 

 

 

2. 데이터 수집 및 전국 배추가격 비교

필요 라이브러리를 import 합니다.

import requests
import pandas as pd
import math

2022년 12월 28일 기준으로 데이터를 수집하겠습니다.

API는 한 번에 1000까지의 제한이 있는데 12월 28일에 데이터는 3000개가 넘게 있습니다.

전체 데이터 수집을 위해 전체 데이터 수를 가져옵니다.

total_cnt='2'
dates='20221228'
#apikey='YOUR_API_KEY'

url='http://211.237.50.150:7080/openapi/' + apikey + '/json/Grid_20221205000000000651_1/1/' + total_cnt

params = {
    'EXAMIN_DE' : dates,
}

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

results = requests.get(url, params=params).json()
results

 

total_Cnt는 아래와 같이 가져올 수 있습니다.

for loop로 1000개씩 수집하는데 몇 번을 해야 할지에 대한 정보를 cnt에 저장합니다.

totalcnt=results['Grid_20221205000000000651_1']['totalCnt']
cnt=math.ceil(totalcnt/1000)
cnt

데이터를 1000개씩 수집해서 listall에 저장했습니다.

listall=[]

for i in range(0,cnt):
    print(i)
    startnum = str(i*1000+1)
    endnum = str((i+1)*1000)
    
    url='http://211.237.50.150:7080/openapi/' + apikey + '/json/Grid_20221205000000000651_1/' \
        + startnum + '/' + endnum

    params = {
        'EXAMIN_DE' : '20221228',
    }

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

    results1 = requests.get(url, params=params).json()
    listall = listall + results1['Grid_20221205000000000651_1']['row']

listall -> dataframe으로 변환하겠습니다.

총 3191 개의 데이터가 있네요

df=pd.DataFrame(listall)
df.shape

어떤 품목들이 제공이 되는지 확인하겠습니다.

df['EXAMIN_PRDLST_NM'].unique()

 

품목 들 중에서 배추의 가격을 비교해 보겠습니다.

필요한 column만 추리고 배추 데이터만 df1에 저장했습니다.

columns=['EXAMIN_DE','AREA_NM','STD_MRKT_NM','TODAY_PRIC','EXAMIN_GRAD_NM','EXAMIN_UNIT_NM']
df1=df.loc[df['EXAMIN_PRDLST_NM']=='배추',columns]
df1

 

상(1등급)과 1 포기에 대한 정보만 저장하고,  지역 정보(AREA_NM)로 group 했습니다.

df2=df1.loc[(df1['EXAMIN_GRAD_NM']=='상(1등급)')&(df1['EXAMIN_UNIT_NM']=='1포기')]
dfgr=df2.groupby('AREA_NM')[['TODAY_PRIC']].mean()
dfgr

가격이 낮은 순으로 확인하면 아래와 같습니다.

dfgr.sort_values('TODAY_PRIC')

2022년 12월 28일 기준으로는 경기 < 전주 < 세종 < 경북안동 순으로 가격이 저렴했습니다.

 

 

반응형

 

 

3. 2020년 12월과 2022년 12월의 데이터 비교하기

2020년 12월 28일 데이터를 수집하겠습니다.

dates='20201228'

url='http://211.237.50.150:7080/openapi/' + apikey + '/json/Grid_20221205000000000651_1/1/' + total_cnt

params = {
    'EXAMIN_DE' : dates,
}

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

results = requests.get(url, params=params).json()

totalcnt=results['Grid_20221205000000000651_1']['totalCnt']
cnt=math.ceil(totalcnt/1000)

listall=[]

for i in range(0,cnt):
    print(i)
    startnum = str(i*1000+1)
    endnum = str((i+1)*1000)
    
    url='http://211.237.50.150:7080/openapi/' + apikey + '/json/Grid_20221205000000000651_1/' \
        + startnum + '/' + endnum

    params = {
        'EXAMIN_DE' : dates,
    }

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

    results1 = requests.get(url, params=params).json()
    listall = listall + results1['Grid_20221205000000000651_1']['row']
    
df2020=pd.DataFrame(listall)
df2020

필요한 column만 지정하고 2022년 dataframe과 2020년 dataframe을 만들겠습니다.

columns=['EXAMIN_DE','AREA_NM','STD_MRKT_NM','TODAY_PRIC','EXAMIN_GRAD_NM','EXAMIN_UNIT_NM','EXAMIN_PRDLST_NM']
df22=df[columns]
df20=df2020[columns]

 

2022년과 데이터를 품목명, 등급, 단위로 groupby 하겠습니다.

grcol=['EXAMIN_DE','EXAMIN_GRAD_NM','EXAMIN_UNIT_NM','EXAMIN_PRDLST_NM']
dfgr22=df22.groupby(grcol)[['TODAY_PRIC']].mean().reset_index().set_index(['EXAMIN_PRDLST_NM','EXAMIN_GRAD_NM','EXAMIN_UNIT_NM'])
dfgr22

 

2020년 데이터도 동일하게 처리해 줍니다.

dfgr20=df20.groupby(grcol)[['TODAY_PRIC']].mean().reset_index().set_index(['EXAMIN_PRDLST_NM','EXAMIN_GRAD_NM','EXAMIN_UNIT_NM'])
dfgr20

 

 

두 개의 dataframe을 병합하고 column명을 변경해 줍니다.

dfgr=pd.merge(left=dfgr22,right=dfgr20,how='inner',left_index=True,right_index=True)
dfgr.columns=['2022', '2022_price', '2020', '2020_price']
dfgr

 

 

반응형

 

rate column에 2022년 데이터와 2020년 데이터의 변동률을 계산합니다.

dfgr['rate']=(dfgr['2022_price']/dfgr['2020_price'] -1)*100
dfgr

 

그럼 상승률이 높은 순으로 15개를 확인해 보겠습니다.

dfgr.sort_values('rate',ascending=False).iloc[:15]

느타리버섯, 호박, 당근의 가격 상승이 높았습니다.

 

반대로 가격 상승이 낮은 순으로 15개 확인해 보겠습니다.

dfgr.sort_values('rate',ascending=True).iloc[:15]

토마토 들깨, 배 등은 오히려 가격이 하락한 것으로 확인이 됩니다.

 

 

농림축산식품 API를 이용해서 농수축산물 물가가격조사 데이터를 수집 및 비교해 봤습니다.

반응형