From d4047d4cf4ec438650ae3fdf953f71349532dd93 Mon Sep 17 00:00:00 2001 From: aszerW Date: Thu, 14 May 2026 00:51:23 +0800 Subject: [PATCH] =?UTF-8?q?fix(flask=5Fapi=5Fsource):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=20fetch=5Fetf=5Fnav=20zstd=20=E8=A7=A3=E5=8E=8B=E4=B8=8E?= =?UTF-8?q?=E6=BA=A2=E4=BB=B7=E7=8E=87=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 处理 zstd 响应的 JSON 解析问题 - 正确解析 Flask server 返回的净值数据结构 - 添加 premium_series、latest_premium、premium_stats 到 DataFrame attrs --- datasource/flask_api_source.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/datasource/flask_api_source.py b/datasource/flask_api_source.py index 254ab0e..f80fe22 100644 --- a/datasource/flask_api_source.py +++ b/datasource/flask_api_source.py @@ -231,13 +231,19 @@ class FlaskAPIDataSource: if response.status_code != 200: return None - data = response.json() + # 处理 zstd 响应 + try: + data = response.json() + except (json.JSONDecodeError, requests.exceptions.JSONDecodeError): + data = json.loads(response.text) - if 'error' in data or 'nav' not in data: + if 'error' in data: return None - nav_data = data.get('nav', {}) - records = nav_data.get('data', []) + # 解析净值数据 + # Flask server 返回格式: {'nav': {'data': [...], 'count': N}, 'premium_series': [...]} + nav_section = data.get('nav', {}) + records = nav_section.get('data', []) if not records: return None @@ -247,6 +253,14 @@ class FlaskAPIDataSource: df['date'] = pd.to_datetime(df['date']) df = df.set_index('date') + # 添加溢价率信息(如果有) + if 'premium_series' in data: + df.attrs['premium_series'] = data['premium_series'] + if 'latest_premium' in data: + df.attrs['latest_premium'] = data['latest_premium'] + if 'premium_stats' in data: + df.attrs['premium_stats'] = data['premium_stats'] + return df except Exception as e: