62 lines
2.4 KiB
Python
62 lines
2.4 KiB
Python
"""
|
|
Data analysis callbacks for the dashboard.
|
|
"""
|
|
|
|
from dash import Output, Input, html, dcc
|
|
import dash_bootstrap_components as dbc
|
|
from utils.logger import get_logger
|
|
from dashboard.components.data_analysis import (
|
|
create_volume_stats_display,
|
|
create_price_stats_display,
|
|
get_market_statistics,
|
|
VolumeAnalyzer,
|
|
PriceMovementAnalyzer
|
|
)
|
|
from database.operations import get_database_operations
|
|
from datetime import datetime, timezone, timedelta
|
|
|
|
logger = get_logger()
|
|
|
|
|
|
def register_data_analysis_callbacks(app):
|
|
"""Register data analysis related callbacks."""
|
|
|
|
logger.info("🚀 STARTING to register data analysis callbacks...")
|
|
|
|
# Initial callback to populate charts on load
|
|
@app.callback(
|
|
[Output('volume-analysis-chart', 'figure'),
|
|
Output('price-movement-chart', 'figure'),
|
|
Output('volume-stats-output', 'children'),
|
|
Output('price-stats-output', 'children'),
|
|
Output('market-statistics-output', 'children')],
|
|
[Input('data-analysis-symbol-dropdown', 'value'),
|
|
Input('data-analysis-timeframe-dropdown', 'value'),
|
|
Input('data-analysis-days-back-dropdown', 'value')],
|
|
prevent_initial_call=False
|
|
)
|
|
def update_data_analysis(symbol, timeframe, days_back):
|
|
"""Update data analysis with statistical cards only (no duplicate charts)."""
|
|
logger.info(f"🎯 DATA ANALYSIS CALLBACK TRIGGERED! Symbol: {symbol}, Timeframe: {timeframe}, Days Back: {days_back}")
|
|
|
|
db_ops = get_database_operations(logger)
|
|
end_time = datetime.now(timezone.utc)
|
|
start_time = end_time - timedelta(days=days_back)
|
|
|
|
df = db_ops.market_data.get_candles_df(symbol, timeframe, start_time, end_time)
|
|
|
|
volume_analyzer = VolumeAnalyzer()
|
|
price_analyzer = PriceMovementAnalyzer()
|
|
|
|
volume_stats = volume_analyzer.get_volume_statistics(df)
|
|
price_stats = price_analyzer.get_price_movement_statistics(df)
|
|
|
|
volume_stats_display = create_volume_stats_display(volume_stats)
|
|
price_stats_display = create_price_stats_display(price_stats)
|
|
market_stats_display = get_market_statistics(df, symbol, timeframe)
|
|
|
|
# Return empty figures for charts, as they are no longer the primary display
|
|
# And the stats displays
|
|
return {}, {}, volume_stats_display, price_stats_display, market_stats_display
|
|
|
|
logger.info("✅ Data analysis callbacks registered successfully") |