Skip to content
Competition - energy prices
  • AI Chat
  • Code
  • Report
  • Understanding the local electricity market

    📖 Background

    You work for an energy company in Australia. Your company builds solar panel arrays and then sells the energy they produce to industrial customers. The company wants to expand to the city of Melbourne in the state of Victoria.

    Prices and demand for electricity change every day. Customers pay for the energy received using a formula based on the local energy market's daily price.

    Your company's pricing committee wants your team to estimate energy prices for the next 12-18 months to use those prices as the basis for contract negotiations.

    In addition, the VP of strategy is researching investing in storage capacity (i.e., batteries) as a new source of revenue. The plan is to store some of the energy produced by the solar panels when pricing conditions are unfavorable and sell it by the next day on the open market if the prices are higher.

    💾 The data

    You have access to over five years of energy price and demand data (source):

    • "date" - from January 1, 2015, to October 6, 2020.
    • "demand" - daily electricity demand in MWh.
    • "price" - recommended retail price in AUD/MWh.
    • "demand_pos_price" - total daily demand at a positive price in MWh.
    • "price_positive" - average positive price, weighted by the corresponding intraday demand in AUD/MWh.
    • "demand_neg_price" - total daily demand at a negative price in MWh.
    • "price_negative" - average negative price, weighted by the corresponding intraday demand in AUD/MWh.
    • "frac_neg_price" - the fraction of the day when the demand traded at a negative price.
    • "min_temperature" - minimum temperature during the day in Celsius.
    • "max_temperature" - maximum temperature during the day in Celsius.
    • "solar_exposure" - total daily sunlight energy in MJ/m^2.
    • "rainfall" - daily rainfall in mm.
    • "school_day" - "Y" if that day was a school day, "N" otherwise.
    • "holiday" - "Y" if the day was a state or national holiday, "N" otherwise.

    Note: The price was negative during some intraday intervals, so energy producers were paying buyers rather than vice-versa.

    import pandas as pd
    df = pd.read_csv('./data/energy_demand.csv', parse_dates=['date'])

    💪 Competition challenge

    Create a report that covers the following:

    1. How do energy prices change throughout the year? Are there any patterns by season or month of the year?
    2. Build a forecast of daily energy prices the company can use as the basis of its financial planning.
    3. Provide guidance on how much revenue the energy storage venture could generate per year using retail prices and a 70MWh storage system.

    🧑‍⚖️ Judging criteria

    • Clarity of recommendations - how clear and well presented the recommendation is.
    • Quality of recommendations - are appropriate analytical techniques used & are the conclusions valid?
    • Number of relevant insights found for the target audience.
    • How well the data and insights are connected to the recommendation.
    • How the narrative and whole report connects together.
    • Balancing making the report in-depth enough but also concise.
    • Appropriateness of visualization used.
    • Clarity of insight from visualization.
    • Up voting - most upvoted entries get the most points.

    ✅ Checklist before publishing into the competition

    • Rename your workspace to make it descriptive of your work. N.B. you should leave the notebook name as notebook.ipynb.
    • Remove redundant cells like the judging criteria, so the workbook is focused on your story.
    • Make sure the workbook reads well and explains how you found your insights.
    • Try to include an executive summary of your recommendations at the beginning.
    • Check that all the cells run without error.

    ⌛️ Time is ticking. Good luck!

    import as px
    import seaborn as sns
    import matplotlib.pyplot as plt
    df = df.dropna()
    # calculate the correlation matrix
    corr = df.corr()
    # plot the heatmap
    sns.heatmap(corr, annot = True,  

    Deep diving into demand

    fig = px.line(df, x="date", y=["demand","demand_pos_price","demand_neg_price"], title='Demand of the Time')
    fig = px.violin(df, y=["demand","demand_pos_price"])
    fig = px.violin(df, y=["demand_neg_price"])