functime 是一个强大的Python库,用于在大型面板数据集上进行生产就绪的全局预测和时间序列特征提取。
functime 还提供时间序列预处理(box-cox变换、差分等)、交叉验证分割器(扩展窗口和滑动窗口)以及预测评估指标(MASE、SMAPE等)。所有这些都被优化为惰性Polars转换。
加入我们的Discord社区!
亮点
- 快速: 在您的笔记本电脑上几秒钟内对10万个时间序列进行预测和特征提取(如tsfresh、Catch22)
- 高效: 使用
Polars
进行高度并行的时间序列特征工程 - 经过实战检验: 能够带来实际业务影响并赢得竞赛的机器学习算法
- 外生特征: 每个预测器都支持
- 回测: 使用扩展窗口和滑动窗口分割器
- 自动滞后和超参数调优: 使用
FLAML
其他亮点
functime
配备了专门的LLM代理,用于分析、描述和比较您的预测。查看这里的演示。
入门
通过pip包管理器安装functime
。
pip install functime
functime
提供额外选项。例如,要安装带有大型语言模型(LLM)和lightgbm功能的functime
:
pip install "functime[llm,lgb]"
cat
: 使用catboost
预测器xgb
: 使用xgboost
预测器lgb
: 使用lightgbm
预测器llm
: 使用LLM驱动的预测分析器
预测
import polars as pl
from functime.cross_validation import train_test_split
from functime.seasonality import add_fourier_terms
from functime.forecasting import linear_model
from functime.preprocessing import scale
from functime.metrics import mase
# 加载商品价格数据
y = pl.read_parquet("https://github.com/functime-org/functime/raw/main/data/commodities.parquet")
entity_col, time_col = y.columns[:2]
# 时间序列分割
y_train, y_test = y.pipe(train_test_split(test_size=3))
# 拟合-预测
forecaster = linear_model(freq="1mo", lags=24)
forecaster.fit(y=y_train)
y_pred = forecaster.predict(fh=3)
# functime ❤️ 函数式设计
# 单行拟合-预测
y_pred = linear_model(freq="1mo", lags=24)(y=y_train, fh=3)
# 并行评分预测
scores = mase(y_true=y_test, y_pred=y_pred, y_train=y_train)
# 使用目标变换和特征变换进行预测
forecaster = linear_model(
freq="1mo",
lags=24,
target_transform=scale(),
feature_transform=add_fourier_terms(sp=12, K=6)
)
# 使用外生回归变量进行预测!
# 只需将它们传入X
X = (
y.select([entity_col, time_col])
.pipe(add_fourier_terms(sp=12, K=6)).collect()
)
X_train, X_future = y.pipe(train_test_split(test_size=3))
forecaster = linear_model(freq="1mo", lags=24)
forecaster.fit(y=y_train, X=X_train)
y_pred = forecaster.predict(fh=3, X=X_future)
查看这里的完整预测演示。
特征提取
functime
提供了100多个时间序列特征提取器。
每个特征都可以通过functime
的自定义ts
(时间序列)命名空间轻松访问,该命名空间适用于任何Polars
系列或表达式。要注册自定义ts
Polars
命名空间,您必须首先在模块中导入functime
。
要注册自定义ts
Polars
命名空间,您必须首先导入functime
!
import polars as pl
import numpy as np
from functime.feature_extractors import FeatureExtractor, binned_entropy
# 加载商品价格数据
y = pl.read_parquet("https://github.com/functime-org/functime/raw/main/data/commodities.parquet")
# 获取列名("commodity_type"、"time"、"price")
entity_col, time_col, value_col = y.columns
# 从单个时间序列中提取单个特征
binned_entropy = binned_entropy(
pl.Series(np.random.normal(0, 1, size=10)),
bin_count=10
)
# 🔥 还可以在LazyFrames上使用查询优化
features = (
pl.LazyFrame({
"index": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"value": np.random.normal(0, 1, size=10)
})
.select(
binned_entropy=pl.col("value").ts.binned_entropy(bin_count=10),
lempel_ziv_complexity=pl.col("value").ts.lempel_ziv_complexity(threshold=3),
longest_streak_above_mean=pl.col("value").ts.longest_streak_above_mean(),
)
.collect()
)
# 🚄 使用`group_by`在多个堆叠的时间序列上快速提取特征
features = (
y.group_by(entity_col)
.agg(
binned_entropy=pl.col(value_col).ts.binned_entropy(bin_count=10),
lempel_ziv_complexity=pl.col(value_col).ts.lempel_ziv_complexity(threshold=3),
longest_streak_above_mean=pl.col(value_col).ts.longest_streak_above_mean(),
)
)
# 🚄 使用`group_by_dynamic`在多个时间序列的窗口上快速提取特征
features = (
# 按年度间隔计算滚动特征
y.group_by_dynamic(
time_col,
every="12mo",
by=entity_col,
)
.agg(
binned_entropy=pl.col(value_col).ts.binned_entropy(bin_count=10),
lempel_ziv_complexity=pl.col(value_col).ts.lempel_ziv_complexity(threshold=3),
longest_streak_above_mean=pl.col(value_col).ts.longest_streak_above_mean(),
)
)
相关项目
如果您对Polars
的通用数据科学相关插件感兴趣,一定要查看polars-ds
。polars-ds
是由functime
的一位核心维护者创建的项目,是使用Rust实现的快速常用数据科学操作扩展Polars
管道的最简单方法!
许可证
functime
基于Apache-2.0许可分发。