
화면 오른쪽 상단 인증키 신청 클릭

본인인증 후 이메일 확인
목록확인(코드)
상세목록 조회 안내서 다운로드
나는 환율 전체 나라 데이터를 1일치씩만 다운받고싶었고, 파이썬 for문을 이용해 csv파일로 저장
import requests
import pandas as pd
from datetime import datetime, timedelta
import json
api_code ='발급받은 코드를 쓰세요'
c = '731Y001' #통계코드 확인 (나는 환율코드)
#먼저 list를 확인해준다.
response_list = requests.get(f'http://ecos.bok.or.kr/api/StatisticItemList/{api_code}/json/kr/1/100/{c}/')
저장 함수를 짜줬다.
def save1(response,start_day,end_day):
if response.status_code == 200:
data = response.json()
df = pd.json_normalize(data['StatisticSearch']['row'])
it = data['StatisticSearch']['row'][0]['ITEM_NAME1'][2:]
df.to_csv( it + start_day + end_day + '.csv', index=False)
else:
print('error:', response.status_code)
각각 따로따로 있는 나라들을 하나씩 저장해줬다.
#52개국
for i in range(0,52):
codd = ''
if i < 9:
codd = '000000' + str(i+1)
else :
codd = '00000' + str(i+1)
if response_list.status_code == 200:
data = response_list.json()
sorted_list = sorted(data['StatisticItemList']['row'], key=lambda x: int(x["ITEM_CODE"])) #나라 코드 오름차순으로 정렬
file_name = sorted_list[i]['ITEM_NAME']
cycle = sorted_list[i]['CYCLE']
end_day = sorted_list[i]['END_TIME']
end_day_int = datetime(int(end_day[:4]), int(end_day[4:6]), int(end_day[6:]))
start_day_int = end_day_int - timedelta(days=0)
start_day = start_day_int.strftime('%Y%m%d')
print(sorted_list[i]['ITEM_CODE'])
print(file_name)
print(cycle)
print(end_day)
print(start_day) #오류 확인용 프린트
response = requests.get(f'http://ecos.bok.or.kr/api/StatisticSearch/{api_code}/json/kr/1/100/{c}/{cycle}/{start_day}/{end_day}/{codd}/?/?/?')#물음표는 채우니까 오류나서 그냥 그대로 냅둠
data = response.json()
print(json.dumps(data, indent=4, ensure_ascii=False)) #그냥 json으로 보니까 눈아파서 ..ㅎㅎ
save1(response,start_day,end_day)
else:
print('error:', response_list.status_code)
그렇게 52개의 csv파일이 생성되었다.
원래는 한 나라당 날짜별로 2024-05-01 , 1000원, 2024-05-02, 2000원 ,,,이런식으로 저장이 되어있다.
근데 나는 한 나라당 딱 한개씩만 필요했다..
그리고 모든 나라가 다 필요했다.....(superset에서 map을 그리고 싶었기 때문)
그래서 이 52개 파일을 S3에 올리고,
redshift에서 한 테이블(country_exchange_rate)에 다 저장할거다
그럼 52개의 레코드(행)이 생긴다.
그 전에 각 나라별 ISO코드를 다른 csv파일로 저장했다.( gpt로 찾아서 저장함 .)
그리고 나라별로 붙여진 숫자코드를 붙여줬고
얘는 다른 테이블로 저장 (country_code)
그리고 나라별 숫자코드 열로 country_code테이블과 country_exchange_rate테이블을 조인할것임..
--코랩에서 진행.
%load_ext sql
!pip install ipython-sql==0.4.1
!pip install SQLAlchemy==1.4.47
--연결
%sql postgresql://{id}:{pw}@{~~~redshift-serverless.amazonaws.com}:5439/데이터베이스이름
%%sql
CREATE SCHEMA raw_data;
52개 데이터의 모든 열이 똑같았기 때문에, 버킷에 폴더를 만들어줘서 그 폴더 내부의 모든 파일을 모두 한 테이블에 저장하는 sql문을 짠 것.
%%sql
DROP TABLE IF EXISTS country_exchange_rate;
DROP TABLE IF EXISTS raw_data.country_exchange_rate;
CREATE TABLE raw_data.country_exchange_rate (
STAT_CODE varchar(256),
STAT_NAME varchar(256),
ITEM_CODE1 float,
ITEM_NAME1 varchar(256),
ITEM_CODE2 float,
ITEM_NAME2 varchar(256),
ITEM_CODE3 float,
ITEM_NAME3 varchar(256),
ITEM_CODE4 float,
ITEM_NAME4 varchar(256),
UNIT_NAME varchar(256),
WGT float,
TIME DATE,
DATA_VALUE float
);
COPY raw_data.country_exchange_rate
FROM 's3://kor-financial-market/exchange_rate/pythontest/'
IAM_ROLE '~~~~~~~~~~'
CSV
IGNOREHEADER 1
DATEFORMAT 'auto';
근데 2001년도 이런식으로 가장 최신 데이터가 한참 전 데이터라면, 그 나라는 이제 그 돈을 안 쓰고 있는것이다.
처음엔 NULL값이 들어있어서 UPDATE함수로 채워줬지만, 다시 확인해보니 그러면 중복 값이 되어버리는 것이다.
그래서 DELETE로 그 국가들은 없애주었다.(대부분 본인 나라 돈 쓰다가 유로로 바뀐 케이스+중국,홍콩)
이후 iso를 담은 테이블 하나 더 생성
%%sql
CREATE TABLE raw_data.country_code (
code_name varchar(256),
code_num float,
country_name varchar(256),
ISO varchar(256)
);
COPY raw_data.country_code
FROM 's3://kor-financial-market/exchange_rate/exchange_rate_code.csv'
credentials '~~~~~~~~~~~'
delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;
이제 preset에서 sql lab에 들어간다..
SELECT
b.code_num,
b.country_name,
b.iso,
a.time,
a.data_value
FROM
raw_data.country_exchange_rate AS a
JOIN
raw_data.country_code AS b ON a.item_code1 = b.code_num
이렇게 간단하게 조인완성!

그럼 이 테이블로 지도를 만들면!!!

동그라미가 클 수록 비싼 나라다 ㅋㅋㅋ
한국은행에서 주요 나라 데이터들만 제공해줬기 때문에, 모든 나라의 데이터가 없다.
따라서 내일은 크롤링을 통해 모든 나라의 데이터를 긁어와서 채우는 것이 목표!
그 나라의 화폐 성질이 달라짐에 따라 데이터도 변화하는 부분이 있었군요..! 인상깊게 봤습니다 ㅎㅎ 고생하셨습니다!