feat(api): 为美股/港股数据添加 stock info 信息
- 在 universal_fetcher._fetch_yfinance 中获取公司信息 - 包含 sector、industry、market_cap 字段 - 将信息存储在 DataFrame.attrs 中 - Flask API 自动提取并返回 info 字段
This commit is contained in:
@@ -232,7 +232,8 @@ def dataframe_to_json(df: pd.DataFrame) -> Dict:
|
|||||||
# 转换为字典列表
|
# 转换为字典列表
|
||||||
records = df_reset.to_dict(orient='records')
|
records = df_reset.to_dict(orient='records')
|
||||||
|
|
||||||
return {
|
# 构建返回结果
|
||||||
|
result = {
|
||||||
"data": records,
|
"data": records,
|
||||||
"count": len(records),
|
"count": len(records),
|
||||||
"columns": list(df_reset.columns),
|
"columns": list(df_reset.columns),
|
||||||
@@ -241,6 +242,12 @@ def dataframe_to_json(df: pd.DataFrame) -> Dict:
|
|||||||
"end": df.index.max().strftime('%Y-%m-%d') if hasattr(df.index.max(), 'strftime') else str(df.index.max()),
|
"end": df.index.max().strftime('%Y-%m-%d') if hasattr(df.index.max(), 'strftime') else str(df.index.max()),
|
||||||
} if len(df) > 0 else None
|
} if len(df) > 0 else None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 添加股票信息(如果存在)
|
||||||
|
if hasattr(df, 'attrs') and df.attrs.get('info'):
|
||||||
|
result['info'] = df.attrs['info']
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
def validate_date(date_str: str) -> bool:
|
def validate_date(date_str: str) -> bool:
|
||||||
|
|||||||
@@ -362,6 +362,20 @@ class UniversalDataFetcher:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
ticker = yf.Ticker(yf_code)
|
ticker = yf.Ticker(yf_code)
|
||||||
|
|
||||||
|
# 获取公司信息(仅对股票)
|
||||||
|
info = {}
|
||||||
|
if asset_type in ['us_stock', 'hk_stock']:
|
||||||
|
try:
|
||||||
|
stock_info = ticker.info
|
||||||
|
info = {
|
||||||
|
'sector': stock_info.get('sector'),
|
||||||
|
'industry': stock_info.get('industry'),
|
||||||
|
'market_cap': stock_info.get('marketCap'),
|
||||||
|
}
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
# end_date 需要加一天(yfinance 的 end 是排他的)
|
# end_date 需要加一天(yfinance 的 end 是排他的)
|
||||||
end_date_obj = pd.Timestamp(end_date) + timedelta(days=1)
|
end_date_obj = pd.Timestamp(end_date) + timedelta(days=1)
|
||||||
data = ticker.history(
|
data = ticker.history(
|
||||||
@@ -388,6 +402,10 @@ class UniversalDataFetcher:
|
|||||||
data = data[available]
|
data = data[available]
|
||||||
data['code'] = code
|
data['code'] = code
|
||||||
|
|
||||||
|
# 添加公司信息到 DataFrame 的 attrs(属性)
|
||||||
|
if info:
|
||||||
|
data.attrs['info'] = info
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
Reference in New Issue
Block a user