Skip to content
(SQL) Project: Analyzing Electric Vehicle Charging Habits
  • AI Chat
  • Code
  • Report
  • Analyzing Electric Vehicle Charging Habits

    Analyze data about electronic vehicle charging behavior to better use shared charging stations.

    As electronic vehicles (EVs) become more popular, there is an increasing need for access to charging stations, also known as ports. To that end, many modern apartment buildings have begun retrofitting their parking garages to include shared charging stations. A charging station is shared if it is accessible by anyone in the building.

    But with increasing demand comes competition for these ports — nothing is more frustrating than coming home to find no charging stations available! In this project, you will use a dataset to help apartment building managers better understand their tenants’ EV charging habits.

    The data has been loaded into a PostgreSQL database with a table named charging_sessions with the following columns:

    charging_sessions

    ColumnDefinitionData type
    garage_idIdentifier for the garage/buildingVARCHAR
    user_idIdentifier for the individual userVARCHAR
    user_typeIndicating whether the station is Shared or PrivateVARCHAR
    start_pluginThe date and time the session startedDATETIME
    start_plugin_hourThe hour (in military time) that the session startedNUMERIC
    end_plugoutThe date and time the session endedDATETIME
    end_plugout_hourThe hour (in military time) that the session endedNUMERIC
    duration_hoursThe length of the session, in hoursNUMERIC
    el_kwhAmount of electricity used (in Kilowatt hours)NUMERIC
    month_pluginThe month that the session startedVARCHAR
    weekdays_pluginThe day of the week that the session startedVARCHAR

    Let’s get started!

    Sources
    • Data: CC BY 4.0, via Kaggle,
    • Image: Julian Herzog, CC BY 4.0, via Wikimedia Commons
    Spinner
    DataFrameavailable as
    df2
    variable
    SELECT * FROM information_schema.columns
    WHERE table_name = 'charging_sessions'
    Spinner
    DataFrameavailable as
    df
    variable
    SELECT * FROM charging_sessions
    SELECT MAX(start_plugin) FROM public.charging_sessions
    SELECT user_type, COUNT(1)
    FROM charging_sessions
    GROUP BY user_type
    ORDER BY count

    1. Find the unique shared users for each garage

    Find the number of unique individuals that use each garage’s shared charging stations. The output should contain two columns: garage_id and num_unique_users. Sort your results by the number of unique users from highest to lowest. Save the result as unique_users_per_garage.

    Spinner
    DataFrameavailable as
    unique_users_per_garage
    variable
    -- unique_users_per_garage
    SELECT garage_id, COUNT(DISTINCT user_id) AS num_unique_users
    FROM charging_sessions
    WHERE user_type = 'Shared'
    GROUP BY garage_id 
    ORDER BY num_unique_users DESC

    2. Find the top 10 most popular starting charge times by day and hour

    Find the top 10 most popular charging start times (by weekday and start hour) for sessions that use shared charging stations. Your result should contain three columns: weekdays_plugin, start_plugin_hour, and a column named num_charging_sessions containing the number of plugins on that weekday at that hour. Sort your results from the most to the least number of sessions. Save the result as most_popular_shared_start_times.

    Spinner
    DataFrameavailable as
    most_popular_shared_start_times
    variable
    -- most_popular_shared_start_times
    SELECT weekdays_plugin, start_plugin_hour, COUNT(*) AS num_charging_sessions
    FROM charging_sessions
    WHERE user_type = 'Shared'
    GROUP BY weekdays_plugin, start_plugin_hour
    ORDER BY num_charging_sessions DESC
    LIMIT 10

    3. Find users with long average charging times

    Find the users whose average charging duration last longer than 10 hours when using shared charging stations. Your result should contain two columns: user_id and avg_charging_duration. Sort your result from highest to lowest average charging duration. Save the result as long_duration_shared_users.

    Spinner
    DataFrameavailable as
    long_duration_shared_users
    variable
    -- long_duration_shared_users
    SELECT user_id, AVG(duration_hours) AS avg_charging_duration
    FROM charging_sessions
    WHERE user_type = 'Shared'
    GROUP BY user_id
    HAVING AVG(duration_hours) > 10
    ORDER BY avg_charging_duration DESC