Spaces:
Running
Running
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) | |