Skip to content
0
import pandas as pd
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go

df= pd.read_csv('./data/crowdfunding.csv')

# total donation amount
total_amount = int(df.amount.sum())

# total donors
total_donors = int(len(df.amount))

# highest donation amount
highest_amount = int(df.amount.max())

# median donation amount
median_amount = int(df.amount.median())


stats = go.Figure()

stats.add_trace(go.Indicator(
    mode = "number",
    title = {'text': "Total Funds Raised"},
    number = {'prefix': "$"},
    value = total_amount,
    domain = {'row': 0, 'column': 0}))

stats.add_trace(go.Indicator(
    mode = "number",
    title = {'text': "Number of Donations"},
    value = total_donors,
    domain = {'row': 0, 'column': 1}))

stats.add_trace(go.Indicator(
    mode = "number",
    number = {'prefix': "$"},
    title = {'text': "Median Donation"},
    value = median_amount,
    domain = {'row': 1, 'column': 0})) 

stats.add_trace(go.Indicator(
    mode = "number",
    number = {'prefix': "$"},
    title = {'text': "Highest Donation"},
    value = highest_amount,
    domain = {'row': 1, 'column': 1}))         

stats.update_layout(
    grid = {'rows': 2, 'columns': 2, 'pattern': "independent"},
    plot_bgcolor='#333',
    paper_bgcolor='#333',
    autosize=True,margin={'t': 50,'l':100,'b':50,'r':100},
    height=300,
    #width=500,
    template = {'data' : {'indicator': [{
        'title': {"font_color":"#ffffff","font_size":18, "font_family":"Lato, sans-serif"},
        'mode' : "number+delta+gauge",
        'number' : {"font_color":"#ffffff","font_size":52}}]  
     }})

stats.show()
# donut chart
fig_donut = px.pie(df, names='device', hole=0.7, title='<b>Most used device by donators',
                   color_discrete_sequence=['#e2e2e2', '#b1eb1e'])

fig_donut.update_traces(hovertemplate=None, textposition='outside', textinfo='percent+label', rotation=90)

fig_donut.update_layout(margin=dict(t=100, b=30, l=0, r=0),
                        showlegend=False,
                        plot_bgcolor='#333',
                        height=350,
                        #width=600,
                        paper_bgcolor='#333',
                        title_font=dict(size=30,
                        color='#ffffff',
                        family="Lato, sans-serif"),
                        font=dict(size=17, color='#ffffff'),
                        hoverlabel=dict(bgcolor="#444", font_size=13, font_family="Lato, sans-serif"))                      
fig_donut.show()

fig_top3 = px.histogram(df, 
    y='category',
    x="amount",
    title='<b>The biggest categorie donations',
    color="category",
    color_discrete_map={
                    "Sports": "#b1eb1e",
                    "Games": "#b1eb1e",
                    "Technology": "#b1eb1e",
                    "Environment": "#e2e2e2",
                    "Fashion": "#e2e2e2",
                    }
)
fig_top3.update_xaxes(visible=False,range = [150000, 170000])
fig_top3.update_yaxes(showgrid=False, ticksuffix='  ', showline=False,categoryorder='total ascending')
fig_top3.update_traces(hovertemplate=None, marker=dict(line=dict(width=0)))
fig_top3.update_layout(margin=dict(t=85, b=20, l=70, r=40),
                       hovermode="y unified", 
                       showlegend=False,
                       xaxis_title=' ',
                       yaxis_title=" ",
                       plot_bgcolor='#333',
                       paper_bgcolor='#333',
                       title_font=dict(size=30,
                       color='#ffffff',
                       family="Lato, sans-serif"),
                       #width=700,
                       #height=350,
                       font=dict(color='#ffffff', size=17),
                       hoverlabel=dict(bgcolor='#333', font_size=13, font_family="Lato, sans-serif"))
fig_top3.show()

# Age proportion per device
fig_age_p = px.histogram(df,
    y='age',
    histnorm="probability density",
    title='<b>Proportion of donations by age and device',
    color="device",
    barmode="group",
    labels={"device":""},
    color_discrete_sequence=['#e2e2e2', '#b1eb1e'],
    category_orders=dict(age=['18-24', '25-34', '35-44', '45-54', '55+']),
)
fig_age_p.update_xaxes(visible=False)
fig_age_p.update_yaxes(showgrid=False, ticksuffix='  ', showline=False)
fig_age_p.update_traces(hovertemplate=None, marker=dict(line=dict(width=0)))
fig_age_p.update_layout(margin=dict(t=85, b=20, l=70, r=40),
                       hovermode="y unified",
                       showlegend=True,
                       xaxis_title="",
                       yaxis_title="",
                       plot_bgcolor='#333',
                       paper_bgcolor='#333',
                       title_font=dict(size=30, color='#ffffff', family="Lato, sans-serif"),
                       #width=700,
                       #height=450,
                       legend=dict(orientation="h", yanchor="bottom", y=1, xanchor="center", x=0.5),
                       font=dict(color='#ffffff', size=15),
                       hoverlabel=dict(bgcolor='#333', font_size=13, font_family="Lato, sans-serif"))
fig_age_p.show()
# Age distribution
# making a copy of df
dff = df.copy()

# making 2 df one for iOS and another for android with category 
df_ios = dff[dff['device']=='iOS'][['age', 'device']].rename(columns={'device':'ios'})
df_android = dff[dff['device']=='android'][['age', 'device']].rename(columns={'device':'android'})


df_ios = pd.DataFrame(df_ios.age.value_counts()).reset_index().rename(columns={'index':'ios'})
df_ios['age_final'] = df_ios['age'] 
# making age column value negative
df_ios['age'] *= -1

df_android = pd.DataFrame(df_android.age.value_counts()).reset_index().rename(columns={'index':'android'})

fig_age_n = make_subplots(rows=1, cols=2, specs=[[{}, {}]], shared_yaxes=True, horizontal_spacing=0)
# bar plot for iOS
fig_age_n.append_trace(go.Bar(x=df_ios.age, y=df_ios.ios, orientation='h', showlegend=True, 
                        text=df_ios.age_final, name='iOS', marker_color='#e2e2e2'), 1, 1)
# bar plot for android
fig_age_n.append_trace(go.Bar(x=df_android.age, y=df_android.android, orientation='h', showlegend=True, text=df_android.age,
                        name='Android', marker_color='#b1eb1e'), 1, 2)
fig_age_n.update_xaxes(showgrid=False,visible=False)
fig_age_n.update_yaxes(showgrid=False, ticksuffix=' ', showline=False,categoryorder='array', categoryarray= ['55+','45-54','35-44','25-34','18-24'])
fig_age_n.update_traces(hovertemplate=None, marker=dict(line=dict(width=0)),texttemplate='%{text:.2s}')
fig_age_n.update_layout(title='<b>Number of donations across age and device',
                  margin=dict(t=100, b=0, l=70, r=40),
                  hovermode="y unified",
                  xaxis_title="",
                  yaxis_title="",
                  plot_bgcolor='#333',
                  paper_bgcolor='#333',
                  title_font=dict(size=30, color='#ffffff', family="Lato, sans-serif"),
                  font=dict(color='#ffffff', size=15),
                  legend=dict(orientation="h", yanchor="bottom", y=1, xanchor="center", x=0.5),
                  hoverlabel=dict(bgcolor='#333', font_size=13, font_family="Lato, sans-serif"))     
fig_age_n.show()   

# Amount distribution
fig_age = px.violin(df, x="amount", color ="device",violinmode="overlay",facet_col="age",
    color_discrete_sequence=['#e2e2e2', '#b1eb1e'],
    labels=dict(device=""),
    category_orders=dict(age=['18-24', '25-34', '35-44', '45-54', '55+']),
    facet_col_spacing=0
)
fig_age.update_traces(orientation='h', side='positive', meanline_visible=True, line_width=5, opacity=0.9,
points=False)
fig_age.update_xaxes(showgrid=False,zeroline=False, tickvals=["10","40","80"],title="",range=[0,100])
fig_age.update_yaxes(showgrid=False,zeroline=False,range=[0.01,0.25])
fig_age.update_layout(title='<B>Amount of donations distribution by age and device',
                  margin=dict(t=140, b=10, l=0, r=30), #l=left,r=ight,t=top,b=botton
                  width=450,
                  #height=400,
                  hovermode="y unified",
                  xaxis_title="",
                  yaxis_title="",
                  plot_bgcolor='#333',
                  paper_bgcolor='#333',
                  title_font=dict(size=30, color='#ffffff', family="Lato, sans-serif"),
                  font=dict(color='#ffffff', size=15),
                  legend=dict(orientation="h", yanchor="bottom", y=1.1, xanchor="center", x=0.5),
                  hoverlabel=dict(bgcolor='#333', font_size=13, font_family="Lato, sans-serif"))
fig_age.for_each_annotation(lambda a: a.update(text=a.text.split("=")[-1]))        
fig_age.show()