contracts-hj3415 0.2.0__py3-none-any.whl → 0.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- contracts_hj3415/nfs/c101_dto.py +27 -0
- contracts_hj3415/nfs/c103_dto.py +35 -0
- contracts_hj3415/nfs/c104_dto.py +44 -0
- contracts_hj3415/nfs/c106_dto.py +28 -0
- contracts_hj3415/nfs/c108_dto.py +21 -0
- contracts_hj3415/nfs/constants.py +49 -0
- contracts_hj3415/nfs/nfs_dto.py +17 -0
- contracts_hj3415/nfs/types.py +61 -0
- contracts_hj3415/universe/__init__.py +0 -0
- contracts_hj3415/universe/constants.py +4 -0
- contracts_hj3415/universe/dto.py +17 -0
- contracts_hj3415/universe/types.py +6 -0
- {contracts_hj3415-0.2.0.dist-info → contracts_hj3415-0.4.0.dist-info}/METADATA +1 -1
- contracts_hj3415-0.4.0.dist-info/RECORD +18 -0
- contracts/.DS_Store +0 -0
- contracts/nfs/c101.py +0 -52
- contracts/nfs/c103.py +0 -19
- contracts/nfs/c104.py +0 -24
- contracts/nfs/c106.py +0 -37
- contracts/nfs/c108.py +0 -61
- contracts_hj3415-0.2.0.dist-info/RECORD +0 -12
- {contracts → contracts_hj3415}/__init__.py +0 -0
- {contracts → contracts_hj3415}/nfs/__init__.py +0 -0
- {contracts_hj3415-0.2.0.dist-info → contracts_hj3415-0.4.0.dist-info}/WHEEL +0 -0
- {contracts_hj3415-0.2.0.dist-info → contracts_hj3415-0.4.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# contracts_hj3415/nfs/c101_dto.py
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing_extensions import TypedDict
|
|
5
|
+
from typing import Any
|
|
6
|
+
from .nfs_dto import NfsDTO
|
|
7
|
+
from .types import PeriodKey, Num, MetricKey
|
|
8
|
+
|
|
9
|
+
Scalar = str | float | int | None
|
|
10
|
+
ValuesMap = dict[PeriodKey, Num]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class C101Blocks(TypedDict):
|
|
14
|
+
요약: dict[str, Scalar]
|
|
15
|
+
시세: dict[str, Scalar]
|
|
16
|
+
주주현황: list[dict[str, Scalar]]
|
|
17
|
+
기업개요: dict[str, Scalar]
|
|
18
|
+
펀더멘털: dict[MetricKey, ValuesMap]
|
|
19
|
+
|
|
20
|
+
어닝서프라이즈: dict[str, Any]
|
|
21
|
+
연간컨센서스: dict[MetricKey, ValuesMap]
|
|
22
|
+
|
|
23
|
+
class C101Payload(TypedDict):
|
|
24
|
+
blocks: C101Blocks
|
|
25
|
+
|
|
26
|
+
class C101DTO(NfsDTO):
|
|
27
|
+
payload: C101Payload
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# contracts_hj3415/nfs/c103_dto.py
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing_extensions import TypedDict
|
|
5
|
+
from .nfs_dto import NfsDTO
|
|
6
|
+
from .types import Num, MetricKey, PeriodKey
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
C103ValuesMap = dict[PeriodKey, Num]
|
|
10
|
+
|
|
11
|
+
class C103Blocks(TypedDict):
|
|
12
|
+
손익계산서y: dict[MetricKey, C103ValuesMap]
|
|
13
|
+
손익계산서q: dict[MetricKey, C103ValuesMap]
|
|
14
|
+
재무상태표y: dict[MetricKey, C103ValuesMap]
|
|
15
|
+
재무상태표q: dict[MetricKey, C103ValuesMap]
|
|
16
|
+
현금흐름표y: dict[MetricKey, C103ValuesMap]
|
|
17
|
+
현금흐름표q: dict[MetricKey, C103ValuesMap]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class C103Labels(TypedDict):
|
|
21
|
+
손익계산서y: dict[MetricKey, str]
|
|
22
|
+
손익계산서q: dict[MetricKey, str]
|
|
23
|
+
재무상태표y: dict[MetricKey, str]
|
|
24
|
+
재무상태표q: dict[MetricKey, str]
|
|
25
|
+
현금흐름표y: dict[MetricKey, str]
|
|
26
|
+
현금흐름표q: dict[MetricKey, str]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class C103Payload(TypedDict):
|
|
30
|
+
blocks: C103Blocks
|
|
31
|
+
labels: C103Labels
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class C103DTO(NfsDTO):
|
|
35
|
+
payload: C103Payload
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# contracts_hj3415/nfs/c104_dto.py
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing_extensions import TypedDict
|
|
5
|
+
from .nfs_dto import NfsDTO
|
|
6
|
+
from .types import Num, MetricKey, PeriodKey
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
C104ValuesMap = dict[PeriodKey, Num]
|
|
10
|
+
|
|
11
|
+
class C104Blocks(TypedDict):
|
|
12
|
+
수익성y: dict[MetricKey, C104ValuesMap]
|
|
13
|
+
성장성y: dict[MetricKey, C104ValuesMap]
|
|
14
|
+
안정성y: dict[MetricKey, C104ValuesMap]
|
|
15
|
+
활동성y: dict[MetricKey, C104ValuesMap]
|
|
16
|
+
가치분석y: dict[MetricKey, C104ValuesMap]
|
|
17
|
+
수익성q: dict[MetricKey, C104ValuesMap]
|
|
18
|
+
성장성q: dict[MetricKey, C104ValuesMap]
|
|
19
|
+
안정성q: dict[MetricKey, C104ValuesMap]
|
|
20
|
+
활동성q: dict[MetricKey, C104ValuesMap]
|
|
21
|
+
가치분석q: dict[MetricKey, C104ValuesMap]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class C104Labels(TypedDict):
|
|
25
|
+
수익성y: dict[MetricKey, str]
|
|
26
|
+
성장성y: dict[MetricKey, str]
|
|
27
|
+
안정성y: dict[MetricKey, str]
|
|
28
|
+
활동성y: dict[MetricKey, str]
|
|
29
|
+
가치분석y: dict[MetricKey, str]
|
|
30
|
+
수익성q: dict[MetricKey, str]
|
|
31
|
+
성장성q: dict[MetricKey, str]
|
|
32
|
+
안정성q: dict[MetricKey, str]
|
|
33
|
+
활동성q: dict[MetricKey, str]
|
|
34
|
+
가치분석q: dict[MetricKey, str]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class C104Payload(TypedDict):
|
|
39
|
+
blocks: C104Blocks
|
|
40
|
+
labels: C104Labels
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class C104DTO(NfsDTO):
|
|
44
|
+
payload: C104Payload
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# contracts_hj3415/nfs/c106_dto.py
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing_extensions import TypedDict
|
|
5
|
+
from .nfs_dto import NfsDTO
|
|
6
|
+
from .types import Num, MetricKey, CodeKey
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
C106ValuesMap = dict[CodeKey, Num]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class C106Blocks(TypedDict):
|
|
13
|
+
y: dict[MetricKey, C106ValuesMap]
|
|
14
|
+
q: dict[MetricKey, C106ValuesMap]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class C106Labels(TypedDict):
|
|
18
|
+
y: dict[MetricKey, str]
|
|
19
|
+
q: dict[MetricKey, str]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class C106Payload(TypedDict):
|
|
23
|
+
blocks: C106Blocks
|
|
24
|
+
labels: C106Labels
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class C106DTO(NfsDTO):
|
|
28
|
+
payload: C106Payload
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# contracts_hj3415/nfs/c108_dto.py
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing_extensions import TypedDict
|
|
5
|
+
from .nfs_dto import NfsDTO
|
|
6
|
+
from .types import MetricKey
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
C108ValuesMap = dict[MetricKey, str|int|None]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class C108Blocks(TypedDict):
|
|
13
|
+
리포트: list[C108ValuesMap]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class C108Payload(TypedDict):
|
|
17
|
+
blocks: C108Blocks
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class C108DTO(NfsDTO):
|
|
21
|
+
payload: C108Payload
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# contracts_hj3415/nfs/constants.py
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
ENDPOINTS: tuple[str, ...] = ("c101", "c103", "c104", "c106", "c108")
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
C101_BLOCK_KEYS: tuple[str, ...] = (
|
|
9
|
+
"요약",
|
|
10
|
+
"시세",
|
|
11
|
+
"주주현황",
|
|
12
|
+
"기업개요",
|
|
13
|
+
"펀더멘털",
|
|
14
|
+
"어닝서프라이즈",
|
|
15
|
+
"연간컨센서스",
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
C103_BLOCK_KEYS: tuple[str, ...] = (
|
|
20
|
+
"손익계산서y",
|
|
21
|
+
"손익계산서q",
|
|
22
|
+
"재무상태표y",
|
|
23
|
+
"재무상태표q",
|
|
24
|
+
"현금흐름표y",
|
|
25
|
+
"현금흐름표q",
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
C104_BLOCK_KEYS: tuple[str, ...] = (
|
|
30
|
+
"수익성y",
|
|
31
|
+
"성장성y",
|
|
32
|
+
"안정성y",
|
|
33
|
+
"활동성y",
|
|
34
|
+
"가치분석y",
|
|
35
|
+
"수익성q",
|
|
36
|
+
"성장성q",
|
|
37
|
+
"안정성q",
|
|
38
|
+
"활동성q",
|
|
39
|
+
"가치분석q",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
C106_BLOCK_KEYS: tuple[str, ...] = (
|
|
44
|
+
"y",
|
|
45
|
+
"q",
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
C108_BLOCK_KEYS: tuple[str, ...] = ("리포트",)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# contracts_hj3415/nfs/nfs_dto.py
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from pydantic import BaseModel, ConfigDict
|
|
6
|
+
from .types import Endpoints, Payload
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class NfsDTO(BaseModel):
|
|
10
|
+
code: str
|
|
11
|
+
asof: datetime
|
|
12
|
+
endpoint: Endpoints
|
|
13
|
+
payload: Payload
|
|
14
|
+
|
|
15
|
+
model_config = ConfigDict(extra="ignore")
|
|
16
|
+
|
|
17
|
+
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# contracts_hj3415/nfs/types.py
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import Mapping, Any, Literal, TypeAlias
|
|
5
|
+
|
|
6
|
+
C101BlockKeys = Literal[
|
|
7
|
+
"요약", "시세", "주주현황", "기업개요", "펀더멘털", "어닝서프라이즈", "연간컨센서스"
|
|
8
|
+
]
|
|
9
|
+
|
|
10
|
+
C103BlockKeys = Literal[
|
|
11
|
+
"손익계산서y",
|
|
12
|
+
"손익계산서q",
|
|
13
|
+
"재무상태표y",
|
|
14
|
+
"재무상태표q",
|
|
15
|
+
"현금흐름표y",
|
|
16
|
+
"현금흐름표q",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
C104BlockKeys = Literal[
|
|
21
|
+
"수익성y",
|
|
22
|
+
"성장성y",
|
|
23
|
+
"안정성y",
|
|
24
|
+
"활동성y",
|
|
25
|
+
"가치분석y",
|
|
26
|
+
"수익성q",
|
|
27
|
+
"성장성q",
|
|
28
|
+
"안정성q",
|
|
29
|
+
"활동성q",
|
|
30
|
+
"가치분석q",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# C106===========================
|
|
35
|
+
|
|
36
|
+
C106BlockKeys = Literal[
|
|
37
|
+
"y",
|
|
38
|
+
"q",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# C108============================
|
|
43
|
+
|
|
44
|
+
C108BlockKeys = Literal["리포트",]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# General====================
|
|
48
|
+
|
|
49
|
+
MetricKey = str
|
|
50
|
+
PeriodKey = str
|
|
51
|
+
CodeKey = str
|
|
52
|
+
Num = float | int | None
|
|
53
|
+
|
|
54
|
+
Endpoints = Literal["c101", "c103", "c104", "c106", "c108"]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
Payload = Mapping[str, Any]
|
|
58
|
+
|
|
59
|
+
BlockKeys: TypeAlias = (
|
|
60
|
+
C101BlockKeys | C103BlockKeys | C104BlockKeys | C106BlockKeys | C108BlockKeys
|
|
61
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# contracts_hj3415/universe/dto.py
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import Any, TypedDict
|
|
5
|
+
|
|
6
|
+
class UniverseItemDTO(TypedDict, total=False):
|
|
7
|
+
code: str # required by convention
|
|
8
|
+
name: str
|
|
9
|
+
market: str
|
|
10
|
+
meta: dict[str, Any]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class UniversePayloadDTO(TypedDict):
|
|
14
|
+
universe: str
|
|
15
|
+
asof: str # ISO string 권장 (UTC). datetime을 넘겨도 되지만 계약은 str이 깔끔함
|
|
16
|
+
source: str
|
|
17
|
+
items: list[UniverseItemDTO]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
contracts_hj3415/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
contracts_hj3415/nfs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
+
contracts_hj3415/nfs/c101_dto.py,sha256=nKKlMhz3jFPAb5JC8ZrgFjhmt7y8ZtamFmqNep2jy0U,686
|
|
4
|
+
contracts_hj3415/nfs/c103_dto.py,sha256=PSAJ3sx77BqBSOm-D_yVQXxTbYVfQ1-711DuOVxVpHY,988
|
|
5
|
+
contracts_hj3415/nfs/c104_dto.py,sha256=uO0-EGb3O5LiLSJ0oCg8TaHjLnInVFyAZDJkYUq26Is,1265
|
|
6
|
+
contracts_hj3415/nfs/c106_dto.py,sha256=TYTgkAHD5vwUo6jn4f0rXaLojUeO9tQ7ZreBj0Uc_oc,541
|
|
7
|
+
contracts_hj3415/nfs/c108_dto.py,sha256=H5eVFAADOAHL_vS_GHiBcYDoTuMg1WlFNgSYKtC7zls,387
|
|
8
|
+
contracts_hj3415/nfs/constants.py,sha256=qUs4EekAbnBFh0wk4tSlmAgxQG9sak-2YZuAjnNt4ak,850
|
|
9
|
+
contracts_hj3415/nfs/nfs_dto.py,sha256=R9Jy3oU8YCuNaYlwjEmFNE7FNNLST-Y5VlnYbfJyLg4,335
|
|
10
|
+
contracts_hj3415/nfs/types.py,sha256=6tUnaXOg0-_JE9wite5toz5CiGgmJtpqjiFD6qoYt2Y,1116
|
|
11
|
+
contracts_hj3415/universe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
+
contracts_hj3415/universe/constants.py,sha256=vYAwhTBFSQhxyzIz8EK3gxwUX6cHdDdezE0KygzAQvU,122
|
|
13
|
+
contracts_hj3415/universe/dto.py,sha256=fR17Cgo8XKT26KDzoqGOltDYTNYvcz2JmMBKhAdbp90,478
|
|
14
|
+
contracts_hj3415/universe/types.py,sha256=OkYoMOHbP6UufOdRL3M8c9orNf_2g-E98fMI7ayG6Fg,134
|
|
15
|
+
contracts_hj3415-0.4.0.dist-info/licenses/LICENSE,sha256=QBiVGQuKAESeCfQE344Ik2ex6g2zfYdu9WqrRWydxIs,1068
|
|
16
|
+
contracts_hj3415-0.4.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
17
|
+
contracts_hj3415-0.4.0.dist-info/METADATA,sha256=nD0xPnBGQi65M19_bAOIZlSDungkYC7yDxHN_FOn8RA,405
|
|
18
|
+
contracts_hj3415-0.4.0.dist-info/RECORD,,
|
contracts/.DS_Store
DELETED
|
Binary file
|
contracts/nfs/c101.py
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
# contracts/nfs/c101.py
|
|
2
|
-
from __future__ import annotations
|
|
3
|
-
|
|
4
|
-
from pydantic import BaseModel, Field
|
|
5
|
-
from typing import Optional
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class C101DTO(BaseModel):
|
|
9
|
-
# 기본 식별 정보
|
|
10
|
-
종목명: str
|
|
11
|
-
코드: str
|
|
12
|
-
날짜: str
|
|
13
|
-
업종: str
|
|
14
|
-
|
|
15
|
-
# 재무 지표
|
|
16
|
-
eps: Optional[int] = None
|
|
17
|
-
bps: Optional[int] = None
|
|
18
|
-
per: Optional[float] = None
|
|
19
|
-
업종per: Optional[float] = None
|
|
20
|
-
pbr: Optional[float] = None
|
|
21
|
-
배당수익률: Optional[float] = None
|
|
22
|
-
|
|
23
|
-
# 주가 정보
|
|
24
|
-
주가: Optional[int] = None
|
|
25
|
-
전일대비: Optional[int] = None
|
|
26
|
-
수익률: Optional[float] = None
|
|
27
|
-
|
|
28
|
-
최고52: Optional[int] = None
|
|
29
|
-
최저52: Optional[int] = None
|
|
30
|
-
|
|
31
|
-
거래량: Optional[int] = None
|
|
32
|
-
거래대금: Optional[int] = None
|
|
33
|
-
시가총액: Optional[int] = None
|
|
34
|
-
|
|
35
|
-
베타52주: Optional[float] = None
|
|
36
|
-
|
|
37
|
-
발행주식: Optional[int] = None
|
|
38
|
-
유동비율: Optional[float] = None
|
|
39
|
-
외국인지분율: Optional[float] = None
|
|
40
|
-
|
|
41
|
-
# 기간 수익률
|
|
42
|
-
수익률1M: Optional[float] = None
|
|
43
|
-
수익률3M: Optional[float] = None
|
|
44
|
-
수익률6M: Optional[float] = None
|
|
45
|
-
수익률1Y: Optional[float] = None
|
|
46
|
-
|
|
47
|
-
# 텍스트 정보
|
|
48
|
-
개요: str = ""
|
|
49
|
-
|
|
50
|
-
class Config:
|
|
51
|
-
# 한글 필드명을 그대로 쓰기 위한 옵션
|
|
52
|
-
populate_by_name = True
|
contracts/nfs/c103.py
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# contracts/nfs/c103.py
|
|
2
|
-
from __future__ import annotations
|
|
3
|
-
|
|
4
|
-
from pydantic import BaseModel, ConfigDict, Field
|
|
5
|
-
|
|
6
|
-
Num = float | int | None
|
|
7
|
-
Row = dict[str, Num] # 예: {"2020/12": 1.0, "전년대비": 2.0, ...}
|
|
8
|
-
ItemsMap = dict[str, Row] # 예: {"매출액(수익)": {...}, ...}
|
|
9
|
-
|
|
10
|
-
class C103DTO(BaseModel):
|
|
11
|
-
코드: str
|
|
12
|
-
손익계산서y: ItemsMap = Field(default_factory=dict)
|
|
13
|
-
손익계산서q: ItemsMap = Field(default_factory=dict)
|
|
14
|
-
재무상태표y: ItemsMap = Field(default_factory=dict)
|
|
15
|
-
재무상태표q: ItemsMap = Field(default_factory=dict)
|
|
16
|
-
현금흐름표y: ItemsMap = Field(default_factory=dict)
|
|
17
|
-
현금흐름표q: ItemsMap = Field(default_factory=dict)
|
|
18
|
-
|
|
19
|
-
model_config = ConfigDict(extra="ignore")
|
contracts/nfs/c104.py
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# contracts/nfs/c104.py
|
|
2
|
-
from __future__ import annotations
|
|
3
|
-
|
|
4
|
-
from pydantic import BaseModel, ConfigDict, Field
|
|
5
|
-
|
|
6
|
-
Num = float | int | None
|
|
7
|
-
Row = dict[str, Num] # 예: {"2020/12": 1.0, "전년대비": 2.0, ...}
|
|
8
|
-
ItemsMap = dict[str, Row] # 예: {"ROE": {...}, ...}
|
|
9
|
-
|
|
10
|
-
class C104DTO(BaseModel):
|
|
11
|
-
코드: str
|
|
12
|
-
수익성y: ItemsMap = Field(default_factory=dict)
|
|
13
|
-
수익성q: ItemsMap = Field(default_factory=dict)
|
|
14
|
-
성장성y: ItemsMap = Field(default_factory=dict)
|
|
15
|
-
성장성q: ItemsMap = Field(default_factory=dict)
|
|
16
|
-
안정성y: ItemsMap = Field(default_factory=dict)
|
|
17
|
-
안정성q: ItemsMap = Field(default_factory=dict)
|
|
18
|
-
활동성y: ItemsMap = Field(default_factory=dict)
|
|
19
|
-
활동성q: ItemsMap = Field(default_factory=dict)
|
|
20
|
-
가치분석y: ItemsMap = Field(default_factory=dict)
|
|
21
|
-
가치분석q: ItemsMap = Field(default_factory=dict)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
model_config = ConfigDict(extra="ignore")
|
contracts/nfs/c106.py
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# contracts/nfs/c106.py
|
|
2
|
-
from __future__ import annotations
|
|
3
|
-
|
|
4
|
-
from pydantic import BaseModel, Field, ConfigDict
|
|
5
|
-
|
|
6
|
-
NumMap = dict[str, float | None]
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class C106Block(BaseModel):
|
|
10
|
-
전일종가: NumMap = Field(default_factory=dict)
|
|
11
|
-
시가총액: NumMap = Field(default_factory=dict)
|
|
12
|
-
자산총계: NumMap = Field(default_factory=dict)
|
|
13
|
-
부채총계: NumMap = Field(default_factory=dict)
|
|
14
|
-
|
|
15
|
-
매출액: NumMap = Field(default_factory=dict)
|
|
16
|
-
영업이익: NumMap = Field(default_factory=dict)
|
|
17
|
-
당기순이익: NumMap = Field(default_factory=dict)
|
|
18
|
-
당기순이익_지배: NumMap = Field(default_factory=dict)
|
|
19
|
-
|
|
20
|
-
영업이익률: NumMap = Field(default_factory=dict)
|
|
21
|
-
순이익률: NumMap = Field(default_factory=dict)
|
|
22
|
-
ROE: NumMap = Field(default_factory=dict)
|
|
23
|
-
부채비율: NumMap = Field(default_factory=dict)
|
|
24
|
-
|
|
25
|
-
PER: NumMap = Field(default_factory=dict)
|
|
26
|
-
PBR: NumMap = Field(default_factory=dict)
|
|
27
|
-
|
|
28
|
-
투자의견: NumMap = Field(default_factory=dict)
|
|
29
|
-
목표주가: NumMap = Field(default_factory=dict)
|
|
30
|
-
|
|
31
|
-
model_config = ConfigDict(extra="ignore")
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class C106DTO(BaseModel):
|
|
35
|
-
코드: str
|
|
36
|
-
q: C106Block
|
|
37
|
-
y: C106Block
|
contracts/nfs/c108.py
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import math
|
|
2
|
-
from pydantic import BaseModel, field_validator
|
|
3
|
-
from typing import List, Optional, Any
|
|
4
|
-
import re
|
|
5
|
-
|
|
6
|
-
class C108DTO(BaseModel):
|
|
7
|
-
코드: str
|
|
8
|
-
날짜: Optional[str]
|
|
9
|
-
제목: str
|
|
10
|
-
작성자: Optional[str]
|
|
11
|
-
제공처: Optional[str]
|
|
12
|
-
투자의견: Optional[str]
|
|
13
|
-
목표가: Optional[float]
|
|
14
|
-
분량: Optional[str]
|
|
15
|
-
내용: List[str]
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@field_validator("투자의견", mode="before")
|
|
19
|
-
@classmethod
|
|
20
|
-
def _coerce_opinion(cls, v):
|
|
21
|
-
# pandas/bs4 parsing sometimes yields float('nan') for empty cells
|
|
22
|
-
if v is None:
|
|
23
|
-
return None
|
|
24
|
-
if isinstance(v, float) and math.isnan(v):
|
|
25
|
-
return None
|
|
26
|
-
if isinstance(v, str):
|
|
27
|
-
s = v.strip()
|
|
28
|
-
if not s or s.lower() == "nan" or s in {"-", "N/A", "NA"}:
|
|
29
|
-
return None
|
|
30
|
-
return s
|
|
31
|
-
# Any other type -> string fallback (keeps validation tolerant)
|
|
32
|
-
return str(v)
|
|
33
|
-
|
|
34
|
-
@field_validator("목표가", mode="before")
|
|
35
|
-
@classmethod
|
|
36
|
-
def _v_target_price(cls, v: Any):
|
|
37
|
-
if v is None:
|
|
38
|
-
return None
|
|
39
|
-
|
|
40
|
-
# nan 방어
|
|
41
|
-
if isinstance(v, float) and math.isnan(v):
|
|
42
|
-
return None
|
|
43
|
-
|
|
44
|
-
# 안내 문구/결측 문자열 방어
|
|
45
|
-
if isinstance(v, str):
|
|
46
|
-
s = v.strip()
|
|
47
|
-
if not s or s in {"-", "N/A"} or "검색된 데이터가 없습니다" in s:
|
|
48
|
-
return None
|
|
49
|
-
|
|
50
|
-
# "123,456원" 같은 케이스에서 숫자만 추출
|
|
51
|
-
m = re.findall(r"\d+(?:,\d+)*", s)
|
|
52
|
-
if not m:
|
|
53
|
-
return None
|
|
54
|
-
return float(m[0].replace(",", ""))
|
|
55
|
-
|
|
56
|
-
# 숫자면 그대로 float로
|
|
57
|
-
if isinstance(v, (int, float)):
|
|
58
|
-
return float(v)
|
|
59
|
-
|
|
60
|
-
# 그 외 타입은 None 처리(또는 raise로 엄격하게)
|
|
61
|
-
return None
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
contracts/.DS_Store,sha256=Xf_I-6KjIMtAPAfhql2fkvFbFFnxThECsUIUP4jzjcw,6148
|
|
2
|
-
contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
contracts/nfs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
contracts/nfs/c101.py,sha256=W5i_D7Icve6E_2sqtees-tm6WWC8nLh9-ZsVIlvRrZY,1301
|
|
5
|
-
contracts/nfs/c103.py,sha256=6toVW_FE2xHgajg-6PDzUyaEcJt3T6uxi6Kjjk9Y710,756
|
|
6
|
-
contracts/nfs/c104.py,sha256=y8f133MN0dVreRefMXltk_60CNz1ZFszxuAE02P5wRk,933
|
|
7
|
-
contracts/nfs/c106.py,sha256=s96kPOBB1QiBGkE8jGKki1wsTBgXx7EOvF-1t3_5Q8I,1168
|
|
8
|
-
contracts/nfs/c108.py,sha256=vNjq_TrBTdlJO_L6hgwZ1IUNAzjDSPFVWqO6_pKz7Ds,1816
|
|
9
|
-
contracts_hj3415-0.2.0.dist-info/licenses/LICENSE,sha256=QBiVGQuKAESeCfQE344Ik2ex6g2zfYdu9WqrRWydxIs,1068
|
|
10
|
-
contracts_hj3415-0.2.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
11
|
-
contracts_hj3415-0.2.0.dist-info/METADATA,sha256=m5qPOSW5Gs5vtGnnr4a7PLHxzSyYhbiWa0IZGwOoKE8,405
|
|
12
|
-
contracts_hj3415-0.2.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|