diff --git a/davisAPI/davisAPI.py b/davisAPI/davisAPI.py index f0e6601..6cb4849 100644 --- a/davisAPI/davisAPI.py +++ b/davisAPI/davisAPI.py @@ -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') @@ -16,7 +15,7 @@ logger.setLevel(logging.DEBUG) def write_data(device, station, send=True): try: - #device.parse() + # device.parse() data = device.fields print(data) if len(data) < 1: @@ -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,21 +59,25 @@ 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) - #write_data(devices[i], 'st' + str(available_ports[list(available_ports.keys())[i]]), True) - time.sleep(1) + 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)) raise e - + diff --git a/davisAPI/hype.py b/davisAPI/hype.py new file mode 100644 index 0000000..908bade --- /dev/null +++ b/davisAPI/hype.py @@ -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) +