вступление
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.