Add FastAPI backend for energy trading system
Implements FastAPI backend with ML model support for energy trading, including price prediction models and RL-based battery trading policy. Features dashboard, trading, backtest, and settings API routes with WebSocket support for real-time updates.
This commit is contained in:
5
backend/app/utils/__init__.py
Normal file
5
backend/app/utils/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from app.utils.logger import get_logger
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
__all__ = ["logger"]
|
||||
36
backend/app/utils/helpers.py
Normal file
36
backend/app/utils/helpers.py
Normal file
@@ -0,0 +1,36 @@
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional
|
||||
import pytz
|
||||
|
||||
|
||||
def utcnow() -> datetime:
|
||||
"""Get current UTC datetime."""
|
||||
return datetime.now(pytz.UTC)
|
||||
|
||||
|
||||
def parse_date(date_str: str) -> datetime:
|
||||
"""Parse date string to datetime."""
|
||||
formats = ["%Y-%m-%d", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S"]
|
||||
for fmt in formats:
|
||||
try:
|
||||
return datetime.strptime(date_str, fmt)
|
||||
except ValueError:
|
||||
continue
|
||||
raise ValueError(f"Unable to parse date: {date_str}")
|
||||
|
||||
|
||||
def format_timestamp(dt: datetime, format_str: str = "%Y-%m-%dT%H:%M:%S") -> str:
|
||||
"""Format datetime to string."""
|
||||
return dt.strftime(format_str)
|
||||
|
||||
|
||||
def calculate_time_delta(start: datetime, end: datetime) -> timedelta:
|
||||
"""Calculate time delta between two datetimes."""
|
||||
return end - start
|
||||
|
||||
|
||||
def safe_divide(a: float, b: float, default: float = 0.0) -> float:
|
||||
"""Safely divide two numbers with default fallback."""
|
||||
if b == 0:
|
||||
return default
|
||||
return a / b
|
||||
36
backend/app/utils/logger.py
Normal file
36
backend/app/utils/logger.py
Normal file
@@ -0,0 +1,36 @@
|
||||
import os
|
||||
from loguru import logger
|
||||
import sys
|
||||
|
||||
|
||||
def get_logger(name: str):
|
||||
"""Get a configured logger instance."""
|
||||
return logger.bind(name=name)
|
||||
|
||||
|
||||
def setup_logger():
|
||||
"""Setup loguru logger configuration."""
|
||||
logger.remove()
|
||||
|
||||
log_format = (
|
||||
"<green>{time:YYYY-MM-DD HH:mm:ss}</green> | "
|
||||
"<level>{level: <8}</level> | "
|
||||
"<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> | "
|
||||
"<level>{message}</level>"
|
||||
)
|
||||
|
||||
logger.add(
|
||||
sys.stdout,
|
||||
format=log_format,
|
||||
level=os.getenv("LOG_LEVEL", "INFO"),
|
||||
colorize=True,
|
||||
)
|
||||
|
||||
logger.add(
|
||||
"logs/app.log",
|
||||
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} | {message}",
|
||||
level="DEBUG",
|
||||
rotation="10 MB",
|
||||
retention="7 days",
|
||||
compression="zip",
|
||||
)
|
||||
Reference in New Issue
Block a user