这两条维护线到底差在哪?
这是本站被问得最集中的问题。答案不是「哪个更好」,而是它们本来就是两个不同的分发包,各自有独立的包名、导入名、版本线与许可。下表逐项对照。
| 对照项 | pandas-ta | pandas-ta-classic | 判断要点 |
|---|---|---|---|
| PyPI 分发名 | pandas-ta | pandas-ta-classic | pip 安装写哪个名字,就装哪个包 |
| 导入名 | pandas_ta | pandas_ta_classic | 迁移时必须改 import,改包名不等于改导入名 |
| PyPI 上可见版本数 | 2 个(0.4.67b0、0.4.71b0) | 13 个(0.3.14b1 → 0.8.32) | 版本数量差异本身就是维护强度的信号 |
| 最新版本与日期 | 0.4.71b0(2025-09-14) | 0.8.32(2026-09-14) | 两者相差近一年,且版本号体系完全不同 |
| 包内分类目录命名 | 单数 candle | 复数 candles | 目录名不同意味着内部结构已分叉 |
| Python 版本要求 | >=3.12 | >=3.10 | 这一条直接决定你装得上哪一个 |
| 依赖约束 | 硬钉 numba==0.61.2 | numba 为可选 | 硬钉意味着不能自由升级 numba |
| 许可 | 当前公开来源无法复核 | MIT | 原仓库不可见,许可证据缺失要如实写 |
| 仓库状态 | 404 | 452 Star / 1,464 commits / 48 contributors | 署名与责任主体不同 |
| 注意点 | 元数据里的 Repository 与 Documentation 仍指向失效地址 | 导入名带 _classic 后缀,容易写错 | 两边都需要独立核验 |
原仓库是什么时候开始访问不到的?
下表把本站能直接观测到的事实按时间排列。凡不能从公开来源直接读到的(例如下架的具体原因),本站不做推断,宁可留空。
| 时间 | 事件 | 来源与可复查性 |
|---|---|---|
| 2024-06 前后 | 社区分支所基于的上游代码时间点(据公开资料) | 第三方描述,标注为未一手核验 |
| 2025-09-03 | PyPI pandas-ta 发布 0.4.67b0 | PyPI 元数据,可复查 |
| 2025-09-14 | PyPI pandas-ta 发布 0.4.71b0(当前最新) | PyPI 元数据,可复查 |
| 2025-06-17 | 社区分支仓库创建 | GitHub API,可复查 |
| 2025-08 起 | 社区分支开始连续发版(0.3.14b1 → 0.8.32) | PyPI 元数据,可复查 |
| 2026-10-02 | 社区分支最后一次推送 | GitHub API,可复查 |
| 2026-10-10 | 本站核验日:原仓库页面与 API 均 404;官方文档站不可达 | 本机实测,可复查 |
除了包名,两个包内部还差在哪?
这一节回答「能不能直接换 import 就跑」的问题。答案是:大部分指标同名同参,但目录结构、默认导出与部分行为已分叉,所以迁移必须做完这几项核对。
| 维度 | 原发行版(0.4.71b0 wheel 实测) | classic(0.8.32 实测) | 迁移时要做什么 |
|---|---|---|---|
| wheel 内 .py 文件数 | 182 | 284 | — |
| 分类子包(单复数) | candle、cycle | candles、cycles | 若有脚本直接按子包路径 import,必须改 |
| 根模块 | core / custom / ma / maps / _typing | 另有 _meta / _indicator_loader 等内部模块 | 不要依赖内部模块名(都属于私有实现) |
| 指标装载方式 | 未核验 | 惰性加载(PEP 562 __getattr__) | 首次访问某指标时才 import,因此首次调用略慢属正常 |
| K 线形态 | candles 分类下 62 个模块 | candles 分类目录 67 个文件,但只导出 5 个公开指标 | 形态要统一走 cdl_pattern(name=...) |
| 版本号来源 | 打包时写入 | setuptools-scm 从 git tag 生成 | 从源码装可能读到异常版本号,见「排障」页 |
| 注意点 | 原包本站未能实际安装(3.11 装不上、无 3.12+ 环境) | 本站全部运行期结论都来自社区分支 0.8.32 | 不要把 classic 的实测读数直接当成原包行为 |
已经用了旧包,怎么迁到新包?
按下面的顺序做,每一步都给出可执行的检查方式。核心思路是:先让旧代码跑起来,再逐项核对输出,不要一次性替换后直接上生产。
- 记录现状 先记下当前包名与版本:
pip show <包名>与python -c "import pandas_ta as ta; print(ta.version)",并保存一份现有指标输出作为对照基线。 - 安装新包并保持旧输出可比 在同一环境里装上社区分支。两个包可以并存(导入名不同),因此可以先并列比较再切换。
- 改导入名 把
import pandas_ta as ta改成import pandas_ta_classic as ta;若有from pandas_ta import ...的写法要一并改。执行一次python -c "import pandas_ta_classic as ta; print(ta.version)"确认成功。 - 核对列名与默认参数 用同一份数据分别打印两种实现的输出列名。重点核对三项容易变的默认值:
sma/ema默认length=10、bbands默认length=5、supertrend默认7/3.0。列名不一致时,下游的取列代码要同步改。 - 核对 K 线形态调用方式 把直接调用单个
cdl_*的写法统一改成df.ta.cdl_pattern(name="engulfing")这种入口,并确认返回列名形如CDL_ENGULFING。 - 回归对比并留痕 对同一段时间、同一批标的,比较迁移前后的指标序列。记录:包名+版本、Python 版本、对比区间、最大绝对差、判定阈值。差异超过你自己设的阈值就不要上线。
怎么判断装到的是哪一个包?
「import 成功」不足以证明身份。下面四条判据按可靠性从高到低排列,前两条基本可以定案。
| 判据 | 命令 | 预期结果 | 可靠性 |
|---|---|---|---|
| 分发包名与版本 | pip show pandas-ta-classic | Name 与 Version 直接给答案 | 最高:来自 dist-info 元数据 |
| 模块文件路径 | python -c "import pandas_ta_classic as t; print(t.__file__)" | 路径位于 site-packages\pandas_ta_classic\ | 最高:直接看到文件位置 |
| 启动横幅 | import 时打印 | classic 会打印版本与 Total Indicators & Utilities: 255 | 较高:可读但不适合脚本解析 |
| 包内分类字典 | from pandas_ta_classic._meta import Category; print({k: len(v) for k, v in Category.items()}) | 9 个分类合计 193 | 高,但属于内部模块,升级可能变 |
| 注意点 | 不要只看 import pandas_ta 是否成功 | 本机实测:pandas-ta-openbb 同样提供 pandas_ta 模块 | — |
ta.version 读到的是 0.0.0 这类明显不对的值,通常说明包是从源码装的、且缺少 git 版本信息。处置见「排障」页。pandas-ta-classic 常见问题:是不是同一个包、能不能并存、迁移要注意什么
下面的回答都指向可核验的官方文件或本站实测;与官方表述冲突时,以官方仓库与文档为准。
pandas-ta-classic 是不是就是原项目换了个名字?
不是。它是独立的 PyPI 分发包,包名、导入名、维护者账号都不同,许可为 MIT。本站能确认的只有这些可直接复查的元数据;两者之间的代码谱系细节,因为原仓库已不可访问,无法一手核验。
两个包能装在同一台机器上吗?
可以并存,因为导入名不同(pandas_ta 与 pandas_ta_classic)。但要注意:本机实测里 pandas-ta-openbb 也会提供 pandas_ta 这个导入名,所以「谁能 import」不能用来判断装了谁。
迁移时必须改哪些代码?
至少四处:①import 语句;②直接按分类子包路径导入的代码(candle → candles);③依赖默认参数的取列代码(sma 默认 10、bbands 默认 5);④单独调用 cdl_* 的写法。完整清单见本页迁移步骤。
迁移后指标数值会变吗?
可能变。本站能提供的确定性结论是:在 classic 0.8.32 上,SMA、EMA、RSI、BBANDS、ATR、OBV、ADX、STOCH 与 TA-Lib 0.8.1 的最大绝对差为 0,MACD 为 0.18。原包本身本站未能运行,因此不做「迁移前后一致」的承诺。
原包的许可还能用吗?
PyPI 元数据里没有 license 字段,仓库又已不可见,本站无法复核原包的许可。如果你需要许可结论用于商用或分发,请自行溯源;本站不替你下结论。
要不要把两个包都装进同一个环境做对照?
可以,因为导入名不同(pandas_ta 与 pandas_ta_classic)不会互相覆盖。本站的建议是:在独立虚拟环境里同时装上,用同一份数据跑一遍同样的指标,把两边输出导成 CSV 比较。比较时至少对齐三件事——数据区间、参数、复权口径。
多久复查一次仓库状态合适?
仓库状态与版本会变化。本站的建议是:在依赖某个包做长期项目时,把「包名 + 版本 + 来源 URL」写进项目文档,每次升级前重新核验一次。