Project
  • AI Chat
  • Code
  • Report
  • Beta
    Spinner


    Personal loans are a lucrative revenue stream for banks. The typical interest rate of a two year loan in the United Kingdom is around 10%. This might not sound like a lot, but in September 2022 alone UK consumers borrowed around £1.5 billion, which would mean approximately £300 million in interest generated by banks over two years!

    You have been asked to work with a bank to clean and store the data they collected as part of a recent marketing campaign, which aimed to get customers to take out a personal loan. They plan to conduct more marketing campaigns going forward so would like you to set up a PostgreSQL database to store this campaign's data, designing the schema in a way that would allow data from future campaigns to be easily imported.

    They have supplied you with a csv file called "bank_marketing.csv", which you will need to clean, reformat, and split, in order to save separate files based on the tables you will create. It is recommended to use pandas for these tasks.

    Lastly, you will write the SQL code that the bank can execute to create the tables and populate with the data from the csv files. As the bank are quite strict about their security, you'll provide the database design script as a .sql file that they can then run.

    You have been asked to design a database that will have three tables:

    client

    columndata typedescription
    idserialClient ID - primary key
    ageintegerClient's age in years
    jobtextClient's type of job
    maritaltextClient's marital status
    educationtextClient's level of education
    credit_defaultbooleanWhether the client's credit is in default
    housingbooleanWhether the client has an existing housing loan (mortgage)
    loanbooleanWhether the client has an existing personal loan

    campaign

    columndata typedescription
    campaign_idserialCampaign ID - primary key
    client_idserialClient ID - references id in the client table
    number_contactsintegerNumber of contact attempts to the client in the current campaign
    contact_durationintegerLast contact duration in seconds
    pdaysintegerNumber of days since contact in previous campaign (999 = not previously contacted)
    previous_campaign_contactsintegerNumber of contact attempts to the client in the previous campaign
    previous_outcomebooleanOutcome of the previous campaign
    campaign_outcomebooleanOutcome of the current campaign
    last_contact_datedateLast date the client was contacted

    economics

    columndata typedescription
    client_idserialClient ID - references id in the client table
    emp_var_ratefloatEmployment variation rate (quarterly indicator)
    cons_price_idxfloatConsumer price index (monthly indicator)
    euribor_three_monthsfloatEuro Interbank Offered Rate (euribor) three month rate (daily indicator)
    number_employedfloatNumber of employees (quarterly indicator)
    import pandas as pd
    import numpy as np
    
    # Start coding here...
    
    #import csv to pandas dataframe
    bank_marketing_df = pd.read_csv("bank_marketing.csv")
    
    
    #client dataframe
    client = bank_marketing_df[['client_id', 'age', 'job', 'marital', 'education', 'credit_default', 'housing', 'loan']]
    
    #campaign dataframe
    campaign = bank_marketing_df[['client_id', 'campaign', 'duration', 'pdays', 'previous', 'poutcome', 'y', ]]
    
    #economics dataframe
    economics = bank_marketing_df[['client_id', 'emp_var_rate', 'cons_price_idx', 'euribor3m', 'nr_employed']]
    
    #create rename dict
    rnm_client = {'client_id':'id'}
    rnm_campaign = {'duration': 'contact_duration', 'previous': 'previous_campaign_contacts', 'y': 'campaign_outcome', 'poutcome': 'previous_outcome', 'campaign': 'number_contacts'}
    rnm_economics = {'euribor3m': 'euribor_three_months', 'nr_employed': 'number_employed'}
    
    #rename
    client.rename(columns=rnm_client, inplace=True)
    campaign.rename(columns=rnm_campaign, inplace=True)
    economics.rename(columns=rnm_economics, inplace=True)
    
    #clean education
    client['education'] = client['education'].str.replace('.', '_')
    client['education'] = client['education'].replace('unknown', np.nan)
    
    #clean job
    client['job'] = client['job'].str.replace('.','')
    
    #convert previous_outcome values
    campaign['previous_outcome'] = campaign['previous_outcome'].replace({'success' : 1, 'failure' : 0})
    campaign['previous_outcome'] = campaign['previous_outcome'].replace('nonexistent', np.nan)
    
    #convert campaign_outcomes values
    campaign['campaign_outcome'] = campaign['campaign_outcome'].replace({'yes' : 1, 'no' : 0})
    
    #add campaign_id column
    campaign['campaign_id'] = '1'
    
    #add datetime column
    add_date_column = bank_marketing_df[['month', 'day']]
    campaign = campaign.join(add_date_column)
    campaign['year'] = '2022'
    campaign['month'] = campaign['month'].str.capitalize()
    campaign['day'] = campaign['day'].astype(str)
    campaign['last_contact_date'] = campaign['year'] + '-' + campaign['month'] + '-' + campaign['day']
    campaign['last_contact_date'] = pd.to_datetime(campaign['last_contact_date'], format='%Y-%b-%d')
    
    #drop unneeded columns
    campaign.drop(['month', 'day', 'year'], axis=1, inplace=True)
    
    #save to csv
    client.to_csv('client.csv', index=False)
    campaign.to_csv('campaign.csv', index=False)
    economics.to_csv('economics.csv', index=False)
    
    #SQL codes
    client_table = """CREATE TABLE client 
    (
        id SERIAL PRIMARY KEY
        age INTEGER
        job TEXT
        marital TEXT
        education TEXT
        credit_default BOOLEAN
        housing BOOLEAN
        loan BOOLEAN)
    ); 
    \copy client from 'client.csv' DELIMITER ',' CSV HEADER
    """
    
    campaign_table = """
    CREATE TABLE campaign (
    campaign_id SERIAL PRIMARY KEY
    client_id SERIAL REFERENCES client (id)
    number_contacts INTEGER
    contact_duration INTEGER
    pdays INTEGER
    previous_campaign_contacts INTEGER
    previous_outcome BOOLEAN
    campaign_outcome BOOLEAN
    last_contact_date DATE
    );
    
    \copy campaign from 'campaign.csv' DELIMITER ',' CSV HEADER
    """
    
    economics_table = """
    CREATE TABLE economics (
    client_id SERIAL REFERENCES client (id)
    emp_var_rate FLOAT
    cons_price_idx FLOAT
    euribor_three_months FLOAT
    number_employed FLOAT
    );
    
    \copy economics from 'economics.csv' DELIMITER ',' CSV HEADER
    """