2024-11-18 23:16:24 +04:00
|
|
|
import hashlib
|
2024-10-27 23:29:52 +04:00
|
|
|
from typing import Sequence
|
|
|
|
|
2024-11-18 23:16:24 +04:00
|
|
|
import pandas as pd
|
|
|
|
from fastapi import HTTPException
|
2024-10-25 02:02:31 +04:00
|
|
|
from sqlalchemy.future import select
|
2024-10-27 23:29:52 +04:00
|
|
|
|
2024-11-18 23:16:24 +04:00
|
|
|
from db.crud import create
|
2024-10-14 21:18:07 +04:00
|
|
|
from db.models.experiment_parameters_model import ExperimentParameters
|
2024-10-28 13:30:02 +04:00
|
|
|
from db.postgres_db_connection import async_session_postgres
|
2024-10-14 21:18:07 +04:00
|
|
|
|
2024-10-27 23:29:52 +04:00
|
|
|
|
2024-10-28 13:30:02 +04:00
|
|
|
async def get_exp_parameters_by_category(category_id: int) -> Sequence[ExperimentParameters]:
|
|
|
|
async with async_session_postgres() as session:
|
|
|
|
result = await session.execute(
|
2024-10-27 23:29:52 +04:00
|
|
|
select(ExperimentParameters).where(ExperimentParameters.experiment_category_id == category_id)
|
|
|
|
)
|
|
|
|
return result.scalars().all()
|
|
|
|
|
2024-10-28 13:30:02 +04:00
|
|
|
async def get_exp_parameters_by_exp_hash(exp_hash: str) -> Sequence[ExperimentParameters]:
|
|
|
|
async with async_session_postgres() as session:
|
|
|
|
result = await session.execute(
|
|
|
|
select(ExperimentParameters).where(ExperimentParameters.experiment_hash == exp_hash)
|
2024-10-22 16:46:39 +04:00
|
|
|
)
|
2024-11-18 23:16:24 +04:00
|
|
|
return result.scalars().all()
|
|
|
|
|
|
|
|
|
|
|
|
def generate_experiment_hash(data: dict) -> str:
|
|
|
|
"""Генерация уникального хеша на основе данных эксперимента"""
|
|
|
|
hash_input = f"{data['outer_blades_count']}_{data['outer_blades_length']}_{data['outer_blades_angle']}_{data['middle_blades_count']}_{data['load']}_{data['recycling_level']}"
|
|
|
|
return hashlib.sha256(hash_input.encode()).hexdigest()
|
|
|
|
|
|
|
|
|
|
|
|
async def save_experiment_to_db(df: pd.DataFrame):
|
|
|
|
for _, row in df.iterrows():
|
|
|
|
try:
|
|
|
|
# Преобразуем load и recycling_level в соответствующие id
|
|
|
|
load_id = int(row['load'])
|
|
|
|
recycling_id = int(row['recycling_level'])
|
|
|
|
|
|
|
|
# Генерация хеша для experiment_hash
|
|
|
|
experiment_hash = generate_experiment_hash(row)
|
|
|
|
|
|
|
|
await create(
|
|
|
|
ExperimentParameters,
|
|
|
|
outer_blades_count=int(row['outer_blades_count']),
|
|
|
|
outer_blades_length=float(row['outer_blades_length']),
|
|
|
|
outer_blades_angle=float(row['outer_blades_angle']),
|
|
|
|
middle_blades_count=int(row['middle_blades_count']),
|
|
|
|
load_id= None,
|
|
|
|
recycling_id=None,
|
|
|
|
experiment_hash=experiment_hash
|
|
|
|
)
|
|
|
|
except Exception as e:
|
|
|
|
print(f"Ошибка при сохранении данных: {e}")
|
|
|
|
raise HTTPException(status_code=500, detail=f"Ошибка при сохранении данных: {e}")
|