__copyright__ = "Copyright (C) 2023 Ali Mustapha"
__license__ = "GPL-3.0-or-later"
import pandas as pd
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go
def get_commits_per_gender(gender_counts):
gender_counts=gender_counts[gender_counts["Predicted_Gender"]!="Unknown"]
grouped = gender_counts.groupby('Year').agg({'Count': 'sum'})
grouped['Male Percentage'] = gender_counts[gender_counts['Predicted_Gender'] == 'Male'].groupby('Year')['Count'].sum() / grouped['Count'] * 100
grouped['Female Percentage'] = gender_counts[gender_counts['Predicted_Gender'] == 'Female'].groupby('Year')['Count'].sum() / grouped['Count'] * 100
grouped=grouped.fillna(0)
merged_gender_counts = grouped.merge(gender_counts, on=["Year"])[['Year', 'Male Percentage', 'Female Percentage',
'Predicted_Gender', 'Count_y']].rename(columns={"Count_y":"Count"})
male_count=merged_gender_counts[merged_gender_counts["Predicted_Gender"]=="Male"]
female_count=merged_gender_counts[merged_gender_counts["Predicted_Gender"]=="Female"]
fig = make_subplots(rows=1, cols=1, shared_xaxes=True)
# Add bars for Male and Female counts
fig.add_trace(
go.Bar(x=male_count['Year'], y=male_count['Count'], name='Male',
hovertemplate='Male Commits: %{y:.2f}
Male Percentage: %{customdata:.2f}', # Use customdata for the hovertemplate
customdata=male_count['Male Percentage']), # Use the 'Male Percentage' column for customdata
row=1, col=1
)
fig.add_trace(
go.Bar(x=female_count['Year'], y=female_count['Count'], name='Female',
hovertemplate='Female Commits: %{y:.2f}
Female Percentage: %{customdata:.2f}', # Use customdata for the hovertemplate
customdata=female_count['Female Percentage']), # Use the 'Female Percentage' column for customdata
row=1, col=1
)
return fig
def get_gender_percentage(df):
counts = df['Predicted_Gender'].value_counts().to_dict()
# Define the labels and their corresponding counts
labels = ["Male", "Female", "Unknown"]
values = [counts.get(label, 0) for label in labels]
Gender_Percentage_plot = go.Figure(data=[go.Pie(labels=labels, values=values, marker=dict(colors=["blue","pink","gray"]))])
return Gender_Percentage_plot
def get_commits_per_region(df,url):
Country_to_region=pd.read_csv("utils/CodeToRegion.csv")
Country_to_region=Country_to_region.rename(columns={"sub-region":"sub-region-prediction"})
# Group by Year and sub-region-prediction, then count unique sub-regions
sub_region_counts = df.groupby(['Year', "sub-region-prediction"])["sub-region-prediction"].count().reset_index(name='Count')
# Calculate the sums for each region
region_sums = sub_region_counts.groupby('sub-region-prediction')['Count'].sum().reset_index()
# Append 'All' rows to the DataFrame
df_all = region_sums.copy()
df_all['Year'] = 'Overall'
df_result = pd.concat([sub_region_counts, df_all], ignore_index=True, sort=False)
# Merge the sub_region_counts DataFrame with the Country_to_region DataFrame
merged_df = df_result.merge(Country_to_region, on="sub-region-prediction", how="left")
# Create a choropleth map using plotly.express
fig = go.Figure(data=px.choropleth(
merged_df,
locations="code3",
color="Count",
hover_name="sub-region-prediction",
# color_continuous_scale=px.colors.qualitative.Set3, # Choose your color scale
color_continuous_scale="Greens",
animation_frame="Year",
title="Counts by Sub-Region"
))
fig.update_layout(
title_text='Commits Counts by Sub-Region for '+url,
geo=dict(
showframe=False,
showcoastlines=False,
projection_type='equirectangular'
),
annotations = [dict(
x=0.55,
y=0.1,
xref='paper',
yref='paper',
text='Source: \
Geo-GenderStudy',
showarrow = False
)],
height=600, # Adjust the height as per your preference
width=1000 # Adjust the width as per your preference
)
return fig