import React, { useState, useEffect } from 'react'; import { motion } from 'framer-motion'; import { useUserStore } from '@/store/userStore'; import apiService from '@/services/api'; import SimulatorChart from './SimulatorChart'; import { BarChart2, Search, ArrowUpDown, Filter } from 'lucide-react'; import { ResponsiveContainer, BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Cell } from 'recharts'; const VariableImportanceTab: React.FC = () => { const { isDark } = useUserStore(); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(''); const [sortBy, setSortBy] = useState<'importance' | 'correlation'>('importance'); const [selectedFeature, setSelectedFeature] = useState(''); const [pdData, setPdData] = useState(null); const cardBg = isDark ? 'rgba(255,255,255,0.03)' : '#ffffff'; const cardBorder = isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'; const textPrimary = isDark ? '#f8fafc' : '#0f172a'; const textMuted = isDark ? '#94a3b8' : '#64748b'; useEffect(() => { const fetch = async () => { try { const res = await apiService.getFeatureImportance(); setData(res.data); if (res.data?.features?.length > 0) { setSelectedFeature(res.data.features[0].feature); } } catch (err) { console.error(err); } finally { setLoading(false); } }; fetch(); }, []); useEffect(() => { if (!selectedFeature) return; const fetchPD = async () => { try { const res = await apiService.getPartialDependence(selectedFeature); setPdData(res.data); } catch {} }; fetchPD(); }, [selectedFeature]); if (loading) return
; const features = (data?.features || []) .filter((f: any) => f.feature.toLowerCase().includes(search.toLowerCase())) .sort((a: any, b: any) => sortBy === 'importance' ? Math.abs(b.importance) - Math.abs(a.importance) : Math.abs(b.correlation) - Math.abs(a.correlation)); // Horizontal bar chart data const barData = features.slice(0, 10).map((f: any) => ({ feature: f.feature, value: Math.abs(f.shap_value), direction: f.direction, })); return (
{/* Toolbar */}
setSearch(e.target.value)} className="w-full pl-9 pr-3 py-2 rounded-xl text-xs border outline-none focus:ring-2 focus:ring-indigo-500/30" style={{ background: cardBg, borderColor: cardBorder, color: textPrimary }} />
{/* SHAP Bar Chart */}

Feature Importance (SHAP Values)

setSelectedFeature(d.feature)}> {barData.map((entry: any, i: number) => ( ))}
{/* Feature Table */}

Feature Ranking

{features.map((f: any, i: number) => ( setSelectedFeature(f.feature)} className={`flex items-center gap-3 p-3 rounded-xl cursor-pointer transition-all ${ selectedFeature === f.feature ? 'ring-1 ring-indigo-500/30' : '' }`} style={{ background: selectedFeature === f.feature ? (isDark ? 'rgba(99,102,241,0.06)' : 'rgba(99,102,241,0.04)') : 'transparent', }} > #{i + 1}

{f.feature}

{f.importance.toFixed(3)} = 0 ? 'text-emerald-500' : 'text-red-500'}`}> {f.correlation >= 0 ? '+' : ''}{f.correlation.toFixed(2)}
))}
{/* Partial Dependence Plot */} {pdData?.points && (

Partial Dependence: {selectedFeature}

)}
); }; export default VariableImportanceTab;