prediction #9

Merged
shadowik merged 5 commits from prediction into front-2-fix-gen 2024-12-01 18:30:10 +04:00
2 changed files with 117 additions and 16 deletions
Showing only changes of commit 737af8e01d - Show all commits

View File

@ -1,4 +1,4 @@
from PyWeather.weather.stations.davis import VantagePro
#from PyWeather.weather.stations.davis import VantagePro
import logging
import mariadb
import serial.tools.list_ports
@ -6,7 +6,6 @@ import gc
import time
from pprint import pprint
logging.basicConfig(filename="Stations.log",
format='%(asctime)s %(message)s',
filemode='a')
@ -36,7 +35,7 @@ def write_data(device, station, send=True):
cursor.execute(sql, values)
conn.commit()
else:
pprint(data)
print(data)
del data
del fields
@ -45,6 +44,7 @@ def write_data(device, station, send=True):
logger.error(str(e))
raise e
try:
conn = mariadb.connect(
user="wind",
@ -59,19 +59,23 @@ except mariadb.Error as e:
raise e
try:
ports = serial.tools.list_ports.comports()
available_ports = {}
# ports = serial.tools.list_ports.comports()
# available_ports = {}
#
# for port in ports:
# if port.serial_number == '0001':
# available_ports[port.name] = port.vid
for port in ports:
if port.serial_number == '0001':
available_ports[port.name] = port.vid
#devices = [VantagePro(port) for port in available_ports.keys()]
devices = {}
devices = [VantagePro(port) for port in available_ports.keys()]
print(available_ports)
while True:
for i in range(len(devices)):
print(devices[i].fields)
for i in range(1):
if len(devices) != 0:
print(devices)
# write_data(devices[i], 'st' + str(available_ports[list(available_ports.keys())[i]]), True)
else:
print('bashmak')
time.sleep(1)
except Exception as e:
logger.error('Device_error: ' + str(e))

97
davisAPI/hype.py Normal file
View File

@ -0,0 +1,97 @@
import pandas as pd
import numpy as np
from sqlalchemy import create_engine
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
# TODO
# 1.Добавить поля
# -barTrend - перечисление и правило какое-то (смотрим через один если повысилось после steady то rising если уменьшилось после steady то falling)
# -DateStamp - берется с последнего предсказанного + время опроса
# -SunRise - берется с последнего предсказанного
# -SunSet - берется с последнего предсказанного
#
# 12-10-2024 12:00
# 12-10-2024 12:01
#
# 2.Отделить вставку данных в бд от парсера данных с метеостанции
#
# 3.Возвращение результата в бд
# Настройка подключения к базе данных
DATABASE_URI = 'mysql+pymysql://wind:wind@193.124.203.110:3306/wind_towers' # Замените на вашу строку подключения
engine = create_engine(DATABASE_URI)
# Запрос данных из базы данных
query = """
SELECT CRC, DateStamp, DewPoint, HeatIndex, ETDay, HumIn, HumOut,
Pressure, RainDay, RainMonth, RainRate, RainStorm, RainYear,
TempIn, TempOut, WindDir, WindSpeed, WindSpeed10Min
FROM weather_data
WHERE DateStamp >= '2024-10-14 21:00:00' - INTERVAL 12 HOUR;
"""
df = pd.read_sql(query, engine)
# Преобразование даты и установка индекса
df['DateStamp'] = pd.to_datetime(df['DateStamp'])
df.set_index('DateStamp', inplace=True)
df.sort_index(inplace=True)
# Создание временных признаков с использованием pd.concat для минимизации фрагментации
lags = 3
shifted_dfs = [df] # Начинаем с оригинальных данных
# Создаем лаговые признаки
for lag in range(1, lags + 1):
shifted_df = df.shift(lag).add_suffix(f'_t-{lag}')
shifted_dfs.append(shifted_df)
# Объединяем все данные вместе, избегая фрагментации
df_with_lags = pd.concat(shifted_dfs, axis=1)
# Удаляем строки с NaN значениями
df_with_lags.dropna(inplace=True)
df_with_lags = df_with_lags.copy() # Устраняем фрагментацию
# Исключаем все нечисловые столбцы
df_with_lags = df_with_lags.select_dtypes(include=['float64', 'int64'])
# Словарь для хранения моделей и оценок
models = {}
mse_scores = {}
# Обучение модели для каждого целевого поля
for target_column in df.columns[:22]: # Ограничиваем до 22 полей
if target_column not in df_with_lags.columns:
continue # Пропускаем, если колонка отсутствует в данных с лагами
X = df_with_lags.drop(columns=[target_column])
y = df_with_lags[target_column]
# Разделение на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
# Обучение модели
model = RandomForestRegressor()
model.fit(X_train, y_train)
# Оценка модели
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
mse_scores[target_column] = mse
models[target_column] = model
print(f"MSE для {target_column}: {mse}")
# Предсказание для следующего шага по всем моделям
predictions = {}
last_data = X.iloc[-1].values.reshape(1, -1) # Последняя строка данных для прогноза
for target_column, model in models.items():
predictions[target_column] = model.predict(last_data)[0]
print(f"Предсказание для {target_column}: {predictions[target_column]}")
print(predictions)