Project Icon

prophet-ruby

Ruby的Prophet时间序列预测库

Prophet.rb是Ruby版的时间序列预测库,源自Facebook的Prophet项目。它支持多重季节性、线性和非线性增长、节假日效应,可处理缺失数据。提供简单和高级API,功能包括异常检测、饱和预测、趋势变点分析和模型诊断。Prophet.rb简化了预测、可视化和模型优化流程,适用于各种数据分析和预测任务。

Prophet.rb

Ruby版时间序列预测库,移植自Prophet

支持:

  • 多重季节性
  • 线性和非线性增长
  • 节假日和特殊事件

并能优雅地处理缺失数据

构建状态

安装

在应用的Gemfile中添加以下行:

gem "prophet-rb"

简单API

预测

获取时间序列的未来预测

series = {
  Date.parse("2020-01-01") => 100,
  Date.parse("2020-01-02") => 150,
  Date.parse("2020-01-03") => 136,
  # ...
}

Prophet.forecast(series)

指定返回的预测数量

Prophet.forecast(series, count: 3)

Groupdate配合使用效果很好

series = User.group_by_day(:created_at).count
Prophet.forecast(series)

支持高级API选项

Prophet.forecast(series, growth: "logistic", weekly_seasonality: false)

异常检测

检测时间序列中的异常

Prophet.anomalies(series)

指定不确定性区间的宽度(减小以获得更多异常)

Prophet.anomalies(series, interval_width: 0.99)

同样支持高级API选项

Prophet.anomalies(series, growth: "logistic", weekly_seasonality: false)

高级API

查看Prophet文档以获取所有功能的详细说明。高级API遵循Python API并支持相同的功能。它使用Rover处理数据框。

高级快速入门

说明

创建包含dsy列的数据框 - 这里有一个示例可供使用

df = Rover.read_csv("example_wp_log_peyton_manning.csv")
df.head
dsy
2007-12-109.59076113
2007-12-118.51959031
2007-12-128.18367658
2007-12-138.07246736
2007-12-147.89357207

拟合模型

m = Prophet.new
m.fit(df)

创建包含未来日期ds列的数据框

future = m.make_future_dataframe(periods: 365)
future.tail
ds
2017-01-15
2017-01-16
2017-01-17
2017-01-18
2017-01-19

进行预测

forecast = m.predict(future)
forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail
dsyhatyhat_loweryhat_upper
2017-01-158.211928407.525264428.92389960
2017-01-168.536963597.791249709.22620028
2017-01-178.324398917.624826999.04719328
2017-01-188.157023957.400799688.91301650
2017-01-198.169004337.456736788.83486188

绘图

要进行绘图,请安装matplotlib gem。

绘制预测图

m.plot(forecast).savefig("forecast.png")

预测

绘制组件图

m.plot_components(forecast).savefig("components.png")

组件

饱和预测

说明

预测逻辑增长而非线性增长

df = Rover.read_csv("example_wp_log_R.csv")
df["cap"] = 8.5
m = Prophet.new(growth: "logistic")
m.fit(df)
future = m.make_future_dataframe(periods: 1826)
future["cap"] = 8.5
forecast = m.predict(future)

饱和最小值

df["y"] = 10 - df["y"]
df["cap"] = 6
df["floor"] = 1.5
future["cap"] = 6
future["floor"] = 1.5
m = Prophet.new(growth: "logistic")
m.fit(df)
forecast = m.predict(future)

趋势变点

说明

绘制变点

fig = m.plot(forecast)
m.add_changepoints_to_plot(fig.gca, forecast)

调整趋势灵活性

m = Prophet.new(changepoint_prior_scale: 0.5)

指定变点位置

m = Prophet.new(changepoints: ["2014-01-01"])

节假日和特殊事件

说明

创建包含holidayds列的数据框。包括过去数据中的所有出现以及你想预测的未来出现。

playoffs = Rover::DataFrame.new({
  "holiday" => "playoff",
  "ds" => [
    "2008-01-13", "2009-01-03", "2010-01-16",
    "2010-01-24", "2010-02-07", "2011-01-08",
    "2013-01-12", "2014-01-12", "2014-01-19",
    "2014-02-02", "2015-01-11", "2016-01-17",
    "2016-01-24", "2016-02-07"
  ],
  "lower_window" => 0,
  "upper_window" => 1
})
superbowls = Rover::DataFrame.new({
  "holiday" => "superbowl",
  "ds" => ["2010-02-07", "2014-02-02", "2016-02-07"],
  "lower_window" => 0,
  "upper_window" => 1
})
holidays = playoffs.concat(superbowls)

m = Prophet.new(holidays: holidays)
m.fit(df)

添加特定国家的节假日

m = Prophet.new
m.add_country_holidays("US")
m.fit(df)

指定自定义季节性

m = Prophet.new(weekly_seasonality: false)
m.add_seasonality(name: "monthly", period: 30.5, fourier_order: 5)
forecast = m.fit(df).predict(future)

指定额外的回归变量

nfl_sunday = lambda do |ds|
  date = ds.respond_to?(:to_date) ? ds.to_date : Date.parse(ds)
  date.wday == 0 && (date.month > 8 || date.month < 2) ? 1 : 0
end

df["nfl_sunday"] = df["ds"].map(&nfl_sunday)

m = Prophet.new
m.add_regressor("nfl_sunday")
m.fit(df)

future["nfl_sunday"] = future["ds"].map(&nfl_sunday)

forecast = m.predict(future)

乘法季节性

说明

指定乘法季节性

df = Rover.read_csv("example_air_passengers.csv")
m = Prophet.new(seasonality_mode: "multiplicative")
m.fit(df)
future = m.make_future_dataframe(periods: 50, freq: "MS")
forecast = m.predict(future)

添加季节性和回归变量时指定模式

m = Prophet.new(seasonality_mode: "multiplicative")
m.add_seasonality(name: "quarterly", period: 91.25, fourier_order: 8, mode: "additive")
m.add_regressor("regressor", mode: "additive")

不确定性区间

说明

指定不确定性区间的宽度(默认为80%)

Prophet.new(interval_width: 0.95)

获取季节性的不确定性

Prophet.new(mcmc_samples: 300)

异常值

说明

移除异常值

df = Rover.read_csv("example_wp_log_R_outliers1.csv")
df["y"][(df["ds"] > "2010-01-01") & (df["ds"] < "2011-01-01")] = Float::NAN
m = Prophet.new.fit(df)

非日常数据

说明

次日数据

df = Rover.read_csv("example_yosemite_temps.csv")
m = Prophet.new(changepoint_prior_scale: 0.01).fit(df)
future = m.make_future_dataframe(periods: 300, freq: "H")
forecast = m.predict(future)

诊断

解释

交叉验证

df_cv = Prophet::Diagnostics.cross_validation(m, initial: "730 days", period: "180 days", horizon: "365 days")

自定义切点

cutoffs = ["2013-02-15", "2013-08-15", "2014-02-15"].map { |v| Time.parse("#{v} 00:00:00 UTC") }
df_cv2 = Prophet::Diagnostics.cross_validation(m, cutoffs: cutoffs, horizon: "365 days")

获取性能指标

df_p = Prophet::Diagnostics.performance_metrics(df_cv)

绘制交叉验证指标图

Prophet::Plot.plot_cross_validation_metric(df_cv, metric: "mape")

超参数调优

param_grid = {
  changepoint_prior_scale: [0.001, 0.01, 0.1, 0.5],
  seasonality_prior_scale: [0.01, 0.1, 1.0, 10.0]
}

# 生成所有参数组合
all_params = param_grid.values[0].product(*param_grid.values[1..-1]).map { |v| param_grid.keys.zip(v).to_h }
rmses = [] # 在此存储每组参数的RMSE

# 使用交叉验证评估所有参数
all_params.each do |params|
  m = Prophet.new(**params).fit(df) # 使用给定参数拟合模型
  df_cv = Prophet::Diagnostics.cross_validation(m, cutoffs: cutoffs, horizon: "30 days")
  df_p = Prophet::Diagnostics.performance_metrics(df_cv, rolling_window: 1)
  rmses << df_p["rmse"][0]
end

# 找出最佳参数
tuning_results = Rover::DataFrame.new(all_params)
tuning_results["rmse"] = rmses
p tuning_results

其他主题

解释

保存模型

File.write("model.json", m.to_json)

加载模型

m = Prophet.from_json(File.read("model.json"))

使用与Python相同的格式,因此模型可以在两种语言中保存和加载

平坦趋势

m = Prophet.new(growth: "flat")

更新已拟合的模型

def stan_init(m)
  res = {}
  ["k", "m", "sigma_obs"].each do |pname|
    res[pname] = m.params[pname][0, true][0]
  end
  ["delta", "beta"].each do |pname|
    res[pname] = m.params[pname][0, true]
  end
  res
end

df = Rover.read_csv("example_wp_log_peyton_manning.csv")
df1 = df[df["ds"] <= "2016-01-19"] # 除最后一天外的所有数据
m1 = Prophet.new.fit(df1) # 使用除最后一天外的所有数据拟合的模型

m2 = Prophet.new.fit(df) # 添加最后一天,从头开始拟合
m2 = Prophet.new.fit(df, init: stan_init(m1)) # 添加最后一天,从m1热启动

资源

致谢

该库是从Prophet Python库移植而来,并使用相同的许可证。

历史

查看更新日志

贡献

我们鼓励每个人都参与改进这个项目。以下是一些您可以帮助的方式:

要开始开发,请执行以下操作:

git clone https://github.com/ankane/prophet-ruby.git
cd prophet-ruby
bundle install
bundle exec rake vendor:all
bundle exec rake test
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号