Update modules/data_analysis/data_analysis_app.py
Browse files
modules/data_analysis/data_analysis_app.py
CHANGED
@@ -384,41 +384,142 @@ class DataAIIntegration:
|
|
384 |
{"risk": "مشاكل في التربة", "probability": "منخفضة", "impact": "عالي", "mitigation": "إجراء فحوصات شاملة للتربة قبل البدء"}
|
385 |
]
|
386 |
|
387 |
-
def
|
388 |
-
"""تحليل التكاليف"""
|
389 |
# محاكاة تحليل التكاليف
|
390 |
total_budget = float(df['الميزانية التقديرية'].iloc[0]) if 'الميزانية التقديرية' in df.columns else 10000000
|
391 |
-
|
392 |
# توزيع التكاليف
|
393 |
materials_cost = total_budget * 0.6
|
394 |
labor_cost = total_budget * 0.25
|
395 |
equipment_cost = total_budget * 0.15
|
396 |
-
|
397 |
-
#
|
398 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
399 |
return {
|
400 |
'total_budget': total_budget,
|
401 |
'materials_cost': materials_cost,
|
402 |
'labor_cost': labor_cost,
|
403 |
-
'equipment_cost': equipment_cost
|
|
|
|
|
404 |
}
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
|
421 |
-
|
422 |
-
|
423 |
-
|
424 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
384 |
{"risk": "مشاكل في التربة", "probability": "منخفضة", "impact": "عالي", "mitigation": "إجراء فحوصات شاملة للتربة قبل البدء"}
|
385 |
]
|
386 |
|
387 |
+
def _analyze_costs(self, df):
|
388 |
+
"""تحليل التكاليف (دالة داخلية)"""
|
389 |
# محاكاة تحليل التكاليف
|
390 |
total_budget = float(df['الميزانية التقديرية'].iloc[0]) if 'الميزانية التقديرية' in df.columns else 10000000
|
391 |
+
|
392 |
# توزيع التكاليف
|
393 |
materials_cost = total_budget * 0.6
|
394 |
labor_cost = total_budget * 0.25
|
395 |
equipment_cost = total_budget * 0.15
|
396 |
+
|
397 |
+
# إنشاء بيانات التوزيع للرسم البياني
|
398 |
+
cost_data = {
|
399 |
+
"الفئة": ["المواد", "العمالة", "المعدات"],
|
400 |
+
"التكلفة": [materials_cost, labor_cost, equipment_cost]
|
401 |
+
}
|
402 |
+
|
403 |
+
# إنشاء DataFrame
|
404 |
+
cost_df = pd.DataFrame(cost_data)
|
405 |
+
|
406 |
return {
|
407 |
'total_budget': total_budget,
|
408 |
'materials_cost': materials_cost,
|
409 |
'labor_cost': labor_cost,
|
410 |
+
'equipment_cost': equipment_cost,
|
411 |
+
'cost_data': cost_data,
|
412 |
+
'cost_df': cost_df
|
413 |
}
|
414 |
+
|
415 |
+
def _analyze_competition(self, df):
|
416 |
+
"""تحليل المنافسة"""
|
417 |
+
# محاكاة تحليل المنافسة
|
418 |
+
competitors = self._get_competitors_data()
|
419 |
+
top_competitors = competitors.nlargest(5, "معدل الفوز (%)").to_dict('records')
|
420 |
+
|
421 |
+
return {
|
422 |
+
'total_competitors': len(competitors),
|
423 |
+
'top_competitors': top_competitors,
|
424 |
+
'market_position': "متوسط",
|
425 |
+
'competitive_advantage': "الخبرة الفنية والتسعير التنافسي",
|
426 |
+
'threats': ["منافسون جدد في السوق", "تسعير أقل من المنافسين الرئيسيين"]
|
427 |
+
}
|
428 |
+
|
429 |
+
def _calculate_win_rate(self, df):
|
430 |
+
"""حساب معدل الفوز"""
|
431 |
+
# محاكاة حساب معدل الفوز
|
432 |
+
if 'الحالة' in df.columns:
|
433 |
+
won_tenders = df[df['الحالة'] == 'فائز']
|
434 |
+
win_rate = len(won_tenders) / len(df) * 100 if len(df) > 0 else 0
|
435 |
+
return win_rate
|
436 |
+
return 45.5 # قيمة افتراضية
|
437 |
+
|
438 |
+
def _calculate_avg_profit_margin(self, df):
|
439 |
+
"""حساب متوسط هامش الربح"""
|
440 |
+
# محاكاة حساب متوسط هامش الربح
|
441 |
+
if 'هامش الربح (%)' in df.columns:
|
442 |
+
return df['هامش الربح (%)'].mean()
|
443 |
+
return 12.3 # قيمة افتراضية
|
444 |
+
|
445 |
+
def _analyze_price_trends(self, df):
|
446 |
+
"""تحليل اتجاهات الأسعار"""
|
447 |
+
# محاكاة تحليل اتجاهات الأسعار
|
448 |
+
return {
|
449 |
+
'trend': 'تصاعدي',
|
450 |
+
'annual_increase': '8.5%',
|
451 |
+
'forecast': 'استمرار الزيادة بنسبة 5-7% سنويًا',
|
452 |
+
'factors': ['زيادة أسعار المواد', 'نقص العمالة', 'زيادة الطلب']
|
453 |
+
}
|
454 |
+
|
455 |
+
def _identify_success_factors(self, df):
|
456 |
+
"""تحديد عوامل النجاح"""
|
457 |
+
# محاكاة تحديد عوامل النجاح
|
458 |
+
return [
|
459 |
+
{'factor': 'السعر التنافسي', 'importance': 'عالي'},
|
460 |
+
{'factor': 'الخبرة السابقة', 'importance': 'عالي'},
|
461 |
+
{'factor': 'جودة العرض الفني', 'importance': 'متوسط'},
|
462 |
+
{'factor': 'مدة التنفيذ', 'importance': 'متوسط'},
|
463 |
+
{'factor': 'سمعة الشركة', 'importance': 'منخفض'}
|
464 |
+
]
|
465 |
+
|
466 |
+
def _generate_visualizations(self, df):
|
467 |
+
"""توليد الرسومات البيانية"""
|
468 |
+
# محاكاة توليد الرسومات البيانية
|
469 |
+
return {
|
470 |
+
'visualization_urls': [
|
471 |
+
'/static/images/win_rate_chart.png',
|
472 |
+
'/static/images/profit_margin_chart.png',
|
473 |
+
'/static/images/project_types_chart.png'
|
474 |
+
],
|
475 |
+
'visualization_data': {
|
476 |
+
'win_rate_by_year': [
|
477 |
+
{'year': '2021', 'win_rate': 42.5},
|
478 |
+
{'year': '2022', 'win_rate': 45.0},
|
479 |
+
{'year': '2023', 'win_rate': 48.2},
|
480 |
+
{'year': '2024', 'win_rate': 47.8}
|
481 |
+
],
|
482 |
+
'profit_margin_by_project_type': [
|
483 |
+
{'type': 'مبنى إداري', 'margin': 12.5},
|
484 |
+
{'type': 'مبنى سكني', 'margin': 10.8},
|
485 |
+
{'type': 'مدرسة', 'margin': 15.2},
|
486 |
+
{'type': 'مستشفى', 'margin': 13.7},
|
487 |
+
{'type': 'طرق', 'margin': 14.3},
|
488 |
+
{'type': 'جسور', 'margin': 11.2},
|
489 |
+
{'type': 'بنية تحتية', 'margin': 12.9}
|
490 |
+
]
|
491 |
+
}
|
492 |
+
}
|
493 |
+
|
494 |
+
def _generate_success_recommendations(self, factors):
|
495 |
+
"""توليد توصيات لزيادة فرص النجاح"""
|
496 |
+
# محاكاة توليد توصيات
|
497 |
+
return [
|
498 |
+
"تخفيض السعر بنسبة 5-8% للحصول على ميزة تنافسية",
|
499 |
+
"التركيز على إبراز الخبرات السابقة في مشاريع مماثلة",
|
500 |
+
"تحسين جودة العرض الفني",
|
501 |
+
"تقديم جدول زمني مختصر للتنفيذ",
|
502 |
+
"تقديم ضمانات إضافية للجودة"
|
503 |
+
]
|
504 |
+
|
505 |
+
def _analyze_market_position(self, price, competitors_df):
|
506 |
+
"""تحليل الموقف التنافسي في السوق"""
|
507 |
+
# محاكاة تحليل الموقف التنافسي
|
508 |
+
return {
|
509 |
+
'position': 'متوسط',
|
510 |
+
'price_percentile': 45,
|
511 |
+
'competitors_lower': 3,
|
512 |
+
'competitors_higher': 7,
|
513 |
+
'recommendation': 'تخفيض السعر بشكل طفيف للحصول على موقف تنافسي أفضل'
|
514 |
+
}
|
515 |
+
|
516 |
+
def _generate_pricing_recommendations(self, optimal_price, price_sensitivity):
|
517 |
+
"""توليد توصيات التسعير"""
|
518 |
+
# محاكاة توليد توصيات التسعير
|
519 |
+
return [
|
520 |
+
f"السعر الأمثل هو {optimal_price:,.0f} ريال",
|
521 |
+
"تجنب تخفيض السعر أكثر من 15% من الميزانية التقديرية",
|
522 |
+
"التركيز على تقديم قيمة إضافية بدلاً من تخفيض السعر بشكل كبير",
|
523 |
+
"في حالة المنافسة الشديدة، يمكن تخفيض السعر بنسبة إضافية 3%",
|
524 |
+
"تقديم خيارات سعرية بديلة مع اختلاف نطاق العمل"
|
525 |
+
]
|