|
import streamlit as st |
|
import pandas as pd |
|
import numpy as np |
|
import plotly.express as px |
|
|
|
class RiskAnalyzer: |
|
def __init__(self): |
|
self.risk_categories = [ |
|
"مخاطر السوق", |
|
"مخاطر التنفيذ", |
|
"مخاطر العقود", |
|
"مخاطر التمويل", |
|
"مخاطر الموارد" |
|
] |
|
|
|
self.impact_levels = { |
|
"منخفض": 1, |
|
"متوسط": 2, |
|
"عالي": 3, |
|
"حرج": 4 |
|
} |
|
|
|
self.probability_levels = { |
|
"نادر": 1, |
|
"محتمل": 2, |
|
"مرجح": 3, |
|
"شبه مؤكد": 4 |
|
} |
|
|
|
def render(self): |
|
"""عرض واجهة تحليل المخاطر""" |
|
st.markdown("### تحليل المخاطر") |
|
|
|
|
|
with st.form("add_risk_form"): |
|
col1, col2 = st.columns(2) |
|
|
|
with col1: |
|
category = st.selectbox("فئة المخاطر", self.risk_categories) |
|
description = st.text_area("وصف المخاطر") |
|
probability = st.selectbox("احتمالية الحدوث", list(self.probability_levels.keys())) |
|
|
|
with col2: |
|
impact = st.selectbox("مستوى التأثير", list(self.impact_levels.keys())) |
|
response = st.text_area("استراتيجية الاستجابة") |
|
responsible = st.text_input("المسؤول") |
|
|
|
if st.form_submit_button("إضافة المخاطر"): |
|
if not description or not response: |
|
st.error("يرجى إدخال جميع البيانات المطلوبة") |
|
else: |
|
if 'project_risks' not in st.session_state: |
|
st.session_state.project_risks = [] |
|
|
|
risk = { |
|
'category': category, |
|
'description': description, |
|
'probability': probability, |
|
'impact': impact, |
|
'response': response, |
|
'responsible': responsible, |
|
'risk_score': self.probability_levels[probability] * self.impact_levels[impact] |
|
} |
|
|
|
st.session_state.project_risks.append(risk) |
|
st.success("تم إضافة المخاطر بنجاح") |
|
st.rerun() |
|
|
|
|
|
if 'project_risks' in st.session_state and st.session_state.project_risks: |
|
st.markdown("### المخاطر المحددة") |
|
risks_df = pd.DataFrame(st.session_state.project_risks) |
|
|
|
column_names = { |
|
'category': 'فئة المخاطر', |
|
'description': 'وصف المخاطر', |
|
'probability': 'احتمالية الحدوث', |
|
'impact': 'مستوى التأثير', |
|
'response': 'استراتيجية الاستجابة', |
|
'responsible': 'المسؤول', |
|
'risk_score': 'درجة الخطورة' |
|
} |
|
risks_df = risks_df.rename(columns=column_names) |
|
st.dataframe(risks_df) |
|
|
|
|
|
self._render_risk_matrix(risks_df) |
|
|
|
def _render_risk_matrix(self, risks_df): |
|
"""عرض مصفوفة المخاطر""" |
|
st.markdown("### مصفوفة المخاطر") |
|
|
|
matrix_data = np.zeros((4, 4)) |
|
for _, risk in risks_df.iterrows(): |
|
prob_idx = self.probability_levels[risk['احتمالية الحدوث']] - 1 |
|
impact_idx = self.impact_levels[risk['مستوى التأثير']] - 1 |
|
matrix_data[prob_idx, impact_idx] += 1 |
|
|
|
fig = px.imshow( |
|
matrix_data, |
|
labels=dict(x="التأثير", y="الاحتمالية"), |
|
x=list(self.impact_levels.keys()), |
|
y=list(self.probability_levels.keys()) |
|
) |
|
st.plotly_chart(fig) |