๐ ์ ํฉํ ์๋ฃํ ํ๋ณด
dict
(๋์ ๋๋ฆฌ): ๊ฐ ์ข ๋ชฉ๋ง๋ค ์ธ๋ถ ํญ๋ชฉ(key: value) ๊ด๋ฆฌdataclass
(Python 3.7+): ๊ตฌ์กฐํ๋ ๊ฐ์ฒด ์ฌ์ฉ + ๊ฐ๋ ์ฑ โcustom class
: ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ก ์ธ๋ฐํ ์ ์ด ๊ฐ๋ฅNamedTuple
orTypedDict
: ํ์ ์์ ์ฑ ํ์ํ ๋ ์ ์ฉ (์ ์ ํ์ ๊ฒ์ฌ๊ธฐ ์ฌ์ฉ ์)
โ
์ต์ ๊ตฌ์กฐ: dataclass
+ dict[str, StockInfo]
- ์ข
๋ชฉ๋ณ ์ ๋ณด๋ฅผ
dataclass
๋ก ๊ตฌ์กฐํ - ์ ์ฒด ์ฃผ์ ์ ๋ณด๋ ์ข
๋ชฉ๋ช
(key) ๊ธฐ์ค์
dict
๋ก ๊ด๋ฆฌ
๐ก ๊ตฌํ ์์
from dataclasses import dataclass, asdict
from typing import Dict
@dataclass
class StockInfo:
code: str
price: int
market_cap: int
per: float
class GlobalStockStorage:
global_stocks: Dict[str, StockInfo] = {
"์ผ์ฑ์ ์": StockInfo(code="005930", price=70000, market_cap=450_000_000_000_000, per=15.2)
}
def __init__(self, **additional_stocks: StockInfo):
# ํด๋์ค ๋ณ์ ๋ณต์ฌ โ ์ธ์คํด์ค ๋
๋ฆฝ์ ์ํ ์ ์ง
self.stocks = self.global_stocks.copy()
self.stocks.update(additional_stocks)
def show_all(self):
for name, stock in self.stocks.items():
print(f"[{name}]")
for k, v in asdict(stock).items():
print(f" {k}: {v}")
print()
# Example usage
test = GlobalStockStorage(
์นด์นด์ค=StockInfo(code="035720", price=54000, market_cap=48000000000000, per=23.4),
๋ค์ด๋ฒ=StockInfo(code="035420", price=210000, market_cap=34000000000000, per=35.1),
)
test.show_all()
๐งพ ์ถ๋ ฅ ์์:
[์ผ์ฑ์ ์]
code: 005930
price: 70000
market_cap: 450000000000000
per: 15.2
[์นด์นด์ค]
code: 035720
price: 54000
market_cap: 48000000000000
per: 23.4
[๋ค์ด๋ฒ]
code: 035420
price: 210000
market_cap: 34000000000000
per: 35.1
๐ง ์์ฝ
๋ชฉ์ | ์ ํฉํ ์๋ฃํ |
---|---|
์ข ๋ชฉ๋ณ ์ธ๋ถ ํญ๋ชฉ ๋ค์ ๊ด๋ฆฌ | dataclass + dict |
์ฝ๊ธฐ์ ์ฉ, ๊ฐ๋ฒผ์ด ๊ตฌ์กฐ | NamedTuple |
JSON ์ง๋ ฌํ ๊ณ ๋ ค | asdict() or __dict__ |
์ ์ ํ์ ๊ฒ์ฌ | TypedDict (with mypy ๋ฑ) |
JSON์ผ๋ก ์ ์ฅ/๋ก๋
โ ๋ชฉํ ๊ธฐ๋ฅ
- ์ข
๋ชฉ ์ ๋ณด๋ฅผ
StockInfo
๋ฐ์ดํฐํด๋์ค๋ก ๊ตฌ์กฐํ GlobalStockStorage
ํด๋์ค๋ก ์ถ๊ฐ/์ถ๋ ฅ ๊ด๋ฆฌ- JSON ํ์ผ๋ก ์ ์ฅ ๋ฐ ๋ก๋ ๊ธฐ๋ฅ ํฌํจ
๐งพ ์ ์ฒด ์ฝ๋
import json
from dataclasses import dataclass, asdict, fields
from typing import Dict
# 1. ๊ฐ๋ณ ์ข
๋ชฉ ์ ๋ณด๋ฅผ ๋ด๋ ๋ฐ์ดํฐ ํด๋์ค
@dataclass
class StockInfo:
code: str
price: int
market_cap: int
per: float
@staticmethod
def from_dict(data: dict) -> 'StockInfo':
return StockInfo(**{f.name: data[f.name] for f in fields(StockInfo)})
# 2. ์ ์ฒด ์ข
๋ชฉ ๋ฆฌ์คํธ๋ฅผ ๊ด๋ฆฌํ๋ ํด๋์ค
class GlobalStockStorage:
global_stocks: Dict[str, StockInfo] = {
"์ผ์ฑ์ ์": StockInfo(code="005930", price=70000, market_cap=450_000_000_000_000, per=15.2)
}
def __init__(self, **additional_stocks: StockInfo):
self.stocks = self.global_stocks.copy()
self.stocks.update(additional_stocks)
def show_all(self):
for name, stock in self.stocks.items():
print(f"[{name}]")
for k, v in asdict(stock).items():
print(f" {k}: {v}")
print()
def save_to_json(self, filepath: str):
json_data = {name: asdict(stock) for name, stock in self.stocks.items()}
with open(filepath, "w", encoding="utf-8") as f:
json.dump(json_data, f, ensure_ascii=False, indent=2)
print(f"๐ ์ ์ฅ ์๋ฃ: {filepath}")
@classmethod
def load_from_json(cls, filepath: str) -> 'GlobalStockStorage':
with open(filepath, "r", encoding="utf-8") as f:
json_data = json.load(f)
loaded_stocks = {name: StockInfo.from_dict(data) for name, data in json_data.items()}
return cls(**loaded_stocks)
โถ๏ธ ์ฌ์ฉ ์์
# ์ด๊ธฐ ๊ฐ์ฒด ์์ฑ ๋ฐ ์ ์ฅ
storage = GlobalStockStorage(
์นด์นด์ค=StockInfo(code="035720", price=54000, market_cap=48000000000000, per=23.4),
๋ค์ด๋ฒ=StockInfo(code="035420", price=210000, market_cap=34000000000000, per=35.1),
)
storage.save_to_json("stocks.json") # JSON ํ์ผ๋ก ์ ์ฅ
# ๋ค๋ฅธ ์์ ์์ ๋ก๋
loaded = GlobalStockStorage.load_from_json("stocks.json")
loaded.show_all()
๐ง ๋ณด์ถฉ ์ค๋ช
ํญ๋ชฉ | ์ค๋ช |
---|---|
asdict() | dataclass ๊ฐ์ฒด โ dict ๋ณํ |
from_dict() | dict โ dataclass ๊ฐ์ฒด ์์ฑ |
json.dump() | ํ์ผ์ JSON์ผ๋ก ์ ์ฅ |
json.load() | ํ์ผ์์ JSON ์ฝ๊ธฐ |
์ด ๊ตฌ์กฐ๋ ํ์ฅ์ฑ, ์ง๋ ฌํ ํธํ์ฑ, ๊ฐ๋ ์ฑ์ด ๋ฐ์ด๋์ ์ค์ ์ฃผ์ ๊ด๋ฆฌ ์ฑ์ด๋ ๋ฐฑ์๋ API ์ค๊ณ ์์๋ ๊ทธ๋๋ก ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
์ข์ต๋๋ค! ์ง๊ธ๊น์ง ๋ง๋ ๊ตฌ์กฐ(dataclass + dict
)๋ฅผ Pandas์ ์ฐ๋ํ๋ฉด ์๋์ ๊ฐ์ ์์
์ด ๊ฐ๋ฅํฉ๋๋ค:
dict[str, StockInfo]
โDataFrame
์ผ๋ก ๋ณํDataFrame
โdict[str, StockInfo]
๋ก ์ญ๋ณํ- CSV/Excel ๋ฑ ๋ค์ํ ํฌ๋งท ์ ์ถ๋ ฅ ๊ฐ๋ฅ
โ ์ ์ฒด ์ฐ๋ ๊ธฐ๋ฅ ๊ตฌํ: Pandas ํตํฉ ๋ฒ์
import json
import pandas as pd
from dataclasses import dataclass, asdict, fields
from typing import Dict
# 1. ๋ฐ์ดํฐ ํด๋์ค ์ ์
@dataclass
class StockInfo:
code: str
price: int
market_cap: int
per: float
@staticmethod
def from_dict(data: dict) -> 'StockInfo':
return StockInfo(**{f.name: data[f.name] for f in fields(StockInfo)})
# 2. ๋ฉ์ธ ์ ์ฅ ํด๋์ค
class GlobalStockStorage:
global_stocks: Dict[str, StockInfo] = {
"์ผ์ฑ์ ์": StockInfo(code="005930", price=70000, market_cap=450_000_000_000_000, per=15.2)
}
def __init__(self, **additional_stocks: StockInfo):
self.stocks = self.global_stocks.copy()
self.stocks.update(additional_stocks)
def show_all(self):
for name, stock in self.stocks.items():
print(f"[{name}]")
for k, v in asdict(stock).items():
print(f" {k}: {v}")
print()
def save_to_json(self, filepath: str):
json_data = {name: asdict(stock) for name, stock in self.stocks.items()}
with open(filepath, "w", encoding="utf-8") as f:
json.dump(json_data, f, ensure_ascii=False, indent=2)
@classmethod
def load_from_json(cls, filepath: str) -> 'GlobalStockStorage':
with open(filepath, "r", encoding="utf-8") as f:
json_data = json.load(f)
loaded_stocks = {name: StockInfo.from_dict(data) for name, data in json_data.items()}
return cls(**loaded_stocks)
# โ
ํ๋ค์ค ๋ณํ ๊ธฐ๋ฅ
def to_dataframe(self) -> pd.DataFrame:
data = {name: asdict(stock) for name, stock in self.stocks.items()}
df = pd.DataFrame.from_dict(data, orient='index')
df.index.name = '์ข
๋ชฉ๋ช
'
return df
@classmethod
def from_dataframe(cls, df: pd.DataFrame) -> 'GlobalStockStorage':
df = df.reset_index()
stocks = {
row['์ข
๋ชฉ๋ช
']: StockInfo(
code=row['code'],
price=int(row['price']),
market_cap=int(row['market_cap']),
per=float(row['per'])
)
for _, row in df.iterrows()
}
return cls(**stocks)
โถ๏ธ ์ฌ์ฉ ์์
# ์ด๊ธฐ ์์ฑ
storage = GlobalStockStorage(
์นด์นด์ค=StockInfo(code="035720", price=54000, market_cap=48000000000000, per=23.4),
๋ค์ด๋ฒ=StockInfo(code="035420", price=210000, market_cap=34000000000000, per=35.1),
)
# Pandas DataFrame ๋ณํ
df = storage.to_dataframe()
print(df)
# ์ ์ฅ
df.to_csv("stocks.csv", encoding="utf-8-sig") # CSV ์ ์ฅ
# CSV ๋ถ๋ฌ์ค๊ธฐ ํ ๊ฐ์ฒด ์ฌ์์ฑ
df_loaded = pd.read_csv("stocks.csv", index_col="์ข
๋ชฉ๋ช
")
storage2 = GlobalStockStorage.from_dataframe(df_loaded)
# ์ฌํ์ธ
storage2.show_all()
๐ ์ถ๋ ฅ ์์ (DataFrame)
code price market_cap per
์ข
๋ชฉ๋ช
์ผ์ฑ์ ์ 005930 70000 450000000000000 15.2
์นด์นด์ค 035720 54000 48000000000000 23.4
๋ค์ด๋ฒ 035420 210000 34000000000000 35.1
โ ์์ฝ
์์ ๋ด์ฉ | ํจ์ |
---|---|
dict โ DataFrame | .to_dataframe() |
DataFrame โ dict | from_dataframe() |
JSON ์ ์ฅ/๋ก๋ | save_to_json , load_from_json |
CSV ์ ์ฅ/๋ก๋ | DataFrame.to_csv , pd.read_csv() |
๋ต๊ธ ๋จ๊ธฐ๊ธฐ