了解如何使用机器学习和 InfluxDB 预测时间序列数据

导航至

预测就是预测未来——在数据科学中,它是处理时间序列数据的关键技能之一,例如股票价格预测、销售预测、物流规划等。

在本教程中,我们将学习如何使用以下免费和开源技术预测英国伦敦臭名昭著的天气模式。

  1. InfluxDB 3 Cloud Serverless(无服务器)(免费):我们使用 InfluxDB 3 的无服务器版本来存储历史时间戳天气数据,因为它具有可扩展性和易于设置的特点。
  2. Prophet:Facebook 研究部门流行的开源时间序列机器学习 (ML) 库。Prophet 尤其擅长处理具有季节性(每日、每周和每年的模式)和趋势变化的数据。
  3. Open-Meteo API:一个免费且开源的天气 API,提供全球各地历史和当前天气数据。在这里,我们将使用它来获取伦敦的天气数据,但您可以在程序中轻松更改。
  4. Python 项目 (GitHub):Python 程序将所有内容整合在一起,您可以在本地笔记本电脑或云端运行,而无需 GPU。

设置环境

在开始之前,请确保您已安装必要的库。您可以使用 pip 安装它们

pip install influxdb3-python prophet requests python-dotenv

您还必须在项目根目录中创建一个 .env 文件,以存储您的 InfluxDB 凭据和其他配置变量。您可以随意替换为您自己的变量。

INFLUXDB_HOST="your_influxdb_cloud_serverless_url"
INFLUXDB_TOKEN="your_token"
INFLUXDB_ORG="your_org_name"
INFLUXDB_DATABASE="weather"
LONDON_LAT="51.5074"
LONDON_LON="-0.1278"

步骤 1:获取和存储历史天气数据

我们将使用 weather_client.py 从 Open-Meteo API 获取过去六个月伦敦的平均每日温度。main.py 脚本将处理这些数据,然后使用 influxdb_client.py 将其高效地存储在 InfluxDB 中。

# In main.py 
from weather_client import fetch_weather_data
from influxdb_client import DBClient
weather_data = fetch_weather_data()
df = process_api_response(weather_data) # This function parses the API response
db = DBClient()
db.write_weather_data(df) # Efficiently writes data to InfluxDB
print("Weather data written to InfluxDB")

DBClient 类处理使用批量模式写入 InfluxDB 存储桶,以获得更好的性能。

步骤 2:从 InfluxDB 读取数据

我们将在 DBClient 类中使用一个简单的 SQL 查询,从过去 6 个月的测量值(表)中检索数据。

# In influxdb_client.py
    def read_data(self):
        query = """
                  SELECT time, temperature
                  FROM "weather-london"
                  WHERE time >= now() - interval '180 days'
                  ORDER BY time ASC
                """

        return self.client.query(query=query)

步骤 3:使用 Prophet 进行预测和可视化

visualization.py 脚本将使用 Prophet 预测温度,并使用 matplotlib 创建一个绘图作为 .png 文件。此代码“拟合” Prophet 模型到历史数据,并生成未来 30 天伦敦天气的预测。

# visualization.py
from influxdb_client import DBClient
from prophet import Prophet

db = DBClient()
df = db.read_data().to_pandas() # Get data from InfluxDB

model = Prophet(yearly_seasonality=True, daily_seasonality=True)
model.fit(df)

future = model.make_future_dataframe(periods=30*24, freq='h') # Forecast 
1 month ahead
forecast = model.predict(future)

# ... (Plotting code using Matplotlib) ...

预测:机器学习与旧的统计技术

Prophet 是一种机器学习模型,可从数据中学习模式。ARIMA 等传统方法使用预定义的数学模型。

  • 机器学习(例如,Prophet、Neural Prophet 等):适应复杂模式,自动处理季节性/趋势,捕获非线性。
  • 统计技术(例如,ARIMA):更易于解释,适用于较少的数据,且计算密集程度较低。
时间序列大型语言模型 (LLM)

特定于时间序列的大型语言模型 (LLM) 提供无需显式训练的预测,因为它们依赖于预先使用大量时间序列数据进行训练的大型语言模型。

  • 优点:具有跨时间序列的零样本学习和泛化的潜力。
  • 缺点:仍然是新技术,计算成本高昂,缺乏可解释性和长期准确的预测。

选择正确的方法

  • Prophet:易于使用,自动处理季节性,并且对异常值具有鲁棒性。
  • ARIMA:更适合较小的数据集或当可解释性至关重要时。
  • 时间序列大型语言模型 (LLM):值得探索零样本学习,但计算成本高昂。
批量处理与实时预测

我们的示例使用批量处理(在固定数据集上进行预测),这适用于像天气这样的长期预测。实时预测是股票价格等事物所必需的。

回顾

预测功能强大,而 Prophet ML 和 InfluxDB 等工具使其更易于访问。该领域正在发展,时间序列大型语言模型 (LLM) 等新技术正在涌现,因此保持信息灵通和进行实验是掌握预测的关键。在未来的文章中,我们将介绍更多使用时间序列大型语言模型 (LLM) 模型进行预测的示例,因此请密切关注我们的博客文章,如果您有任何问题,请随时咨询我们的社区