Assistant / admin_dashboard.py
Really-amin's picture
Upload 7 files
7da6612 verified
import streamlit as st
import plotly.graph_objects as go
import plotly.express as px
import numpy as np
from datetime import datetime, timedelta
import streamlit as st
import pandas as pd
from pathlib import Path
# تنظیمات صفحه
st.set_page_config(
page_title="داشبورد مدیریت",
page_icon="👤",
layout="wide"
)
# استایل‌های داشبورد
st.markdown("""
<style>
@import url('https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;700&display=swap');
* {
font-family: 'Vazirmatn', sans-serif;
direction: rtl;
}
.dashboard-container {
background: white;
border-radius: 15px;
padding: 25px;
margin: 20px 0;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
.stat-card {
background: linear-gradient(135deg, #6B73FF 0%, #000DFF 100%);
color: white;
padding: 20px;
border-radius: 10px;
margin: 10px;
text-align: center;
}
.file-upload {
border: 2px dashed #ccc;
padding: 20px;
border-radius: 10px;
text-align: center;
margin: 20px 0;
transition: all 0.3s ease;
}
.file-upload:hover {
border-color: #2196F3;
}
.action-button {
background: #2196F3;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
transition: all 0.3s ease;
}
.action-button:hover {
background: #1976D2;
transform: scale(1.05);
}
.file-list {
margin-top: 20px;
}
.file-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px;
background: #f5f5f5;
border-radius: 8px;
margin: 10px 0;
}
.delete-button {
background: #ff4444;
color: white;
padding: 5px 15px;
border: none;
border-radius: 5px;
cursor: pointer;
}
.delete-button:hover {
background: #cc0000;
}
</style>
""", unsafe_allow_html=True)
# هدر داشبورد
st.title("🎛️ داشبورد مدیریت")
# آمار کلی
col1, col2, col3 = st.columns(3)
with col1:
st.markdown("""
<div class="stat-card">
<h2>۱۲۳</h2>
<p>تعداد فایل‌ها</p>
</div>
""", unsafe_allow_html=True)
with col2:
st.markdown("""
<div class="stat-card">
<h2>۴۵۶</h2>
<p>تعداد پرسش‌ها</p>
</div>
""", unsafe_allow_html=True)
with col3:
st.markdown("""
<div class="stat-card">
<h2>۷۸۹</h2>
<p>پاسخ‌های موفق</p>
</div>
""", unsafe_allow_html=True)
# بخش آپلود فایل
st.markdown("""
<div class="dashboard-container">
<h3>📤 آپلود فایل جدید</h3>
<div class="file-upload">
<p>فایل خود را اینجا رها کنید یا کلیک کنید</p>
<input type="file" accept=".csv,.json,.txt">
</div>
</div>
""", unsafe_allow_html=True)
# لیست فایل‌ها
st.markdown("""
<div class="dashboard-container">
<h3>📁 مدیریت فایل‌ها</h3>
<div class="file-list">
<div class="file-item">
<span>banking_data.csv</span>
<button class="delete-button">حذف</button>
</div>
<div class="file-item">
<span>customer_qa.json</span>
<button class="delete-button">حذف</button>
</div>
<div class="file-item">
<span>training_data.txt</span>
<button class="delete-button">حذف</button>
</div>
</div>
</div>
""", unsafe_allow_html=True)
# تنظیمات مدل
st.markdown("""
<div class="dashboard-container">
<h3>⚙️ تنظیمات مدل</h3>
<div style="margin: 20px 0;">
<label>دمای مدل:</label>
<input type="range" min="0" max="100" value="70">
</div>
<div style="margin: 20px 0;">
<label>حداکثر طول پاسخ:</label>
<input type="number" value="512">
</div>
<button class="action-button">ذخیره تنظیمات</button>
</div>
""", unsafe_allow_html=True)
if __name__ == "__main__":
st.markdown("""
<script>
// اضافه کردن عملکرد به دکمه‌ها
document.querySelectorAll('.delete-button').forEach(button => {
button.addEventListener('click', function() {
if (confirm('آیا از حذف این فایل اطمینان دارید؟')) {
this.closest('.file-item').remove();
}
});
});
</script>
""", unsafe_allow_html=True)
# اضافه کردن بخش نمودارها
st.markdown("""
<div class="dashboard-container">
<h3>📊 تحلیل عملکرد مدل</h3>
</div>
""", unsafe_allow_html=True)
# نمودار نرخ یادگیری
col1, col2 = st.columns(2)
with col1:
# نمودار نرخ یادگیری
dates = [datetime.now() - timedelta(days=x) for x in range(30)]
learning_rate = [0.001 * np.exp(-x/10) for x in range(30)]
fig_learning = go.Figure()
fig_learning.add_trace(go.Scatter(
x=dates,
y=learning_rate,
mode='lines+markers',
name='نرخ یادگیری',
line=dict(color='#2196F3', width=3)
))
fig_learning.update_layout(
title='نرخ یادگیری در طول زمان',
xaxis_title='تاریخ',
yaxis_title='نرخ یادگیری',
template='plotly_white',
dir='rtl'
)
st.plotly_chart(fig_learning, use_container_width=True)
with col2:
# نمودار دقت مدل
accuracy_data = np.linspace(0.7, 0.95, 30)
fig_accuracy = go.Figure()
fig_accuracy.add_trace(go.Scatter(
x=dates,
y=accuracy_data,
mode='lines+markers',
name='دقت مدل',
line=dict(color='#4CAF50', width=3)
))
fig_accuracy.update_layout(
title='پیشرفت دقت مدل',
xaxis_title='تاریخ',
yaxis_title='دقت',
template='plotly_white',
dir='rtl'
)
st.plotly_chart(fig_accuracy, use_container_width=True)
# نمودار پاسخ‌های صحیح و غلط
labels = ['پاسخ‌های صحیح', 'پاسخ‌های غلط']
values = [85, 15]
fig_pie = go.Figure(data=[go.Pie(
labels=labels,
values=values,
hole=.3,
marker_colors=['#4CAF50', '#f44336']
)])
fig_pie.update_layout(title='نسبت پاسخ‌های صحیح به غلط')
st.plotly_chart(fig_pie, use_container_width=True)
# چت‌بات آموزش سریع
st.markdown("""
<div class="dashboard-container">
<h3>🤖 آموزش سریع با چت‌بات</h3>
<div class="chat-trainer">
<input type="text" placeholder="دستور آموزشی خود را وارد کنید..." class="trainer-input">
<button class="action-button">ارسال دستور</button>
</div>
</div>
""", unsafe_allow_html=True)
# دکمه دسترسی به نالج بیس
st.markdown("""
<div class="dashboard-container">
<h3>📚 مدیریت نالج بیس</h3>
<button class="action-button" onclick="window.open('/filemanager.py')">
<i class="fas fa-folder-open"></i>
دسترسی به فایل منیجر
</button>
</div>
""", unsafe_allow_html=True)
# اضافه کردن استایل‌های جدید
st.markdown("""
<style>
.chat-trainer {
display: flex;
gap: 10px;
margin: 20px 0;
}
.trainer-input {
flex: 1;
padding: 12px;
border: 2px solid #f0f0f0;
border-radius: 8px;
font-size: 14px;
}
.plotly-chart {
background: white;
border-radius: 10px;
padding: 15px;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
</style>
""", unsafe_allow_html=True)
# اضافه کردن نمودار هیت‌مپ برای نمایش ماتریس خطا
confusion_matrix = np.array([
[850, 50],
[30, 70]
])
fig_heatmap = px.imshow(
confusion_matrix,
labels=dict(x="پیش‌بینی", y="مقدار واقعی"),
x=['مثبت', 'منفی'],
y=['مثبت', 'منفی'],
color_continuous_scale="RdBu",
title="ماتریس خطا"
)
fig_heatmap.update_layout(
template='plotly_white',
dir='rtl',
width=600,
height=500
)
# نمودار روند زمانی با قابلیت فیلتر
training_metrics = pd.DataFrame({
'تاریخ': pd.date_range(start='2023-01-01', periods=100),
'دقت': np.random.normal(0.85, 0.05, 100).cumsum()/100,
'recall': np.random.normal(0.80, 0.05, 100).cumsum()/100,
'f1_score': np.random.normal(0.82, 0.05, 100).cumsum()/100
})
fig_metrics = px.line(
training_metrics,
x='تاریخ',
y=['دقت', 'recall', 'f1_score'],
title='روند معیارهای ارزیابی',
labels={'value': 'مقدار', 'variable': 'معیار'},
template='plotly_white'
)
fig_metrics.update_layout(
showlegend=True,
legend_title_text='معیارها',
hovermode='x unified',
updatemenus=[
dict(
buttons=list([
dict(
args=[{"visible": [True, True, True]}],
label="همه",
method="restyle"
),
dict(
args=[{"visible": [True, False, False]}],
label="دقت",
method="restyle"
),
dict(
args=[{"visible": [False, True, False]}],
label="Recall",
method="restyle"
),
dict(
args=[{"visible": [False, False, True]}],
label="F1 Score",
method="restyle"
)
]),
direction="down",
showactive=True,
x=0.1,
y=1.1
)
]
)
# نمودار توزیع خطا
errors = np.random.normal(0, 1, 1000)
fig_dist = px.histogram(
errors,
nbins=50,
title='توزیع خطای پیش‌بینی',
labels={'value': 'خطا', 'count': 'تعداد'},
template='plotly_white'
)
fig_dist.update_layout(
bargap=0.1,
showlegend=False
)
# اضافه کردن کنترل‌های تعاملی
st.sidebar.markdown("## تنظیمات نمودارها")
time_range = st.sidebar.slider(
"بازه زمانی (روز)",
min_value=7,
max_value=100,
value=30
)
metric_threshold = st.sidebar.number_input(
"آستانه دقت",
min_value=0.0,
max_value=1.0,
value=0.8,
step=0.05
)
# نمایش نمودارها با چینش جدید
col1, col2 = st.columns(2)
with col1:
st.plotly_chart(fig_metrics, use_container_width=True)
st.plotly_chart(fig_heatmap, use_container_width=True)
with col2:
st.plotly_chart(fig_dist, use_container_width=True)
st.plotly_chart(fig_pie, use_container_width=True)