Compare commits

..

4 Commits

Author SHA1 Message Date
Bazunov Andrew Igorevich
2e34bcd8c1 remove extra category in ExperimentParametersPyDOE3 2024-12-11 13:53:44 +04:00
Bazunov Andrew Igorevich
5f4dcf84f6 Merge branch 'dev_and'
# Conflicts:
#	db/repositories/experiment_parameters_repos.py
#	requirements.txt
2024-12-11 13:48:57 +04:00
75bf3f157d Merge pull request 'added plot' (#3) from modified_db into main
Reviewed-on: #3
2024-12-11 13:45:13 +04:00
821a1eb473 added plot 2024-12-09 22:32:11 +03:00
6 changed files with 103 additions and 7 deletions

View File

@ -1,3 +1,5 @@
from typing import List
from db.models.ch_experimentdb_experiment_data_model import ChExperimentDBExperimentData from db.models.ch_experimentdb_experiment_data_model import ChExperimentDBExperimentData
from sqlalchemy import select,func from sqlalchemy import select,func
@ -11,7 +13,7 @@ class ChExperimentDBExperimentDataRepository:
def get_by_id(self, id: int) -> ChExperimentDBExperimentData: def get_by_id(self, id: int) -> ChExperimentDBExperimentData:
return self.session.query(ChExperimentDBExperimentData).filter(ChExperimentDBExperimentData.id == id).one_or_none() return self.session.query(ChExperimentDBExperimentData).filter(ChExperimentDBExperimentData.id == id).one_or_none()
def get_by_file_id(self, file_id: str) -> ChExperimentDBExperimentData: def get_by_file_id(self, file_id: str) -> List[ChExperimentDBExperimentData]:
return self.session.query(ChExperimentDBExperimentData).filter(ChExperimentDBExperimentData.file_id == file_id).all() return self.session.query(ChExperimentDBExperimentData).filter(ChExperimentDBExperimentData.file_id == file_id).all()
def create(self, ch_experiment_data: ChExperimentDBExperimentData) -> ChExperimentDBExperimentData: def create(self, ch_experiment_data: ChExperimentDBExperimentData) -> ChExperimentDBExperimentData:

View File

@ -20,7 +20,6 @@ async def get_exp_parameters_by_category(category_id: int) -> Sequence[Experimen
) )
return result.scalars().all() return result.scalars().all()
async def get_exp_parameters_by_exp_hash(exp_hash: str) -> Sequence[ExperimentParameters]: async def get_exp_parameters_by_exp_hash(exp_hash: str) -> Sequence[ExperimentParameters]:
async with async_session_postgres() as session: async with async_session_postgres() as session:
result = await session.execute( result = await session.execute(
@ -35,7 +34,7 @@ def generate_experiment_hash(data: dict) -> str:
return hashlib.sha256(hash_input.encode()).hexdigest() return hashlib.sha256(hash_input.encode()).hexdigest()
async def save_experiment_to_db(df: pd.DataFrame, experiment_category_id: int): async def save_experiment_to_db(df: pd.DataFrame):
for _, row in df.iterrows(): for _, row in df.iterrows():
try: try:
# Преобразуем load и recycling_level в соответствующие id # Преобразуем load и recycling_level в соответствующие id
@ -43,7 +42,7 @@ async def save_experiment_to_db(df: pd.DataFrame, experiment_category_id: int):
recycling = int(row['recycling_level']) recycling = int(row['recycling_level'])
# Генерация хеша для experiment_hash # Генерация хеша для experiment_hash
experiment_hash = generate_experiment_hash(row.to_dict()) experiment_hash = generate_experiment_hash(row)
exp = await create( exp = await create(
ExperimentParameters, ExperimentParameters,

39
main.py
View File

@ -1,13 +1,20 @@
from random import uniform, random
from traceback import format_exc
import pandas as pd import pandas as pd
from fastapi import FastAPI, HTTPException, BackgroundTasks from fastapi import FastAPI, HTTPException, BackgroundTasks
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from pyDOE3 import pbdesign, lhs from pyDOE3 import pbdesign, lhs
from db.csv_to_db import csv_to_db from db.csv_to_db import csv_to_db
from db.models import ChExperimentDBExperimentData
from db.repositories import save_experiment_to_db from db.repositories import save_experiment_to_db
from network.routes import (ch_experimentdb_experiment_data_router, experiment_data_router, from network.routes import (ch_experimentdb_experiment_data_router, experiment_data_router,
experiment_parameters_router, experiment_category_router) experiment_parameters_router, experiment_category_router)
from network.routes import load_parameters_router, recycling_parameters_router from network.routes import load_parameters_router, recycling_parameters_router
from network.routes.ch_experimentdb_experiment_data_router import create_ch_experimentdb_experiment_data
from network.routes.experiment_data_router import create_experiment_data
from network.routes.experiment_parameters_router import get_all_experiment_parameters
from network.schemas import * from network.schemas import *
from new_experiment_planner import run_experiment from new_experiment_planner import run_experiment
from new_experiment_planner_pyDOE3 import scale_design, scale_design_lhs, round_by_index from new_experiment_planner_pyDOE3 import scale_design, scale_design_lhs, round_by_index
@ -70,6 +77,38 @@ async def init_db_data(background_tasks: BackgroundTasks):
print(str(e.with_traceback())) print(str(e.with_traceback()))
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}") raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@app.get('/init_data_plot')
async def init_data_plot():
try:
parameters = await get_all_experiment_parameters()
async def generate_data_for_file_id(file_id):
for _ in range(100):
await create_ch_experimentdb_experiment_data(
ChExperimentDBExperimentData(
volume=uniform(1e-8, 6.3e-6),
nitrogen_oxide_emission=uniform(2.7e-10, 8.92e-10),
temperature=uniform(1543.0, 2432.0),
co_fraction=uniform(0.0875, 0.4567),
co2_fraction=uniform(0.0824, 0.5678),
x=uniform(0.0002, 0.9849),
y=uniform(4.25, 10.31),
z=uniform(4.20, 10.26),
file_id=file_id
)
)
for param in parameters:
print(param)
file_id = param.experiment_hash
if file_id:
await generate_data_for_file_id(file_id)
return {"status": "success", "message": "Добавление данных в БД успешно завершено"}
except Exception as e:
print(format_exc())
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
# Пример запроса # Пример запроса
# { # {
# "param_ranges": { # "param_ranges": {

View File

@ -1,12 +1,19 @@
import yaml import yaml
from fastapi import APIRouter, HTTPException from fastapi import APIRouter, HTTPException
from scipy.stats import alpha from pydantic import BaseModel
from typing import List, Tuple
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import io
import base64
from db.crud import * from db.crud import *
from db.models import LoadParameters from db.models import LoadParameters
from db.repositories import get_exp_parameters_by_category, get_exp_parameters_by_exp_hash from db.repositories import get_exp_parameters_by_category, get_exp_parameters_by_exp_hash
from macros_generator import load_calculation, recycling_calculation from macros_generator import load_calculation, recycling_calculation
from network.schemas import ExperimentParametersBody from network.routes.ch_experimentdb_experiment_data_router import get_ch_experimentdb_experiment_data_by_file_id
from network.schemas import ExperimentParametersBody, ExperimentParametersPlot
router = APIRouter() router = APIRouter()
@ -29,6 +36,50 @@ async def create_experiment_parameters(body: ExperimentParametersBody):
except Exception as e: except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}") raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.post('/plot')
async def create_plot(body: ExperimentParametersPlot):
try:
exp_data = await get_ch_experimentdb_experiment_data_by_file_id(body.file_id)
if not exp_data:
raise HTTPException(status_code=404, detail="Данные не найдены для указанного file_id")
filtered_data = [
record for record in exp_data
if body.range[0] <= getattr(record, body.additional_dimension, None) <= body.range[1]
]
if not filtered_data:
return {"message": "Нет данных для отображения в заданном диапазоне"}
x = [record.x for record in filtered_data]
y = [record.y for record in filtered_data]
z = [record.z for record in filtered_data]
color_values = [getattr(record, body.additional_dimension, None) for record in filtered_data]
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(x, y, z, c=color_values, cmap=cm.viridis, marker='o')
cbar = fig.colorbar(scatter, ax=ax)
cbar.set_label(body.additional_dimension)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.title(f"3D график с измерением: {body.additional_dimension}")
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
image_base64 = base64.b64encode(buf.getvalue()).decode('utf-8')
buf.close()
plt.close(fig)
return {"message": "График построен успешно", "plot": image_base64}
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
@router.get('/all') @router.get('/all')
async def get_all_experiment_parameters(): async def get_all_experiment_parameters():

View File

@ -1,5 +1,7 @@
from enum import Enum
from typing import Optional, Dict, Tuple, List from typing import Optional, Dict, Tuple, List
from psycopg.types import enum
from pydantic import BaseModel, ConfigDict from pydantic import BaseModel, ConfigDict
@ -8,7 +10,6 @@ class ExperimentParametersPyDOE3(BaseModel):
category: int category: int
count_exp: int count_exp: int
round_rules: List[int] round_rules: List[int]
category: int
class ExperimentParameters(BaseModel): class ExperimentParameters(BaseModel):
@ -19,6 +20,10 @@ class ExperimentParameters(BaseModel):
load: str load: str
recycling: str recycling: str
class ExperimentParametersPlot(BaseModel):
file_id: str
additional_dimension: str
range: Tuple[float, float]
class ChExperimentDBExperimentDataBody(BaseModel): class ChExperimentDBExperimentDataBody(BaseModel):
model_config = ConfigDict(from_attributes=True) model_config = ConfigDict(from_attributes=True)

Binary file not shown.