chalet_jornal / performance_analysis.py
Medon90ae's picture
Update performance_analysis.py
d8e06c3 verified
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
import os
import json
from collections import Counter
def create_keyword_performance_chart(keyword_analysis):
"""
إنشاء رسم بياني لأداء الكلمات المفتاحية
"""
try:
top_keywords = keyword_analysis.get('top_keywords', [])
if not top_keywords:
# إنشاء رسم بياني فارغ
fig, ax = plt.subplots(figsize=(10, 6))
ax.text(0.5, 0.5, 'لا توجد بيانات كافية لإنشاء الرسم البياني',
horizontalalignment='center', verticalalignment='center', transform=ax.transAxes)
return fig
# إعداد البيانات للرسم البياني
keywords = [item['keyword'] for item in top_keywords]
conversion_rates = [item['performance']['avg_conversion'] for item in top_keywords]
engagement_rates = [item['performance']['avg_engagement'] for item in top_keywords]
views = [item['performance']['avg_views'] for item in top_keywords]
# إنشاء الرسم البياني
fig, axes = plt.subplots(2, 1, figsize=(12, 10))
# تعيين نمط الخط لدعم اللغة العربية
plt.rcParams['font.family'] = 'Arial'
# رسم بياني لمعدل التحويل
axes[0].bar(keywords, conversion_rates, color='green')
axes[0].set_title('معدل التحويل حسب الكلمة المفتاحية')
axes[0].set_ylabel('معدل التحويل (%)')
axes[0].set_xlabel('الكلمة المفتاحية')
plt.setp(axes[0].get_xticklabels(), rotation=45, ha='right')
# رسم بياني للعلاقة بين التفاعل والمشاهدات
scatter = axes[1].scatter(engagement_rates, views, c=conversion_rates, cmap='viridis',
s=100, alpha=0.7)
# إضافة تسميات للنقاط
for i, keyword in enumerate(keywords):
axes[1].annotate(keyword, (engagement_rates[i], views[i]),
xytext=(5, 5), textcoords='offset points')
axes[1].set_title('العلاقة بين التفاعل والمشاهدات والتحويل')
axes[1].set_ylabel('عدد المشاهدات')
axes[1].set_xlabel('معدل التفاعل (%)')
# إضافة شريط الألوان
cbar = plt.colorbar(scatter, ax=axes[1])
cbar.set_label('معدل التحويل (%)')
plt.tight_layout()
return fig
except Exception as e:
print(f"خطأ في إنشاء رسم بياني لأداء الكلمات المفتاحية: {str(e)}")
# إنشاء رسم بياني فارغ
fig, ax = plt.subplots(figsize=(10, 6))
ax.text(0.5, 0.5, f'خطأ في إنشاء الرسم البياني: {str(e)}',
horizontalalignment='center', verticalalignment='center', transform=ax.transAxes)
return fig
def analyze_content_performance(content_data):
"""
تحليل أداء المحتوى
"""
# التحقق من وجود البيانات
if content_data.empty:
return {
'avg_metrics': {
'avg_views': 0,
'avg_engagement': 0,
'avg_conversion': 0
},
'best_content': {},
'worst_content': {},
'correlations': pd.DataFrame()
}
# حساب متوسط المقاييس
avg_metrics = {
'avg_views': content_data['views'].mean() if 'views' in content_data.columns else 0,
'avg_engagement': content_data['engagement'].mean() if 'engagement' in content_data.columns else 0,
'avg_conversion': content_data['conversion'].mean() if 'conversion' in content_data.columns else 0
}
# تحديد أفضل وأسوأ المحتوى
if 'conversion' in content_data.columns and not content_data.empty:
best_content = content_data.loc[content_data['conversion'].idxmax()].to_dict()
worst_content = content_data.loc[content_data['conversion'].idxmin()].to_dict()
else:
best_content = {}
worst_content = {}
# تحليل العلاقة بين المقاييس
metrics_columns = [col for col in ['views', 'engagement', 'conversion'] if col in content_data.columns]
if metrics_columns and len(metrics_columns) > 1:
correlations = content_data[metrics_columns].corr()
else:
correlations = pd.DataFrame()
return {
'avg_metrics': avg_metrics,
'best_content': best_content,
'worst_content': worst_content,
'correlations': correlations
}
def create_performance_charts(content_data):
"""
إنشاء رسوم بيانية لأداء المحتوى
"""
# التحقق من وجود البيانات
if content_data.empty or 'content_type' not in content_data.columns:
# إنشاء رسم بياني فارغ
fig, ax = plt.subplots(figsize=(10, 6))
ax.text(0.5, 0.5, 'لا توجد بيانات كافية لإنشاء الرسوم البيانية',
horizontalalignment='center', verticalalignment='center', transform=ax.transAxes)
return fig
# إنشاء الرسوم البيانية
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# تعيين نمط الخط لدعم اللغة العربية
plt.rcParams['font.family'] = 'Arial'
# رسم بياني للمشاهدات
if 'views' in content_data.columns:
sns.barplot(x='content_type', y='views', data=content_data, ax=axes[0, 0])
axes[0, 0].set_title('المشاهدات حسب نوع المحتوى')
axes[0, 0].set_ylabel('عدد المشاهدات')
axes[0, 0].set_xlabel('نوع المحتوى')
else:
axes[0, 0].text(0.5, 0.5, 'لا توجد بيانات للمشاهدات',
horizontalalignment='center', verticalalignment='center', transform=axes[0, 0].transAxes)
# رسم بياني للتفاعل
if 'engagement' in content_data.columns:
sns.barplot(x='content_type', y='engagement', data=content_data, ax=axes[0, 1])
axes[0, 1].set_title('التفاعل حسب نوع المحتوى')
axes[0, 1].set_ylabel('معدل التفاعل (%)')
axes[0, 1].set_xlabel('نوع المحتوى')
else:
axes[0, 1].text(0.5, 0.5, 'لا توجد بيانات للتفاعل',
horizontalalignment='center', verticalalignment='center', transform=axes[0, 1].transAxes)
# رسم بياني للتحويل
if 'conversion' in content_data.columns:
sns.barplot(x='content_type', y='conversion', data=content_data, ax=axes[1, 0])
axes[1, 0].set_title('التحويل حسب نوع المحتوى')
axes[1, 0].set_ylabel('معدل التحويل (%)')
axes[1, 0].set_xlabel('نوع المحتوى')
else:
axes[1, 0].text(0.5, 0.5, 'لا توجد بيانات للتحويل',
horizontalalignment='center', verticalalignment='center', transform=axes[1, 0].transAxes)
# رسم بياني للعلاقة بين التفاعل والتحويل
if 'engagement' in content_data.columns and 'conversion' in content_data.columns:
sns.scatterplot(x='engagement', y='conversion', hue='content_type', data=content_data, ax=axes[1, 1])
axes[1, 1].set_title('العلاقة بين التفاعل والتحويل')
axes[1, 1].set_ylabel('معدل التحويل (%)')
axes[1, 1].set_xlabel('معدل التفاعل (%)')
else:
axes[1, 1].text(0.5, 0.5, 'لا توجد بيانات كافية لإظهار العلاقة',
horizontalalignment='center', verticalalignment='center', transform=axes[1, 1].transAxes)
plt.tight_layout()
return fig
def load_performance_data():
"""
تحميل بيانات الأداء من ملف CSV أو إنشاء بيانات جديدة إذا لم يكن الملف موجوداً
"""
try:
if os.path.exists("content_performance.csv"):
return pd.read_csv("content_performance.csv")
else:
return pd.DataFrame()
except Exception as e:
print(f"خطأ في تحميل بيانات الأداء: {str(e)}")
return pd.DataFrame()
def save_performance_data(df):
"""
حفظ بيانات الأداء في ملف CSV
"""
try:
df.to_csv("content_performance.csv", index=False)
return True
except Exception as e:
print(f"خطأ في حفظ بيانات الأداء: {str(e)}")
return False
def add_performance_record(content_id, content_type, views, engagement, conversion, publish_date=None):
"""
إضافة سجل أداء جديد
"""
try:
# تحميل البيانات الحالية
df = load_performance_data()
# إنشاء سجل جديد
new_record = {
'content_id': content_id,
'content_type': content_type,
'views': views,
'engagement': engagement,
'conversion': conversion,
'publish_date': publish_date or datetime.datetime.now().strftime("%Y-%m-%d")
}
# إضافة السجل إلى DataFrame
df = pd.concat([df, pd.DataFrame([new_record])], ignore_index=True)
# حفظ البيانات
save_performance_data(df)
return True
except Exception as e:
print(f"خطأ في إضافة سجل الأداء: {str(e)}")
return False
def analyze_performance_trends(days=30):
"""
تحليل اتجاهات الأداء خلال فترة زمنية محددة
"""
try:
# تحميل البيانات
df = load_performance_data()
if df.empty or 'publish_date' not in df.columns:
return {
'trend_views': [],
'trend_engagement': [],
'trend_conversion': [],
'best_day': None,
'worst_day': None
}
# تحويل تاريخ النشر إلى نوع datetime
df['publish_date'] = pd.to_datetime(df['publish_date'])
# تحديد تاريخ البداية
start_date = datetime.datetime.now() - datetime.timedelta(days=days)
# فلترة البيانات حسب الفترة الزمنية
filtered_df = df[df['publish_date'] >= start_date]
if filtered_df.empty:
return {
'trend_views': [],
'trend_engagement': [],
'trend_conversion': [],
'best_day': None,
'worst_day': None
}
# تجميع البيانات حسب اليوم
daily_data = filtered_df.groupby(filtered_df['publish_date'].dt.date).agg({
'views': 'mean',
'engagement': 'mean',
'conversion': 'mean'
}).reset_index()
# تحديد أفضل وأسوأ يوم
best_day = daily_data.loc[daily_data['conversion'].idxmax()]
worst_day = daily_data.loc[daily_data['conversion'].idxmin()]
# إعداد بيانات الاتجاهات
trend_views = [{'date': str(row['publish_date']), 'value': row['views']} for _, row in daily_data.iterrows()]
trend_engagement = [{'date': str(row['publish_date']), 'value': row['engagement']} for _, row in daily_data.iterrows()]
trend_conversion = [{'date': str(row['publish_date']), 'value': row['conversion']} for _, row in daily_data.iterrows()]
return {
'trend_views': trend_views,
'trend_engagement': trend_engagement,
'trend_conversion': trend_conversion,
'best_day': {
'date': str(best_day['publish_date']),
'views': best_day['views'],
'engagement': best_day['engagement'],
'conversion': best_day['conversion']
},
'worst_day': {
'date': str(worst_day['publish_date']),
'views': worst_day['views'],
'engagement': worst_day['engagement'],
'conversion': worst_day['conversion']
}
}
except Exception as e:
print(f"خطأ في تحليل اتجاهات الأداء: {str(e)}")
return {
'trend_views': [],
'trend_engagement': [],
'trend_conversion': [],
'best_day': None,
'worst_day': None
}
def analyze_content_keywords_performance(content_data):
"""
تحليل أداء الكلمات المفتاحية في المحتوى
"""
try:
if content_data.empty or 'keywords' not in content_data.columns or 'conversion' not in content_data.columns:
return {
'top_keywords': [],
'keyword_performance': {}
}
# استخراج جميع الكلمات المفتاحية
all_keywords = []
for keywords_str in content_data['keywords']:
if isinstance(keywords_str, str):
keywords = [k.strip() for k in keywords_str.split(',')]
all_keywords.extend(keywords)
# حساب تكرار الكلمات المفتاحية
keyword_counts = Counter(all_keywords)
# حساب أداء كل كلمة مفتاحية
keyword_performance = {}
for keyword in set(all_keywords):
# تحديد المحتوى الذي يحتوي على الكلمة المفتاحية
keyword_content = content_data[content_data['keywords'].str.contains(keyword, na=False)]
if not keyword_content.empty:
keyword_performance[keyword] = {
'count': keyword_counts[keyword],
'avg_views': keyword_content['views'].mean(),
'avg_engagement': keyword_content['engagement'].mean(),
'avg_conversion': keyword_content['conversion'].mean()
}
# ترتيب الكلمات المفتاحية حسب معدل التحويل
sorted_keywords = sorted(keyword_performance.items(), key=lambda x: x[1]['avg_conversion'], reverse=True)
top_keywords = [{'keyword': k, 'performance': v} for k, v in sorted_keywords[:10]]
return {
'top_keywords': top_keywords,
'keyword_performance': keyword_performance
}
except Exception as e:
print(f"خطأ في تحليل أداء الكلمات المفتاحية: {str(e)}")
return {
'top_keywords': [],
'keyword_performance': {}
}