diff --git a/src/FinanceDataReader/krx/listing.py b/src/FinanceDataReader/krx/listing.py index f074def..6f15c00 100644 --- a/src/FinanceDataReader/krx/listing.py +++ b/src/FinanceDataReader/krx/listing.py @@ -32,6 +32,7 @@ def read(self): # 해당 날짜의 데이터를 가져옴 url = f'https://raw.githubusercontent.com/FinanceData/fdr_krx_data_cache/refs/heads/master/data/listing/krx/{formatted_date}.csv' df = pd.read_csv(url, dtype={'Code': str, 'Dept': str, 'ChangeCode': str, 'MarketId': str}) + df = df.rename(columns={'ChagesRatio': 'ChangesRatio'}) mkt_map = {'KRX-MARCAP':'ALL', 'KRX':'ALL', 'KOSPI':'STK', 'KOSDAQ':'KSQ', 'KONEX':'KNX'} if self.market not in mkt_map: @@ -89,7 +90,7 @@ def read(self): df = df.sort_values('MKTCAP', ascending=False) cols_map = {'ISU_SRT_CD':'Code', 'ISU_ABBRV':'Name', 'TDD_CLSPRC':'Close', 'SECT_TP_NM': 'Dept', 'FLUC_TP_CD':'ChangeCode', - 'CMPPREVDD_PRC':'Changes', 'FLUC_RT':'ChagesRatio', 'ACC_TRDVOL':'Volume', + 'CMPPREVDD_PRC':'Changes', 'FLUC_RT':'ChangesRatio', 'ACC_TRDVOL':'Volume', 'ACC_TRDVAL':'Amount', 'TDD_OPNPRC':'Open', 'TDD_HGPRC':'High', 'TDD_LWPRC':'Low', 'MKTCAP':'Marcap', 'LIST_SHRS':'Stocks', 'MKT_NM':'Market', 'MKT_ID': 'MarketId' } df = df.rename(columns=cols_map) @@ -335,4 +336,3 @@ def read(self): df.rename(columns=col_map, inplace=True) df.attrs = {'exchange':'KRX', 'source':'KRX', 'data':'LISTINGS'} return df[['Symbol', 'Name', 'DesignationDate', 'Reason']] - diff --git a/tests/test_basic.py b/tests/test_basic.py index 0019027..1901628 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -153,7 +153,7 @@ def test_pref_us(): def test_stocklistings(): # KRX 상장회사(발행회사)목록 (가격 중심, 주식 종목) - 시가총액순 - # Code, ISU_CD, Name, Market, Dept, Close, ChangeCode, Changes, ChagesRatio, Open, High, Low, Volume, Amount, Marcap, Stocks, MarketId + # Code, ISU_CD, Name, Market, Dept, Close, ChangeCode, Changes, ChangesRatio, Open, High, Low, Volume, Amount, Marcap, Stocks, MarketId df = fdr.StockListing('KRX') # 2,700+ 종목 - 한국거래소(=코스피+코스닥+코넥스) assert len(df) > 2700 @@ -250,4 +250,4 @@ def test_snap_krx(): def test_snap_krx_stock_list(): df = fdr.SnapDataReader('KRX/INDEX/STOCK/1001') # 코스피 대형주 종목 리스트 - assert len(df) >= 90 \ No newline at end of file + assert len(df) >= 90 diff --git a/tests/test_krx_listing_schema.py b/tests/test_krx_listing_schema.py new file mode 100644 index 0000000..bbbc1f7 --- /dev/null +++ b/tests/test_krx_listing_schema.py @@ -0,0 +1,70 @@ +import json + +import pandas as pd + +import FinanceDataReader as fdr +from FinanceDataReader.krx import listing as krx_listing + + +def test_krx_stock_listing_uses_correct_change_ratio_column(monkeypatch): + class Response: + text = json.dumps({"result": {"output": [{"max_work_dt": "20260329"}]}}) + + cached_listing = pd.DataFrame( + { + "Code": ["005930"], + "Name": ["Samsung"], + "ChagesRatio": [0.14], + "MarketId": ["STK"], + } + ) + + monkeypatch.setattr(krx_listing.requests, "get", lambda *args, **kwargs: Response()) + monkeypatch.setattr( + krx_listing.pd, "read_csv", lambda *args, **kwargs: cached_listing.copy() + ) + + result = fdr.StockListing("KRX") + + assert "ChangesRatio" in result.columns + assert "ChagesRatio" not in result.columns + + +def test_krx_live_listing_uses_correct_change_ratio_column(monkeypatch): + class Response: + def __init__(self, text): + self.text = text + + metadata = json.dumps({"result": {"output": [{"max_work_dt": "20260329"}]}}) + row = { + "ISU_SRT_CD": "005930", + "ISU_ABBRV": "Samsung", + "TDD_CLSPRC": "70000", + "SECT_TP_NM": "Electronics", + "FLUC_TP_CD": "1", + "CMPPREVDD_PRC": "100", + "FLUC_RT": "0.14", + "ACC_TRDVOL": "123", + "ACC_TRDVAL": "8610000", + "TDD_OPNPRC": "69900", + "TDD_HGPRC": "70500", + "TDD_LWPRC": "69500", + "MKTCAP": "1000000", + "LIST_SHRS": "1000", + "MKT_NM": "KOSPI", + "MKT_ID": "STK", + } + + def fake_get(*args, **kwargs): + return Response(metadata) + + def fake_post(*args, **kwargs): + return Response(json.dumps({"OutBlock_1": [row]})) + + monkeypatch.setattr(krx_listing.requests, "get", fake_get) + monkeypatch.setattr(krx_listing.requests, "post", fake_post) + + result = krx_listing.KrxMarcapListing("KRX").read() + + assert "ChangesRatio" in result.columns + assert "ChagesRatio" not in result.columns