Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

Β 

History

37 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

fn-dg6-ingest

FnGuide DataGuide 6μ—μ„œ 내보낸 CSV/Excel νŒŒμΌμ„ μžλ™ κ°μ§€ν•˜κ³ , μ •μ œλœ κ΄€κ³„ν˜• ν…Œμ΄λΈ”(CSV/Parquet)둜 λ³€ν™˜ν•˜λ©°, λ³€ν™˜λœ 데이터λ₯Ό ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ 읽을 수 있게 ν•΄μ£ΌλŠ” Python 라이브러리.

Why?

2025λ…„ 12μ›”, FnGuide DataGuideκ°€ 버전 5μ—μ„œ 6으둜 μ—…λ°μ΄νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 기쑴에 DataGuideμ—μ„œ μ—‘μ…€λ‘œ 데이터λ₯Ό 내보낸 λ’€ Pythonμ—μ„œ ν™œμš©ν•˜λŠ” κ³Όμ •μ—λŠ” μ—¬λŸ¬ λΆˆνŽΈν•¨μ΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€:

  • λ‚ μ§œκ°€ μ»¬λŸΌμ— νŽΌμ³μ§€λŠ” ꡬ쑰 -- λŒ€λŸ‰ 데이터 내보내기 μ‹œ λ‚ μ§œκ°€ μ—΄(column)둜 λ‚˜μ—΄λ˜μ–΄ μ²˜λ¦¬κ°€ λ²ˆκ±°λ‘œμ›€
  • λΉ„κ΄€κ³„ν˜• λ ˆμ΄μ•„μ›ƒ -- 일반적인 κ΄€κ³„ν˜• DB(long format)와 λ‹€λ₯Έ ꡬ쑰라 뢄석에 λ°”λ‘œ μ“°κΈ° 어렀움
  • 빈 μ’…λͺ© 데이터 -- 상μž₯ 폐지 λ“±μœΌλ‘œ 데이터가 μ—†λŠ” μ’…λͺ©λ„ 전체 기간에 걸쳐 null 행이 쑴재
  • 느린 λ‘œλ”© 속도 -- 큰 νŒŒμΌμ„ κ·ΈλŒ€λ‘œ 읽으면 λΆˆν•„μš”ν•œ λ°μ΄ν„°κΉŒμ§€ μŠ€μΊ”

DataGuide 6 μ—…λ°μ΄νŠΈλ₯Ό κ³„κΈ°λ‘œ, 내보낸 파일만 λ„£μœΌλ©΄ μ •μ œλœ CSV/Parquet DB둜 μžλ™ λ³€ν™˜ν•΄ μ£ΌλŠ” 라이브러리λ₯Ό λ§Œλ“€κ³ μž 이 ν”„λ‘œμ νŠΈλ₯Ό μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.


Quick Start

1. μ„€μΉ˜

# 아직 PyPI에 λ°°ν¬λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μ €μž₯μ†Œλ₯Ό ν΄λ‘ ν•˜μ—¬ μ„€μΉ˜ν•©λ‹ˆλ‹€.
git clone https://github.com/jaepil-choi/fn-dg6-ingest.git
cd fn-dg6-ingest

# uv μ‚¬μš© (ꢌμž₯)
uv pip install -e .

# λ˜λŠ” pip
pip install -e .

2. 데이터 μ€€λΉ„

DataGuide 6μ—μ„œ 내보낸 νŒŒμΌμ„ ν”„λ‘œμ νŠΈ 루트의 inputs/ 폴더에 λ„£μœΌμ„Έμš”.

fn-dg6-ingest/
  inputs/                          # ← 여기에 DG6 νŒŒμΌμ„ λ„£μœΌμ„Έμš”
    dataguide_kse+kosdaq_ohlcv_from(20160101)_to(20260207).csv
    dataguide_kse+kosdaq_sales-consensus_from(20180101)_to(20260207).csv
    dataguide_etfconst(kodex200)_from(20250101)_to(20260207).csv

지원 포맷:

포맷 μ˜ˆμ‹œ μ„€λͺ…
Time Series Wide OHLCV, 맀좜 μ»¨μ„Όμ„œμŠ€ λ‚ μ§œκ°€ μ—΄(column)둜 νŽΌμ³μ§„ ν˜•νƒœ
Misc (ETF ꡬ성쒅λͺ© λ“±) ETF ꡬ성쒅λͺ© 이미 κ΄€κ³„ν˜•(long) ν˜•νƒœμΈ 데이터

3. μ‹€ν–‰

import fn_dg6_ingest

# ── open(): 단일 μ§„μž…μ  ──
# 졜초 μ‹€ν–‰: 포맷 감지 β†’ μ„€μ • 생성 β†’ 데이터 λ³€ν™˜ β†’ Dataset λ°˜ν™˜
ds = fn_dg6_ingest.open(
    "inputs/dataguide_kse+kosdaq_ohlcv_from(20160101)_to(20260207).csv",
    output_dir="outputs/kse+kosdaq_ohlcv",
)

# 두 번째 호좜: 이미 데이터가 μ‘΄μž¬ν•˜λ©΄ λ³€ν™˜μ„ κ±΄λ„ˆλ›°κ³  λ°”λ‘œ Dataset λ°˜ν™˜ (λ©±λ“±μ„±)
ds = fn_dg6_ingest.open(
    "inputs/dataguide_kse+kosdaq_ohlcv_from(20160101)_to(20260207).csv",
    output_dir="outputs/kse+kosdaq_ohlcv",
)

# ── 데이터 읽기 ──
df = ds.load()                                              # 전체 λ‘œλ“œ
df = ds.load(codes=["A005930"], items=["μˆ˜μ •μ£Όκ°€(원)"])       # μ‚Όμ„±μ „μž μ’…κ°€λ§Œ
df = ds.load(date_from="2024-01-01", date_to="2025-12-31")  # λ‚ μ§œ λ²”μœ„

# ── 메타데이터 쑰회 ──
meta = ds.load_meta()    # _meta 메타 ν…Œμ΄λΈ”
info = ds.describe()     # λΉ λ₯Έ 메타데이터 (데이터 μŠ€μΊ” 없이)

λ˜λŠ” 데λͺ¨ 슀크립트둜 전체 μž…λ ₯ νŒŒμΌμ„ 일괄 처리:

uv run python scripts/run_ingest.py            # λ©±λ“±: 데이터 있으면 κ±΄λ„ˆλœ€
uv run python scripts/run_ingest.py --force     # κ°•μ œ μž¬λΉŒλ“œ

open()은 μž…λ ₯에 따라 λ‹€ν˜•μ μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€:

인자 μœ ν˜• λ™μž‘
DG6 원본 파일 (CSV/Excel) 졜초 μ‹€ν–‰: 포맷 감지 β†’ μ„€μ • 생성 β†’ 좜λ ₯ λΉŒλ“œ. Dataset λ°˜ν™˜. 이미 좜λ ₯이 μ‘΄μž¬ν•˜λ©΄ λΉŒλ“œ κ±΄λ„ˆλœ€.
κΈ°μ‘΄ YAML μ„€μ • 파일 μ„€μ • λ‘œλ“œ β†’ Dataset λ°˜ν™˜. νŒŒμ΄ν”„λΌμΈ μ‹€ν–‰ μ—†μŒ.
# μ„€μ • νŒŒμΌμ—μ„œ 직접 μ—΄κΈ°
ds = fn_dg6_ingest.open("outputs/kse+kosdaq_ohlcv.yaml")
df = ds.load()

μ„€μ • 파일만 λ¨Όμ € λ§Œλ“€κ³  μ‹ΆμœΌλ©΄ run_immediately=Falseλ₯Ό μ§€μ •ν•˜μ„Έμš”:

ds = fn_dg6_ingest.open(
    "inputs/your_file.csv",
    output_dir="outputs/",
    run_immediately=False,  # μ„€μ • 파일만 생성, 데이터 λ³€ν™˜μ€ λ‚˜μ€‘μ—
)
ds.ingest()  # ν•„μš”ν•  λ•Œ μˆ˜λ™ λΉŒλ“œ

4. μ„€μ • νŽΈμ§‘ 및 μž¬λΉŒλ“œ

μžλ™ μƒμ„±λœ fnconfig.yaml을 νŽΈμ§‘ν•˜μ—¬ ν…Œμ΄λΈ” λΆ„ν• , 좜λ ₯ 포맷 등을 μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# outputs/kse+kosdaq_ohlcv.yaml (μžλ™ μƒμ„±λœ μ„€μ •)
source:
  input_path: inputs/dataguide_kse+kosdaq_ohlcv_from(20160101)_to(20260207).csv
  detected_format: timeseries_wide

metadata:
  frequency: 일간
  currency: 원화
  sort_order: μ˜€λ¦„μ°¨μˆœ
  non_business_days: μ œμ™Έ
  include_weekends: μ œμ™Έ
  period_start: '20160101'
  period_end: 졜근일자(20260206)
  calendar_basis: true

output:
  output_dir: outputs/kse+kosdaq_ohlcv
  output_format: parquet        # csv λ˜λŠ” parquet
  normalize_units: true         # (μ²œμ›)β†’(원) λ“± λ‹¨μœ„ μžλ™ ν™˜μ‚°
  drop_empty_entities: true     # 전체 NaN인 μ’…λͺ© 제거

tables:
  default:
    - μˆ˜μ •μ‹œκ°€(원)
    - μˆ˜μ •κ³ κ°€(원)
    - μˆ˜μ •μ €κ°€(원)
    - μˆ˜μ •μ£Όκ°€(원)
    - κ±°λž˜λŸ‰(μ£Ό)
    - κ±°λž˜λŒ€κΈˆ(원)

  # μ—¬λŸ¬ ν…Œμ΄λΈ”λ‘œ λΆ„ν• ν•˜λ €λ©΄ 그룹을 μΆ”κ°€ν•˜μ„Έμš”:
  # ohlcv:
  #   - μˆ˜μ •μ‹œκ°€(원)
  #   - μˆ˜μ •κ³ κ°€(원)
  #   - μˆ˜μ •μ €κ°€(원)
  #   - μˆ˜μ •μ£Όκ°€(원)
  # volume:
  #   - κ±°λž˜λŸ‰(μ£Ό)
  #   - κ±°λž˜λŒ€κΈˆ(원)

νŽΈμ§‘ ν›„ Dataset을 톡해 μž¬λΉŒλ“œν•©λ‹ˆλ‹€:

ds = fn_dg6_ingest.open("outputs/kse+kosdaq_ohlcv.yaml")
ds.ingest()  # λ³€κ²½λœ μ„€μ •μœΌλ‘œ μž¬λΉŒλ“œ

# λΆ„ν• λœ ν…Œμ΄λΈ” λ‘œλ“œ
df = ds.load(table="ohlcv")

λ˜λŠ” Pythonμ—μ„œ ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ 섀정을 μˆ˜μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€:

ds = fn_dg6_ingest.open("outputs/kse+kosdaq_ohlcv.yaml")

ds.config.tables = {
    "ohlcv": ["μˆ˜μ •μ‹œκ°€(원)", "μˆ˜μ •κ³ κ°€(원)", "μˆ˜μ •μ €κ°€(원)", "μˆ˜μ •μ£Όκ°€(원)"],
    "volume": ["κ±°λž˜λŸ‰(μ£Ό)", "κ±°λž˜λŒ€κΈˆ(원)"],
}
ds.config.output.output_format = "csv"

ds.save_config()  # YAML에 반영
ds.ingest()       # μž¬λΉŒλ“œ β†’ ohlcv.csv, volume.csv, _meta.csv

Dataset API

Dataset 객체

fn_dg6_ingest.open()이 λ°˜ν™˜ν•˜λŠ” ν•Έλ“€ 객체. 경둜λ₯Ό ν•œ 번만 μ§€μ •ν•˜λ©΄ 이후 λͺ¨λ“  μž‘μ—…μ€ 이 핸듀을 톡해 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

ds = fn_dg6_ingest.open("outputs/kse+kosdaq_ohlcv.yaml")

ds.config          # IngestConfig (νŒŒμ‹±λœ μ„€μ •)
ds.config_path     # YAML 파일 경둜
ds.output_dir      # 좜λ ₯ 디렉토리 경둜

ds.load() -- 필터링을 μ§€μ›ν•˜λŠ” 데이터 읽기

Parquet의 **μ—΄ 선택(column pruning)**κ³Ό **μˆ μ–΄ ν‘Έμ‹œλ‹€μš΄(predicate pushdown)**을 ν™œμš©ν•˜μ—¬ λŒ€μš©λŸ‰ λ°μ΄ν„°μ—μ„œ ν•„μš”ν•œ λΆ€λΆ„λ§Œ 효율적으둜 μ½μŠ΅λ‹ˆλ‹€.

df = ds.load()                                          # 전체 데이터
df = ds.load(table="ohlcv")                             # νŠΉμ • ν…Œμ΄λΈ”
df = ds.load(codes=["A005930"])                         # μ’…λͺ© μ½”λ“œλ‘œ ν•„ν„°
df = ds.load(date_from="2024-01-01", date_to="2025-12-31")  # λ‚ μ§œ λ²”μœ„
df = ds.load(items=["μˆ˜μ •μ£Όκ°€(원)", "κ±°λž˜λŸ‰(μ£Ό)"])         # μ•„μ΄ν…œ(컬럼) 선택
df = ds.load(codes=["A005930"], date_from="2024-01-01",
             items=["μˆ˜μ •μ£Όκ°€(원)"])                      # μ‘°ν•©

ν…Œμ΄λΈ”μ΄ 1개면 DataFrame, μ—¬λŸ¬ 개면 dict[str, DataFrame]을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

ds.load_meta() -- 메타 ν…Œμ΄λΈ” 읽기

meta = ds.load_meta()  # _meta DataFrame (20개 컬럼)

ds.describe() -- λΉ λ₯Έ 메타데이터 쑰회

Parquet 파일 ν‘Έν„°μ—μ„œ μŠ€ν‚€λ§ˆμ™€ ν–‰ 수λ₯Ό 읽어 데이터λ₯Ό μŠ€μΊ”ν•˜μ§€ μ•Šκ³  λΉ λ₯΄κ²Œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

info = ds.describe()
info.tables         # ["default"] λ˜λŠ” ["ohlcv", "volume"]
info.items          # {"default": ["μˆ˜μ •μ‹œκ°€(원)", ...]}
info.shape          # {"default": (7613009, 9)}
info.date_range     # ("20160101", "졜근일자(20260206)")
info.entities       # 3071
info.format_name    # "timeseries_wide"

ds.ingest() -- μž¬λΉŒλ“œ

ds.ingest()        # ν˜„μž¬ μ„€μ •μœΌλ‘œ 좜λ ₯ μž¬μƒμ„±

ds.save_config() -- μ„€μ • μ €μž₯

ds.config.tables = {"ohlcv": [...], "volume": [...]}
ds.save_config()   # YAML에 반영

μ‹€μ œ 좜λ ₯ μ˜ˆμ‹œ

μ„Έ κ°€μ§€ DataGuide 6 νŒŒμΌμ— λŒ€ν•΄ scripts/run_ingest.pyλ₯Ό μ‹€ν–‰ν•œ κ²°κ³Όμž…λ‹ˆλ‹€.

KSE+KOSDAQ OHLCV (Time Series Wide)

ν•­λͺ© κ°’
감지 포맷 timeseries_wide
좜λ ₯ 파일 default.parquet (113.8 MB)
ν–‰ x μ—΄ 7,613,009 x 9
λ©”λͺ¨λ¦¬ 786.3 MB
κΈ°κ°„ 2016-01-01 ~ 2026-02-06 (일간)
μ’…λͺ© 4,071개 쀑 1,000개 빈 μ’…λͺ© 제거 β†’ 3,071개
     μ½”λ“œ  μ½”λ“œλͺ…       date  μˆ˜μ •μ‹œκ°€(원)  μˆ˜μ •κ³ κ°€(원)  μˆ˜μ •μ €κ°€(원)  μˆ˜μ •μ£Όκ°€(원)    κ±°λž˜λŸ‰(μ£Ό)      κ±°λž˜λŒ€κΈˆ(원)
  A000020 λ™ν™”μ•½ν’ˆ 2015-12-30   8180.0   8180.0   8020.0   8140.0  166761.0 1.348911e+09
  A000020 λ™ν™”μ•½ν’ˆ 2016-01-04   8130.0   8150.0   7920.0   8140.0  281440.0 2.265829e+09
  A000020 λ™ν™”μ•½ν’ˆ 2016-01-05   8040.0   8250.0   8000.0   8190.0  243179.0 1.981977e+09
  A000020 λ™ν™”μ•½ν’ˆ 2016-01-06   8200.0   8590.0   8110.0   8550.0  609906.0 5.129946e+09
  A000020 λ™ν™”μ•½ν’ˆ 2016-01-07   8470.0   8690.0   8190.0   8380.0  704752.0 5.919556e+09

KSE+KOSDAQ Sales Consensus (Time Series Wide, λ‹¨μœ„ ν™˜μ‚°)

ν•­λͺ© κ°’
감지 포맷 timeseries_wide
좜λ ₯ 파일 default.parquet (13.0 MB)
ν–‰ x μ—΄ 4,913,310 x 13
λ©”λͺ¨λ¦¬ 661.4 MB
κΈ°κ°„ 2018-01-01 ~ 2026-02-06 (일간)
μ’…λͺ© 4,071개 쀑 1,602개 빈 μ’…λͺ© 제거 β†’ 2,469개
λ‹¨μœ„ ν™˜μ‚° λ§€μΆœμ•‘(얡원) β†’ λ§€μΆœμ•‘(원) (x100,000,000) λ“± 7개 μ•„μ΄ν…œ

λ‹¨μœ„ ν™˜μ‚°μ΄ 적용된 _meta ν–‰ μ˜ˆμ‹œ:

μ•„μ΄ν…œλͺ… μ•„μ΄ν…œλͺ…_normalized unit_original unit_multiplier
λ§€μΆœμ•‘(얡원) λ§€μΆœμ•‘(원) 얡원 100,000,000
λ§€μΆœμ•‘(Fwd.12M)(얡원) λ§€μΆœμ•‘(Fwd.12M)(원) 얡원 100,000,000
μΆ”μ •κΈ°κ΄€μˆ˜ μΆ”μ •κΈ°κ΄€μˆ˜ NaN 1

ETF ꡬ성쒅λͺ© -- KODEX 200 (Misc)

ν•­λͺ© κ°’
감지 포맷 misc_etf
좜λ ₯ 파일 default.parquet (380.4 KB)
ν–‰ x μ—΄ 53,836 x 8
λ©”λͺ¨λ¦¬ 5.9 MB
κΈ°κ°„ 2025-01-01 ~ 2026-02-06 (일간)
       date   ETFμ½”λ“œ      ETFλͺ…  ꡬ성쒅λͺ©μ½”λ“œ      ꡬ성쒅λͺ©  μ£Όμ‹μˆ˜(κ³„μ•½μˆ˜)       κΈˆμ•‘  κΈˆμ•‘κΈ°μ€€ ꡬ성비쀑(%)
 2025-01-02 A069500 KODEX 200              μ›ν™”ν˜„κΈˆ       NaN   9945243          0.62
 2025-01-02 A069500 KODEX 200 A000080     ν•˜μ΄νŠΈμ§„λ‘œ      47.0    914620          0.06
 2025-01-02 A069500 KODEX 200 A000100      μœ ν•œμ–‘ν–‰      91.0  10765300          0.67
 2025-01-02 A069500 KODEX 200 A000120    CJλŒ€ν•œν†΅μš΄      17.0   1429700          0.09
 2025-01-02 A069500 KODEX 200 A000660    SKν•˜μ΄λ‹‰μŠ€     851.0 145691200          9.09

좜λ ₯ 디렉토리 ꡬ쑰

outputs/
β”œβ”€β”€ etfconst(kodex200).yaml              # μ„€μ • 파일
β”œβ”€β”€ etfconst(kodex200)/
β”‚   β”œβ”€β”€ default.parquet                  # 데이터 ν…Œμ΄λΈ”
β”‚   └── _meta.parquet                    # 메타 ν…Œμ΄λΈ”
β”œβ”€β”€ kse+kosdaq_ohlcv.yaml
β”œβ”€β”€ kse+kosdaq_ohlcv/
β”‚   β”œβ”€β”€ default.parquet
β”‚   └── _meta.parquet
β”œβ”€β”€ kse+kosdaq_sales-consensus.yaml
└── kse+kosdaq_sales-consensus/
    β”œβ”€β”€ default.parquet
    └── _meta.parquet

_meta ν…Œμ΄λΈ” μŠ€ν‚€λ§ˆ (20개 컬럼)

λͺ¨λ“  데이터셋에 _meta.parquetκ°€ ν•¨κ»˜ 좜λ ₯λ©λ‹ˆλ‹€. 각 μ•„μ΄ν…œμ˜ 좜처, λ‹¨μœ„ ν™˜μ‚° 이λ ₯, 제거된 μ’…λͺ© 수 등을 κΈ°λ‘ν•©λ‹ˆλ‹€.

Column μ˜ˆμ‹œ μ„€λͺ…
table_name default μ†Œμ† 좜λ ₯ ν…Œμ΄λΈ”λͺ…
source_file dataguide_kse+kosdaq_ohlcv_...csv 원본 파일λͺ…
source_hash 523e45d8... 원본 파일 SHA-256
source_last_updated 2026-02-07 15:46:56 DG6 Refresh μ‹œκ°
detected_format timeseries_wide κ°μ§€λœ λ ˆμ΄μ•„μ›ƒ
μ•„μ΄ν…œμ½”λ“œ S410000650 DG6 μ•„μ΄ν…œ μ½”λ“œ
μ•„μ΄ν…œλͺ… μˆ˜μ •μ‹œκ°€(원) 원본 μ•„μ΄ν…œλͺ…
μ•„μ΄ν…œλͺ…_normalized μˆ˜μ •μ‹œκ°€(원) λ‹¨μœ„ ν™˜μ‚° ν›„ 이름
μœ ν˜• SSC μ’…λͺ© μœ ν˜•
집계주기 일간 집계 μ£ΌκΈ°
unit_original 얡원 원본 λ‹¨μœ„ 접미사
unit_multiplier 100000000 적용된 ν™˜μ‚° 배수
entities_total 4071 원본 μ’…λͺ© 수
entities_dropped 1000 제거된 빈 μ’…λͺ© 수
processed_at 2026-02-11T02:15:02+00:00 처리 μ‹œκ° (UTC)

μ£Όμš” κΈ°λŠ₯

  • Dataset ν•Έλ“€ -- open() ν•œ 번으둜 경둜λ₯Ό κΈ°μ–΅ν•˜κ³ , load() / describe() / ingest()λ₯Ό 톡합 제곡
  • λ©±λ“± open() -- 좜λ ₯ 데이터가 이미 μ‘΄μž¬ν•˜λ©΄ λ³€ν™˜μ„ κ±΄λ„ˆλ›°κ³  μ¦‰μ‹œ Dataset λ°˜ν™˜ (force=True둜 κ°•μ œ μž¬λΉŒλ“œ κ°€λŠ₯)
  • Parquet λ„€μ΄ν‹°λΈŒ 필터링 -- μ—΄ 선택(column pruning) + μˆ μ–΄ ν‘Έμ‹œλ‹€μš΄(predicate pushdown)으둜 λŒ€μš©λŸ‰ 데이터 효율 읽기
  • 포맷 μžλ™ 감지 -- λ ˆμ΄μ•„μ›ƒ YAML 기반 μ’Œν‘œ νƒμ§€λ‘œ Time Series / Misc 포맷을 μžλ™ νŒλ³„
  • λ‹¨μœ„ μžλ™ ν™˜μ‚° -- (μ²œμ›), (얡원), (십얡원) λ“±μ˜ κΈˆμ•‘ λ‹¨μœ„λ₯Ό (원) κΈ°μ€€μœΌλ‘œ ν™˜μ‚°
  • 빈 μ’…λͺ© 제거 -- μ „ κΈ°κ°„ 데이터가 μ—†λŠ” μ’…λͺ©μ„ μžλ™ μ œμ™Έ (OHLCV: 4,071개 쀑 1,000개 제거)
  • Config-First μ›Œν¬ν”Œλ‘œμš° -- fnconfig.yaml ν•˜λ‚˜λ‘œ ν…Œμ΄λΈ” λΆ„ν• , 좜λ ₯ 포맷, μ •μ œ μ˜΅μ…˜μ„ μ œμ–΄
  • 메타 ν…Œμ΄λΈ” -- _meta ν…Œμ΄λΈ”λ‘œ 처리 이λ ₯ 좔적 (원본 ν•΄μ‹œ, λ‹¨μœ„ ν™˜μ‚° λ‚΄μ—­, μ’…λͺ© 톡계)

슀크립트

슀크립트 μ„€λͺ…
scripts/run_ingest.py inputs/의 전체 νŒŒμΌμ„ 일괄 처리 (λ©±λ“±, --force둜 κ°•μ œ μž¬λΉŒλ“œ)
scripts/inspect_outputs.py Dataset APIλ₯Ό μ‚¬μš©ν•˜μ—¬ outputs/의 κ²°κ³Όλ¬Ό 속성 및 μƒ˜ν”Œ 좜λ ₯
# 전체 파일 일괄 처리 (데이터 있으면 κ±΄λ„ˆλœ€)
uv run python scripts/run_ingest.py

# κ°•μ œ μž¬λΉŒλ“œ
uv run python scripts/run_ingest.py --force

# 좜λ ₯ κ²°κ³Ό 전체 점검
uv run python scripts/inspect_outputs.py

# νŠΉμ • λ°μ΄ν„°μ…‹λ§Œ 점검 (YAML μ„€μ • 경둜둜 μ§€μ •)
uv run python scripts/inspect_outputs.py outputs/kse+kosdaq_ohlcv.yaml

ν…ŒμŠ€νŠΈ

# λ‹¨μœ„ ν…ŒμŠ€νŠΈ (195개, ~3초)
uv run python -m pytest tests/unit/ -v

# 톡합 ν…ŒμŠ€νŠΈ (31개, inputs/ 에 μ‹€μ œ 파일 ν•„μš”, ~42λΆ„)
uv run python -m pytest tests/integration/ -v -m integration

# 전체
uv run python -m pytest -v

μš”κ΅¬ 사항

  • Python >= 3.14
  • pandas, pyarrow, pydantic, pyyaml, openpyxl

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages