вступление

TDengine™ — это облачная база данных временных рядов (TSDB) с открытым исходным кодом, оптимизированная для Интернета вещей (IoT), подключенных автомобилей и промышленного IoT. Он обеспечивает эффективный прием, обработку и мониторинг петабайт данных в день, генерируемых миллиардами датчиков и сборщиков данных, в режиме реального времени.

Многие пользователи хранят в TDengine массивные данные, сгенерированные IoT-устройствами, автомобилями или ИТ-инфраструктурой, в режиме реального времени. Они используют стандартные команды SQL для запроса данных из TDengine. TDengine поддерживает фильтрацию, группировку, оконный режим, объединение и множество функций агрегирования для запроса данных. Это облегчает пользователям запрос данных в соответствии с их целью.

Многие пользователи также хотят больше интересоваться существующими данными. Например, что произойдет в свете текущей тенденции? С наступлением эры ИИ в последние годы появилось много новых технологий или методов, таких как новое машинное обучение и алгоритмы глубокого обучения. Можно ли использовать алгоритмы машинного обучения и глубокого обучения для прогнозирования будущего с помощью данных, хранящихся в кластере TDengine?

К счастью, TDengine поддерживает несколько популярных коннекторов языков программирования, таких как Java, Python, Go, Rust, C#, NodeJS и т. д. Пользователи могут использовать коннектор своего любимого языка для доступа к TDengine. Соединители предоставляют интерфейсы, соответствующие спецификации. Это позволяет легко интегрировать соединители с другим программным обеспечением или платформами.

В этой статье рассказывается, как прогнозировать будущие данные с помощью существующих данных, хранящихся в TDengine. Мы смоделируем некоторые тестовые данные, чтобы отразить реальную систему питания. И продемонстрируйте, как использовать TDengine и несколько библиотек Python, чтобы прогнозировать, какими будут данные в следующем году.

Предположим, что пользователь является компанией по производству электроэнергии. Пользователь каждый день собирает данные об энергопотреблении со счетчика электростанции и сохраняет их в кластере TDengine. Теперь пользователь хочет спрогнозировать энергопотребление и приобрести больше устройств для его поддержки.

По мере роста экономики потребление электроэнергии увеличивается на определенный процент каждый год. Кроме того, с учетом сезонных колебаний соответственно меняется и потребление электроэнергии. Этот город расположен в северном полушарии, поэтому летом многие домохозяйства потребляют больше электроэнергии. Мы моделируем данные, чтобы отразить эти предположения

Исходный код размещен по адресу https://github.com/sangshuduo/td-forecasting.

Демонстрация

Шаг 1: Разверните TDengine и запустите сервер TDengine в вашей системе.

Пожалуйста, обратитесь к официальному документу https://docs.tdengine.com/get-started/ для получения подробных инструкций.

Шаг 2: Клонируйте исходный код

git clone https://github.com/sangshuduo/td-forecasting

Шаг 3: Установите необходимые пакеты Python

# if you are using Ubuntu 20.04 Linux
sudo apt install python3-pyqt5

# Optional, if PyQT5 fails
sudo apt-get install libxcb-xinerama0

python3 -m pip install -r requirements.txt

Обратите внимание, что минимальная требуемая версия Python — 3.8.

Шаг 4: смоделируйте некоторые данные

python3 mockdata.py

Шаг 5: Прогноз данных на следующий год

python3 forecast.py

Результат

Если все в порядке, рисунок будет выглядеть, как показано ниже.

Как это работает?

mockdata.py

...
def insert_rec_per_month(conn, db_name, table_name, year, month):
    increment = (year - 2014) * 1.1
    base = int(10 * increment)
    if month < 10 and month > 5:
        factor = 10
    else:
        factor = 8
    for day in range(1, monthrange(year, month)[1] + 1):
        num = base * randint(5, factor) + randint(0, factor)
        sql = f"INSERT INTO {db_name}.{table_name} VALUES ('{year}-{month}-{day} 00:00:00.000', {num})"
        try:
            conn.execute(sql)
        except Exception as e:
            print(f"command: {sql}")
            print(e)
 ...

Основная функция mockdata.py — имитация случайных данных с некоторыми корректировками, чтобы выполнить предположение.

прогноз.py

forecast.py реализует функцию прогнозирования.

Шаг 1: Импортируйте необходимые модули для предсказания

import argparse
import lightgbm as lgb
import matplotlib.pyplot as plt
import mlforecast
import pandas as pd
from mlforecast.target_transforms import Differences
from sklearn.linear_model import LinearRegression
from sqlalchemy import create_engine, text
...

Здесь объясните, что это такое и для чего они нужны.

  • Lightgbm – это модуль Python, поддерживающий алгоритм LightGBM – платформу повышения градиента, использующую алгоритмы обучения на основе дерева.
  • Matplotlib — один из самых популярных модулей Python для визуализации.
  • Mlforecast — это платформа для прогнозирования временных рядов с использованием моделей машинного обучения.
  • Pandas — самый популярный модуль для поддержки манипулирования данными.
  • Sklearn — это модуль, который поддерживает популярные алгоритмы науки о данных/машинного обучения.
  • SQLAlchemy — это набор инструментов Python SQL и Object Relational Mapper, который дает разработчикам приложений всю мощь и гибкость SQL.

Шаг 2: Подключитесь к TDengine и запросите данные

...
    engine = create_engine("taos://root:taosdata@localhost:6030/power")
    conn = engine.connect()
    print("Connected to the TDengine ...")
    df = pd.read_sql(
        text("select _wstart as ds, avg(num) as y from power.meters interval(1w)"), conn
    )
    conn.close()
...

Соединитель TDengine Python соответствует спецификации Python Database API версии 2.0 (PEP 249). DBAPI — это сокращение от фразы Спецификация API базы данных Python. Это широко используемая спецификация в Python для определения общих шаблонов использования для всех пакетов подключения к базе данных. DBAPI — это низкоуровневый API, который обычно представляет собой систему самого низкого уровня, используемую в приложении Python для взаимодействия с базой данных. Диалектная система SQLAlchemy построена вокруг работы DBAPI, предоставляя отдельные диалектные классы, которые обслуживают определенный DBAPI поверх определенного ядра базы данных.

Мы можем использовать SQLAlchemy для подключения кластера TDengine и использовать Pandas для запроса данных в формате фрейма данных.

Здесь мы предполагаем, что пользователь заботится о среднем потреблении энергии за неделю, а не о ежедневном потреблении, чтобы уменьшить необычное значение. Мы можем использовать функцию AVG() и команду предложения INTERVAL(1w) для запроса данных из кластера TDengine.

Позже мы будем манипулировать данными в формате фрейма данных.

Шаг 3: Прогнозирование

...
    df.insert(0, column="unique_id", value="unique_id")
    print("Forecasting ...")
    forecast = mlforecast.MLForecast(
        models=[LinearRegression(), lgb.LGBMRegressor()],
        freq="W",
        lags=[52],
        target_transforms=[Differences([52])],
    )
    forecast.fit(df)
    predicts = forecast.predict(52)
    pd.concat([df, predicts]).set_index("ds").plot(figsize=(12, 8)) 
...

Благодаря модулю mlforecast мы можем делать прогнозы с несколькими параметрами. Здесь мы используем линейную регрессию и LightGBM, чтобы показать их результаты на одном графике, чтобы визуализировать то, что сделали разные алгоритмы.

Шаг 4: Отображение или дамп в файл

...
    if args.dump:
        plt.savefig(args.dump)
    else:
        plt.show()

В коде Python предусмотрен аргумент --dump, позволяющий пользователям принять решение о выводе результата в изображение для последующей обработки или немедленного отображения результата на экране.

Вышеуказанные шаги проверены в Ubuntu 20.04, Ubuntu 22.04, Windows 10 и macOS.

Заключение

Вот и все! Теперь у нас есть очень простая программа для демонстрации того, как использовать TDengine для прогнозирования значений счетчиков мощности, используя данные истории энергосистемы, хранящиеся в TDengine.