Standard_Intelligence_Dev / charts_advanced.py
YchKhan's picture
Create charts_advanced.py
8cc7d1d verified
raw
history blame
13.2 kB
import pandas as pd
import matplotlib.pyplot as plt
from collections import Counter
import matplotlib.ticker as ticker
def category_chart(file_path):
plt.close('all')
# Define expert to specialty mapping
expert_specialties = {
"mireille": "Security Trust",
"khawla": "Network Security",
"guillaume": "Distributed Networks",
"vincent": "USIM Management",
"pierre": "Eco-Design",
"ly-thanh": "Trend Analysis",
"nicolas": "Satellite Networks",
"dorin": "Emergency Communication"
}
# Load the Excel file
data = pd.read_excel(file_path)
# Assuming experts are listed in a column named 'Experts'
# This part might need to be adjusted based on the actual structure of your Excel file
experts = data['Expert'].dropna()
# Map experts to their specialties
specialties = experts.apply(lambda expert: expert_specialties.get(expert.strip(), "Other"))
# Count occurrences
specialty_counts = specialties.value_counts()
# Convert to DataFrame for plotting
specialty_counts_df = specialty_counts.reset_index()
specialty_counts_df.columns = ['Specialty', 'Count']
# Plotting
plt.style.use('dark_background')
fig, ax = plt.subplots(figsize=(14, 14))
ax.set_facecolor('#222c52')
fig.patch.set_facecolor('#222c52')
# Alternating colors for the bars
colors = ['#08F7FE' if i % 2 == 0 else '#FE53BB' for i in range(len(specialty_counts_df))]
specialty_counts_df.plot(kind='bar', x='Specialty', y='Count', ax=ax, color=colors, edgecolor=colors, alpha=0.5, linewidth=5, legend=None)
# Set chart details
ax.xaxis.label.set_color('white')
ax.yaxis.label.set_color('white')
ax.tick_params(axis='x', colors='white', labelsize=12, direction='out', length=6, width=2, rotation=42)
ax.tick_params(axis='y', colors='white', labelsize=12, direction='out', length=6, width=2)
ax.set_title('Most Used Expert Specialties', color='white', fontsize=16)
ax.set_xlabel('Specialty', fontsize=14)
ax.set_ylabel('Count', fontsize=14)
ax.grid(True, which='both', axis='y', color='gray', linestyle='-', linewidth=0.5, alpha=0.5)
ax.set_axisbelow(True)
for spine in ax.spines.values():
spine.set_color('white')
spine.set_linewidth(2)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
return fig
def status_chart(file_path):
# Load the Excel file
plt.close('all')
data = pd.read_excel(file_path)
# Calculate the frequency of each status
status_counts = data['Status'].value_counts()
# Define colors with 50% opacity
colors = ['#08F7FE80', '#FE53BB80',
'#fff236de', '#90ff00bf'] # '80' for 50% opacity
# Plotting
fig, ax = plt.subplots()
fig.patch.set_facecolor('#222c52') # Set the background color of the figure
ax.set_facecolor('#222c52') # Set the background color of the axes
wedges, texts, autotexts = ax.pie(status_counts, autopct='%1.1f%%', startangle=90, colors=colors,
wedgeprops=dict(edgecolor='white', linewidth=1.5))
# Set legend
ax.legend(wedges, status_counts.index, title="Document Status", loc="center left", bbox_to_anchor=(1, 0, 0.5, 1))
ax.set_ylabel('') # Remove the y-label
ax.set_title('Document Status Distribution', color='white')
plt.setp(autotexts, size=8, weight="bold", color="white")
return fig
def plot_glowing_line_with_dots_enhanced(ax, x, y, color, label, glow_size=10, base_linewidth=3, markersize=8):
for i in range(1, glow_size + 1):
alpha_value = (1.0 / glow_size) * (i / (glow_size / 2))
if alpha_value > 1.0:
alpha_value = 1.0
linewidth = base_linewidth * i * 0.5
ax.plot(x, y, color=color, linewidth=linewidth, alpha=alpha_value * 0.1)
ax.plot(x, y, color=color, linewidth=base_linewidth, marker='o', linestyle='-', label=label, markersize=markersize)
def company_document_type(file_path, company_names):
plt.close('all')
# Convert company_names to a list if it's a string
if isinstance(company_names, str):
company_names = [name.strip() for name in company_names.split(',')] # Ensure it's a list even for single company name
df = pd.read_excel(file_path)
plt.style.use('dark_background')
fig, ax = plt.subplots(figsize=(14, 8))
ax.set_facecolor('#222c52')
fig.patch.set_facecolor('#222c52')
colors = ['#08F7FE', '#FE53BB', '#fff236'] # Assign more colors for more companies
max_count = 0
for index, company_name in enumerate(company_names):
df_company = df[df['Source'].str.contains(company_name, case=False, na=False)]
document_counts = df_company['Type'].value_counts()
all_document_types = df['Type'].unique()
document_counts = document_counts.reindex(all_document_types, fill_value=0)
x_data = document_counts.index
y_data = document_counts.values
ax.fill_between(x_data, y_data, -0.2, color=colors[index % len(colors)], alpha=0.1)
plot_glowing_line_with_dots_enhanced(ax, x_data, y_data, colors[index % len(colors)], company_name, base_linewidth=4)
if max_count < max(y_data):
max_count = max(y_data)
ax.set_xticks(range(len(all_document_types)))
ax.set_xticklabels(all_document_types, rotation=45, fontsize=12, fontweight='bold')
ax.yaxis.set_major_locator(ticker.MaxNLocator(integer=True))
ax.set_ylabel('Count', color='white')
ax.set_title('Document Types Contributed by Companies')
ax.grid(True, which='both', axis='both', color='gray', linestyle='-', linewidth=0.5, alpha=0.5)
ax.set_axisbelow(True)
plt.ylim(-0.2, max_count + 1)
for spine in ax.spines.values():
spine.set_color('white')
spine.set_linewidth(2)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['left'].set_position(('data', 0))
plt.legend(facecolor='#222c52', edgecolor='white', fontsize=12)
return fig
def chart_by_expert(file_path, expert_name):
plt.close('all')
# Load the Excel file
data = pd.read_excel(file_path)
parts = expert_name.split('/')
# The name would be the second part, trim spaces
name = parts[1].strip()
# Filter data for the specified expert
filtered_data = data[data['Expert'] == name.lower()]
# Define merge entities mapping
merge_entities = {
"Nokia Shanghai Bell": "Nokia",
"Qualcomm Korea": "Qualcomm",
"Qualcomm Incorporated": "Qualcomm",
"Huawei Technologies R&D UK": "Huawei",
"Hughes Network Systems": "Hughes",
"HUGHES Network Systems": "Hughes",
"Hughes Network systems": "Hughes",
"HUGHES Network Systems Ltd": "Hughes",
"KT Corp.": "KT Corporation",
"LG Electronics Inc.": "LG Electronics",
"LG Uplus": "LG Electronics",
"OPPO (chongqing) Intelligence": "OPPO",
"Samsung Electronics GmbH": "Samsung",
"China Mobile International Ltd": "China Mobile",
"NOVAMINT": "Novamint",
"Eutelsat": "Eutelsat Group",
"Inmarsat Viasat": "Inmarsat",
"China Telecommunications": "China Telecom",
"SES S.A.": "SES",
"Ericsson GmbH": "Ericsson",
"JSAT": "SKY Perfect JSAT",
"NEC Europe Ltd": "NEC",
"Fraunhofer IIS": "Fraunhofer",
"Hugues Network Systems": "Hughes"
}
# Normalize company names within each cell
def normalize_companies(company_list, merge_entities):
normalized = set() # Use a set to avoid duplicates within the same cell
for company in company_list:
normalized_name = merge_entities.get(company.strip(), company.strip())
normalized.add(normalized_name)
return list(normalized)
# Prepare the filtered data
sources = filtered_data['Source'].dropna()
split_sources = sources.apply(lambda x: normalize_companies(x.split(', '), merge_entities))
# Flatten the list of lists while applying the merge rules
all_sources = [company for sublist in split_sources for company in sublist]
# Count occurrences
source_counts = Counter(all_sources)
top_10_sources = source_counts.most_common(10)
# Convert to DataFrame for plotting
top_10_df = pd.DataFrame(top_10_sources, columns=['Company', 'Count'])
# Plotting
plt.style.use('dark_background')
fig, ax = plt.subplots(figsize=(14, 11))
ax.set_facecolor('#222c52')
fig.patch.set_facecolor('#222c52')
# Alternating colors for the bars
colors = ['#08F7FE' if i % 2 == 0 else '#FE53BB' for i in range(len(top_10_df))]
top_10_df.plot(kind='bar', x='Company', y='Count', ax=ax, color=colors, edgecolor=colors, alpha=0.5, linewidth=5)
# Set chart details
ax.xaxis.label.set_color('white')
ax.yaxis.label.set_color('white')
ax.tick_params(axis='x', colors='white', labelsize=12, direction='out', length=6, width=2, rotation=45)
ax.tick_params(axis='y', colors='white', labelsize=12, direction='out', length=6, width=2)
ax.set_title(f"Top 10 Cotributors for Expert '{expert_name}'", color='white', fontsize=16)
ax.set_xlabel('Company', fontsize=14)
ax.set_ylabel('Count', fontsize=14)
ax.yaxis.set_major_locator(ticker.MaxNLocator(integer=True))
ax.grid(True, which='both', axis='y', color='gray', linestyle='-', linewidth=0.5, alpha=0.5)
ax.set_axisbelow(True)
for spine in ax.spines.values():
spine.set_color('white')
spine.set_linewidth(2)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
return fig
# @title Top 10 des entreprises en termes de publications
def generate_company_chart(file_path):
# plt.close('all')
# Define merge entities mapping
merge_entities = {
"Nokia Shanghai Bell": "Nokia",
"Qualcomm Korea": "Qualcomm",
"Qualcomm Incorporated": "Qualcomm",
"Huawei Technologies R&D UK": "Huawei",
"Hughes Network Systems": "Hughes",
"HUGHES Network Systems": "Hughes",
"Hughes Network systems": "Hughes",
"HUGHES Network Systems Ltd": "Hughes",
"KT Corp.": "KT Corporation",
"Deutsche Telekom AG": "Deutsche Telekom",
"LG Electronics Inc.": "LG Electronics",
"LG Uplus": "LG Electronics",
"OPPO (chongqing) Intelligence": "OPPO",
"Samsung Electronics GmbH": "Samsung",
"China Mobile International Ltd": "China Mobile",
"NOVAMINT": "Novamint",
"Eutelsat": "Eutelsat Group",
"Inmarsat Viasat": "Inmarsat",
"China Telecommunications": "China Telecom",
"SES S.A.": "SES",
"Ericsson GmbH": "Ericsson",
"JSAT": "SKY Perfect JSAT",
"NEC Europe Ltd": "NEC",
"Fraunhofer IIS": "Fraunhofer",
"Hugues Network Systems": "Hughes"
}
# Function to normalize company names within each cell
def normalize_companies(company_list, merge_entities):
normalized = set() # Use a set to avoid duplicates within the same cell
for company in company_list:
normalized_name = merge_entities.get(company.strip(), company.strip())
normalized.add(normalized_name)
return list(normalized)
# Load the Excel file
data = pd.read_excel(file_path)
# Prepare the data
sources = data['Source'].dropna()
split_sources = sources.apply(lambda x: normalize_companies(x.split(', '), merge_entities))
# Flatten the list of lists while applying the merge rules
all_sources = [company for sublist in split_sources for company in sublist]
# Count occurrences
source_counts = Counter(all_sources)
top_10_sources = source_counts.most_common(10)
# Convert to DataFrame for plotting
top_10_df = pd.DataFrame(top_10_sources, columns=['Company', 'Count'])
# Plotting
plt.style.use('dark_background')
fig, ax = plt.subplots(figsize=(14, 12))
ax.set_facecolor('#222c52')
fig.patch.set_facecolor('#222c52')
# Alternating colors for the bars
colors = ['#08F7FE' if i % 2 == 0 else '#FE53BB' for i in range(len(top_10_df))]
top_10_df.plot(kind='bar', x='Company', y='Count', ax=ax, color=colors, edgecolor=colors, alpha=0.5, linewidth=5, legend=None)
# Set chart details
ax.xaxis.label.set_color('white')
ax.yaxis.label.set_color('white')
ax.tick_params(axis='x', colors='white', labelsize=16, direction='out', length=6, width=2, rotation=37)
ax.tick_params(axis='y', colors='white', labelsize=12, direction='out', length=6, width=2)
ax.set_title('Top 10 Contributors: Ranking Company Contributions', color='white', fontsize=16)
ax.set_xlabel('Company', fontsize=14)
ax.set_ylabel('Count', fontsize=14)
ax.grid(True, which='both', axis='y', color='gray', linestyle='-', linewidth=0.5, alpha=0.5)
ax.set_axisbelow(True)
for spine in ax.spines.values():
spine.set_color('white')
spine.set_linewidth(2)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
#plt.show()
return fig