问题描述
label的作用是命名获得数据的标签,一般用于直接运算后的重命名
q = query(indicator.code.label('股票代码'),
indicator.operating_profit.label('get_operating_profit'),
(income.total_operating_revenue - income.total_operating_cost).label('my_operating_profit')
).filter(indicator.code=='600507.XSHG')
get_fundamentals(q)
这段教程内容PYCharm环境PY3.86中运行失败,调测中发现是使用了中文字段名,改为英文正常,初始环境需要设置什么?
解决方案
在本地环境(如 PyCharm + Python 3.8)使用 JQData SDK 时,query 语句中的 label() 方法底层依赖于 SQLAlchemy 来构建 SQL 查询。如果在 label() 中使用中文字符导致运行失败,通常是因为底层的数据库驱动或 SQL 编译器在处理非 ASCII 字符的列别名(Alias)时出现了编码兼容性问题。
虽然在聚宽官网的在线研究环境中可能做了特定的环境适配允许使用中文 label,但在本地环境中,最稳妥且最推荐的工程实践是:在 SQL 查询阶段使用英文字段名,在获取到 Pandas DataFrame 后再进行中文重命名。
最佳解决方案:使用 Pandas 的 rename 方法
建议在 query 中保持英文 label,然后利用 Pandas 强大的数据处理能力将列名修改为中文。这不仅能彻底避开底层数据库驱动的编码问题,还能让代码更具可移植性。
修改后的代码示例:
import pandas as pd
from jqdatasdk import *
# 1. 在 query 中使用英文 label(或直接使用默认字段名)
q = query(
indicator.code,
indicator.operating_profit.label('get_operating_profit'),
(income.total_operating_revenue - income.total_operating_cost).label('my_operating_profit')
).filter(
indicator.code == '600507.XSHG'
)
# 2. 获取数据
df = get_fundamentals(q)
# 3. 使用 Pandas 的 rename 方法将列名修改为中文
df.rename(columns={
'code': '股票代码',
'get_operating_profit': '营业利润',
'my_operating_profit': '自定义营业利润'
}, inplace=True)
print(df)
其他环境排查建议
如果您确实希望在初始环境中排查中文编码问题,可以检查以下几点:
- 文件编码声明:确保您的 Python 脚本文件保存为 UTF-8 编码,并在文件头部添加编码声明:
# -*- coding: utf-8 -*- - 终端输出编码:有时并非查询失败,而是 PyCharm 的控制台在打印包含中文列名的 DataFrame 时抛出了
UnicodeEncodeError。请检查 PyCharm 的File Encodings设置,确保Global Encoding和Project Encoding均设置为UTF-8。 - SDK 版本:确保您安装的
jqdatasdk是最新版本(可通过pip install -U jqdatasdk升级),以获取官方最新的底层修复。
总结来说,SQL 查英文 + Pandas 转中文 是量化数据处理中最标准、最不易出错的流程,强烈建议采用此方式。