{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ " # [EEP 147]: Introduction to Programming and the ESG" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\"alternateAES California Power Plant - Huntington Beach, CA
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " # Python Basics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this notebook, we will go over simple techniques in Python and Matplotlib that you can use to generate graphs that will help you in analyzing the ESG!\n", "\n", "\n", "First on our agenda is to import **dependencies** -- or packages in Python that add to the basic functions in Python. Kind of like accessorizing! For example, `matplotlib` allows us to generate the graphs we will be using.\n", "\n", "The format is as follows: from (package) import (stuff), where the \"stuff\" we're importing can range from a specific function in that package to a whole library of functions, as is the case when we type import (package) as (name)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from datascience import *\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "import numpy as np\n", "import pandas as pd\n", "plt.style.use('fivethirtyeight')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Section 1: Math in Python \n", "\n", "Python is the programming language that we will use in this lab. Although this lab will go over some basics, should you be more interested in learning Python feel free to check out the following resources:\n", "\n", "* **[Python Tutorial](https://docs.python.org/3.5/tutorial/)**: Introduction to Python from the creators of Python\n", "* **[Composing Programs](http://composingprograms.com/pages/11-getting-started.html)**: An introduction to programming with Python from CS 61A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Mathematical Expressions**\n", "In Python, we can carry out all the mathematical processes you know and love:\n", "\n", "* Add using `+`\n", "* Subtract using `-`\n", "* Multiply using `*`\n", "* Divide using `/`\n", "* Exponentiate using `**`\n", "* Floor divide using `//`\n", "* Take the remainder / modulo using `%`\n", "\n", "The most of these you should be familiar with, but let's go over some of the more obscure processes while beginning to implement some python code!\n", "\n", "To run the code in the following cells, press Shift + Enter/Return!" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# So what exactly does floor divide do?\n", "10 // 3" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# What about modulo?\n", "10 % 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Very cool! Now we'll let you try, and notice that we can use parentheses to organize our order of operations.\n", "\n", "**Exercise**: Take the product of *three* and *three to the power of six* and subtract 168." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Insert your code where the dots are:\n", "..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Awesome job! Feel free to add more cells using the + button in the upper left hand corner of the lab and play around with more mathematical expressions later! In the meantime, let's move on to the next section." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Section 2: Variables\n", "\n", "As you might recall, a name that is used to denote a value is called a variable. In python, variables can be declared and values can be assigned. Here are a few examples of variables and their assignment:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = 2\n", "m = 3\n", "b = 4\n", "y = m*x + b\n", "# Look familiar? Press shift + enter to see the value!\n", "y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Output and Printing**\n", "\n", "As you might have noticed at the end, there is a difference between returning and printing:\n", "\n", "* **Return**: A value that is not necessarily printed, but is stored away inside a computer if we assign or bind it to a name.\n", "* **Printing**: A value that pops up on our screen.\n", "We print using a **print** function and return a value using the **return** function.\n", "\n", "**Functions?**\n", "\n", "You might recall that a function receives input and correspondingly will output something. In Python, we have numerous functions, such as:\n", "\n", "* `print`: The command `print('hi')` will print 'hi' out to the screen.\n", "* `sum`: The command `sum(2,3,4)` will sum up the values enclosed in the parentheses and return the value.\n", "* And more!\n", "\n", "The best thing about functions is that, in Python, we can make our own functions! We will discuss this more in depth later, but for now just remember that to call a function, we write the name of the function, like `print()` and we place our arguments inside the parentheses. \n", "\n", "Let's try it for ourselves!\n", "\n", "**Exercise**: Try printing out the phrase 'Hello World!'" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Ellipsis" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Section 3: Functions and Loops\n", "\n", "A function is a block of organized, reusable code that is used to perform a single, related action. Take for example a factorial, denoted `x!`, which takes the initial value `x` and multiplies it by `x-1` and `x-2` and so on and so forth until it gets to 1! Typing this all out would look something like this:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "120" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Let's pick a random value for x:\n", "x = 5\n", "factorial = 5 * 4 * 3 * 2 * 1\n", "factorial" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This might not seem too troublesome now, but imagine doing this by hand for a larger number like 123! Instead, let's consider writing a function that can take in any value (such as 123) and output the factorial!\n", "\n", "**Function Structure**\n", "\n", "So how can we begin writing a function? Well there is a very simple structure to them:\n", "\n", "**def** function_name(arguments):\n", " [function procedures]\n", " **return** [output]\n", " \n", "There are some aspects of a function that are required no matter what kind of function you are writing. You will always begin writing a function by writing **def**, followed by the name of your function. Following the name of your function, you will want to specify your inputs by using parentheses and giving your inputs names. These names can be anything you'd like, but generally you'd like them to be memorable and symbolic of what you're trying to do.\n", "\n", "Before typing in your functions procedure in the **body** of your function, you'll want to end the first line with a `:`. Then you're ready to proceed to the body and second line of your function! You will want to indent (press tab or space 4 times) and write what you'd like your function to do.\n", "\n", "Lastly, you'll want to end the function by writing what you'd like your function to **return**.\n", "\n", "**Example**: Let's look at what a factorial function would look like!" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "120" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def factorial_func(x):\n", " product = 1\n", " while x > 0:\n", " product = product * x\n", " x = x - 1\n", " return product\n", "\n", "# Now let's test out our new factorial function!\n", "factorial_func(5)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Try calculating the factorial value for the big number from before:\n", "factorial_func(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Amazing! However, you might have noticed there were some new features used, which brings us to our next small topic.\n", "\n", "**Loops**\n", "\n", "Something that came in handy for this equation was a loop. A loop is a piece of code that repeats a block of code **while** a condition is true or **for** a certain number of times. Like we just not-so-subtly hinted, there are two very important kinds of loops: for loops and while loops. In the case of our function above, the code under the while loop was repeated **while** `x > 0`. On the other hand, a for loop will continue looping **for** a specified number of times." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Section 4: Data Structures\n", "\n", "So now that we know how to calculate things and create functions to do so, how can we organize large amounts of information?\n", "\n", "The solution to our problem is a data structure! A data structures is simply a means by which to contain and organize our data or information. They include:\n", "* **List**: A list holds an ordered collection of items similar to a grocery list.\n", "* **Dictionary**: Like an addressbook in which keys are associated with values (similar to names and phone numbers in addressbooks).\n", "* **Set**: An unordered collection of items, and they operate similar to how Venn Diagrams do.\n", "\n", "Here is how we can use lists:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Helen', 'Nadeem', 'Alma', 'Nika']" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Creating a list using brackets and commas in between:\n", "names = ['Helen', 'Nadeem', 'Alma', 'Nika']\n", "names" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Helen'" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The first name in our list, located at position 0:\n", "names[0]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Helen', 'Nadeem', 'Alma', 'Nika', 'Sam']" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Adding a name, feel free to change the name to yours!\n", "names.append('Sam')\n", "names" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise**: Now you try creating a list with the names of some of your friends or pets!" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# Create your list below:\n", "..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As opposed to a list (or array), a dictionary contains **keys** and **values** that, when defined, are separated by a colon. Take a look at the example below:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# Creating a dictionary\n", "dictionary = {'Helen': 'Math', 'Nadeem': 'Physics', 'Alma': 'Data Science', 'Nika': 'MCB'}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To call a certain value in a dictionary, we use the corresponding key:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Math'" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dictionary['Helen']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Calling an index won't work here! Feel free to play around with the dictionary or create your own. One thing to note is that in a given dictionary, the keys must be unique, but values do not have to be." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition to the data structures listed above, we can also organize our information in a table. Similar to Google Sheets or Microsoft Excel, we will be organzing our data into nice-looking tables." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Section 5: Tables\n", "In this section, we'll cover some basic table functions. In order to begin filtering through information stored in a table, we'll have to \"read in\" the information. Most of the time, information to be displayed as a table is stored as a `.csv` file which stands for **comma separated values**.\n", "\n", "To read in a file, we use the following command:\n", "\n", "`Table.read_table('file_name.csv')`\n", "\n", "and in order to store it, we'll assign it a name or label. We'll begin by reading in the file that you'll be using for the remainder of the lab:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# Just run this code block!\n", "ESG_table = Table.read_table('ESGPorfolios_forcsv.csv')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Group Group_num UNIT NAME Capacity_MW Heat_Rate_MMBTUperMWh Fuel_Price_USDperMMBTU Fuel_Cost_USDperMWH Var_OandM_USDperMWH Total_Var_Cost_USDperMWH Carbon_tonsperMWH FixedCst_OandM_perDay Plant_ID
Big Coal 1 FOUR CORNERS 1900 11.67 3 35 1.5 36.5 1.1 $8,000 11
Big Coal 1 ALAMITOS 7 250 16.05 4.5 72.22 1.5 73.72 0.85 $0 12
Big Coal 1 HUNTINGTON BEACH 1&2 300 8.67 4.5 39 1.5 40.5 0.46 $2,000 13
Big Coal 1 HUNTINGTON BEACH 5 150 14.44 4.5 65 1.5 66.5 0.77 $2,000 14
Big Coal 1 REDONDO 5&6 350 8.99 4.5 40.44 1.5 41.94 0.48 $3,000 15
\n", "

... (37 rows omitted)

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ESG_table.show(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Table Manipulations**\n", "\n", "One of the many manipulations you can make on a table is to sort it by some value. When do you think this might be helpful?\n", "\n", "In order to sort, we will use the following table method:\n", "\n", "`table.sort(\"column_to_sort_by\", descending = False)` in which `table` is the table you are working with, `.sort` is the table method, and `\"column_to_sort_by\"` is the column label that you'd like to use when sorting your table. The label must be placed in quotation marks as it is a string or phrase. Lastly, an optional second command can be passed in following the comma.\n", "\n", "Something important to note is the second entry in the table method `table.sort`. This second argument is optional and decides whether the table will be sorted in either the ascending or descending manner. You are perfectly able to use the `table.sort` method without specifying an order.\n", "\n", "The following code sorts the different groups in ascending order by their Total_Var_Cost and assigns this sorted table to a new name. Here we've specified ascending order manually, however the default for the method, given that you didn't specify anything will always be `descending = False`." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "ESG_sorted = ESG_table.sort(\"Total_Var_Cost_USDperMWH\", descending = False)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Group Group_num UNIT NAME Capacity_MW Heat_Rate_MMBTUperMWh Fuel_Price_USDperMMBTU Fuel_Cost_USDperMWH Var_OandM_USDperMWH Total_Var_Cost_USDperMWH Carbon_tonsperMWH FixedCst_OandM_perDay Plant_ID
Old Timers 7 BIG CREEK 1000 nan 0 0 0 0 0 $15,000 61
Fossil Light 8 HELMS 800 nan 0 0 0.5 0.5 0 $15,000 72
Fossil Light 8 DIABLO CANYON 1 1000 1 7.5 7.5 4 11.5 0 $20,000 75
Bay Views 4 MOSS LANDING 6 750 6.9 4.5 31.06 1.5 32.56 0.37 $8,000 33
Bay Views 4 MOSS LANDING 7 750 6.9 4.5 31.06 1.5 32.56 0.37 $8,000 34
\n", "

... (37 rows omitted)

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Run this code block to view the sorted table; compare it to the first one that we looked at:\n", "ESG_sorted.show(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So we've seen how to sort in ascending order, but what if we wanted the most expensive group first? We can simply run the same command but use the optional input, `descending = True`. Try it out in the code block below:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Group Group_num UNIT NAME Capacity_MW Heat_Rate_MMBTUperMWh Fuel_Price_USDperMMBTU Fuel_Cost_USDperMWH Var_OandM_USDperMWH Total_Var_Cost_USDperMWH Carbon_tonsperMWH FixedCst_OandM_perDay Plant_ID
Big Gas 2 KEARNY 200 19.9 4.5 89.56 0.5 90.06 1.06 $0 26
Fossil Light 8 HUNTERS POINT 4 250 16.53 4.5 74.39 1.5 75.89 0.88 $1,000 74
Beachfront 5 ELLWOOD 300 16.69 4.5 75.11 0.5 75.61 0.89 $0 44
Big Coal 1 ALAMITOS 7 250 16.05 4.5 72.22 1.5 73.72 0.85 $0 12
East Bay 6 POTRERO HILL 150 15.41 4.5 69.33 0.5 69.83 0.82 $0 56
Big Coal 1 HUNTINGTON BEACH 5 150 14.44 4.5 65 1.5 66.5 0.77 $2,000 14
Big Gas 2 NORTH ISLAND 150 14.44 4.5 65 0.5 65.5 0.77 $0 24
Beachfront 5 ETIWANDA 5 150 13.64 4.5 61.39 1.5 62.89 0.72 $1,000 43
Bay Views 4 OAKLAND 150 13.48 4.5 60.67 0.5 61.17 0.72 $0 35
East Bay 6 PITTSBURGH 7 700 13.16 4.5 59.22 0.5 59.72 0.7 $4,000 53
\n", "

... (32 rows omitted)

" ], "text/plain": [ "Group | Group_num | UNIT NAME | Capacity_MW | Heat_Rate_MMBTUperMWh | Fuel_Price_USDperMMBTU | Fuel_Cost_USDperMWH | Var_OandM_USDperMWH | Total_Var_Cost_USDperMWH | Carbon_tonsperMWH | FixedCst_OandM_perDay | Plant_ID\n", "Big Gas | 2 | KEARNY | 200 | 19.9 | 4.5 | 89.56 | 0.5 | 90.06 | 1.06 | $0 | 26\n", "Fossil Light | 8 | HUNTERS POINT 4 | 250 | 16.53 | 4.5 | 74.39 | 1.5 | 75.89 | 0.88 | $1,000 | 74\n", "Beachfront | 5 | ELLWOOD | 300 | 16.69 | 4.5 | 75.11 | 0.5 | 75.61 | 0.89 | $0 | 44\n", "Big Coal | 1 | ALAMITOS 7 | 250 | 16.05 | 4.5 | 72.22 | 1.5 | 73.72 | 0.85 | $0 | 12\n", "East Bay | 6 | POTRERO HILL | 150 | 15.41 | 4.5 | 69.33 | 0.5 | 69.83 | 0.82 | $0 | 56\n", "Big Coal | 1 | HUNTINGTON BEACH 5 | 150 | 14.44 | 4.5 | 65 | 1.5 | 66.5 | 0.77 | $2,000 | 14\n", "Big Gas | 2 | NORTH ISLAND | 150 | 14.44 | 4.5 | 65 | 0.5 | 65.5 | 0.77 | $0 | 24\n", "Beachfront | 5 | ETIWANDA 5 | 150 | 13.64 | 4.5 | 61.39 | 1.5 | 62.89 | 0.72 | $1,000 | 43\n", "Bay Views | 4 | OAKLAND | 150 | 13.48 | 4.5 | 60.67 | 0.5 | 61.17 | 0.72 | $0 | 35\n", "East Bay | 6 | PITTSBURGH 7 | 700 | 13.16 | 4.5 | 59.22 | 0.5 | 59.72 | 0.7 | $4,000 | 53\n", "... (32 rows omitted)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Replace the ellipsis below with the correct command:\n", "ESG_table.sort(\"Total_Var_Cost_USDperMWH\", ... )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are a wide variety of table methods, but here are the highlights, followed with examples:\n", "\n", "* `table.where(column, value_you_want)`, where *column* is the column you'd like to select from and *value_you_want* is the item you're searching for. The output will be a table that only contains elements that are the value you want for the column you specified.\n", "* `table.column(column)`, where *column* is again the column you'd like to select. However, this method returns the entire column as an **array** of the items in that column!\n", "\n", "Note that when specifying a column, you can use either the string label or the index of the column. And don't forget that in python, we begin counting (or indexing) at 0. Below are some examples:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Group Group_num UNIT NAME Capacity_MW Heat_Rate_MMBTUperMWh Fuel_Price_USDperMMBTU Fuel_Cost_USDperMWH Var_OandM_USDperMWH Total_Var_Cost_USDperMWH Carbon_tonsperMWH FixedCst_OandM_perDay Plant_ID
Big Coal 1 FOUR CORNERS 1900 11.67 3 35 1.5 36.5 1.1 $8,000 11
Big Coal 1 HUNTINGTON BEACH 1&2 300 8.67 4.5 39 1.5 40.5 0.46 $2,000 13
Big Coal 1 REDONDO 5&6 350 8.99 4.5 40.44 1.5 41.94 0.48 $3,000 15
Big Coal 1 REDONDO 7&8 950 8.99 4.5 40.44 1.5 41.94 0.48 $5,000 16
Big Coal 1 HUNTINGTON BEACH 5 150 14.44 4.5 65 1.5 66.5 0.77 $2,000 14
Big Coal 1 ALAMITOS 7 250 16.05 4.5 72.22 1.5 73.72 0.85 $0 12
" ], "text/plain": [ "Group | Group_num | UNIT NAME | Capacity_MW | Heat_Rate_MMBTUperMWh | Fuel_Price_USDperMMBTU | Fuel_Cost_USDperMWH | Var_OandM_USDperMWH | Total_Var_Cost_USDperMWH | Carbon_tonsperMWH | FixedCst_OandM_perDay | Plant_ID\n", "Big Coal | 1 | FOUR CORNERS | 1900 | 11.67 | 3 | 35 | 1.5 | 36.5 | 1.1 | $8,000 | 11\n", "Big Coal | 1 | HUNTINGTON BEACH 1&2 | 300 | 8.67 | 4.5 | 39 | 1.5 | 40.5 | 0.46 | $2,000 | 13\n", "Big Coal | 1 | REDONDO 5&6 | 350 | 8.99 | 4.5 | 40.44 | 1.5 | 41.94 | 0.48 | $3,000 | 15\n", "Big Coal | 1 | REDONDO 7&8 | 950 | 8.99 | 4.5 | 40.44 | 1.5 | 41.94 | 0.48 | $5,000 | 16\n", "Big Coal | 1 | HUNTINGTON BEACH 5 | 150 | 14.44 | 4.5 | 65 | 1.5 | 66.5 | 0.77 | $2,000 | 14\n", "Big Coal | 1 | ALAMITOS 7 | 250 | 16.05 | 4.5 | 72.22 | 1.5 | 73.72 | 0.85 | $0 | 12" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Big_Coal= ESG_sorted.where(\"Group\",\"Big Coal\")\n", "Big_Coal" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**But perhaps you're interested in a specific group?** In the code block below, select what group you'd like to take a closer look at?" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "# REPLACE '...' with your specific group! Remember that the input should be a string, so don't remove the quotes!\n", "selection = 'Big Coal'\n", "Group = ESG_sorted.where(\"Group\", selection)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the original table, we extract information about one particular group: Big Coal. In the following code blocks we create 2 arrays, **width_coal** and **height_coal**. The items of the **width_coal** array are basically the capacity of Big Coal plants in MWH while **height_coal** contains their cost in USD per MWH." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "width_coal: [1900 300 350 950 150 250]\n", "height_coal: [1900 300 350 950 150 250]\n" ] } ], "source": [ "# Here we select the appropriate columns:\n", "width_group = Group.column(\"Capacity_MW\")\n", "height_group = Group.column(\"Total_Var_Cost_USDperMWH\")\n", "\n", "# Don't worry about the following code, we are simply making it 'look nice':\n", "print(\"width_coal: \", width_group)\n", "print(\"height_coal: \", width_group)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###
Congratulations! You've successfully completed the Intro to Python section!
\n", "\n", "
We will now move onto the application of these techniques. Make sure you understand the tables we created as we will be using these in the parts that follow.
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Application to the Electricity Strategy Game" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we will use the widths we generated from the sorted ESG table and create an array of x positions used to graph the Variable Cost vs Capacity_MW bar graph with the **find_x_pos** function." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "def find_x_pos(widths):\n", " cumulative_widths = [0]\n", " cumulative_widths.extend(np.cumsum(widths))\n", " half_widths = [i/2 for i in widths]\n", " x_pos = []\n", " for i in range(0, len(half_widths)):\n", " x_pos.append(half_widths[i] + cumulative_widths[i])\n", " return x_pos\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[950.0, 2050.0, 2375.0, 3025.0, 3575.0, 3775.0]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_x_group = find_x_pos(width_group)\n", "new_x_group" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we make a bar plot of the data we have collected so far, with **new_x_coal** on the x axis and **height_coal** on the y axis." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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jh07avTo0fL395cknThxQkuXLtX06dPl4uKip59+usKKBQAAwP+xO8i988476tatmz7++GPrd6xKUps2bTRo0CA9+OCDeueddwhyAAAAlcTur+jKyspS//79bUKcdZAqVTRgwABlZWWVa3EAAAAomd1BrnXr1jp+/HiJ7cePH1ebNm3KpSgAAADcmN2XVufOnauIiAg1atRIjz32mGrWrClJunTpkpYtW6ZNmzZp3bp1FVYoAAAAbJUY5Dp16lS8s5ubpk+frpkzZ8rb21uSlJ6eritXrqhBgwaKiorSnj17Kq5aJ/D/3lmpzCsO+4pap5F3KU/uNd0dXYZDMQdFbsV5SD51Wgp2dBUAcGMlJpI6deoUux+ubt26atSokc22hg0bVkxlTurH87/r605Rji4DQAWqc+JlR5cAAHYpMcht27atMusAAABAGdn9YQcAAAA4lzLf7FVQUKATJ07o/PnzKiwsLNYeFhZWLoUBAACgdHYHOYvFolmzZundd99Vbm5uif1++eWXcikMAAAApbP70upbb72lefPmacCAAVq4cKEsFoumTZum2NhYNWvWTK1atVJ8fHxF1goAAIA/sDvIvf/+++rfv78WLlyo+++/X5IUEhKixx9/XAkJCfr999+1f//+CisUAAAAtuwOcqdPn1aPHj2K3lSl6G2XL1+WJNWoUUPDhw/X6tWrK6BEAAAAXI/dQc5kMik/P19S0TPmqlatqrNnz1rb3d3d+a5VAACASmR3kAsMDNThw4eL3lSlikJDQ7V8+XKlp6crLS1NK1asUEBAQIUVCgAAAFt2f2p1yJAhWrZsmfLz81WjRg1NnTpVgwcPVvPmzYsGcnPTqlWrKqxQAAAA2LI7yD3yyCN65JFHrK87d+6sxMREffbZZ3J1dVXv3r3VtGnTCikSAAAAxf2pb39v0qSJxo0bV161AAAAoAz4ii4AAACDKvGMXEhIiKpUqaKkpCS5ubkpJCRELi4upQ7m4uKif//73+VeJAAAAIorMci1a9dOkqzh7eprAAAAOIcSg9zixYtLfQ0AAADHsuseuby8PI0fP16bNm2q6HoAAABgJ7uCnLu7u+Lj45WdnV3R9QAAAMBOdn9qNTg4WN99911F1gIAAIAysDvIzZo1Sxs3btR7772nK1euVGRNAAAAsIPdDwSOiopSlSpV9MILLyg6Olo+Pj6q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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Make the plot\n", "plt.figure(figsize=(9,6))\n", "plt.bar(new_x_group, height_group, width=width_group, edgecolor = \"black\")\n", "# Add title and axis names\n", "plt.title(selection)\n", "plt.xlabel('Capacity_MW')\n", "plt.ylabel('Variable Cost')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Repeat the same process, this time for all the energy sources. Since we are not concerned with any one particular group here, we use the original **ESG_sorted** table." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0.5 , 11.5 , 32.56, 32.56, 34.5 , 34.5 , 36.5 , 36.61,\n", " 36.61, 38.06, 38.06, 38.78, 39.06, 39.5 , 40.5 , 40.94, 41.22,\n", " 41.67, 41.94, 41.94, 42.39, 42.67, 43.83, 44.83, 47.44, 49.17,\n", " 49.61, 52.06, 52.5 , 53.94, 58.28, 59.72, 61.17, 62.89, 65.5 ,\n", " 66.5 , 69.83, 73.72, 75.61, 75.89, 90.06])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "width = ESG_sorted.column(\"Capacity_MW\")\n", "width\n", "height = ESG_sorted.column(\"Total_Var_Cost_USDperMWH\")\n", "height" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "new_x = find_x_pos(width)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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oQ0AAMAACG0AAAAGQGgDAAAwAEIbAACAAfAYKwAAYBi3PmtUuv+fN3orQhsAADCMW581Kt3/zxu9FadHAQAADIDQBgAAYACcHgUAAHnardex5adr2G5HaAMAAHnardex5adr2G7H6VEAAAADILQBAAAYAKENAADAAAhtAAAABkBoAwAAMABCGwAAgAEQ2gAAAAyAedoAAECekp8fCp8dQhsAAMhT8vND4bPD6VEAAAADsDm0vf766/r111+zXP/777/r9ddft0tRAAAAsGZzaFu8eLGOHz+e5fq///5bX3zxhV2KAgAAgDW7nR69cOGCChcubK/uAAAAcItsb0SIjIzUzp07La+//fZbnTp1KkO7hIQERUREqEaNGvavEAAAANmHtp9//lmTJ0+WJLm4uGjNmjVas2ZNpm39/f0VFhaWo43/888/GjdunH744QclJiaqUqVK+uCDD/Too49Kksxms8LCwrRo0SIlJCSobt26mjp1qqpVq5aj7QAAgLzt1mk+mOIjc9mGtsGDB6tv374ym80KCAjQ1KlT9fTTT1u1cXFxUdGiReXh4ZGjDSckJKhVq1Zq2LChVqxYodKlS+vkyZPy9PS0tJkxY4Zmz56t2bNny9/fX1OmTFGnTp20Z88eFS9ePEfbAwAAedet03wwxUfmsg1tHh4eljD222+/ycvLK8fhLCsfffSRypYtq08//dSyrFKlSpY/m81mzZkzR0OGDFGHDh0kSXPmzJG/v78iIiLUp08fu9QBAABgBDbfiODj46OUlBSrZRcvXtRHH32k9957T3v37s3RhtevX6+6deuqT58+qly5sh599FF99tlnMpvNkqSTJ08qNjZWzZo1s7zH3d1djRo10q5du3K0LQAAAKOz+YkIgwcP1oEDB7Rt2zZJUlJSklq0aGGZBmTmzJn673//qwYNGtjU34kTJzR//ny9+uqrGjJkiPbv36+RI0dKkl566SXFxsZKktXp0vTXZ8+ezbLf6OhoW3fpruXGNpB7OJ73F47n/Ydjen/J6ngmXUuy/DklJdVq3a2vc7LuTstz8p6ka0kO/7vo7++f7XqbQ9uOHTvUo0cPy+uVK1fq+PHj+uqrrxQYGKjQ0FCFh4dr5cqVNvWXmpqqOnXq6N1335Uk1a5dW8ePH9e8efP00ksv2VpWBnfa4XsVHR3t8G0g93A87y8cz/sP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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Make the plot\n", "plt.figure(figsize=(9,6))\n", "plt.bar(new_x, height, width=width, edgecolor = \"black\")\n", "#plt.xticks(y_pos, bars)\n", "# Add title and axis names\n", "plt.title('All Energy Sources')\n", "plt.xlabel('Capacity_MW')\n", "plt.ylabel('Variable Cost')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our aim now is to make a plot which shows all the different groups with unique colors. The first step in doing this is creating a dictionary called **energy_colors_dict** in which the groups and colors are a key-value pair. We use the following code to accomplish this:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "energy_colors_dict = {}\n", "count = 0\n", "colors = ['#EC5F67', '#F29056', '#F9C863', '#99C794', '#5FB3B3', '#6699CC', '#C594C5']\n", "for i in set(ESG_sorted['Group']):\n", " energy_colors_dict[i] = colors[count]\n", " count += 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we just map the colors from our dictionary to a series which contains all the groups. Our resultant list will have the same length as the **ESG_sorted** table." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "scrolled": true }, "outputs": [], "source": [ "colors_mapped = list(pd.Series(ESG_sorted['Group']).map(energy_colors_dict))\n", "ESG_sorted = ESG_sorted.with_column('Color', colors_mapped)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our plot now shows the Variable Cost and Capacity for each group in a different color." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm0AAAGpCAYAAADfmgGBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xt8j/X/x/HnDg4zhzlsQ8PKxhzmMIctokIicihnJaSDUJIzlS9iQyK0yiGEbxihr6JCOc2hg5JTQxjZzGa2sZHt8/tjP5987OAzO3x2bY/77eZ287mu9/W+Xtf13md73q6jXWxsrEkAAADI1+xtXQAAAADujdAGAABgAIQ2AAAAAyC0AQAAGAChDQAAwAAIbQAAAAZAaAMKmZUrV8rFxUUrV660mO7r6ytfX18bVQUAuBdCG1BABAcHy8XFRS4uLvrpp59yfX2+vr7m9WX07+5gCCkyMlITJkxQQECAKleuLHd3d9WpU0ft2rXTO++8o6NHj9q6RAD5lKOtCwCQM5YtWyY7OzuZTCYtXbpUjRs3zpP1vvrqqypTpky68zhyZ+nYsWPq2LGjoqOjVbt2bfXq1Utly5ZVdHS0fvnlF82bN09ly5ZV7dq1bV0qgHyI0AYUAHv37tXx48fVvXt3hYaG6ssvv9S0adNUunTpXF/34MGDVa1atVxfT0Ewfvx4RUdHa+zYsRo7dmya+efPn9eVK1dsUBkAI+D0KFAALF26VJL03HPPqXfv3rp27ZrWrl1r26LusmvXLrm4uGjw4ME6e/asBg4cqIceekju7u567LHHtGXLlgyX3bhxozp37ixPT0+5ubnJz89PkyZNUlxcXJq2t0/b3rhxQ9OnT5efn59cXV0tQlJERIRee+01eXl5qWLFinrkkUe0atUqc43Tp083t33iiSdUtmxZnTlzJt3alixZIhcXF02dOvWe+2D//v2SUo9OpsfDwyPdo5OXLl3S6NGjVb9+fbm5uenBBx9Uz549tWfPnjRtM7pm8bb0rl28vcz06dN18OBBdevWTdWqVZOLi4tiY2PN7cLCwjR06FDVq1dPbm5uql69utq2bav58+enWc/p06c1bNgw1a1b19y2b9++OnToUJq28fHxmjlzppo1a6aqVavqgQceUL169fTcc89p165d6W4HUBgR2gCDu3LlijZt2qQqVaqoZcuW6tu3r+zs7LRs2TJbl5au8PBwtW7dWufOnVPPnj3VtWtXHTt2TH369NHOnTvTtH/rrbf0wgsv6OTJk+rYsaNefvllubm5ac6cOWrXrp3i4+PTXU+/fv20bNkyPfzwwxo8eLC8vb0lSVFRUXriiSe0atUqeXt7a/DgwapXr55Gjhypjz/+OE0/AwcOlMlk0vLly9Ndz2effSZ7e3u98MIL99z2smXLSpJOnTp1z7a3nTt3To8//rg+/fRTeXh4aMiQIWrXrp127typp59+OkevGzxw4ICeeuop3bp1S/369VOPHj3k4OAgSdq6datatmyplStXqkaNGhoyZIi6dOkiBwcHzZo1y6KfH3/8US1bttR///tf1a9fX6+++qpatWqlbdu26cknn9S2bdvMbU0mk7p166b33ntPTk5O6tu3rwYNGqSAgAAdOnRIP/74Y45tH2B0nB4FDO6///2vkpKS1Lt3b9nZ2cnT01PNmjXTnj179Msvv8jPzy9X1x8cHJzhNW2DBw+Wi4uLxbTdu3enOT3YvXt3Pfvss5o3b55atmxpnr569WotXrxYHTt21MKFC+Xk5GSeN3PmTL333nsKDAzUe++9l2bd4eHh2rNnj8qXL28x/T//+Y/Cw8M1ZMgQi+UGDx6s1q1bp+mna9eumjBhglasWKFx48apSJEi5nk//fSTDh8+rCeffFJVqlTJaBdZ9DV//nz16tVLAwcOVIsWLVS3bt00++hOI0aM0IULF9Lss6FDh6pNmzYaMWKEHnvsMT3wwAP3XP+97NixQ3PmzFH//v0tpkdHR+ull17SP//8ow0bNujRRx+1mH/+/Hnz/69evaoBAwaoSJEi+v777+Xj42Oed+LECbVu3VpDhgzRb7/9pmLFiuno0aPav3+/nnrqKa1atcqiX5PJxOli4A4caQMM7vYNCH369DFP69u3r6R/T5vmpo8//lhBQUHp/rt69Wqa9lWqVNGoUaMsprVu3VoeHh76+eefLaZ/9NFHcnBw0Lx58ywCm5QaZsqXL681a9akW9eECRPSBLabN29q3bp1KlWqlEaPHm0xz9fXV7169UrTT/HixfXcc8/p0qVL2rx5s8W8zz77TJI0YMCAdGu429tvv60XXnhBV65cUVBQkDp27ChPT081bNhQb775Zpo7R//++299//33euCBBzRixAiL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2bOnjh49atGG72jeyvehTZIGDRqkw4cP69KlS/rxxx/VvHnzPF0/D/jN37y9vXXixAnzvzsD9dy5c7VgwQIFBQVp+/btcnV1VdeuXRUfH29uM2jQIP3+++8KCQlRSEiIfv/9d73yyivm+XFxceratavc3Ny0fft2BQYGat68eZo/f36ebmdBdO3aNdWuXVuBgYFycnJKMz+vxu/AgQMaOHCgunfvrl27dql79+7q37+/fvrpp9zdAQXMvcZTkh577DGL7+vatWst5o8bN05fffWVFi9erK+//lrx8fHq2bOnkpOTJUnJycnq2bOnEhIS9PXXX2vx4sXatGmTJkyYYO7jzJkz6tGjh5o2baqdO3dqxIgRGj16tDZu3Jh7G18A7d69Wy+++KK2bt2qTZs2ydHRUV26dNGVK1fMbfiO5q18/Zy2/KJ169aqU6eOPvzwQ/M0Pz8/de7cucA94Ndopk+frk2bNik0NDTNPJPJJB8fH7300ksaOXKkJCkxMVHe3t6aMmWKBgwYoBMnTsjf319btmxRQECAJCk0NFTt27fXwYMH5e3trcWLF2vSpEn6888/zX+IZs6cqSVLlujo0aOys7PLuw0uwB544AHNmDFDffv2lZS34zdgwABduXJFGzZsMNfTuXNnVahQQYsXL87jPVEw3D2eUuqRtpiYGK1evTrdZa5evSovLy8tWLBAPXr0kCSdP39evr6+CgkJUevWrfXdd9+pR48eOnz4sDw8PCRJq1ev1uuvv66wsDCVLl1a7777rr766iv98ssv5r6HDRum48eP67vvvsvFrS7YEhISVLVqVa1cuVLt27fnO2oDhjjSZks3b97UoUOH1KpVK4vprVq10v79+21UFe505swZ+fj4qF69eho4cKDOnDkjSTp79qwiIyMtxs7JyUnNmjUzj92BAwdUsmRJixtbAgIC5OzsbNHm4Ycftjhy0Lp1a128eFFnz57Ngy0snPJy/A4ePJjmO966dWu+47kgNDRUXl5eatSokV5//XWLpwMcOnRI//zzj8VYeHh4qGbNmhbjWbNmTXNgk1LH6saNGzp06JC5TXrj+euvv+qff/7Jzc0r0BISEpSSkiIXFxdJfEdtgdB2DzzgN39r3LixPvroI4WEhOjDDz9UZGSk2rZtq5iYGEVGRkpSpmN36dIllS9f3uJomZ2dnSpUqGDRJr0+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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Make the plot\n", "plt.figure(figsize=(9,6))\n", "plt.bar(new_x, height, width=width, color=ESG_sorted['Color'], edgecolor = \"black\")\n", "#plt.xticks(y_pos, bars)\n", "# Add title and axis names\n", "plt.title('All Energy Sources')\n", "plt.xlabel('Capacity_MW')\n", "plt.ylabel('Variable Cost')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To make sense of which color corresponds to which group, we make a plot that can serve as a legend for our colors." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(5,1))\n", "plt.bar(energy_colors_dict.keys(), 1, color = energy_colors_dict.values())\n", "plt.xticks(rotation=60)\n", "plt.title('Legend')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prediction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to determine the market price of energy in our simulation, we rely on the graphs we produced above, but we're missing one key factor: **demand**. We don't know exactly how much energy will be demanded in a given frame of time, however we can make predictions based off of estimates that we are given, and use those predictions to calculate the profitability of our plants." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can set an estimated demand below." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "demand = 20000" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The functions below will calculate the maximum variable cost companies can have in order to make profit based on the demand above. For now, we will make the assumption that plants are willing to sell at a price equal to their variable cost." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "def price_calc(demand, sorted_table):\n", " price = 0\n", " sum_cap = 0\n", " for i in range(0,len(sorted_table['Capacity_MW'])):\n", " if sum_cap + sorted_table['Capacity_MW'][i] > demand:\n", " price = sorted_table['Total_Var_Cost_USDperMWH'][i]\n", " break\n", " else:\n", " sum_cap += sorted_table['Capacity_MW'][i]\n", " price = sorted_table['Total_Var_Cost_USDperMWH'][i]\n", " return price" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "59.72" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "price = price_calc(demand, ESG_sorted)\n", "price" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "def price_line_plot(price):\n", " plt.axhline(y=price, color='r', linewidth = 2)\n", " print(\"Price: \" + str(price))" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "def demand_plot(demand):\n", " plt.axvline(x=demand, color='r', linewidth = 2)\n", " print(\"Capacity: \" + str(demand))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next we will add the vertical line for demand and horizontal line for variable cost cap into the graph. Since we have our plants graphed in order of lowest variable cost to highest variable cost, we can see that the companies to the left of the vertical demand line will produce energy while the companies to the right of the vertical demand line will not. This is because the public will purchase from the plants that have the cheapest prices, and we have graphed the cumulative energy production of companies ordered by increasing variable cost of production." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Price: 59.72\n", "Capacity: 20000\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm0AAAGpCAYAAADfmgGBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xd4Tvf/x/FXhhExYiRBg7QSYsSIkZTSFrVrtDa1qkPRqlpBW1+UBFWKpq1RFN8iFP1qaYvWitGhVatBESoRiYiQUMn9+yM/d90y3GTcOfJ8XJervc/5nM95n/PJnbyuM+3i4uJMAgAAQJ5mb+sCAAAAcG+ENgAAAAMgtAEAABgAoQ0AAMAACG0AAAAGQGgDAAAwAEIbkM+sWLFCLi4uWrFihcV0X19f+fr62qgqAMC9ENqAh0RISIhcXFzk4uKin376KcfX5+vra15fRv/uDoaQoqKiNH78eAUEBKh8+fJyd3dXjRo11Lp1a73zzjs6cuSIrUsEkEc52roAANlj6dKlsrOzk8lk0pIlS1S/fv1cWe+rr76qEiVKpDuPI3eWjh49qvbt2ysmJkbVq1dXjx49VLJkScXExOiXX37R3LlzVbJkSVWvXt3WpQLIgwhtwENgz549OnbsmLp27aqwsDB9+eWXmjp1qooXL57j6x48eLAqVaqU4+t5GIwbN04xMTEaO3asxo4dm2b+uXPndPnyZRtUBsAIOD0KPASWLFkiSerTp4969uypa9euac2aNbYt6i47d+6Ui4uLBg8erDNnzmjgwIF67LHH5O7urqeeekqbN2/OcNkNGzaoY8eO8vT0lJubm/z8/DRx4kTFx8enaXv7tO2NGzc0bdo0+fn5ydXV1SIkRUZG6rXXXpOXl5fKli2rJ554QitXrjTXOG3aNHPbZ555RiVLltTp06fTrW3x4sVycXHRlClT7rkP9u3bJyn16GR6PDw80j06efHiRY0ePVq1a9eWm5ubHn30UXXv3l27d+9O0zajaxZvS+/axdvLTJs2TQcOHFCXLl1UqVIlubi4KC4uztwuPDxcQ4cOVa1ateTm5qbKlSurZcuWmjdvXpr1nDp1SsOGDVPNmjXNbXv37q2DBw+maXv16lXNmDFDjRo1UsWKFfXII4+oVq1a6tOnj3bu3JnudgD5EaENMLjLly9r48aNqlChgpo2barevXvLzs5OS5cutXVp6YqIiFDz5s119uxZde/eXZ07d9bRo0fVq1cv7dixI037t956S/369dOJEyfUvn17vfzyy3Jzc9Ps2bPVunVrXb16Nd319O3bV0uXLtXjjz+uwYMHy9vbW5IUHR2tZ555RitXrpS3t7cGDx6sWrVqaeTIkfr444/T9DNw4ECZTCYtW7Ys3fV89tlnsre3V79+/e657SVLlpQknTx58p5tbzt79qyefvppffrpp/Lw8NCQIUPUunVr7dixQ88++2y2Xje4f/9+tW3bVrdu3VLfvn3VrVs3OTg4SJK2bNmipk2basWKFapSpYqGDBmiTp06ycHBQTNnzrTo58cff1TTpk313//+V7Vr19arr76qZs2aaevWrWrVqpW2bt1qbmsymdSlSxe99957cnJyUu/evTVo0CAFBATo4MGD+vHHH7Nt+wCj4/QoYHD//e9/lZSUpJ49e8rOzk6enp5q1KiRdu/erV9++UV+fn45uv6QkJAMr2kbPHiwXFxcLKbt2rUrzenBrl276vnnn9fcuXPVtGlT8/RVq1Zp0aJFat++vRYsWCAnJyfzvBkzZui9995TUFCQ3nvvvTTrjoiI0O7du1W6dGmL6f/5z38UERGhIUOGWCw3ePBgNW/ePE0/nTt31vjx47V8+XIFBgaqQIEC5nk//fSTDh06pFatWqlChQoZ7SKLvubNm6cePXpo4MCBatKkiWrWrJlmH91pxIgROn/+fJp9NnToULVo0UIjRozQU089pUceeeSe67+X7du3a/bs2erfv7/F9JiYGL300kv6559/tH79ej355JMW88+dO2f+/ytXrmjAgAEqUKCAvv/+e/n4+JjnHT9+XM2bN9eQIUP022+/qVChQjpy5Ij27duntm3bauXKlRb9mkwmThcDd+BIG2Bwt29A6NWrl3la7969Jf172jQnffzxxwoODk7335UrV9K0r1ChgkaNGmUxrXnz5vLw8NDPP/9sMf2jjz6Sg4OD5s6daxHYpNQwU7p0aa1evTrdusaPH58msN28eVNr165VsWLFNHr0aIt5vr6+6tGjR5p+ChcurD59+ujixYvatGmTxbzPPvtMkjRgwIB0a7jb22+/rX79+uny5csKDg5W+/bt5enpqbp16+rNN99Mc+fo33//re+//16PPPKIRowYYTGvRo0aGjhwoG7cuKFVq1ZZtf578fX1TRPYJGnlypWKj49X//790wQ2KfW07m1ffPGFYmNjNWbMGIvAJklVq1ZV3759FRkZmeYI2t3jK0l2dnYqVarUA24N8PDhSBtgYHv27NHx48fVuHFjeXp6mqd37NhRo0eP1rp16/Tee++pWLFiOVbDb7/9dl83Ivj6+ppPud3Jw8ND+/fvN3++fv26fv/9d5UsWTLd05aSVLBgQV24cEGxsbFp/rjXq1cvTfvw8HAlJiaqYcOG6R4dDAgISPc06MCBAzVv3jx99tln6tSpk6TUI0pffvmlPDw81LJly8w3+v8VKlRIc+bM0fjx4/X999/r559/1m+//aZff/1Vn332mT7//HPNmjVLffv2lZS6byXJ399fBQsWTNPfU089pfnz55vbZVV6+0yS+REyLVq0uGcft6/bO3z4sMW1gbedOHFCUupRt5YtW8rHx0e+vr5au3atzp49q7Zt28rf319+fn4qXLjwg24K8FAitAEGdvtI2p1H2STJ2dlZnTp10vLlyxUaGmr1kaDckNGpVAcHB6WkpJg/x8XFyWQyKTY2VsHBwZn2mZCQkCa0ubu7p2l3+8YFV1fXdPtxc3NLd7qnp6eaN2+u77//XidPnlTlypX1xRdf6Pr163rzzTdlb39/Jy3c3NzUq1cv87hdvnxZ7777rpYtW6ZRo0apdevWcnNzM9ebUV23tzG9I5oPIqP13O6/XLly9+wjNjZWkvT5559n2u7atWuSUsf9q6++0owZM7Rx40b95z//kSQVKVJEnTt31qRJk9IcMQXyK06PAgZ1+fJlbdiwQZI0ZMiQNA+2Xb58uaTcOUWaE24/rqR69eqKi4vL9F/FihXTLG9nZ5dm2u0jjtHR0emu8+LFixnW8+KLL5qfgSel7ldHR0e98MIL97tpaZQsWVKzZ8+Wh4eHbty4ob1790r6dx9kVFdUVJRFO0nmAJmcnJzuMpkFvPT2mfRv0L5w4UJmm2FRyw8//JDpmN15fZ6Li4vee+89HTp0SAcPHtRHH32kOnXqaMWKFemergXyK460AQa1cuVK3bhxQ76+vqpTp066bbZu3arffvtNBw8ezLBNXlW0aFFVr15d4eHhiomJyZajLVWqVJGTk5OOHj2qK1eupDnqdzsspadly5aqWLGiVq5cqRYtWujo0aPq0KGDypYtm+W6pNSw5ezsLCn1AnxJqlWrlqTUU443b95Mc4r09nVhd47t7Zsa7rw54LaTJ08qPj4+w6OdGalfv742bNig77//Xq1bt860bYMGDbRx40aFhYU90M+cp6enPD091a1bN9WpU0c7d+5Md6yA/IgjbYBB3X6kR3BwsObOnZvuv8GDB0sy7tG2IUOG6J9//tFrr72W7l2EV69eva9XdhUsWFCdO3c2PxfsTocOHdIXX3yR4bL29vYaMGCAYmJizPt14MCBVq9bkoKCgnTmzJl0523YsEF//vmnHB0d1bBhQ0nSI488oubNm+v8+fOaM2eORfujR49q8eLFKlSokLp162aeXrduXdnb22v16tVKSEgwT7927VqaG0Cs1atXLxUvXlxLlixJ97Es58+fN/9/nz595OLiohkzZlhco3ibyWRSWFiYbt68KUk6ffp0us/AS0hI0LVr11SgQAE5OnJ8AZA40gYY0u7du/Xnn3+qSpUqatSoUYbtevbsqcmTJ2vt2rWaMmWKihYtmu21ZPbIjwYNGlh18XpGevfurd9++02ffvqp6tSpo+bNm6tixYq6cuWKzp49qz179ujpp59O86iIzEycOFE7duzQvHnz9PPPP+vxxx9XVFSUvvzySz3zzDPatGlThteovfDCCwoKCtLff/+typUrp3snZWY++ugjBQUFqVatWqpbt67KlCmj+Ph4/fbbb+aAM2nSJItrx2bNmqXWrVvrvffe044dO9SgQQNFRkZq/fr1SkpKMp9Wva1s2bLq0aOHVq5cqSZNmqhly5ZKSkrS1q1bVbFiRauuS7tb6dKltWDBAvXr10+dOnVS8+bNVbNmTSUkJOjo0aP6448/zMGrZMmSWrZsmfr06aOWLVuqadOm8vHxUYECBXT+/Hn99NNPOnfunE6fPq2CBQvqjz/+0AsvvKA6deqoatWqKleunOLi4rRlyxZdvnxZQ4cONR+BBPI7QhtgQLePnN2+yzAjZcqUUdu2bbV+/XqtXbvWqgfA3q+M7uyUUp/8n5XQJknTp09Xy5YttWjRIu3atUuXL19WiRIlVL58eQ0aNEhdunS5r/7c3Nz07bffatKkSfruu+/066+/ysvLSzNnzpSzs7M2bdqU4d22ZcqUUevWrbVhwwb1798/w2vAMrJq1Spt3bpVu3fv1tatWxUdHS07OzuVK1dO3bt314svvmg+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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Make the plot\n", "plt.figure(figsize=(9,6))\n", "plt.bar(new_x, height, width=width, color=ESG_sorted['Color'], edgecolor = \"black\")\n", "plt.title('All Energy Sources')\n", "plt.xlabel('Capacity_MW')\n", "plt.ylabel('Variable Cost')\n", "price_line_plot(price)\n", "demand_plot(demand)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we will graph our variable cost cap with just the Big Coal plants." ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Price: 59.72\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnIAAAGpCAYAAAAJP9vkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3XtYVOX+//8XggdEcUoBI0G3gKJ4QDDxkGfT3Jimkprub0lZSmVaaUqpmfURFbefKI3ylJbWVtFMy8NuJ5YHUPduW+YplMRDBkiBopAJ8/uDH/NpQnAwYGbp83FdXJez7nvu9V53d/hyrTVrnLKzs80CAACA4VSzdwEAAAC4OQQ5AAAAgyLIAQAAGBRBDgAAwKAIcgAAAAZFkAMAADAoghwAw1u9erVMJpNWr15t71LswmQyKTw83N5lALADF3sXAAC/ZzKZSmyrUaOGvLy81KVLFz333HNq3ry5HSorcvnyZX3wwQfaunWrjhw5ouzsbLm6uqpp06bq3r27/va3vykgIMBu9QG4vTjxQGAAjqQ4yE2ZMsWy7eLFi/r666+1b98+ubm5aevWrWrTpo2lPScnR+np6fLy8lK9evUqrbYDBw7o0Ucf1Y8//ihvb29169ZN3t7eunLlig4fPqzk5GQVFhZq48aN6tq1a6XV8Ucmk0ldunTRZ599VmX7BOAYOCMHwCFFR0eX2DZ58mQtWbJE8fHxio+Pt2yvV69epQY4Sfr+++81dOhQXbp0STNmzND48eNVvXp1qz5nz57V66+/rosXL1ZqLQBQjHvkABhGr169JElZWVlW28u6R+6LL75Qv3795O3trSZNmmjkyJH6/vvvFRUVJZPJpLS0NJv2/eKLL+rixYt69tln9fzzz5cIcZLUqFEjvfPOO+rTp4/V9lOnTumpp55Sy5Yt5eHhoYCAAI0ePVrfffddiTFycnL05ptv6oEHHrD09/Pz0/Dhw7Vv3z6bagVw++CMHADD2LlzpyQpJCTEpv7r16/XmDFjVLNmTT344IO66667tH//ft13331q1aqVzfs9deqUdu7cqVq1aum55567Yf+aNWta/nzw4EENGjRIFy9eVN++fRUUFKQffvhBmzdv1rZt2/Thhx9aAqpUdObvtddeU+fOndW3b1+ZTCadPXtWW7du1b/+9S999NFH6tu3r821A7i1EeQAOKSYmBjLny9duqT//ve/Sk5OVv/+/fXMM8/c8P2XLl3S888/L2dnZ23btk3BwcGWtpkzZ+qNN96wuZbk5GRJUnBw8HU/jFEas9mscePGKScnR2+//bZGjhxpadu5c6cGDx6sJ598Ut9++61q164tSWrWrJmOHTum+vXrW4117tw59e7dWy+//DJBDoAFQQ6AQ5o7d26JbYGBgRoyZIjq1Klzw/dv2bJFOTk5Gj58uFWIk6RJkybpvffeU05Ojk21pKenS5K8vb1t6l9s3759OnbsmEJCQqxCnCT16NFDAwYM0ObNm7VlyxZFRERIUqn3+t19990aOHCgFi9erDNnzsjHx6dctQC4NXGPHACHlJ2dbfk5d+6cvvjiC3l4eOiJJ57Qa6+9dsP3f/vtt5KkTp06lWirU6eOWrduXeE1/9E333wjSerWrdt123v06GHVr1hycrJGjx6toKAgeXp6ymQyyWQyafHixZKk8+fPV17RAAyFM3IAHJ6bm5tCQ0P1wQcfKCgoSHFxcYqMjFSjRo1KfU/xJ0c9PDyu2+7p6Wnz/r28vCRJP/74Yzmq/r8aSttX8bi/PzO4efNmPfroo6pVq5Z69Oihv/zlL6pdu7aqVaum3bt3a8+ePfr111/LVQeAWxdBDoBhmEwm+fv765tvvtE333xTZpCrW7euJCkzM/O67RkZGTbvt2PHjpKKPriQnZ1t831y7u7uZe6r+JJtcT9Jmj17tmrUqKHExMQSDz6eOHGi9uzZY3PdAG59XFoFYCjZ2dmSpMLCwjL7FT8wOCkpqURbbm6uDh06ZPM+mzRpoh49eig/P19xcXE37F98xqxt27aSpF27dl2335dffilJVvfwpaamqnnz5iVCXGFhoeVDFwBQjCAHwDA+/fRTpaWlqXr16goLCyuz71//+le5u7trw4YNOnjwoFXb/Pnzbf6gQ7G5c+fK3d1dcXFxiouL07Vr10r0OX/+vJ566in961//kiSFhYWpefPm+s9//qM1a9ZY9f3yyy+1efNm1a9fX3/9618t2319fZWammp1H5zZbFZMTIyOHTtWrpoB3Pq4tArAIf3+8SNXrlzR8ePH9fnnn0uSZsyYccN73Nzd3TV//nyNHTtW/fv3t3qO3KFDh9SlSxft2bNH1arZ9u/Z5s2ba/369Xr00Uf1yiuvaPHixVZf0XX06FHt3btXBQUFGjVqlCTJyclJ8fHxevDBBzVu3Dh9/PHHlufIbdq0STVq1NA777xjefSIJD311FN67rnn1K1bNw0cOFAuLi7at2+fjh8/rvvvv1/btm0r71QCuIUR5AA4pN8/fsTZ2VkNGjTQ/fffryeffFI9e/a0aYxhw4bpjjvuUGxsrDZu3KgaNWqoc+fO+vzzzzV9+nRJ/3cvnS3uueceHThwQO+//762bt2qzz//XNnZ2XJ1dVWTJk00duxYPfroo/L397e8JyQkRDt37lRsbKx27typL774QvXq1VN4eLheeOEFq++MlaTIyEjVqFFD8fHx+uijj1SrVi116tRJixYt0qZNmwhyAKw4ZWdnm+1dBABUpYKCArVt21a//fabjh8/bu9yAOCmcY8cgFtWTk6Orly5YrXNbDYrNjZWZ8+e1YABA+xUGQBUDM7IAbhl7dy5U4888oh69uwpX19fXb58WQcOHNChQ4fUqFEjJSYmlvqcOQAwAoIcgFvW6dOn9frrrys5OVkXLlzQtWvX5O3trX79+umFF14o10OBAcAREeQAAAAMinvkAAAADIogBwAAYFAEOQAAAIMiyJVTSkqKvUtwCMwDc1CMeSjCPBRhHpiDYsxDkcqeB4IcAACAQRHkAAAADIogBwAAYFAEOQAAAIMiyAEAABgUQQ4AAMCgCHIAAAAGRZADAAAwKIIcAACAQRHkAAAADIogBwAAYFAEOQAAAIMiyAEAABgUQQ4AAMCgXOxdAAAAwI08OytWJ7Mu27UGv/puenPGZLvW8EcEOQAA4PBOZl3WnuAn7FvEwSX23f91cGkVAADAoAhyAAAABkWQAwAAMCiCHAAAgEER5AAAAAyKIAcAAGBQBDkAAACDIsgBAAAYFEEOAADAoAhyAAAABmW3INe6dWuZTKYSP8OGDbP0Wbp0qdq0aSMvLy91795de/futVe5AAAADsduQS4xMVHHjx+3/Hz55ZdycnLSgw8+KEnasGGDpk6dqhdeeEFfffWVOnTooIceekhnzpyxV8kAAAAOxW5BrkGDBvLy8rL8fP7556pbt64GDx4sSVq0aJFGjhypRx99VM2bN1dsbKy8vLy0fPlye5UMAADgUBziHjmz2awPPvhAw4cPl6urq65evaqDBw+qV69eVv169eqlffv22alKAAAAx+IQQS4xMVFpaWl65JFHJElZWVkqKCiQh4eHVT8PDw9lZGTYo0QAAACH42LvAiRp5cqVCgkJUevWrf/0WCkpKRVQkf33YQTMA3NQjHkowjwUYR6Yg2IVOQ95V/IqbKw/U8PNHJOt7wkICCj32HYPcpmZmdqyZYvmz59v2Va/fn05OzsrMzOzRF9PT88yx7uZSSiPlJSUSt+HETAPzEEx5qEI81CEeWAOilX0PLjWdq2wsf5MDeU9pspeD3a/tPrhhx+qZs2aGjp0qGVbjRo1FBwcrMTERKu+iYmJCgsLq+oSAQAAHJJdz8iZzWa9//77GjJkiOrUqWPV9vTTT2vs2LEKDQ1VWFiYli9frp9++kmRkZF2qhYAAMCx2DXI7dq1SydPntTixYtLtA0ZMkQ///yzYmNjlZ6erhYtWmjt2rXy9fW1Q6UAAACOx65Brlu3bsrOzi61fcyYMRozZkwVVgQAAGAcdr9HDgAAADeHIAcAAGBQBDkAAACDIsgBAAAYFEEOAADAoAhyAAAABkWQAwAAMCiCHAAAgEER5AAAAAzKrt/sAAAAbk3/885KZV6ruJiRcuqMFFxhw90yCHIAAKDCnb74m77uHFVh47mfeLnCxrqVcGkVAADAoAhyAAAABkWQAwAAMCiCHAAAgEER5AAAAAyKIAcAAGBQBDkAAACDIsgBAAAYFEEOAADAoAhyAAAABkWQAwAAMCiCHAAAgEER5AAAAAyKIAcAAGBQBDkAAACDIsgBAAAYFEEOAADAoAhyAAAABkWQAwAAMCiCHAAAgEER5AAAAAyKIAcAAGBQBDkAAACDsmuQ++mnnzRu3Dj5+fnJy8tLYWFh2r17t6XdbDYrJiZGgYGBatiwocLDw3X06FE7VgwAAOA47BbksrOz1a9fP5nNZq1du1b79u3TvHnz5OHhYekTFxenRYsWae7cudqxY4c8PDw0ePBgXbp0yV5lAwAAOAwXe+34zTffVMOGDfXuu+9atjVp0sTyZ7PZrPj4eE2cOFGDBg2SJMXHxysgIEAJCQmKjIys6pIBAAAcit3OyH322WcKDQ1VZGSk/P39de+992rx4sUym82SpLS0NKWnp6tXr16W97i6uqpz587at2+fvcoGAABwGHYLcqdOndKyZcvUpEkTrV+/XuPGjdOrr76qJUuWSJLS09MlyepSa/HrjIyMKq8XAADA0djt0mphYaHatWunV155RZLUtm1bpaamaunSpXryySdvetx6JlNFlXhd7St1dONgHpiDYsxDEeahCPPAHBT7jySte/dG3cpnz8aKHe9mrHyjXN3Lsx5ysrPLV4vseEbOy8tLzZs3t9rWrFkznT171tIuSZmZmVZ9MjMz5enpWTVFAgAAODC7nZHr2LGjTpw4YbXtxIkT8vHxkSQ1btxYXl5eSkxMVEhIiCQpPz9fSUlJmjVrVqnj3kyaLY+UlBQFBARU6j6MgHlgDooxD0WYhyLMA3NQrNcTU/R152crbDz3hJd1MeJ/Kmy8m9Hl4BJ9FjezXO+p7PVgtzNyTz31lA4cOKD58+crNTVVGzdu1OLFizVmzBhJkpOTk6KiohQXF6dNmzbpyJEjeuqpp+Tm5qaIiAh7lQ0AAOAw7HZGLiQkRKtXr9asWbMUGxurRo0a6aWXXrIEOUmaMGGC8vLyNHnyZGVnZys0NFQbNmxQ3bp17VU2AACAw7BbkJOkfv36qV+/fqW2Ozk5KTo6WtHR0VVYFQAAgDHwXasAAAAGRZADAAAwKIIcAACAQRHkAAAADIogBwAAYFAEOQAAAIMiyAEAABgUQQ4AAMCgCHIAAAAGRZADAAAwKIIcAACAQRHkAAAADIogBwAAYFAEOQAAAIMiyAEAABgUQQ4AAMCgCHIAAAAGRZADAAAwKIIcAACAQRHkAAAADIogBwAAYFAEOQAAAIMiyAEAABgUQQ4AAMCgCHIAAAAGRZADAAAwKIIcAACAQRHkAAAADIogBwAAYFAEOQAAAIMiyAEAABgUQQ4AAMCgCHIAAAAGRZADAAAwKIIcAACAQdkc5CZMmKD//Oc/pbb/97//1YQJE2zecUxMjEwmk9VPs2bNLO1ms1kxMTEKDAxUw4YNFR4erqNHj9o8PgAAwK3O5iD3/vvvKzU1tdT2H374QR988EG5dh4QEKDjx49bfvbu3Wtpi4uL06JFizR37lzt2LFDHh4eGjx4sC5dulSufQAAANyqKuzS6s8//6yaNWuW6z0uLi7y8vKy/DRo0EBS0dm4+Ph4TZw4UYMGDVLLli0VHx+v3NxcJSQkVFTJAAAAhuZSVmNSUpLVWbItW7bo9OnTJfplZ2crISFBQUFB5dr5qVOnFBgYqBo1aqh9+/aaMWOGmjRporS0NKWnp6tXr16Wvq6ururcubP27dunyMjIcu0HAADgVlRmkPvyyy81d+5cSZKTk5M2btyojRs3XrdvQECA5syZY/OO27dvr7ffflsBAQG6cOGCYmNj1bdvXyUnJys9PV2S5OHhYfUeDw8PnT9/vsxxU1JSbK7hZlXFPoyAeWAOijEPRZiHIswDc1AZCgoK7V2C8q7k3dR/W1vfExAQUO6xywxy48eP12OPPSaz2azAwEDNnz9fDzzwgFUfJycn1a5dW25ubuXa8X333Wf1un379goODtaHH36oe+65p1xj/d7NTEJ5pKSkVPo+jIB5YA6KMQ9FmIcizANzUFmcne3/oA3X2q7l/m9b2euhzCDn5uZmCWhff/21PD09yx3YbFWnTh0FBgYqNTVVAwYMkCRlZmbKx8fH0iczM1Oenp6Vsn8AAACjsTneNmrUSAUFBVbbfvnlF7355pt67bXXdPDgwT9VSH5+vlJSUuTl5aXGjRvLy8tLiYmJVu1JSUkKCwv7U/sBAAC4VZR5Ru73xo8fr8OHD2vXrl2SpLy8PPXp08fySJK33npLn376qTp06GDTeNOmTdP999+vRo0aWe6Ru3Llih5++GE5OTkpKipKCxYsUEBAgPz9/TV//ny5ubkpIiLiJg4TAADg1mNzkNuzZ49Gjhxpeb1u3TqlpqbqH//4h1q3bq2IiAjFxsZq3bp1No33448/asyYMcrKylKDBg3Uvn17ff755/L19ZVU9ADivLw8TZ48WdnZ2QoNDdWGDRtUt27dch4iAADArcnmIHfhwgU1atTI8nrr1q2655571K9fP0nS3/72N73xxhs273j58uVltjs5OSk6OlrR0dE2jwkAAHA7sfkeOTc3N+Xk5EiSrl27pj179qhHjx6W9tq1a/OtCwAAAFXI5jNybdu21QcffKCePXtqy5Ytys3N1f33329p/+GHH/hEKQAAQBWyOchNmzZNgwcPVteuXWU2m/XAAw8oJCTE0v7ZZ5/xiVIAAIAqZHOQa9eunfbv36/k5GTVq1dP3bp1s7RlZ2fr0UcfVdeuXSulSAAAAJRkc5CTJE9PTw0cOLDEdpPJpPHjx1dYUQAAALixcgU5SdqxY4e2b9+u06dPS5J8fX3Vv39/qw8+AAAAoPLZHOR+/fVXjR49Wtu3b5ckywcbtm/friVLluj+++/XihUrVKNGjcqpFAAAAFZsfvzInDlztG3bNj3//PNKTU3VsWPHdOzYMf3www+aNGmStm7dqrlz51ZmrQAAAPgdm4NcQkKCRo0apWnTpslkMlm216tXTy+99JJGjhyptWvXVkqRAAAAKMnmIJeRkWH1uJE/CgkJUUZGRoUUBQAAgBuzOch5e3tr9+7dpbbv3r1b3t7eFVIUAAAAbszmIPfwww/r448/1nPPPaeUlBQVFBSosLBQKSkpev755/XJJ59o5MiRlVkrAAAAfsfmT62+8MIL+uGHH7RixQqtXLlS1aoVZcDCwkKZzWY9/PDDeuGFFyqtUAAAAFizOcg5OzsrPj5e48aN0z//+U+dOXNGkuTj46O+ffuqbdu2lVYkAAAASir3A4Hbtm1LaAMAAHAAZd4j9+uvv2ry5MlavHhxmYMsXrxYkydP1rVr1yq0OAAAAJSuzCC3cuVKrVy5Un369ClzkN69e2vlypVatWpVhRYHAACA0pUZ5DZu3Kjw8HA1bdq0zEH8/Pw0cOBArVu3rkKLAwAAQOnKDHKHDx9Wp06dbBooLCxMhw8frpCiAAAAcGNlBrn8/Hy5urraNFCtWrWUl5dXIUUBAADgxsoMcp6enjp58qRNA508eVIeHh4VUhQAAABurMwg16VLF61du1aXL18uc5DLly9rzZo1uvfeeyu0OAAAAJSuzCD3zDPPKCMjQ8OGDdP58+ev2+f8+fMaMWKELly4oGeeeaZSigQAAEBJZT4QuFWrVlqwYIGef/55tW3bVl27dlVQUJDq1Kmj3NxcHTlyRLt27dK1a9f097//Xa1ataqqugEAAG57N/xmh0ceeUSBgYGKiYnRl19+qR07dljanJ2d1bVrV02ZMkUdO3as1EIBAABgzaav6OrQoYM+/vhjXb58WSdOnNClS5dUt25d+fn5qU6dOpVdIwAAAK6jXN+16ubmxvesAgAAOIgyP+wAAAAAx0WQAwAAMKhyXVoFANjXs7NidTKr7Gd72lPelTy51i75jUAZaSfk2djfDhVVvdLm4HaTdv4ne5dwWyDIAYCBnMy6rD3BT9i7jHJzP/GyUgxYN26e2/Foe5dwW+DSKgAAgEGV+4zcqVOntHv3bl24cEFDhw6Vj4+PfvvtN124cEENGjRQ9erVK6NOAAAA/IHNQc5sNmvSpElasWKFCgsL5eTkpHbt2snHx0f5+fkKCwvTiy++yNd0AQAAVBGbL60uWLBA7733nl588UVt3bpVZrPZ0la3bl0NGDBAn3766U0XsmDBAplMJk2ePNmyzWw2KyYmRoGBgWrYsKHCw8N19OjRm94HAADArcTmILdq1SqNGjVKU6ZMUbNmzUq0t2zZUidPnrypIg4cOKAVK1YoKCjIantcXJwWLVqkuXPnaseOHfLw8NDgwYN16dKlm9oPAADArcTmS6vnzp3TPffcU2q7m5vbTQWsnJwcPfHEE1q4cKHmzp1r2W42mxUfH6+JEydq0KBBkqT4+HgFBAQoISFBkZGR5d4XANjiZh7xUVWPnEg5dUYKrvTdADAIm4Ocp6enzpw5U2r7wYMH1ahRo3IXUBzUunXrZhXk0tLSlJ6erl69elm2ubq6qnPnztq3bx9BDkClceRHfLifeNneJQBwIDYHuQEDBmj58uUaNWqU3N3dJUlOTk6SpB07dujDDz/UhAkTyrXzlStXKjU1VYsXLy7Rlp6eLkny8PCw2u7h4aHz58+XOmZKSkq5argZVbEPI2AemINit9o85F3Js3cJpSooKLR3CTfFqHXDcTjCGsq7kndTv+9sfU9AQEC5x7Y5yEVHR2vXrl3q2rWrOnXqJCcnJ8XFxWn27Nnav3+/2rRpo+eff97mHaekpGjWrFnatm1bhT6y5GYmoTxSUlIqfR9GwDwwB8VuxXlw5KfyOzsb8/GfRq0bjsMR1pBrbddy/76r7N+RNs9KvXr19K9//UvPPPOMzp49KxcXF3311VfKysrSpEmTtHXrVtWuXdvmHe/fv19ZWVnq2LGj6tevr/r162vPnj1aunSp6tevrzvvvFOSlJmZafW+zMxMeXp62rwfAACAW1W5Hgjs6uqqKVOmaMqUKX96x+Hh4WrXrp3Vtqefflp+fn56/vnn5e/vLy8vLyUmJiokJESSlJ+fr6SkJM2aNetP7x8AAMDo7PZdqyaTSSaTyWpb7dq1dccdd6hly5aSpKioKC1YsEABAQHy9/fX/Pnz5ebmpoiICHuUDAAA4FBKDXJ///vfyz2Yk5NTue6Tu5EJEyYoLy9PkydPVnZ2tkJDQ7VhwwbVrVu3wvYBAABgVKUGuddff73cg/3ZIPfZZ5+VGC86OlrR0dE3PSYAAMCtqtQgd+HChaqsAwAAAOVUapBzdnauyjoAAABQTuX+sMPly5e1Z88enT59WpLk6+urLl26yM3NrcKLAwAAQOnKFeSKv8A+NzdXZrPZsr1OnTqaMmWKnnnmmQovEAAAANdnc5BbtGiRpk2bpk6dOmnMmDHy8/OTJJ04cUJLly7VjBkz5OTkpKeffrrSigUAAMD/sTnIvfPOO+revbs+/vhjy3esSlLbtm01ePBgPfjgg3rnnXcIcgAAAFXE5q/oysrK0oABA6xCnGWQatU0cOBAZWVlVWhxAAAAKJ3NQa5NmzY6fvx4qe3Hjx9X27ZtK6QoAAAA3JjNl1bnzZuniIgINW7cWI899phq164tSbpy5YqWLVumTZs2ad26dZVWKAAAAKyVGuQ6d+5csrOLi2bMmKFZs2bJy8tLkpSenq5r166pYcOGioqK0p49eyqvWgfwP++sVOY1u31FrcPIu5In19qu9i7DrpiDIrfiPKScOiMF27sKALixUhOJu7t7ifvh6tWrp8aNG1tta9SoUeVU5qBOX/xNX3eOsncZACqR+4mX7V0CANik1CC3bdu2qqwDAAAA5WTzhx0AAADgWMp9s1dBQYFOnDihixcvqrCwsER7WFhYhRQGAACAstkc5Mxms2bPnq13331Xubm5pfb7+eefK6QwAAAAlM3mS6tvvfWW5s+fr4EDB2rhwoUym82aPn26YmNj1bx5c7Vu3VoJCQmVWSsAAAB+x+Yg9/7772vAgAFauHCh7r//fklSSEiIHn/8cSUmJuq3337T/v37K61QAAAAWLM5yJ05c0Y9e/YselO1orddvXpVklSrVi2NGDFCq1evroQSAQAAcD02BzmTyaT8/HxJRc+Yq169us6dO2dpd3V15btWAQAAqpDNQS4wMFCHDx8uelO1agoNDdXy5cuVnp6u8+fPa8WKFfL396+0QgEAAGDN5k+tDh06VMuWLVN+fr5q1aqladOmaciQIWrRokXRQC4uWrVqVaUVCgAAAGs2B7lHHnlEjzzyiOV1ly5dlJSUpM8++0zOzs7q06ePmjVrVilFAgAAoKQ/9e3vTZs21fjx4yuqFgAAAJQDX9EFAABgUKWekQsJCVG1atWUnJwsFxcXhYSEyMnJqczBnJyc9O9//7vCiwQAAEBJpQa59u3bS5IlvBW/BgAAgGMoNcgtXry4zNcAAACwL5vukcvLy9OECRO0adOmyq4HAAAANrIpyLm6uiohIUHZ2dmVXQ8AAABsZPOnVoODg/Xdd99VZi0AAAAoB5uD3OzZs7Vx40a99957unbtWmXWBAAAABvY/EDgqKgoVatWTS+88IKio6Pl7e2tWrVqWfVxcnLSnj17KrxIAAAAlGRzkHN3d1e9evX0l7/8pTLrAQAAgI1sDnLbtm2rzDoAAABQTnb7iq4lS5aoc+fO8vHxkY+Pj+677z5t377d0m42mxUTE6PAwEA1bNhQ4eHhOnr0qL3KBQAAcDg2n5ErVlBQoBMnTujixYsqLCws0R4WFmbTON7e3nr11Vfl5+enwsJCffTRRxo1apR27typVq1aKS4uTosWLdKiRYsUEBCgefPmafDgwTpw4IDq1q1b3rIBAABuOTYHObNjKNnaAAAgAElEQVTZrNmzZ+vdd99Vbm5uqf1+/vlnm8YLDw+3ej19+nQtW7ZMBw4cUFBQkOLj4zVx4kQNGjRIkhQfH6+AgAAlJCQoMjLS1rIBAABuWTZfWn3rrbc0f/58DRw4UAsXLpTZbNb06dMVGxur5s2bq3Xr1kpISLipIgoKCrR+/XpdvnxZHTp0UFpamtLT09WrVy9LH1dXV3Xu3Fn79u27qX0AAADcamw+I/f+++9rwIABWrhwoeWsW0hIiLp3765Ro0apV69e2r9/v1X4upHDhw+rb9++ys/Pl5ubm1atWqWgoCBLWPPw8LDq7+HhofPnz5c5ZkpKis37B4DrKSgoeduIo3Dk2spi1LrhOBxhDeVdybupnGHrewICAso9ts1B7syZM3rqqackSdWqFZ3Iu3r1qiSpVq1aGjFihJYsWaKpU6favPOAgADt2rVLFy9e1CeffKKoqCh9+umn5an/umMCwJ/h7Gy3z4HdkCPXVhaj1g3H4QhryLW2a7lzRkpKSqVmE5tnxWQyKT8/X1LRM+WqV6+uc+fOWdpdXV2VlZVVrp3XqFFDTZs2VXBwsF555RW1bt1ab7/9try8vCRJmZmZVv0zMzPl6elZrn0AAADcqmwOcoGBgTp8+HDRm6pVU2hoqJYvX6709HSdP39eK1askL+//58qprCwUFevXlXjxo3l5eWlxMRES1t+fr6SkpJs/lQsAADArc7mS6tDhw7VsmXLlJ+fr1q1amnatGkaMmSIWrRoUTSQi4tWrVpl845nzpypvn376u6771Zubq4SEhK0e/durV27Vk5OToqKitKCBQsUEBAgf39/zZ8/X25uboqIiCj/UQIAANyCbA5yjzzyiB555BHL6y5duigpKUmfffaZnJ2d1adPHzVr1szmHaenp+vJJ59URkaG3N3dFRQUpISEBPXu3VuSNGHCBOXl5Wny5MnKzs5WaGioNmzYwDPkAAAA/n9lBrnU1FQ1bdq01PamTZtq/PjxN7Xj+Pj4MtudnJwUHR2t6OjomxofAADgVlfmPXKhoaG67777tGTJknJ/kAEAAACVq8wg98QTTygtLU0vvviiAgMDNXz4cK1fv155eXlVVR8AAABKUWaQmzdvno4dO6Z169Zp8ODB2rt3r8aMGaNmzZpp3LhxSkxMlNlsrqpaAQAA8Ds3/LBDtWrV1KdPH/Xp00d5eXn67LPPtG7dOq1fv15r166Vp6enhgwZomHDhik4OLgqagYAAIDK8Rw5qeihvxEREVqzZo2OHz+uefPmqUmTJoqPj1evXr14xhsAAEAVuunvu7jzzjs1ZswYxcTEqH///jKbzXzPKQAAQBWy+Tlyv5eamqq1a9dq/fr1OnnypJycnNS1a1cNGzasousDAABAKWwOcunp6Vq/fr0SEhJ08OBBmc1mtWzZUjNnzlRERIS8vb0rs04AAAD8QZlB7uLFi9q0aZPl67MKCgp09913a/z48Ro2bJiCgoKqqk4AAAD8QZlBrlmzZrp69arq1KmjESNGaNiwYerataucnJyqqj4AAACUoswg17NnTw0fPlz9+/dXzZo1q6omAAAA2KDMIPfRRx9VVR0AAAAop5t+/AgAAADsiyAHAABgUAQ5AAAAgyLIAQAAGBRBDgAAwKAIcgAAAAZFkAMAADAoghwAAIBBEeQAAAAMiiAHAABgUAQ5AAAAgyLIAQAAGBRBDgAAwKAIcgAAAAZFkAMAADAoghwAAIBBEeQAAAAMiiAHAABgUAQ5AAAAgyLIAQAAGBRBDgAAwKAIcgAAAAZltyC3YMEC9ezZUz4+PvLz89Pw4cN15MgRqz5ms1kxMTEKDAxUw4YNFR4erqNHj9qpYgAAAMdityC3e/duPf7449q+fbs2bdokFxcXPfjgg/rll18sfeLi4rRo0SLNnTtXO3bskIeHhwYPHqxLly7Zq2wAAACH4WKvHW/YsMHq9bvvvitfX18lJyerf//+MpvNio+P18SJEzVo0CBJUnx8vAICApSQkKDIyEh7lA0AAOAwHOYeudzcXBUWFspkMkmS0tLSlJ6erl69eln6uLq6qnPnztq3b5+9ygQAAHAYDhPkpk6dqtatW6tDhw6SpPT0dEmSh4eHVT8PDw9lZGRUeX0AAACOxm6XVn/vpZdeUnJysrZt2yZnZ+c/NVZKSkoFVQXgdlVQUGjvEkrlyLWVxah1w3E4whrKu5J3UznD1vcEBASUe2y7B7no6Ght2LBBmzdvVpMmTSzbvby8JEmZmZny8fGxbM/MzJSnp2ep493MJADA7zk7O8zFihIcubayGLVuOA5HWEOutV3LnTNSUlIqNZvYdVamTJmi9evXa9OmTWrWrJlVW+PGjeXl5aXExETLtvz8fCUlJSksLKyqSwUAAHA4djsjN2nSJK1Zs0arVq2SyWSy3BPn5uamOnXqyMnJSVFRUVqwYIECAgLk7++v+fPny83NTREREfYqGwAAwGHYLcgtXbpUkiyPFik2ZcoURUdHS5ImTJigvLw8TZ48WdnZ2QoNDdWGDRtUt27dKq8XAADA0dgtyGVnZ9+wj5OTk6Kjoy3BDgAAAP/H/ncOAgAA4KYQ5AAAAAyKIAcAAGBQBDkAAACDIsgBAAAYFEEOAADAoAhyAAAABkWQAwAAMCiCHAAAgEER5AAAAAyKIAcAAGBQBDkAAACDIsgBAAAYFEEOAADAoAhyAAAABkWQAwAAMCiCHAAAgEER5AAAAAyKIAcAAGBQBDkAAACDIsgBAAAYFEEOAADAoAhyAAAABkWQAwAAMCiCHAAAgEER5AAAAAyKIAcAAGBQBDkAAACDIsgBAAAYFEEOAADAoAhyAAAABkWQAwAAMCiCHAAAgEER5AAAAAzKrkFuz549GjFihFq0aCGTyaTVq1dbtZvNZsXExCgwMFANGzZUeHi4jh49aqdqAQAAHItdg9zly5fVsmVLzZkzR66uriXa4+LitGjRIs2dO1c7duyQh4eHBg8erEuXLtmhWgAAAMdi1yDXt29fzZgxQ4MGDVK1atalmM1mxcfHa+LEiRo0aJBatmyp+Ph45ebmKiEhwU4VAwAAOA6HvUcuLS1N6enp6tWrl2Wbq6urOnfurH379tmxMgAAAMfgsEEuPT1dkuTh4WG13cPDQxkZGfYoCQAAwKG42LuAipaSkmLvEgAYXEFBob1LKJUj11YWo9YNx+EIayjvSt5N5Qxb3xMQEFDusR02yHl5eUmSMjMz5ePjY9memZkpT0/PUt93M5MAAL/n7OywFyscurayGLVuOA5HWEOutV3LnTNSUlIqNZvYf1ZK0bhxY3l5eSkxMdGyLT8/X0lJSQoLC7NjZQAAAI7BrmfkcnNzlZqaKkkqLCzU2bNn9e233+qOO+6Qj4+PoqKitGDBAgUEBMjf31/z58+Xm5ubIiIi7Fk2AACAQ7BrkPvvf/+rBx54wPI6JiZGMTExevjhhxUfH68JEyYoLy9PkydPVnZ2tkJDQ7VhwwbVrVvXjlUDAAA4BrsGua5duyo7O7vUdicnJ0VHRys6OroKqwIAADAGh71HDgAAAGUjyAEAABgUQQ4AAMCgCHIAAAAGRZADAAAwKIIcAACAQRHkAAAADIogBwAAYFAEOQAAAIMiyAEAABgUQQ4AAMCgCHIAAAAGRZADAAAwKIIcAACAQRHkAAAADIogBwAAYFAEOQAAAIMiyAEAABgUQQ4AAMCgCHIAAAAGRZADAAAwKIIcAACAQRHkAAAADIogBwAAYFAEOQAAAIMiyAEAABgUQQ4AAMCgCHIAAAAGRZADAAAwKIIcAACAQRHkAAAADIogBwAAYFAEOQAAAIMiyAEAABgUQQ4AAMCgDBHkli5dqjZt2sjLy0vdu3fX3r177V0SAACA3Tl8kNuwYYOmTp2qF154QV999ZU6dOighx56SGfOnLF3aQAAAHbl8EFu0aJFGjlypB599FE1b95csbGx8vLy0vLly+1dGgAAgF05ZWdnm+1dRGmuXr2qu+66S8uWLdODDz5o2T5p0iQdOXJEW7ZssWN1AAAA9uXQZ+SysrJUUFAgDw8Pq+0eHh7KyMiwU1UAAACOwaGDHAAAAErn0EGufv36cnZ2VmZmptX2zMxMeXp62qkqAAAAx+DQQa5GjRoKDg5WYmKi1fbExESFhYXZqSoAAADH4GLvAm7k6aef1tixYxUaGqqwsDAtX75cP/30kyIjI+1dGgAAgF059Bk5SRoyZIhiYmIUGxurrl27Kjk5WWvXrpWvr2+V13IrP5g4JiZGJpPJ6qdZs2aWdrPZrJiYGAUGBqphw4YKDw/X0aNHrcbIzs7Wk08+KV9fX/n6+urJJ59UdnZ2VR+Kzfbs2aMRI0aoRYsWMplMWr16tVV7RR3z4cOH9de//lUNGzZUixYtNHfuXJnNjvNh8RvNQ1RUVIm10adPH6s+v/76qyZPnqymTZvK29tbI0aM0Llz56z6nDlzRsOHD5e3t7eaNm2qF198UVevXq3047PFggUL1LNnT/n4+MjPz0/Dhw/XkSNHrPrcDuvBlnm4HdbDkiVL1LlzZ/n4+MjHx0f33Xeftm/fbmm/HdbCjebgdlgH17NgwQKZTCZNnjzZss3e68Hhg5wkjRkzRocOHVJGRoa+/PJLdenSpcpruB0eTBwQEKDjx49bfn4fVOPi4rRo0SLNnTtXO3bskIeHhwYPHqxLly5Z+owZM0bffvutEhISlJCQoG+//VZjx461x6HY5PLly2rZsqXmzJkjV1fXEu0VccwXL17U4MGD5enpqR07dmjOnDl66623tHDhwio5RlvcaB4kqUePHlZrY926dVbt0dHR2rx5s5YtW6YtW7bo0qVLGj58uAoKCiRJBQUFGj58uHJzc7VlyxYtW7ZMmzZt0ssvv1zpx2eL3bt36/HHH9f27du1adMmubi46MEHH9Qvv/xi6XM7rAdb5kG69deDt7e3Xn31VX355ZdKTExUt27dNGrUKH333XeSbo+1cKM5kG79dfBHBw4c0IoVKxQUFGS13d7rwaGfI+dIevfuraCgIL355puWbSEhIRo0aJBeeeUVO1ZWMWJiYrRp0yYlJSWVaDObzQoMDNQTTzyhSZMmSZLy8vIUEBCg1157TZGRkTp+/LjCwsK0bds2dezYUZKUlJSk/v3768CBAwoICKjS4ymvu+++W/PmzdOoUaMkVdwxL1u2TDNnztT3339vCUmxsbFavny5jhw5IicnJ/sccCn+OA9S0b+8f/75Z61Zs+a678nJyZG/v78WLVqkYcOGSZLOnj2r1q1bKyEhQb1799bnn3+uYcOG6dChQ2rUqJEkac2aNXr22WeVkpIid3f3yj+4csjNzZWvr69Wr16t/v3737br4Y/zIN2e60GSmjRpoldeeUWjR4++LdeC9H9zEBkZedutg5ycHHXv3l1vvvmm5s6dq5YtWyo2NtYhfjcY4oycvV29elUHDx5Ur169rLb36tVL+/bts1NVFe/UqVMKDAxUmzZt9Nhjj+nUqVOSpLS0NKWnp1sdv6urqzp37mw5/v3796tOnTpWH0Lp2LGj3NzcDDlHFXXM+/fvV6dOnazOdPXu3Vvnz59XWlpaFR3Nn5eUlCR/f3+Fhobq2Weftfok+cGDB/Xbb79ZzVWjRo3UvHlzq3lo3ry55Ze1VDQPv/76qw4ePFh1B2Kj3NxcFRYWymQySbp918Mf56HY7bQeCgoKtH79el2+fFkdOnS4LdfCH+eg2O20DiZOnKhBgwapW7duVtsdYT04/IcdHMHt8GDi9u3b6+2331ZAQIAuXLig2NhY9e3bV8nJyUpPT5ek6x7/+fPnJUkZGRmqX7++1b8anJyc1KBBA0POUUUdc0ZGhry9vUuMUdzWpEmTyjqECtOnTx898MADaty4sU6fPq3XX39dAwcO1M6dO1WzZk1lZGTI2dlZ9evXt3rf7///yMjIKDGXxY8XcsT1MXXqVLVu3dryl9btuh7+OA/S7bMeDh8+rL59+yo/P19ubm5atWqVgoKCLH/x3g5robQ5kG6fdSBJK1euVGpqqhYvXlyizRF+NxDkIEm67777rF63b99ewcHB+vDDD3XPPffYqSo4gqFDh1r+HBQUpODgYLVu3Vrbt2/XwIED7VhZ5XjppZeUnJysbdu2ydnZ2d7l2E1p83C7rIeAgADt2rVLFy9e1CeffKKoqCh9+umn9i6rSpU2By1btrxt1kFKSopmzZqlbdu2qXr16vYu57q4tGqD2/HBxHXq1FFgYKBSU1Pl5eUlSWUev6enp7Kysqw+YWM2m3XhwgVDzlFFHbOnp+d1xyhuM6K77rpL3t7eSk1NlVR0HAUFBcrKyrLq98e5+uM8FJ/pdqR5iI6O1vr167Vp0yarfwHfbuuhtHm4nlt1PdSoUUNNmzZVcHCwXnnlFbVu3Vpvv/32bbUWSpuD67lV18H+/fuVlZWljh07qn79+qpfv7727NmjpUuXqn79+rrzzjsl2Xc9EORscDs+mDg/P18pKSny8vJS48aN5eXlZXX8+fn5SkpKshx/hw4dlJubq/3791v67N+/X5cvXzbkHFXUMXfo0EFJSUnKz8+39ElMTNRdd92lxo0bV9HRVKysrCydP3/e8hdacHCwqlevbjVX586ds9zgKxXNw/Hjx60ePZCYmKiaNWsqODi4ag+gFFOmTLGEl98/eke6vdZDWfNwPbfqevijwsJCXb169bZaC39UPAfXc6uug/DwcO3du1e7du2y/LRr105Dhw7Vrl275O/vb/f14Dx16tSZFXjMt6y6desqJiZGDRs2VK1atRQbG6u9e/dq4cKFqlevnr3L+9OmTZumGjVqqLCwUCdOnNDkyZOVmpqq//3f/5XJZFJBQYHeeOMN+fn5qaCgQC+//LLS09P1xhtvqGbNmmrQoIH+/e9/KyEhQa1bt9a5c+f03HPPKSQkxGEfQZKbm6tjx44pPT1dH3zwgVq2bCl3d3ddvXpV9erVq5Bj9vPz03vvvadDhw4pICBASUlJmjFjhiZOnOgwAbeseXB2dtasWbNUp04dXbt2TYcOHdL48eNVUFCg2NhY1axZU7Vq1dJPP/2kpUuXKigoSDk5OXruuefk7u6uV199VdWqVVOTJk20efNm7dixQ0FBQTp27JgmTZqkhx56SA888IC9p0CTJk3SP/7xD61YsUKNGjXS5cuXdfnyZUlF/5BzcnK6LdbDjeYhNzf3tlgPM2fOtPw+PHfunOLj47V27VrNnDnT8t//Vl8LZc2Bl5fXbbEOJKlWrVry8PCw+lm3bp18fX01atQoh/jdwONHymHp0qWKi4tTenq6WrRoodmzZ9vlmXaV4bHHHtPevXuVlZWlBg0aqH379nr55ZcVGBgoqeg08Jw5c7RixQplZ2crNDRU8+fPV8uWLS1jZGdn68UXX9TWrVslSf3799e8efNKfOLNUezateu6vywefvhhxcfHV9gxHz58WJMmTdLXX38tk8mkyMhITZkyxWEeL1DWPCxYsECjRo3St99+q5ycHHl5ealr1656+eWXrT5p9uuvv2ratGlKSEhQfn6+unXrpr///e9Wfc6cOaNJkybpq6++Uq1atfTQQw/ptddeU82aNavkOMtS2hqdMmWKoqOjJVXc/wOOvB5uNA95eXm3xXqIiorSrl27lJGRIXd3dwUFBenZZ59V7969Jd0ea6GsObhd1kFpwsPDLY8fkey/HghyAAAABsU9cgAAAAZFkAMAADAoghwAAIBBEeQAAAAMiiAHAABgUAQ5AAAAgyLIAUAZVq9eLZPJpLS0NHuXAgAlEOQAVIoLFy5o5syZ6tixo7y9vXXXXXepc+fOmjlzps6fP2/v8v6UdevWlfqdkxUlKipKJpNJjRo1Ul5eXon2M2fO6I477pDJZFJMTIwk6eDBgzKZTIqLiyvRf+zYsTKZTFq4cGGJtjFjxsjDw0NXrlyp+AMBUKkIcgAq3MGDB9WpUyfFx8crJCREr732mmbPnq3OnTvr/fff14ABA+xdos1GjBihn376Sb6+vpZtCQkJio+Pr/R9Ozs7Kz8/3/I0+N9LSEgo8fT71q1bq27dukpKSirRPzk5WS4uLkpOTr5uW5s2bVS7du2KKx5AlXCxdwEAbi05OTn629/+JknauXOnWrRoYdU+ffr0654xclTOzs5ydna2y75dXFzUvXt3rVu3TkOGDLFqW7dunfr27atNmzZZtjk7O6t9+/bav3+/zGaz5at9zp8/r7S0NA0bNszqy72lojN7Z8+e1aBBgyr/gABUOM7IAahQK1as0NmzZ/X666+XCHGSVK9ePc2YMcPyeu/evYqMjFSrVq3k6emp5s2b69lnn9Uvv/xi9b6YmBiZTCYdO3ZMY8aMka+vrxo3bqyJEycqNzfXqu+WLVs0fPhwtWzZUp6enmrVqpWmT5+u/Pz8EvWcOHFCjz/+uPz9/eXl5aWQkBBNnTrV0v7He+TCw8O1fft2nTlzRiaTyfJTWFioVq1aacSIESX2ce3aNQUEBCgyMrJ8kykpIiJCX3zxhdV8HD58WEeOHNFDDz1Uon/Hjh31888/6/jx45Zt+/btU40aNTRu3DhlZmbqxIkTVm2S1KlTp3LXBsD+OCMHoEJt3bpVtWrV0uDBg23qv3HjRl28eFGjR4+Wh4eHvvvuO33wwQc6evSo/vnPf5b4wujHHntM3t7emj59ug4dOqQVK1bo3LlzWrdunaXP6tWrVbNmTY0dO1bu7u46cOCA3n77bZ07d07Lly+39Dt69Kj69eunatWqafTo0WrSpIlOnz6tDRs2aM6cOdetd9KkSbp48aJ+/PFHzZ4927K9WrVqGjZsmN566y39/PPPuvPOOy1tO3bsUGZm5nVD3o2Eh4dr4sSJ+uSTTzR69GhJRZdVGzVqdN3w1bFjR0lFl0sDAwMlSUlJSQoODla7du3k7u6upKQk+fv7W/pJBDnAqAhyACrUsWPH5O/vrxo1atjUf+bMmSXuzerQoYOeeOIJJScnlwgY3t7eWrdunSXgeXl5KTY2Vjt37lSPHj0kSUuWLLEaMzIyUn5+fnr99dc1a9YsNWrUSFJRKCsoKNBXX32lJk2aWPpPnz691Hp79uwpb29vZWdna/jw4VZtI0aM0IIFC7RhwwaNGTPGsn3t2rVq0KCBevfubdOc/J6bm5v69++vtWvXavTo0TKbzUpISFBERESJkCtJ99xzj1xcXJSUlGQJfsnJyerWrZucnJzUoUMHJScn6//9v/8nqSjkBQQEqH79+uWuDYD9cWkVQIW6dOmS6tata3P/4sBlNpt18eJFZWVlqUOHDpKKPjTxR0888YRVgBk3bpwkadu2bSXGLCwsVE5OjrKystSxY0eZzWZ98803koo+Vbtnzx6NHDnSKsRJum5AskWzZs0UGhqqNWvWWLbl5uZqy5YtGjp0qFxcbu7fzhEREUpKStLZs2eVnJysM2fOXPeyqlR07G3atLGcacvNzdV3332nsLAwSbIEOanofsajR49yNg4wMIIcgApVt25dXbp0yeb+Z8+e1WOPPSZfX1/5+vrKz89Pbdu2lSRdvHixRH8/Pz+r1/Xr15fJZNLp06ct24rvH7v77rvVuHFj+fn5KTw83GrMU6dOSdJ17+P7Mx5++GEdOHBAP/zwgyRp8+bNunLlyk1dVi3Wp08fmUwmrV+/XuvWrVPLli0VFBRUav+OHTsqLS1N58+f17///W8VFBRYglxYWJhOnjypzMxMHThwQIWFhZbLsQCMhyAHoEI1b95cJ06c0NWrV2/Yt6CgQEOGDNHOnTv13HPPadWqVfr444+1fv16SUVn1MorJydHDzzwgI4dO6Zp06bpo48+0saNGy3PfbuZMctj6NChqlGjhuWs3Nq1a9WsWTO1a9fupsesXr26Bg0apDVr1uiTTz4p9Wxcsd/fJ5eUlCQ/Pz95eHhIktq3by9nZ2clJSVxfxxwC+AeOQAVqn///tq3b582btyoYcOGldn38OHD+v777/X2229r5MiRlu0nT54s9T0nT5603KgvSVlZWcrOzrY8523Xrl3KysrSypUrde+991r6/fGxG3/5y18kFX3goSLdcccd6tevn+Wetq+++kovvfTSnx43IiJCK1askJOTk4YOHVpm3+JglpSUpOPHj1udcXNzc1OrVq2UnJysb775Rg0bNrTMBQDj4YwcgAo1evRoeXt7a9q0aVaPwCh26dIlvfbaa5JkeT6b2Wy26vPWW2+VOv6SJUus+r/zzjuSpH79+pU6ZmFhoRYtWmQ1Tv369dWlSxd9+OGHlsusxf5Yzx+5ubkpJyen1H4PP/ywUlNTFR0drcLCwhsGWlt06dJF06ZN05w5c6weTnw9Hh4e8vPz0+7du/Wf//zHclm1WIcOHbRr1y59/fXXXFYFDI4zcgAqlMlk0urVq/XQQw+pe/fuioiIUEhIiKpVq6YjR45o/fr1uuOOOzR9+nQ1a9ZMfn5+mjZtmn788Ufdcccd+vzzz/Xjjz+WOv6PP/6ohx56SP369dN3332nlStXqlevXurZs6ekosuKd955p6KiojR27Fi5uLho06ZNJZ41J0nz5s1T//791aNHD0VGRqpJkyY6c+aMNmzYoK+//rrUGtq1a6cNGzZo6tSpat++vapVq2Z1luy+++5TgwYN9PHHH+vee++Vj4/Pn5jRIk5OTpo0aZLN/Tt27KjV/1879+9qbBjHcfzzJGUhpCyMFib+gFM2gz/AJCWUf4CSichiMUosp7BYZLEYFGW0YDUyGBnUGZ4enV/O8wyc89x6v6a7vldX1719+t7f635+vjy/rzWbzU9rAIyFjhyAmwsGg5rNZspkMlosFioUCsrn85pOp0okEhqNRpJ+z351u12FQiE1Gg2Vy2VZrdbLjNxnWq2W7Ha7SqWSBoOB4vG4Op3Ope5wONTv9+XxeAlndHQAAAEiSURBVFStVlWv1+X3+y+du9cCgYDG47Genp7UbreVy+U0GAwUiUS+fL9kMqlYLKZ+v690Oq1kMvmmbjabL8Hu/S9KvsufgOZ0OuXz+d7UXnfoCHKAsf06HA5ff0MAgP9AtVpVrVbTer2W2+3+6eP8VbFYVLPZ1Gazkc1m++njAHhQdOQA4MZOp5N6vZ6i0SghDsBdMSMHADey2+00mUw0HA612+2UzWY/rNnv9zqfz1f3MJlMcrlc9zwmgAdCkAOAG1mtVkqlUnK5XKpUKgqFQh/WhMNhbbfbq3t4vV4tl8t7HhPAA2FGDgC+0Xw+1/F4vFq3WCxcQADwzwhyAAAABsVlBwAAAIMiyAEAABgUQQ4AAMCgCHIAAAAGRZADAAAwqBeJFO1smJerHQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Make the plot\n", "plt.figure(figsize=(9,6))\n", "plt.bar(new_x_group, height_group, width=width_group, edgecolor = \"black\")\n", "plt.title(selection)\n", "plt.xlabel('Capacity_MW')\n", "plt.ylabel('Variable Cost')\n", "price_line_plot(price)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lastly, we calculate the profit that our plants can make. Here we first calculate the revenue for the plant, by multiplying the capacity that will be produced by the market price. Next, we subtract the cost of production for each plant that is operating, and get our estimate for profit!" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3500" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(Group.where(\"Total_Var_Cost_USDperMWH\", are.below(price))[\"Capacity_MW\"])" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "def profit(sorted_table, price):\n", " capacity_subset = sum(sorted_table.where(\"Total_Var_Cost_USDperMWH\", are.below(price))[\"Capacity_MW\"])\n", " revenue = capacity_subset * price\n", " cost = 0\n", " for i in range(len(sorted_table.where(\"Total_Var_Cost_USDperMWH\", are.below(price))[\"Total_Var_Cost_USDperMWH\"])):\n", " cost += sorted_table.where(\"Total_Var_Cost_USDperMWH\", are.below(price))[\"Total_Var_Cost_USDperMWH\"][i]\\\n", " * sorted_table.where(\"Total_Var_Cost_USDperMWH\", are.below(price))[\"Capacity_MW\"][i]\n", " return revenue - cost" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "72998.0" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profit(Group, price)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So now we have the ability to estimate the amount of profit our plants will generate based on a given amount of demand. However, there is a caveat in what we have done. The graphs above are generated by using the marginal cost. In reality, you (and every other team) can choose to price their plants however they wish, so there is no guarantee that any of these estimates are accurate." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Conclusion and Resources" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Congratulations! You have completed your Jupyter Notebook tutorial for the ESG. We hope that this resource proves useful to you throughout the course of the game. If you do have questions, please do not hesitate to reach out and ask anyone from the modules team via Piazza or email, as we are here to help.\n", "\n", "Module Developers: Alec Kan [(alec.kan@berkeley.edu)](mailto:alec.kan@berkeley.edu), Alma Pineda, Aarish Irfan, Elaine Chien, and Octavian Sima.\n", "\n", "Data Science Modules: http://data.berkeley.edu/education/modules" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.7" } }, "nbformat": 4, "nbformat_minor": 2 }