EGYADMIN commited on
Commit
b6a9964
·
verified ·
1 Parent(s): 2768aff

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 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
-
 
 
 
 
 
 
 
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
- cost_data = {
408
- "الفئة": ["المواد", "العمالة", "المعدات"],
409
- "التكلفة": [materials_cost, labor_cost, equipment_cost]
410
- }
411
-
412
- # إنشاء DataFrame
413
- cost_df = pd.DataFrame(cost_data)
414
-
415
- # إنشاء رسم بياني دائري لتوزيع التكاليف
416
- fig = px.pie(
417
- cost_df,
418
- values="التكلفة",
419
- names="الفئة",
420
- title="توزيع التكاليف",
421
- color_discrete_sequence=px.colors.qualitative.Set2
422
- )
423
-
424
- st.plotly_chart(fig, use_container_width=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ ]