/** * Helper functions to extract and transform data science analysis results * for visualization in Analytics dashboard */ // Extract KPI metrics from analysis export const extractKPIMetrics = (analysisResults) => { if (!analysisResults) return null; const crackData = analysisResults.crack_detection || {}; const materialData = analysisResults.material_analysis || {}; const envData = analysisResults.environmental_impact_assessment || {}; const bioData = analysisResults.biological_growth || {}; const insights = analysisResults.data_science_insights || {}; const academicDS = analysisResults.academic_data_science || {}; // Structural Health Score - from Unit 2: Descriptive Analytics const structuralHealth = insights.statistical_summary?.structural_health_score || 85; // Critical Issues Count - from crack detection const criticalIssues = crackData.count || 0; // AI Confidence - from Unit 3: Inferential Statistics (0-100 scale) let aiConfidence = 85; // Default confidence if (academicDS.unit3_inferential_statistics?.confidence_intervals) { const intervals = Object.values(academicDS.unit3_inferential_statistics.confidence_intervals); if (intervals.length > 0 && intervals[0]?.ci_95?.upper_bound) { aiConfidence = Math.min(100, intervals[0].ci_95.upper_bound); } } else if (materialData.probabilities) { const maxProb = Math.max(...Object.values(materialData.probabilities)); aiConfidence = Math.round(maxProb * 100); } // Sustainability Score - from environmental assessment const sustainability = envData.sustainability_score || 7.5; return { structuralHealth, criticalIssues, aiConfidence, sustainability }; }; // Extract health trend data from Unit 5: Predictive Analytics export const extractHealthTrendData = (analysisResults) => { if (!analysisResults) return []; const academicDS = analysisResults.academic_data_science || {}; const predictive = academicDS.unit5_predictive_analytics || {}; const timeSeriesData = predictive.time_series || {}; const insights = analysisResults.data_science_insights || {}; // Generate time series data based on current health + predictions const currentHealth = insights.statistical_summary?.structural_health_score || 85; const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; const currentMonth = new Date().getMonth(); // Use time series forecasts if available const forecasts = timeSeriesData.forecasts?.next_3_periods || []; const trendSlope = timeSeriesData.trend_analysis?.slope || -0.5; return months.slice(0, currentMonth + 4).map((month, index) => { let healthValue, performanceValue, maintenanceValue; if (index <= currentMonth) { // Historical data (slightly varying from current) healthValue = Math.max(70, Math.min(100, currentHealth + (Math.random() - 0.5) * 5)); performanceValue = healthValue - 5 + Math.random() * 3; maintenanceValue = healthValue + 2 + Math.random() * 3; } else { // Forecast data from predictive analytics const forecastIndex = index - currentMonth - 1; healthValue = forecasts[forecastIndex] || (currentHealth + trendSlope * (forecastIndex + 1)); performanceValue = healthValue - 3; maintenanceValue = healthValue + 4; } return { month, 'Structural Health': Math.round(healthValue * 10) / 10, 'System Performance': Math.round(performanceValue * 10) / 10, 'Maintenance Index': Math.round(maintenanceValue * 10) / 10 }; }); }; // Extract risk assessment data from Unit 4: ANOVA export const extractRiskAssessmentData = (analysisResults) => { if (!analysisResults) return []; const academicDS = analysisResults.academic_data_science || {}; const anovaResults = academicDS.unit4_anova || {}; const crackData = analysisResults.crack_detection || {}; const envData = analysisResults.environmental_impact_assessment || {}; // Risk categories based on ANOVA analysis of severity groups // Calculate normalized scores (0-100 scale) // Structural Integrity: Higher critical crack ratio = lower score const totalCracks = Object.values(crackData.statistics?.severity_distribution || {}).reduce((a, b) => a + b, 1) || 1; const criticalRatio = (crackData.statistics?.severity_distribution?.Critical || 0) / totalCracks; const structuralScore = Math.max(30, 100 - (criticalRatio * 100)); // Material Condition: Based on material confidence, not quantity const materialScore = (crackData.material_analysis?.material_confidence || 0.75) * 100; // Environmental Impact: Ensure sustainability score is 0-100 const envScore = Math.min(100, Math.max(0, envData.sustainability_score || 75)); // Maintenance Requirements: Fewer cracks = better score const maxCracksThreshold = 20; const crackRatio = Math.min(1, (crackData.count || 0) / maxCracksThreshold); const maintenanceScore = Math.max(30, 100 - (crackRatio * 70)); return [ { category: 'Structural\nIntegrity', score: Math.round(structuralScore * 10) / 10 }, { category: 'Material\nCondition', score: Math.round(materialScore * 10) / 10 }, { category: 'Environmental\nImpact', score: Math.round(envScore * 10) / 10 }, { category: 'Maintenance\nRequirements', score: Math.round(maintenanceScore * 10) / 10 }, { category: 'System\nPerformance', score: analysisResults.data_science_insights?.statistical_summary?.structural_health_score || 86 } ]; }; // Extract severity distribution from Unit 2: Frequency Distributions export const extractSeverityDistribution = (analysisResults) => { if (!analysisResults) return []; const crackData = analysisResults.crack_detection || {}; const academicDS = analysisResults.academic_data_science || {}; const descriptive = academicDS.unit2_descriptive_analytics || {}; // Get frequency distribution from descriptive analytics const freqDist = descriptive.frequency_distributions || {}; const severityDist = crackData.statistics?.severity_distribution || {}; const severityColors = { 'Critical': '#dc2626', 'Severe': '#ea580c', 'Moderate': '#f59e0b', 'Minor': '#10b981' }; const severityPriority = { 'Critical': 1, 'Severe': 2, 'Moderate': 3, 'Minor': 4 }; const severityImpact = { 'Critical': 'Immediate action required - structural failure risk', 'Severe': 'Urgent repairs needed - accelerated deterioration', 'Moderate': 'Monitor closely - schedule maintenance', 'Minor': 'Routine monitoring - low immediate risk' }; return Object.entries(severityDist).map(([type, value]) => ({ type, value, color: severityColors[type] || '#6b7280', priority: severityPriority[type] || 5, impact: severityImpact[type] || 'Assessment required' })); }; // Extract material confidence from Unit 2: Descriptive Statistics export const extractMaterialConfidence = (analysisResults) => { if (!analysisResults) return []; const materialData = analysisResults.material_analysis || {}; const academicDS = analysisResults.academic_data_science || {}; const descriptive = academicDS.unit2_descriptive_analytics || {}; const probabilities = materialData.probabilities || {}; const materials = Object.entries(probabilities); const colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#FFA07A', '#98D8C8', '#F7DC6F', '#BB8FCE', '#85C1E9']; return materials.map(([material, prob], index) => { const confidence = prob * 100; return { material: material.charAt(0).toUpperCase() + material.slice(1), confidence: Math.round(confidence * 10) / 10, color: colors[index % colors.length], category: confidence >= 75 ? 'High Confidence' : confidence >= 50 ? 'Medium Confidence' : 'Low Confidence' }; }); }; // Extract correlation data from Unit 2: Correlation Analysis export const extractCorrelationData = (analysisResults) => { if (!analysisResults) return null; const academicDS = analysisResults.academic_data_science || {}; const descriptive = academicDS.unit2_descriptive_analytics || {}; const correlations = descriptive.correlation_analysis || {}; return correlations.significant_correlations || []; }; // Extract regression analysis from Unit 5: Linear Regression export const extractRegressionData = (analysisResults) => { if (!analysisResults) return null; const academicDS = analysisResults.academic_data_science || {}; const predictive = academicDS.unit5_predictive_analytics || {}; const linearModels = predictive.linear_models || {}; return { r_squared: linearModels.model_performance?.train_r_squared || 0, equation: linearModels.model_equation || '', rmse: linearModels.model_performance?.train_rmse || 0 }; }; // Extract ANOVA results from Unit 4 export const extractANOVAResults = (analysisResults) => { if (!analysisResults) return null; const academicDS = analysisResults.academic_data_science || {}; const anova = academicDS.unit4_anova || {}; return { oneWayANOVA: anova.one_way_anova || {}, chiSquare: anova.chi_square_tests || {} }; }; // Extract confidence intervals from Unit 3: Inferential Statistics export const extractConfidenceIntervals = (analysisResults) => { if (!analysisResults) return null; const academicDS = analysisResults.academic_data_science || {}; const inferential = academicDS.unit3_inferential_statistics || {}; return inferential.confidence_intervals || {}; }; // Extract hypothesis testing results from Unit 3 export const extractHypothesisTests = (analysisResults) => { if (!analysisResults) return null; const academicDS = analysisResults.academic_data_science || {}; const inferential = academicDS.unit3_inferential_statistics || {}; return inferential.hypothesis_tests || {}; }; // Extract environmental impact metrics export const extractEnvironmentalMetrics = (analysisResults) => { if (!analysisResults) return null; const envData = analysisResults.environmental_impact_assessment || {}; return { carbonFootprint: envData.carbon_footprint_kg || 0, waterFootprint: envData.water_footprint_liters || 0, energyConsumption: envData.energy_consumption_kwh || 0, sustainabilityScore: envData.sustainability_score || 0, ecoEfficiency: envData.eco_efficiency_rating || 0, recommendations: envData.recommendations || [] }; }; // Check if analysis data is available export const hasAnalysisData = (analysisResults) => { return analysisResults && Object.keys(analysisResults).length > 0; };