From 3c5b10953ed756fa77c257f6e849b53a009b1234 Mon Sep 17 00:00:00 2001
From: ashwinmaran <amaran@wisc.edu>
Date: Tue, 10 Oct 2023 22:35:40 -0500
Subject: [PATCH] add lab-p6 and p6

---
 lab-p6/README.md            |   66 +
 lab-p6/lab-p6.ipynb         | 3075 +++++++++++++++++++++++++++++++++++
 lab-p6/power_generators.csv |  614 +++++++
 lab-p6/public_tests.py      | 1160 +++++++++++++
 p6/README.md                |    2 +-
 p6/p6.ipynb                 |  310 ++--
 6 files changed, 5071 insertions(+), 156 deletions(-)
 create mode 100644 lab-p6/README.md
 create mode 100644 lab-p6/lab-p6.ipynb
 create mode 100644 lab-p6/power_generators.csv
 create mode 100644 lab-p6/public_tests.py

diff --git a/lab-p6/README.md b/lab-p6/README.md
new file mode 100644
index 0000000..a99577e
--- /dev/null
+++ b/lab-p6/README.md
@@ -0,0 +1,66 @@
+# Lab P6: Reading CSV Data from Airbnb
+
+In this lab, you will practice accessing CSVs, sorting, and using sets. You will work with a real-world dataset and deal with issues that arise when using such datasets.
+
+### Corrections/Clarifications
+
+None yet
+
+**Find any issues?** Report to us:
+
+- Ashwin Maran <amaran@wisc.edu>
+
+------------------------------
+## Learning Objectives
+
+In this lab, you will practice:
+* accessing data directly from a CSV file,
+* dealing with messy real-world datasets,
+* using string functions to compare and extract data values,
+* using sorting functions to order data,
+* using sets to determine the unique values in a list
+
+------------------------------
+## Note on Academic Misconduct
+
+You may do these lab exercises only with your project partner; you are not allowed to start working on Lab-P6 with one person, then do the project with a different partner.  Now may be a good time to review [our course policies](https://cs220.cs.wisc.edu/f23/syllabus.html).
+
+
+------------------------------
+## Segment 1: Setup
+
+Create a `lab-p6` directory and download the following files into the `lab-p6` directory.
+
+* `power_generators.csv`
+* `lab-p6.ipynb`
+* `public_tests.py`
+
+**Note:** If you accidentally downloaded the file as a `.txt` instead of `.csv` (or `.cvs` or `.csv.txt`)
+(say `power_generators.cvs`), you can execute `mv power_generators.cvs power_generators.csv` on a
+Terminal/PowerShell window. Recall that the `mv` (move) command lets you rename a source file
+(first argument, example: `power_generators.cvs`) to the destination file (second argument, example:
+`power_generators.csv`).
+
+**Warning:** Please make sure that the name of the file is `power_generators.csv` in your local computer. If your file has a different name on your computer, you may pass the *local tests*, but **fail** the tests on Gradescope.
+
+To start, familiarize yourself with the dataset (`power_generators.csv`). Examine its contents using Microsoft Excel, Numbers (Mac) or any other spreadsheet viewing software.
+
+------------------------------
+
+## Segment 2: Working with `power_generators.csv`
+
+You will be finishing the rest of your lab on `lab-p6.ipynb`. Run the command `jupyter notebook` from your Terminal/PowerShell window.
+Remember not to close this
+Terminal/PowerShell window while Jupyter is running, and open a new Terminal/PowerShell
+window if necessary.
+
+**Note**: For P6, you will be working on `p6.ipynb`, which is very similar to `lab-p6.ipynb`. We
+strongly recommend that you finish working on this notebook during the lab, so you can ask
+your TA/PM any questions about the notebook that may arise.
+
+**Note**: Unlike `p6.ipynb`, you do **not** have to submit `lab-p6.ipynb`. This notebook is solely
+for your practice and preparation for P6.
+
+------------------------------
+
+You can now get started with [P6]((https://git.doit.wisc.edu/cdis/cs/courses/cs220/cs220-f23-projects/-/tree/main/p6)). **You may use any helper functions created here in project P6**. Remember to only work with P6 with your partner from this point on. Have fun!
diff --git a/lab-p6/lab-p6.ipynb b/lab-p6/lab-p6.ipynb
new file mode 100644
index 0000000..96aed2b
--- /dev/null
+++ b/lab-p6/lab-p6.ipynb
@@ -0,0 +1,3075 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "9de140a7",
+   "metadata": {
+    "cell_type": "code",
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "# import and initialize otter\n",
+    "import otter\n",
+    "grader = otter.Notebook(\"lab-p6.ipynb\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "749dcb29",
+   "metadata": {
+    "editable": false,
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.268982Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.267982Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.454885Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.453855Z"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "import public_tests"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bf8001ac",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "# Lab-P6: Real-world Datasets (Power Generators in WI)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6926bf1f",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "## Segment 2: Loading Data from CSVs"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "110dcf74",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### About the dataset\n",
+    "\n",
+    "Now would be a good time to open `power_generators.csv` with Microsoft Excel (or some other Spreadsheet viewing software) and have a look at the data. The first few rows of the dataset are reproduced here:"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ab3f9dd9",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "entity_id|entity_name|plant_id|plant_name|generator_id|county|net_summer_capacity|net_winter_capacity|technology|latitude|longitude\n",
+    "---|---|---|---|---|---|---|---|---|---|---\n",
+    "13781|Northern States Power Co - Minnesota|1756|Saxon Falls|1|Iron|0.5|0.5|Conventional Hydroelectric|46.5392|-90.3742\n",
+    "13781|Northern States Power Co - Minnesota|1756|Saxon Falls|2|Iron|0.5|0.6|Conventional Hydroelectric|46.5392|-90.3742\n",
+    "20847|Wisconsin Electric Power Co|1775|Brule|1|Florence|1.3|1.3|Conventional Hydroelectric|45.9472|-88.2189\n",
+    "20847|Wisconsin Electric Power Co|1775|Brule|2|Florence|2|2|Conventional Hydroelectric|45.9472|-88.2189\n",
+    "20847|Wisconsin Electric Power Co|1775|Brule|3|Florence|2|2|Conventional Hydroelectric|45.9472|-88.2189"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "34b34771",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**WARNING**: If you open `power_generators.csv` using a Spreadsheet Viewer, you need to be careful **not** to modify the dataset in any way. Leading zeroes are *intentionally* a part of some plant and generator ids. In particular, make sure you **do not save** the file before you close the file."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "03b4ee6f",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "The `power_generators.csv` file has data about every Power Generator in operation within the state of Wisconsin, as of August 2023. Each row of data represents a **single** generator within the state of Wisconsin. The columns contain the following data about each generator (along with the correct data type you **must** represent it as)::\n",
+    "\n",
+    "1. `entity_id` - the **ID** of the **entity** that operates the Power Generator (`int`)\n",
+    "2. `entity_name` - the **name** of the **entity** that operates the Power Generator (`str`)\n",
+    "3. `plant_id` - the **ID** of the **Power Plant** hosting the Power Generator (`int`)\n",
+    "4. `plant_name` - the **name** of the **Power Plant** hosting the Power Generator (`str`)\n",
+    "5. `generator_id` - the **ID** of the specific **Power Generator** within its Power Plant (`str`)\n",
+    "6. `county` - the **name** of the **county** that the **Power Plant** is located in (`str`)\n",
+    "7. `net_summer_capacity` - the maximum **capacity** of the **Power Generator** (in units of MW) during the Summer months (`float`)\n",
+    "8. `net_winter_capacity` - the maximum **capacity** of the **Power Generator** (in units of MW) during the Winter months (`float`)\n",
+    "9. `technology` - the **technology** used by the **Power Generator** (`str`)\n",
+    "10. `latitude` - the **latitude** where the **Power Plant** is located (`float`)\n",
+    "11. `longitude` - the **longitude** where the **Power Plant** is located (`float`)\n",
+    "\n",
+    "**Warning**: Keep in mind while writing your project, some entries may be **missing data** for specific columns. Sadly, data in real life is often messy. **In P6, we will have to deal with missing data.**"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "29301c84",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 2.1: Processing the CSV file\n",
+    "\n",
+    "You will now read this dataset with Python. [Chapter 14](https://automatetheboringstuff.com/chapter14/) of Automate the Boring Stuff introduces CSV files and provides a code snippet you can reuse. You can use the same code snippet for P6. Run the next few cells and see their outputs."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "9d3acf35",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.458885Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.458885Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.465094Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.465094Z"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "# it is considered a good coding practice to place all import statements at the top of the notebook\n",
+    "# please place all your import statements in this cell if you need to import any more modules for this lab\n",
+    "\n",
+    "import csv # we have imported this module for you; it is required by the process_csv function below"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "289f8744",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.470116Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.469124Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.475416Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.474402Z"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "# modified from https://automatetheboringstuff.com/chapter14/\n",
+    "\n",
+    "def process_csv(filename):\n",
+    "    example_file = open(filename, encoding=\"utf-8\")\n",
+    "    example_reader = csv.reader(example_file)\n",
+    "    example_data = list(example_reader)\n",
+    "    example_file.close()\n",
+    "    return example_data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "86dfacfb",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.479427Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.478426Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.492488Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.491468Z"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "# this call to process_csv reads the data in \"power_generators.csv\"\n",
+    "csv_data = process_csv(\"power_generators.csv\")\n",
+    "\n",
+    "# this will display the first three items in the list `csv_data`\n",
+    "csv_data[:3]"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f355fe3d",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "The variable `csv_data` stores the contents of the file `power_generators.csv` as a **list of lists** (i.e., `csv_data` is a **list**, and the elements of this list are **lists** themselves). In the next subsection, you will learn to access data stored within this data structure."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5a9fde4d",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 2.2: Accessing the contents of the dataset\n",
+    "\n",
+    "You will now index the data to extract the correct answers for the questions listed below. Some have been done for you. To understand the results better, locate the values in the `power_generators.csv` file."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "dab9a99f",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 1:** What are the **names** of the **columns** in the dataset?\n",
+    "\n",
+    "**Hint:** Take a look at the output of the cell above and see where the column names are stored. Use **indexing** to extract the csv header.\n",
+    "\n",
+    "**Note:** Index starts at 0"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "fd70e628",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.496489Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.496489Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.503904Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.502883Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "csv_header = csv_data[...] # A list of the column headers\n",
+    "\n",
+    "csv_header"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "4947b1af",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q1\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1b619cc5",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "It would be a good idea to use **slicing** to extract all the inner lists (except the header), and store them in a variable you can use later."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ec047e7e",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.519166Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.519166Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.523267Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.523267Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "csv_rows = csv_data[...] # extract the entire CSV data set besides the header\n",
+    "# DO NOT attempt to display csv_rows(i.e., do not print out the variable by adding the variable name to the end of the cell)\n",
+    "# DO not add an addtional line to this cell\n",
+    "# csv_rows has over 600 lists, and will take up unnecessary space\n",
+    "# you can confirm that you extracted the data correctly by answering the next few questions"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ad22249e",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 2:** How many **rows** are in the dataset (excluding the **header**)?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "66b5752b",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.528296Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.528296Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.533920Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.533920Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# we have done this one for you\n",
+    "num_rows = len(csv_rows)\n",
+    "\n",
+    "num_rows"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "9d009375",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q2\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "742604dd",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 3:** What are the **first** *ten* rows in the dataset?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f89a3a8e",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.547764Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.547764Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.556094Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.555084Z"
+    },
+    "scrolled": true,
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# we have done this one for you\n",
+    "first_ten_rows = csv_rows[:10]\n",
+    "\n",
+    "first_ten_rows"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a68e520d",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q3\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "402722b2",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 4:** What are the **last** *ten* rows in the dataset?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b625f054",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.570138Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.570138Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.579343Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.578332Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "\n",
+    "last_ten_rows = csv_rows[...]\n",
+    "\n",
+    "last_ten_rows"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "28c17c05",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q4\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b14e05b4",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**In general, when you want to confirm that you are reading a large file correctly, it is a good idea to check that you have the correct number of rows, and that the first and last few rows are correct. Here, you were given access to `public_tests.py`, which has the correct answers, so it was easy for you to check. Otherwise, you would have to manually open `power_generators.csv` and confirm that you have not made any mistakes. It is recommended that you manually open `power_generators.csv` in any case to verify that the data matches your answers for the previous three questions.**"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4b37962a",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 5:** What values are present in the *first* **row** of the dataset?\n",
+    "\n",
+    "**Hint**: You already know how to extract a single element from a list. That is all you need to do here."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "7c7e1323",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.592879Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.592879Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.598910Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.598910Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "first_row = ...\n",
+    "\n",
+    "first_row"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "92831ddb",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q5\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3b0b0bfc",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "You now know how to extract a single **row** (or a list of rows) from the file `power_generators.csv`. You will now extract data from a single **cell** of the file.\n",
+    "\n",
+    "To extract data from a single cell of the csv file, we need two things:\n",
+    "  1. row index\n",
+    "  2. column index\n",
+    "    \n",
+    "You already know to extract a row of data with `csv_rows[row_idx]`. Given this list, can you now extract the data in a particular cell using the **column index**?"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6bdcb5af",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 6:** What is the `entity_name` of the *first* power generator?\n",
+    "\n",
+    "**Hint:** The **column index** for the `entity_name` column is `1`. You may **hardcode** the **column index** as `1` **just for this question**."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "31a6cbd0",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.612699Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.611692Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.619465Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.618448Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "first_row = csv_rows[...] # extract the first row of the dataset\n",
+    "first_entity_name = first_row[...] # extract the entity name\n",
+    "\n",
+    "first_entity_name"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "16c8044d",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q6\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b42507d0",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "You solved the previous question by **hardcoding** the **column index**, when you were just given the **column name**. This is however a **bad practice**, and you **must not** do it in your project. It would be much safer to somehow **extract** the **column index** **from** the **column name**, and then use the **column index**. The following (built-in) list method helps us with that:\n",
+    "\n",
+    "### List method: `index`\n",
+    "\n",
+    "**Syntax:** `list.index(value)`\n",
+    "\n",
+    "This function will return the index of the item `value` in the `list`. You can see this function in action in the question below."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f20b3537",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 7:** What is the **index** of the column `technology`?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "dfe9fded",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.632601Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.632601Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.638014Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.638014Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# we have done this one for you\n",
+    "technology_index = csv_header.index('technology')\n",
+    "\n",
+    "technology_index"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ec6e115c",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q7\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "37774b1f",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "Can you make sense of the code above? If not, please request your TA/PM to help you before proceeding further."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1984caf6",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 8:** What is the `technology` of the *first* generator in the dataset (first row)?\n",
+    "\n",
+    "You **must** use the `index` method to extract the **column index** from the given **column name**."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "90304fe1",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.652162Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.652162Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.659276Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.658253Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "# do NOT hardcode the number; use the variable you defined in the last question using the index function\n",
+    "\n",
+    "technology_first_row = csv_rows[0][...]\n",
+    "\n",
+    "technology_first_row"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "0b427807",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q8\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "913f15cc",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 2.3: Build a helper function for quick data access\n",
+    "\n",
+    "It is quite cumbersome to extract data from `power_generators.csv` by indexing `csv_rows` and using the `index` method each time. To save yourself some time and effort, fill in the details of the following helper function.\n",
+    "\n",
+    "After finishing the definition of the `cell` function below, you **must only** use this function to extract data from `power_generators.csv`. In P6, you will **lose points** if you attempt to extract data from `power_generators.csv` without **explicitly** calling the `cell` function."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "089d39bc",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.672005Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.672005Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.677878Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.677878Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "def cell(row_idx, col_name):\n",
+    "    \"\"\"\n",
+    "    cell(row_idx, col_name) returns the data value (cell) \n",
+    "    corresponding to the row index `row_idx`\n",
+    "    and the column name `col_name` of a CSV file\n",
+    "    \"\"\"\n",
+    "    # replace the ... with your code\n",
+    "    col_idx = csv_header.index(...)\n",
+    "    val = csv_rows[...][col_idx]\n",
+    "    if val == \" \": # missing data in this dataset is represented by the string with just a single space\n",
+    "        return None # when we come across missing data, we return None instead\n",
+    "    return val"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "186c2dea",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 9:** What is the `technology` used by the *first* power generator?\n",
+    "\n",
+    "You **must** answer this question by calling the `cell` function."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "fbef32a2",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.682909Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.682909Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.688316Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.688316Z"
+    },
+    "scrolled": true,
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "\n",
+    "technology_first_row = cell(..., ...)\n",
+    "\n",
+    "technology_first_row"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c42be6b9",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q9\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bfcb5ad9",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 10:** What is the `plant_name` of the *second* power generator?\n",
+    "\n",
+    "You **must** answer this question by calling the `cell` function."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f7a1191c",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.702039Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.701016Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.708414Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.707398Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "\n",
+    "plant_name_second_row = cell(..., ...)\n",
+    "\n",
+    "plant_name_second_row"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "fb596d13",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q10\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "74cab492",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 11:** What is the `latitude` of the *third* power generator?\n",
+    "\n",
+    "You **must** answer this question by calling the `cell` function."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "58a431be",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.720954Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.720954Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.727858Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.726829Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "\n",
+    "latitude_third_row = cell(..., ...)\n",
+    "\n",
+    "latitude_third_row"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c9f9415e",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q11\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "24cce8c7",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 12:** What is the `generator_id` of the *tenth* power generator?\n",
+    "\n",
+    "You **must** answer this question by calling the `cell` function."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "dad5ef16",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.740982Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.740982Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.746780Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.746780Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "\n",
+    "generator_id_tenth_row = cell(..., ...)\n",
+    "\n",
+    "generator_id_tenth_row"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f9641b40",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q12\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "df8393cd",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 13:** How **many** power generators are in the `county` *Iron*?\n",
+    "\n",
+    "You **must** use `cell` if you want to extract any data from the csv file.\n",
+    "\n",
+    "**Hint:** You must loop through the entire dataset. Use `cell` to extract the `county` of each generator."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "95c5e77b",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.760562Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.759561Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.766877Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.766877Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "iron_generators = ... # initialize with the correct value\n",
+    "for idx in range(...): # loop through all the indices \n",
+    "    if ...: # use `cell` to determine if the power generator at `idx` is from the correct county\n",
+    "        iron_generators += 1 # update the variable appropriately\n",
+    "\n",
+    "iron_generators"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a60efdeb",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q13\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8f736193",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 14:** List the names (`plant_name`) of all the power plants operated by the entity with the `entity_name` *Butter Solar, LLC*.\n",
+    "\n",
+    "Your output **must** be a *list*. You **must** use `cell` if you want to extract any data from the csv file.\n",
+    "\n",
+    "**Hint:** Loop through the entire dataset and use `cell` to determine if each generator is operated by the required `entity_name`. Use `cell` once again to extract the `plant_name` of each such generator, and use the `<list>.append` method to add the `plant_name` to your list. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "73ab8cfc",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.780681Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.780681Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.789590Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.788561Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "butter_solar_plants = ... # initialize as an empty list\n",
+    "for idx in range(...): # loop through all the indices \n",
+    "    if ...: # use `cell` to determine if the generator at `idx` is operated by the correct entity\n",
+    "        butter_solar_plants.append(...) # use `cell` to append the `plant_name` to the list\n",
+    "\n",
+    "butter_solar_plants"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a775fbca",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q14\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f44dbc99",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "## Segment 3: Building a better helper function"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "67e1bcf0",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "Our helper function `cell` could use some improvement. As you have seen, the function currently returns columns such as `entity_id` as **strings**, even though it would make more sense to represent them as **ints**. Let us ensure that the function returns the required type on its own. \n",
+    "\n",
+    "We will define a new function `cell` and test its implementation."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "e92db997",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.802615Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.802615Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.808120Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.808120Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# we did this one for you, but you will need to come back and update it later\n",
+    "def cell(row_idx, col_name):\n",
+    "    col_idx = csv_header.index(col_name)\n",
+    "    val = csv_rows[row_idx][col_idx]\n",
+    "    if val == \" \":\n",
+    "        return None\n",
+    "    elif col_name == 'entity_id':\n",
+    "        val = int(val)\n",
+    "    elif col_name == 'net_summer_capacity':\n",
+    "        val = float(val)\n",
+    "    return val"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "113b684a",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 3.1 Return the correct data type for `entity_id`"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e8b37764",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 15**: What is the `entity_id` of the *last* power generator?\n",
+    "\n",
+    "Your output **must** be an `int`. You **must** call the `cell` function to answer this question."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "53d43e13",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.813142Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.813142Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.818672Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.818672Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# we have done this for you\n",
+    "entity_id_last_row = cell(-1, 'entity_id')\n",
+    "\n",
+    "entity_id_last_row"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "0ca45d94",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q15\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0c1c3054",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 3.2 Return the correct data type for `plant_id` column\n",
+    "\n",
+    "Update `cell` so it can correctly handle the column `plant_id` as well. Your function **must** return an `int` when the `col_name` is `plant_id`."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c46ef31c",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 16**: What is the `plant_id` of the *last* power generator?\n",
+    "\n",
+    "You **must** answer this question by calling the **`cell`** function."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "860b716a",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.832661Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.831659Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.837679Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.837679Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "plant_id_last_row = ...\n",
+    "\n",
+    "plant_id_last_row"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "3a2cfc2d",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q16\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "96153b7b",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 3.3 Return the correct data types for all other columns\n",
+    "\n",
+    "- Recall that the **correct** datatypes for each of the columns are as follows:\n",
+    "    1. `entity_id` - **`int`**\n",
+    "    2. `entity_name` - **`str`**\n",
+    "    3. `plant_id` - **`int`**\n",
+    "    4. `plant_name` - **`str`**\n",
+    "    5. `generator_id` - **`str`**\n",
+    "    6. `county` - **`str`**\n",
+    "    7. `net_summer_capacity` - **`float`**\n",
+    "    8. `net_winter_capacity` - **`float`**\n",
+    "    9. `technology` - **`str`**\n",
+    "    10. `latitude` - **`float`**\n",
+    "    11. `longitude` - **`float`**\n",
+    "    \n",
+    "- Update your `cell` function so it can correctly handle **all** columns.\n",
+    "- The `if` condition will become very long if you keep using `or` to separate each column comparison operation.\n",
+    "- It is easier to make a list of all the column names whose values require `int` conversion and use `in` operator to check \n",
+    "```python\n",
+    "if col_name in [..., ..., ...]\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "02e94d10",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 17**: What is the `net_summer_capacity` of the *fifth* power generator?\n",
+    "\n",
+    "You **must** answer this question by calling the **`cell`** function."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "12a1d13e",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.851568Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.851568Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.856835Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.856835Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# we have done this one for you\n",
+    "net_summer_capacity_fifth_row = cell(4, 'net_summer_capacity')\n",
+    "\n",
+    "net_summer_capacity_fifth_row"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "2ff43ddb",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q17\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9e0b5b42",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 18**: What is the `latitude` of the *hundredth* power generator?\n",
+    "\n",
+    "You **must** answer this question by calling the **`cell`** function."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ca2c107b",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.870425Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.869409Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.876421Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.875409Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# we have done this one for you\n",
+    "latitude_hundredth_row = cell(99, 'latitude')\n",
+    "\n",
+    "latitude_hundredth_row"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a1c73a70",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q18\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "dbf2551b",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 19:** What is the **list** of `net_winter_capacity` of the generators from the `county` *Sheboygan*?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "292835fc",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.889383Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.889383Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.897889Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.896869Z"
+    },
+    "scrolled": false,
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "sheboygan_winter_capacities = ... # initialize as an empty list\n",
+    "for idx in range(...): # loop through all the indices \n",
+    "    if ...: # use `cell` to determine if the generator at `idx` is from Sheboygan\n",
+    "        sheboygan_winter_capacities.append(...) # use `cell` to append the `net_winter_capacity` to the list\n",
+    "\n",
+    "sheboygan_winter_capacities"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "56deb324",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q19\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1385d415",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "## Segment 4: Sorting Data\n",
+    "\n",
+    "There are two major ways to sort lists in Python: (1) with the `sorted` function and (2) with the `.sort` method. For each method, let's examine (a) how it modifies existing structures, and (b) what new values it returns, if any.\n",
+    "\n",
+    "The default sorting order is ascending. You can change that to descending, by passing the keyword argument `reverse = True`. The same parameter / argument pair is applicable for both `.sort` method and `sorted` function."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ed689446",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 4.1: Sort lists using `.sort()`"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "207afca6",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 20:** What does the method call `sheboygan_winter_capacities.sort()` do?\n",
+    "\n",
+    "Can you explain what is going on here?"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bc1becee",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "_Type your answer here, replacing this text._"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "e2adc274",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.913472Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.912459Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.919156Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.918136Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# we have done this one for you\n",
+    "result = sheboygan_winter_capacities.sort()\n",
+    "\n",
+    "print(\"Returned value:\", result)\n",
+    "print(\"Original list after sorting:\", sheboygan_winter_capacities)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c9976110",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q20\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e6e3f9e8",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "Now run the below code. Can you explain the output?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "4f80a8b9",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.932496Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.931492Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.937777Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.937777Z"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "# sort in descending order\n",
+    "sheboygan_winter_capacities.sort(reverse=True)\n",
+    "\n",
+    "sheboygan_winter_capacities"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "026f3231",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 4.2: Sort lists using `sorted()`\n",
+    "\n",
+    "Now, use the `sorted` function to complete the same task as above."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "428750af",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 21:** What does the function call `sorted(sheboygan_winter_capacities)` do?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "fd0275a4",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.942795Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.942795Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.949354Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.948324Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# sort the list `sheboygan_winter_capacities` and assign the sorted list to the variable `sorted_sheboygan_winter_capacities`.\n",
+    "# replace the ... with your code\n",
+    "\n",
+    "sorted_sheboygan_winter_capacities = sorted(...)\n",
+    "\n",
+    "print(\"Returned value:\", sorted_sheboygan_winter_capacities)\n",
+    "print(\"Original list after sorting:\", sheboygan_winter_capacities)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ee92e5f8",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q21\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0875ce7e",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "Now run the below code to sort the list in reverse (descending) order using the `sorted()` function."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "d160583d",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.962565Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.961565Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.968787Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.967756Z"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "# sort in descending order\n",
+    "reverse_sorted_sheboygan_winter_capacities = sorted(sheboygan_winter_capacities, reverse=True) \n",
+    "reverse_sorted_sheboygan_winter_capacities "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d9de61d7",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Can you compare the outcome of calling `list.sort()` and `sorted(list)`**? What is returned by these functions, and what happens to the original lists? If you are not able to spot the difference, reach out to a TA/PM."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "15e4e2df",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 4.3: Sorting to find the median"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "399c1210",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "Now, let's try using sorting to solve a common problem - that of finding the median of a given distribution of values. Recall that the median is the **middle number** in a sorted (ascending or descending) list of numbers.   \n",
+    "  \n",
+    "In a sorted list, if the list has an **odd** number of elements, the median is the middle number:\n",
+    "\n",
+    "For example, for the list `[10, 20, 30, 40, 50]` --> median is `30`.\n",
+    "\n",
+    "If a sorted list has an **even** number of elements, the median is the **average** of the **two middle numbers**:\n",
+    "\n",
+    "For example, for the list `[10, 20, 30, 40]` --> median is `25`. \n",
+    "\n",
+    "**Note:** The function **must not** change the original list's order. Think about which of the two functions above you should use here."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "3a6977d7",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.972787Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.972787Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.979380Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.978350Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "def median(items):\n",
+    "    \"\"\"\n",
+    "    median(items) returns the median of the list `items`\n",
+    "    \"\"\"\n",
+    "    # sort the list\n",
+    "    sorted_list = ...\n",
+    "    # determine the length of the list\n",
+    "    list_len = ...\n",
+    "    if ...: # determine whether length of the list is odd\n",
+    "        # return item in the middle using indexing\n",
+    "        return sorted_list[...]\n",
+    "    else:\n",
+    "        first_middle = ... # use appropriate indexing\n",
+    "        second_middle = ... # use appropriate indexing\n",
+    "        return (first_middle + second_middle) / 2"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "414375d9",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 22:** What is the median of the list `list1 = [5, 3, 1, 2, 4]`?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "603cb84d",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:25.983381Z",
+     "iopub.status.busy": "2023-10-11T02:27:25.983381Z",
+     "iopub.status.idle": "2023-10-11T02:27:25.990937Z",
+     "shell.execute_reply": "2023-10-11T02:27:25.989915Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "\n",
+    "list1 = [5, 3, 1, 2, 4]\n",
+    "median1 = ...\n",
+    "\n",
+    "median1"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ea342ea7",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q22\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "cf75d030",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 23:** What is the median of the `list2 = [5, 3, 1, 2, 4, 6]`?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "bedf28a0",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.005216Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.005216Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.012356Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.011327Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "\n",
+    "list2 = [5, 3, 1, 2, 4, 6]\n",
+    "median2 = ...\n",
+    "\n",
+    "median2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "cb3f6b61",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q23\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "47476820",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "After that short detour, let us return to the Power Generators dataset.\n",
+    "\n",
+    "**Question 24:** What is the **median** `latitude` of all power generators in the dataset?\n",
+    "\n",
+    "**Hint:** First create a *list* of the `latitude`(s) of all the power generators in the dataset, and then use the `median` function to find the **median** of that list."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c35846bd",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.025363Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.024362Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.032979Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.031963Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# create a list of latitudes of all power generators in the dataset and store it in a suitably named variable\n",
+    "\n",
+    "# find the median of the list of latitudes and store it in the variable 'median_latitude', then display it"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "e50efe70",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q24\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5552b779",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 25:** What is the **median** `net_summer_capacity` of all generators powered by the `technology` *Nuclear*?\n",
+    "\n",
+    "**Hint:** First create a *list* of the `net_summer_capacity` of all the power generators in the dataset with the required `technology`, and then use the `median` function to find the **median** of that list."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "6a605730",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.046545Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.046545Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.054078Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.054078Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# create a list of net_summer_capacity of all Nuclear generators in the dataset and store it in a suitably named variable\n",
+    "\n",
+    "# find the median of the list and store it in the variable 'median_nuclear_summer_capacities', then display it"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a3db2387",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q25\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "af8453b8",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "## Segment 5: Missing Data\n",
+    "\n",
+    "So far, we have carefully avoided having to deal with missing data in the dataset. We have defined our `cell` function to identify missing data in the dataset, and to return `None` every time the data we request is missing. This will make it a little easier for us to identify missing data while we work with the dataset."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e11faa4c",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 26:** What is the **list** of net summer capacities (`net_summer_capacity`) of all generators from the `county` *Columbia*?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c038d028",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.069707Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.068707Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.077036Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.077036Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# compute and store the answer in the variable 'columbia_summer_capacities', then display it\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "22ce410f",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q26\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "75371442",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 5.1: Ignoring missing data\n",
+    "\n",
+    "As you can see in the list above, some of the data for power generators in *Columbia* was **missing** in the dataset. Now, if we wanted to find the **median** `net_summer_capacity` of the generators in the `county` of *Columbia*, it would not make any sense to include the data from these generators with missing data. Therefore, we will have to **ignore** all the **missing data** while computing the median."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "7ecd656a",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 27:** What is the **median** `net_summer_capacity` of all generators from the `county` *Columbia*?\n",
+    "\n",
+    "You **must** ignore any generators for which the `net_summer_capacity` data is **missing**."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "1baa001d",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.090986Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.090986Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.100383Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.100383Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "\n",
+    "columbia_summer_capacities = ... # initialize as an empty list\n",
+    "for idx in range(...): # loop through all the indices\n",
+    "    if cell(idx, 'net_summer_capacity') == None: # skip the row if the `net_summer_capacity` data is missing\n",
+    "        continue\n",
+    "    if ...: # use `cell` to determine if the generator at `idx` is from the correct county\n",
+    "        columbia_summer_capacities.append(...) # use `cell` to append the `net_summer_capacity` to the list\n",
+    "\n",
+    "# find the median of the list and store it in the variable 'median_columbia_summer_capacities', then display it"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c5de4952",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q27\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f0b05c5f",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "## Segment 6: Sets\n",
+    "In class, we learned about the Python `list` sequence. Another simpler structure you'll sometimes find useful is the `set`. A set is **not** a sequence because it does not keep all the values in any particular order."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a4a18ee5",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 6.1: Create a set\n",
+    "You can create sets the same way as lists, just **replacing** the *square brackets*(`[]`) with *curly braces*(`{}`). In the cell below, create a set with the same elements as the example list provided."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f6826936",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 28:** What is the set having the same contents as `example_list` below?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "01f0c7ef",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.113958Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.113958Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.121949Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.120928Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "example_list = [\"Saxon Falls\", \"Brule\", \"Biron\"]\n",
+    "print(example_list)\n",
+    "# replace the ... with your code\n",
+    "example_set = {..., ..., ...}\n",
+    "\n",
+    "example_set"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "9b4057f8",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q28\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "25add0b1",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 6.2: Check if an element is present in a list or set"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "654f9668",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "The `in` operator is used to check if an element is present in a list or set. Try it below:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "9451957f",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.133898Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.133898Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.140968Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.139951Z"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "\"Biron\" in example_list"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f0affe49",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 29**: Check if `plant_name` *Saxon Falls* is **present in** the set `example_set`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "7b4a75f3",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.144966Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.144966Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.150667Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.150667Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "saxon_falls_check = ... in ...\n",
+    "\n",
+    "saxon_falls_check"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ad453f87",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q29\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3d558b07",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 6.3: Check the ordering of elements in a list or set"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4f05e011",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "Sets have no inherent ordering, so they don't support indexing. Try the code in the cells below."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "bc45050e",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.165119Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.165119Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.170427Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.170427Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "example_list[0]  # this works"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "1151f0c8",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.175457Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.175457Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.179161Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.179161Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "example_set[1] # but this does not work"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9d6cc933",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "Unlike lists, the order does not matter to sets for comparisons. Try evaluating this boolean expression:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "720cefac",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.184192Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.183171Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.189434Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.189434Z"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "[\"Saxon Falls\", \"Brule\", \"Biron\"] == [\"Biron\", \"Brule\", \"Saxon Falls\"]"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "2720ded3",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "And now try this:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "0b5a186a",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.193450Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.193450Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.200002Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.200002Z"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "{\"Saxon Falls\", \"Brule\", \"Biron\"} == {\"Biron\", \"Brule\", \"Saxon Falls\"}"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "98619260",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 6.4 Convert between lists and sets\n",
+    "You can switch back and forth between lists and sets with ease. Let's try it."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "baf148ac",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 30**: What is the **list** of all plant names (`plant_name`) operated by the entity with the ID (`entity_id`) *13781*?"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "96068c1d",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.205038Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.204012Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.212572Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.212572Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# compute and store the answer in the variable 'plant_names_13781', then display it\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "90885cf9",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q30\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b93eb6ec",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "We note that each power plant features multiple times in the list above, since each power plant may have multiple generators, and each generator shows up once in the dataset.\n",
+    "\n",
+    "Now, let us convert the **list** `plant_names_13781` into a **set**. Compare the number of elements in the list and the set."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5bfc3ac8",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 31**: What is the **set** of all plant names (`plant_name`) operated by the entity with the ID (`entity_id`) *13781*?\n",
+    "\n",
+    "**Hint:** You can convert a *list* into a *set* by typecasting. For example, to convert a *list* `example_list` into a *set*, you can use `set(example_list)`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "09aa8e71",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.227477Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.227477Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.235335Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.234314Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# replace the ... with your code\n",
+    "plant_names_13781_set = ...\n",
+    "\n",
+    "print('Length of list:',  len(plant_names_13781))\n",
+    "print('Length of set:', len(plant_names_13781_set))\n",
+    "\n",
+    "plant_names_13781_set"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "2e1c332f",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q31\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "afd5f72b",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "As you can see, the number of elements is different! This is because a set is a collection of **unique** elements. Therefore, there can be no duplicates in a **set**.\n",
+    "\n",
+    "**Be careful!** When going from a set to a list, Python has to choose how to order the previously unordered values. If you run the same code, there's no guarantee Python will always choose the same way to order the set values in the new list."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4d509c71",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "### Task 6.5 Remove Duplicates\n",
+    "Let's use the uniqueness property of sets above to remove duplicates from a list by **converting** from a **list to a set** and **back to a list again**."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "99ed4c64",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "**Question 32**: What is the **unique list** of all plant names (`plant_name`) operated by the entity with the ID (`entity_id`) *4247*?\n",
+    "\n",
+    "**Hint:** Just as you can convert a *list* into a *set* by typecasting, you can convert a *set* into a *list*. For example, to convert a *set* `example_set` into a *list*, you can use `list(example_set)`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "9786714a",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2023-10-11T02:27:26.248709Z",
+     "iopub.status.busy": "2023-10-11T02:27:26.248709Z",
+     "iopub.status.idle": "2023-10-11T02:27:26.257858Z",
+     "shell.execute_reply": "2023-10-11T02:27:26.256845Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# compute and store the answer in the variable 'plant_names_4247', then display it\n",
+    "\n",
+    "# first define a list of every plant name in the dataset operated by the entity with the given id\n",
+    "\n",
+    "# then use typecasting to convert this list into a set, and then typecast this set into a list\n",
+    "plant_names_4247 = list(set(...))\n",
+    "\n",
+    "plant_names_4247"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "1e7a487f",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "outputs": [],
+   "source": [
+    "grader.check(\"q32\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "cc0b4d7c",
+   "metadata": {
+    "deletable": false,
+    "editable": false
+   },
+   "source": [
+    "## Great work! You are now ready to start [P6](https://git.doit.wisc.edu/cdis/cs/courses/cs220/cs220-s23-projects/-/tree/main/p6)."
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "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.11.4"
+  },
+  "otter": {
+   "OK_FORMAT": true,
+   "tests": {
+    "q1": {
+     "name": "q1",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q1', csv_header)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q10": {
+     "name": "q10",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q10', plant_name_second_row)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q11": {
+     "name": "q11",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q11', latitude_third_row)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q12": {
+     "name": "q12",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q12', generator_id_tenth_row)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q13": {
+     "name": "q13",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q13', iron_generators)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q14": {
+     "name": "q14",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q14', butter_solar_plants)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q15": {
+     "name": "q15",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q15', entity_id_last_row)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q16": {
+     "name": "q16",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q16', plant_id_last_row)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q17": {
+     "name": "q17",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q17', net_summer_capacity_fifth_row)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q18": {
+     "name": "q18",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q18', latitude_hundredth_row)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q19": {
+     "name": "q19",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q19', sheboygan_winter_capacities)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q2": {
+     "name": "q2",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q2', num_rows)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q20": {
+     "name": "q20",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q20', result)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q21": {
+     "name": "q21",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q21', sorted_sheboygan_winter_capacities)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q22": {
+     "name": "q22",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q22', median1)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q23": {
+     "name": "q23",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q23', median1)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q24": {
+     "name": "q24",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q24', median_latitude)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q25": {
+     "name": "q25",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q25', median_nuclear_summer_capacities)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q26": {
+     "name": "q26",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q26', columbia_summer_capacities)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q27": {
+     "name": "q27",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q27', median_columbia_summer_capacities)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q28": {
+     "name": "q28",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q28', example_set)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q29": {
+     "name": "q29",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q29', saxon_falls_check)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q3": {
+     "name": "q3",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q3', first_ten_rows)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q30": {
+     "name": "q30",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q30', plant_names_13781)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q31": {
+     "name": "q31",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q31', plant_names_13781_set)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q32": {
+     "name": "q32",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q32', plant_names_4247)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q4": {
+     "name": "q4",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q4', last_ten_rows)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q5": {
+     "name": "q5",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q5', first_row)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q6": {
+     "name": "q6",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q6', first_entity_name)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q7": {
+     "name": "q7",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q7', technology_index)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q8": {
+     "name": "q8",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q8', technology_first_row)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    },
+    "q9": {
+     "name": "q9",
+     "points": 5,
+     "suites": [
+      {
+       "cases": [
+        {
+         "code": ">>> public_tests.check('q9', technology_first_row)\nAll test cases passed!\n",
+         "hidden": false,
+         "locked": false
+        }
+       ],
+       "scored": true,
+       "setup": "",
+       "teardown": "",
+       "type": "doctest"
+      }
+     ]
+    }
+   }
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/lab-p6/power_generators.csv b/lab-p6/power_generators.csv
new file mode 100644
index 0000000..55e3e25
--- /dev/null
+++ b/lab-p6/power_generators.csv
@@ -0,0 +1,614 @@
+entity_id,entity_name,plant_id,plant_name,generator_id,county,net_summer_capacity,net_winter_capacity,technology,latitude,longitude
+13781,Northern States Power Co - Minnesota,1756,Saxon Falls,1,Iron,0.5,0.5,Conventional Hydroelectric,46.5392,-90.3742
+13781,Northern States Power Co - Minnesota,1756,Saxon Falls,2,Iron,0.5,0.6,Conventional Hydroelectric,46.5392,-90.3742
+20847,Wisconsin Electric Power Co,1775,Brule,1,Florence,1.3,1.3,Conventional Hydroelectric,45.9472,-88.2189
+20847,Wisconsin Electric Power Co,1775,Brule,2,Florence,2,2,Conventional Hydroelectric,45.9472,-88.2189
+20847,Wisconsin Electric Power Co,1775,Brule,3,Florence,2,2,Conventional Hydroelectric,45.9472,-88.2189
+4247,Consolidated Water Power Co,3971,Biron,1,Wood,1.3,1.3,Conventional Hydroelectric,44.4306,-89.7808
+4247,Consolidated Water Power Co,3971,Biron,2,Wood,1.3,1.3,Conventional Hydroelectric,44.4306,-89.7808
+4247,Consolidated Water Power Co,3971,Biron,3,Wood,0.4,0.4,Conventional Hydroelectric,44.4306,-89.7808
+4247,Consolidated Water Power Co,3971,Biron,4,Wood,0.4,0.4,Conventional Hydroelectric,44.4306,-89.7808
+4247,Consolidated Water Power Co,3971,Biron,5,Wood,0.4,0.4,Conventional Hydroelectric,44.4306,-89.7808
+4247,Consolidated Water Power Co,3971,Biron,6,Wood,0.4,0.4,Conventional Hydroelectric,44.4306,-89.7808
+4247,Consolidated Water Power Co,3971,Biron,7,Wood,0.4,0.4,Conventional Hydroelectric,44.4306,-89.7808
+4247,Consolidated Water Power Co,3971,Biron,9,Wood,0.8,0.8,Conventional Hydroelectric,44.4306,-89.7808
+4247,Consolidated Water Power Co,3972,Du Bay,1,Portage,1.2,1.2,Conventional Hydroelectric,44.6647,-89.6511
+4247,Consolidated Water Power Co,3972,Du Bay,2,Portage,2,2,Conventional Hydroelectric,44.6647,-89.6511
+4247,Consolidated Water Power Co,3972,Du Bay,3,Portage,2,2,Conventional Hydroelectric,44.6647,-89.6511
+4247,Consolidated Water Power Co,3972,Du Bay,4,Portage,2,2,Conventional Hydroelectric,44.6647,-89.6511
+4247,Consolidated Water Power Co,3973,Stevens Point,1,Portage,0.8,0.8,Conventional Hydroelectric,44.5153,-89.585
+4247,Consolidated Water Power Co,3973,Stevens Point,2,Portage,0.8,0.8,Conventional Hydroelectric,44.5153,-89.585
+4247,Consolidated Water Power Co,3973,Stevens Point,3,Portage,0.8,0.8,Conventional Hydroelectric,44.5153,-89.585
+4247,Consolidated Water Power Co,3973,Stevens Point,4,Portage,0.8,0.8,Conventional Hydroelectric,44.5153,-89.585
+4247,Consolidated Water Power Co,3973,Stevens Point,5,Portage,0.8,0.8,Conventional Hydroelectric,44.5153,-89.585
+4247,Consolidated Water Power Co,3973,Stevens Point,6,Portage,0.8,0.8,Conventional Hydroelectric,44.5153,-89.585
+4247,Consolidated Water Power Co,3974,Wisconsin Rapids,1,Wood,2.3,2.3,Conventional Hydroelectric,44.3939,-89.825
+4247,Consolidated Water Power Co,3974,Wisconsin Rapids,10,Wood,0.6,0.6,Conventional Hydroelectric,44.3939,-89.825
+4247,Consolidated Water Power Co,3974,Wisconsin Rapids,2,Wood,2.3,2.3,Conventional Hydroelectric,44.3939,-89.825
+4247,Consolidated Water Power Co,3974,Wisconsin Rapids,3,Wood,0.6,0.6,Conventional Hydroelectric,44.3939,-89.825
+4247,Consolidated Water Power Co,3974,Wisconsin Rapids,4,Wood,0.6,0.6,Conventional Hydroelectric,44.3939,-89.825
+4247,Consolidated Water Power Co,3974,Wisconsin Rapids,5,Wood,0.6,0.6,Conventional Hydroelectric,44.3939,-89.825
+4247,Consolidated Water Power Co,3974,Wisconsin Rapids,6,Wood,0.3,0.3,Conventional Hydroelectric,44.3939,-89.825
+4247,Consolidated Water Power Co,3974,Wisconsin Rapids,7,Wood,0.6,0.6,Conventional Hydroelectric,44.3939,-89.825
+4247,Consolidated Water Power Co,3974,Wisconsin Rapids,8,Wood,0.3,0.3,Conventional Hydroelectric,44.3939,-89.825
+4247,Consolidated Water Power Co,3974,Wisconsin Rapids,9,Wood,0.6,0.6,Conventional Hydroelectric,44.3939,-89.825
+4247,Consolidated Water Power Co,3975,Whiting,1,Portage,1.2,1.2,Conventional Hydroelectric,44.4889,-89.5756
+4247,Consolidated Water Power Co,3975,Whiting,10,Portage,0.3,0.3,Conventional Hydroelectric,44.4889,-89.5756
+4247,Consolidated Water Power Co,3975,Whiting,2,Portage,0.5,0.5,Conventional Hydroelectric,44.4889,-89.5756
+4247,Consolidated Water Power Co,3975,Whiting,3,Portage,0.5,0.5,Conventional Hydroelectric,44.4889,-89.5756
+4247,Consolidated Water Power Co,3975,Whiting,4,Portage,0.5,0.5,Conventional Hydroelectric,44.4889,-89.5756
+4247,Consolidated Water Power Co,3975,Whiting,5,Portage,0.5,0.5,Conventional Hydroelectric,44.4889,-89.5756
+4247,Consolidated Water Power Co,3975,Whiting,6,Portage,0.5,0.5,Conventional Hydroelectric,44.4889,-89.5756
+4247,Consolidated Water Power Co,3975,Whiting,7,Portage,0.5,0.5,Conventional Hydroelectric,44.4889,-89.5756
+4247,Consolidated Water Power Co,3975,Whiting,8,Portage,0.3,0.3,Conventional Hydroelectric,44.4889,-89.5756
+4247,Consolidated Water Power Co,3975,Whiting,9,Portage,0.3,0.3,Conventional Hydroelectric,44.4889,-89.5756
+4715,Dahlberg Light & Power Co,3976,Gordon,3,Douglas,0.7,0.7,Petroleum Liquids,46.23669,-91.78553
+4715,Dahlberg Light & Power Co,3976,Gordon,4,Douglas,0.7,0.7,Petroleum Liquids,46.23669,-91.78553
+4715,Dahlberg Light & Power Co,3976,Gordon,5,Douglas,0.7,0.7,Petroleum Liquids,46.23669,-91.78553
+4715,Dahlberg Light & Power Co,3976,Gordon,6,Douglas,0.7,0.7,Petroleum Liquids,46.23669,-91.78553
+13781,Northern States Power Co - Minnesota,3982,Bay Front,5,Ashland,18,18,Wood/Wood Waste Biomass,46.587222,-90.9017
+13781,Northern States Power Co - Minnesota,3982,Bay Front,6,Ashland,23,23,Natural Gas Steam Turbine,46.587222,-90.9017
+13781,Northern States Power Co - Minnesota,3983,Big Falls,1,Rusk,1.1,1,Conventional Hydroelectric,45.491667,-91.0469
+13781,Northern States Power Co - Minnesota,3983,Big Falls,2,Rusk,1.1,1,Conventional Hydroelectric,45.491667,-91.0469
+13781,Northern States Power Co - Minnesota,3983,Big Falls,3,Rusk,1.1,1,Conventional Hydroelectric,45.491667,-91.0469
+13781,Northern States Power Co - Minnesota,3986,Ladysmith Dam,1,Rusk,0.3,0.3,Conventional Hydroelectric,45.464444,-91.08361
+13781,Northern States Power Co - Minnesota,3986,Ladysmith Dam,2,Rusk,0.3,0.2,Conventional Hydroelectric,45.464444,-91.08361
+13781,Northern States Power Co - Minnesota,3986,Ladysmith Dam,3,Rusk,0.4,0.3,Conventional Hydroelectric,45.464444,-91.08361
+13781,Northern States Power Co - Minnesota,3988,Thornapple,1,Rusk,0.4,0.4,Conventional Hydroelectric,45.411139,-91.21828
+13781,Northern States Power Co - Minnesota,3988,Thornapple,2,Rusk,0.4,0.4,Conventional Hydroelectric,45.411139,-91.21828
+13781,Northern States Power Co - Minnesota,3989,White River (WI),1,Ashland,0.2,0.2,Conventional Hydroelectric,46.498333,-90.90389
+13781,Northern States Power Co - Minnesota,3989,White River (WI),2,Ashland,0.2,0.2,Conventional Hydroelectric,46.498333,-90.90389
+11479,Madison Gas & Electric Co,3991,Fitchburg,1,Dane,15.3,15.3,Natural Gas Fired Combustion Turbine,43.0147,-89.4603
+11479,Madison Gas & Electric Co,3991,Fitchburg,2,Dane,15.8,15.8,Natural Gas Fired Combustion Turbine,43.0147,-89.4603
+11479,Madison Gas & Electric Co,3992,Blount Street,6,Dane,47.2,47.2,Natural Gas Steam Turbine,43.0789,-89.3744
+11479,Madison Gas & Electric Co,3992,Blount Street,7,Dane,47.9,47.9,Natural Gas Steam Turbine,43.0789,-89.3744
+11479,Madison Gas & Electric Co,3993,Sycamore (WI),1,Dane,12.2,12.2,Natural Gas Fired Combustion Turbine,43.1133,-89.3128
+11479,Madison Gas & Electric Co,3993,Sycamore (WI),2,Dane,17.4,17.4,Natural Gas Fired Combustion Turbine,43.1133,-89.3128
+58149,Renewable World Energies LLC,3995,Arpin Dam,1,Sawyer,0.6,0.6,Conventional Hydroelectric,45.7517,-91.2028
+58149,Renewable World Energies LLC,3995,Arpin Dam,2,Sawyer,0.6,0.6,Conventional Hydroelectric,45.7517,-91.2028
+58149,Renewable World Energies LLC,3995,Arpin Dam,3,Sawyer,0.2,0.2,Conventional Hydroelectric,45.7517,-91.2028
+13781,Northern States Power Co - Minnesota,3998,Cedar Falls (WI),1,Dunn,1.3,1.2,Conventional Hydroelectric,44.9367,-91.8883
+13781,Northern States Power Co - Minnesota,3998,Cedar Falls (WI),2,Dunn,1.1,1.1,Conventional Hydroelectric,44.9367,-91.8883
+13781,Northern States Power Co - Minnesota,3998,Cedar Falls (WI),3,Dunn,1.2,1.1,Conventional Hydroelectric,44.9367,-91.8883
+13781,Northern States Power Co - Minnesota,4000,Chippewa Falls,1,Chippewa,1.9,1.9,Conventional Hydroelectric,44.9308,-91.3889
+13781,Northern States Power Co - Minnesota,4000,Chippewa Falls,2,Chippewa,2.1,2.1,Conventional Hydroelectric,44.9308,-91.3889
+13781,Northern States Power Co - Minnesota,4000,Chippewa Falls,3,Chippewa,2,2,Conventional Hydroelectric,44.9308,-91.3889
+13781,Northern States Power Co - Minnesota,4000,Chippewa Falls,4,Chippewa,2,2,Conventional Hydroelectric,44.9308,-91.3889
+13781,Northern States Power Co - Minnesota,4000,Chippewa Falls,5,Chippewa,2,2,Conventional Hydroelectric,44.9308,-91.3889
+13781,Northern States Power Co - Minnesota,4000,Chippewa Falls,6,Chippewa,2.1,2.1,Conventional Hydroelectric,44.9308,-91.3889
+13781,Northern States Power Co - Minnesota,4002,Dells,1,Eau Claire,1.9,1.9,Conventional Hydroelectric,44.828056,-91.51111
+13781,Northern States Power Co - Minnesota,4002,Dells,2,Eau Claire,1.5,1.5,Conventional Hydroelectric,44.828056,-91.51111
+13781,Northern States Power Co - Minnesota,4002,Dells,3,Eau Claire,1.5,1.5,Conventional Hydroelectric,44.828056,-91.51111
+13781,Northern States Power Co - Minnesota,4002,Dells,4,Eau Claire,1.5,1.5,Conventional Hydroelectric,44.828056,-91.51111
+13781,Northern States Power Co - Minnesota,4002,Dells,5,Eau Claire,0.9,0.9,Conventional Hydroelectric,44.828056,-91.51111
+13781,Northern States Power Co - Minnesota,4005,French Island,1,La Crosse,9,9,Wood/Wood Waste Biomass,43.8292,-91.2597
+13781,Northern States Power Co - Minnesota,4005,French Island,2,La Crosse,7,7,Wood/Wood Waste Biomass,43.8292,-91.2597
+13781,Northern States Power Co - Minnesota,4005,French Island,3,La Crosse,61,81,Petroleum Liquids,43.8292,-91.2597
+13781,Northern States Power Co - Minnesota,4005,French Island,4,La Crosse,58,78,Petroleum Liquids,43.8292,-91.2597
+13781,Northern States Power Co - Minnesota,4007,Holcombe,1,Chippewa,7.3,7.3,Conventional Hydroelectric,45.223611,-91.12722
+13781,Northern States Power Co - Minnesota,4007,Holcombe,2,Chippewa,7.3,7.3,Conventional Hydroelectric,45.223611,-91.12722
+13781,Northern States Power Co - Minnesota,4007,Holcombe,3,Chippewa,7.3,7.3,Conventional Hydroelectric,45.223611,-91.12722
+13781,Northern States Power Co - Minnesota,4008,Jim Falls,1,Chippewa,12.3,12.3,Conventional Hydroelectric,45.051,-91.274
+13781,Northern States Power Co - Minnesota,4008,Jim Falls,2,Chippewa,12.5,12.5,Conventional Hydroelectric,45.051,-91.274
+13781,Northern States Power Co - Minnesota,4008,Jim Falls,4,Chippewa,0.2,0.2,Conventional Hydroelectric,45.051,-91.274
+13781,Northern States Power Co - Minnesota,4009,Menomonie,1,Dunn,1.1,1.2,Conventional Hydroelectric,44.884167,-91.92944
+13781,Northern States Power Co - Minnesota,4009,Menomonie,2,Dunn,1.1,1.2,Conventional Hydroelectric,44.884167,-91.92944
+13781,Northern States Power Co - Minnesota,4011,St Croix Falls,1,Polk,1.8,1.4,Conventional Hydroelectric,45.41167,-92.6469
+13781,Northern States Power Co - Minnesota,4011,St Croix Falls,2,Polk,1.8,1.4,Conventional Hydroelectric,45.41167,-92.6469
+13781,Northern States Power Co - Minnesota,4011,St Croix Falls,3,Polk,1.9,1.5,Conventional Hydroelectric,45.41167,-92.6469
+13781,Northern States Power Co - Minnesota,4011,St Croix Falls,4,Polk,1.9,1.5,Conventional Hydroelectric,45.41167,-92.6469
+13781,Northern States Power Co - Minnesota,4011,St Croix Falls,5,Polk,2,1.6,Conventional Hydroelectric,45.41167,-92.6469
+13781,Northern States Power Co - Minnesota,4011,St Croix Falls,6,Polk,1.9,1.5,Conventional Hydroelectric,45.41167,-92.6469
+13781,Northern States Power Co - Minnesota,4011,St Croix Falls,7,Polk,2,1.6,Conventional Hydroelectric,45.41167,-92.6469
+13781,Northern States Power Co - Minnesota,4011,St Croix Falls,8,Polk,1.9,1.5,Conventional Hydroelectric,45.41167,-92.6469
+13781,Northern States Power Co - Minnesota,4012,Trego,1,Washburn,0.4,0.4,Conventional Hydroelectric,45.94794,-91.88837
+13781,Northern States Power Co - Minnesota,4012,Trego,2,Washburn,0.3,0.3,Conventional Hydroelectric,45.94794,-91.88837
+13781,Northern States Power Co - Minnesota,4014,Wheaton,1,Chippewa,44,56,Natural Gas Fired Combustion Turbine,44.885416,-91.51583
+13781,Northern States Power Co - Minnesota,4014,Wheaton,2,Chippewa,51,66,Natural Gas Fired Combustion Turbine,44.885416,-91.51583
+13781,Northern States Power Co - Minnesota,4014,Wheaton,3,Chippewa,44,56,Natural Gas Fired Combustion Turbine,44.885416,-91.51583
+13781,Northern States Power Co - Minnesota,4014,Wheaton,4,Chippewa,47,61,Natural Gas Fired Combustion Turbine,44.885416,-91.51583
+13781,Northern States Power Co - Minnesota,4014,Wheaton,6,Chippewa,48,70,Petroleum Liquids,44.885416,-91.51583
+13781,Northern States Power Co - Minnesota,4015,Wissota,1,Chippewa,3,3,Conventional Hydroelectric,44.9378,-91.3406
+13781,Northern States Power Co - Minnesota,4015,Wissota,2,Chippewa,3.1,3.1,Conventional Hydroelectric,44.9378,-91.3406
+13781,Northern States Power Co - Minnesota,4015,Wissota,3,Chippewa,3,3,Conventional Hydroelectric,44.9378,-91.3406
+13781,Northern States Power Co - Minnesota,4015,Wissota,4,Chippewa,3,3,Conventional Hydroelectric,44.9378,-91.3406
+13781,Northern States Power Co - Minnesota,4015,Wissota,5,Chippewa,2.9,2.9,Conventional Hydroelectric,44.9378,-91.3406
+13781,Northern States Power Co - Minnesota,4015,Wissota,6,Chippewa,3,3,Conventional Hydroelectric,44.9378,-91.3406
+58149,Renewable World Energies LLC,4018,Clam River Dam,1,Burnett,0.4,0.4,Conventional Hydroelectric,45.9467,-92.5383
+58149,Renewable World Energies LLC,4018,Clam River Dam,2,Burnett,0.4,0.4,Conventional Hydroelectric,45.9467,-92.5383
+58149,Renewable World Energies LLC,4018,Clam River Dam,3,Burnett,0.4,0.4,Conventional Hydroelectric,45.9467,-92.5383
+58149,Renewable World Energies LLC,4019,Danbury Dam,1,Burnett,0.1,0.1,Conventional Hydroelectric,46,-92.3725
+58149,Renewable World Energies LLC,4019,Danbury Dam,2,Burnett,0.3,0.3,Conventional Hydroelectric,46,-92.3725
+58149,Renewable World Energies LLC,4019,Danbury Dam,HY3,Burnett,0.6,0.6,Conventional Hydroelectric,46,-92.3725
+13815,Northwestern Wisconsin Elec Co,4020,Frederic Diesel,10,Polk,2.5,2.6,Petroleum Liquids,45.654835,-92.46506
+13815,Northwestern Wisconsin Elec Co,4020,Frederic Diesel,2,Polk,0.7,0.7,Petroleum Liquids,45.654835,-92.46506
+13815,Northwestern Wisconsin Elec Co,4020,Frederic Diesel,3,Polk,0.7,0.7,Petroleum Liquids,45.654835,-92.46506
+13815,Northwestern Wisconsin Elec Co,4020,Frederic Diesel,4,Polk,0.6,0.6,Petroleum Liquids,45.654835,-92.46506
+13815,Northwestern Wisconsin Elec Co,4020,Frederic Diesel,5,Polk,0.5,0.5,Petroleum Liquids,45.654835,-92.46506
+13815,Northwestern Wisconsin Elec Co,4020,Frederic Diesel,6,Polk,1.7,1.7,Petroleum Liquids,45.654835,-92.46506
+13815,Northwestern Wisconsin Elec Co,4020,Frederic Diesel,7,Polk,1.8,1.8,Petroleum Liquids,45.654835,-92.46506
+13815,Northwestern Wisconsin Elec Co,4020,Frederic Diesel,8,Polk,2.5,2.6,Petroleum Liquids,45.654835,-92.46506
+13815,Northwestern Wisconsin Elec Co,4020,Frederic Diesel,9,Polk,2.5,2.6,Petroleum Liquids,45.654835,-92.46506
+13815,Northwestern Wisconsin Elec Co,4021,Grantsburg Diesel,1A,Burnett,0.8,0.8,Petroleum Liquids,45.779189,-92.67805
+13815,Northwestern Wisconsin Elec Co,4021,Grantsburg Diesel,2,Burnett,0.8,0.8,Petroleum Liquids,45.779189,-92.67805
+13815,Northwestern Wisconsin Elec Co,4021,Grantsburg Diesel,3,Burnett,0.9,0.9,Petroleum Liquids,45.779189,-92.67805
+13815,Northwestern Wisconsin Elec Co,4021,Grantsburg Diesel,4,Burnett,2,2,Petroleum Liquids,45.779189,-92.67805
+13815,Northwestern Wisconsin Elec Co,4021,Grantsburg Diesel,8,Burnett,1.8,1.8,Petroleum Liquids,45.779189,-92.67805
+20847,Wisconsin Electric Power Co,4040,Port Washington Generating Station,1CT1,Ozaukee,178.2,207,Natural Gas Fired Combined Cycle,43.3842,-87.8689
+20847,Wisconsin Electric Power Co,4040,Port Washington Generating Station,1CT2,Ozaukee,178.8,207,Natural Gas Fired Combined Cycle,43.3842,-87.8689
+20847,Wisconsin Electric Power Co,4040,Port Washington Generating Station,2CT1,Ozaukee,174.8,204.2,Natural Gas Fired Combined Cycle,43.3842,-87.8689
+20847,Wisconsin Electric Power Co,4040,Port Washington Generating Station,2CT2,Ozaukee,174.9,204.5,Natural Gas Fired Combined Cycle,43.3842,-87.8689
+20847,Wisconsin Electric Power Co,4040,Port Washington Generating Station,ST1,Ozaukee,265.1,265.2,Natural Gas Fired Combined Cycle,43.3842,-87.8689
+20847,Wisconsin Electric Power Co,4040,Port Washington Generating Station,ST2,Ozaukee,264.7,264.3,Natural Gas Fired Combined Cycle,43.3842,-87.8689
+20847,Wisconsin Electric Power Co,4041,South Oak Creek,5,Milwaukee,242.2,242.2,Conventional Steam Coal,42.8457,-87.8294
+20847,Wisconsin Electric Power Co,4041,South Oak Creek,6,Milwaukee,253.8,253.8,Conventional Steam Coal,42.8457,-87.8294
+20847,Wisconsin Electric Power Co,4041,South Oak Creek,7,Milwaukee,306.5,309.3,Conventional Steam Coal,42.8457,-87.8294
+20847,Wisconsin Electric Power Co,4041,South Oak Creek,8,Milwaukee,309.5,312.7,Conventional Steam Coal,42.8457,-87.8294
+20847,Wisconsin Electric Power Co,4042,Valley (WI),1,Milwaukee,124.7,88.3,Natural Gas Steam Turbine,43.0303,-87.9233
+20847,Wisconsin Electric Power Co,4042,Valley (WI),2,Milwaukee,139.2,140.1,Natural Gas Steam Turbine,43.0303,-87.9233
+20847,Wisconsin Electric Power Co,4042,Valley (WI),3,Milwaukee,2.7,2.7,Petroleum Liquids,43.0303,-87.9233
+20847,Wisconsin Electric Power Co,4043,Appleton,4,Outagamie,1.2,1.2,Conventional Hydroelectric,44.25393,-88.40956
+20847,Wisconsin Electric Power Co,4043,Appleton,5,Outagamie,0.5,0.5,Conventional Hydroelectric,44.25393,-88.40956
+20847,Wisconsin Electric Power Co,4043,Appleton,6,Outagamie,0.5,0.5,Conventional Hydroelectric,44.25393,-88.40956
+57280,"Eagle Creek Renewable Energy, LLC",4044,Oconto Falls Upper,1,Oconto,0.4,0.4,Conventional Hydroelectric,44.8764,-88.1475
+57280,"Eagle Creek Renewable Energy, LLC",4044,Oconto Falls Upper,2,Oconto,0.4,0.4,Conventional Hydroelectric,44.8764,-88.1475
+57280,"Eagle Creek Renewable Energy, LLC",4044,Oconto Falls Upper,3,Oconto,0.3,0.3,Conventional Hydroelectric,44.8764,-88.1475
+20847,Wisconsin Electric Power Co,4045,Pine,1,Florence,1.6,1.6,Conventional Hydroelectric,45.8275,-88.2483
+20847,Wisconsin Electric Power Co,4045,Pine,2,Florence,1.6,1.6,Conventional Hydroelectric,45.8275,-88.2483
+55906,NextEra Energy Point Beach LLC,4046,Point Beach Nuclear Plant,1,Manitowoc,595.4,599.6,Nuclear,44.2806,-87.5369
+55906,NextEra Energy Point Beach LLC,4046,Point Beach Nuclear Plant,2,Manitowoc,600.6,606.2,Nuclear,44.2806,-87.5369
+55906,NextEra Energy Point Beach LLC,4046,Point Beach Nuclear Plant,5,Manitowoc,15,18,Petroleum Liquids,44.2806,-87.5369
+20856,Wisconsin Power & Light Co,4050,Edgewater,5,Sheboygan,409.1,409.3,Conventional Steam Coal,43.715142,-87.70586
+20856,Wisconsin Power & Light Co,4053,Kilbourn,2,Columbia,9.5,9.5,Conventional Hydroelectric,43.625845,-89.78076
+20856,Wisconsin Power & Light Co,4053,Kilbourn,HC1,Columbia, , ,Conventional Hydroelectric,43.625845,-89.78076
+20856,Wisconsin Power & Light Co,4053,Kilbourn,HC5,Columbia, , ,Conventional Hydroelectric,43.625845,-89.78076
+20856,Wisconsin Power & Light Co,4053,Kilbourn,HC6,Columbia, , ,Conventional Hydroelectric,43.625845,-89.78076
+20856,Wisconsin Power & Light Co,4056,Prairie Du Sac,1,Sauk,29,29,Conventional Hydroelectric,43.309932,-89.72778
+20856,Wisconsin Power & Light Co,4056,Prairie Du Sac,2,Sauk, , ,Conventional Hydroelectric,43.309932,-89.72778
+20856,Wisconsin Power & Light Co,4056,Prairie Du Sac,3,Sauk, , ,Conventional Hydroelectric,43.309932,-89.72778
+20856,Wisconsin Power & Light Co,4056,Prairie Du Sac,4,Sauk, , ,Conventional Hydroelectric,43.309932,-89.72778
+20856,Wisconsin Power & Light Co,4056,Prairie Du Sac,5,Sauk, , ,Conventional Hydroelectric,43.309932,-89.72778
+20856,Wisconsin Power & Light Co,4056,Prairie Du Sac,6,Sauk, , ,Conventional Hydroelectric,43.309932,-89.72778
+20856,Wisconsin Power & Light Co,4056,Prairie Du Sac,7,Sauk, , ,Conventional Hydroelectric,43.309932,-89.72778
+20856,Wisconsin Power & Light Co,4056,Prairie Du Sac,8,Sauk, , ,Conventional Hydroelectric,43.309932,-89.72778
+20860,Wisconsin Public Service Corp,4060,Alexander,1,Lincoln,1.4,1.4,Conventional Hydroelectric,45.1875,-89.7553
+20860,Wisconsin Public Service Corp,4060,Alexander,2,Lincoln,1.4,1.4,Conventional Hydroelectric,45.1875,-89.7553
+20860,Wisconsin Public Service Corp,4060,Alexander,3,Lincoln,1.4,1.4,Conventional Hydroelectric,45.1875,-89.7553
+20860,Wisconsin Public Service Corp,4061,Caldron Falls,1,Marinette,3.2,3.2,Conventional Hydroelectric,45.3569,-88.2306
+20860,Wisconsin Public Service Corp,4061,Caldron Falls,2,Marinette,3.2,3.2,Conventional Hydroelectric,45.3569,-88.2306
+20860,Wisconsin Public Service Corp,4063,Grandfather Falls,1,Lincoln,11,11,Conventional Hydroelectric,45.3019,-89.7917
+20860,Wisconsin Public Service Corp,4063,Grandfather Falls,2,Lincoln,6.2,6.2,Conventional Hydroelectric,45.3019,-89.7917
+20860,Wisconsin Public Service Corp,4064,Hat Rapids,1,Oneida,0.8,0.8,Conventional Hydroelectric,45.5711,-89.4806
+20860,Wisconsin Public Service Corp,4064,Hat Rapids,2A,Oneida,0.5,0.5,Conventional Hydroelectric,45.5711,-89.4806
+20860,Wisconsin Public Service Corp,4064,Hat Rapids,3A,Oneida,0.4,0.4,Conventional Hydroelectric,45.5711,-89.4806
+20860,Wisconsin Public Service Corp,4065,High Falls (WI),1,Marinette,1.4,1.4,Conventional Hydroelectric,45.2794,-88.1997
+20860,Wisconsin Public Service Corp,4065,High Falls (WI),2,Marinette,1.4,1.4,Conventional Hydroelectric,45.2794,-88.1997
+20860,Wisconsin Public Service Corp,4065,High Falls (WI),3,Marinette,1.4,1.4,Conventional Hydroelectric,45.2794,-88.1997
+20860,Wisconsin Public Service Corp,4065,High Falls (WI),4,Marinette,1.4,1.4,Conventional Hydroelectric,45.2794,-88.1997
+20860,Wisconsin Public Service Corp,4065,High Falls (WI),5,Marinette,1.4,1.4,Conventional Hydroelectric,45.2794,-88.1997
+20860,Wisconsin Public Service Corp,4067,Johnson Falls,1,Marinette,1.7,1.7,Conventional Hydroelectric,45.2875,-88.1603
+20860,Wisconsin Public Service Corp,4067,Johnson Falls,2,Marinette,1.7,1.7,Conventional Hydroelectric,45.2875,-88.1603
+20860,Wisconsin Public Service Corp,4068,Merrill,1,Lincoln,0.4,0.4,Conventional Hydroelectric,45.1786,-89.685
+20860,Wisconsin Public Service Corp,4068,Merrill,2,Lincoln,0.4,0.4,Conventional Hydroelectric,45.1786,-89.685
+20860,Wisconsin Public Service Corp,4068,Merrill,3,Lincoln,1.5,1.5,Conventional Hydroelectric,45.1786,-89.685
+20860,Wisconsin Public Service Corp,4071,Potato Rapids,1,Marinette,0.5,0.5,Conventional Hydroelectric,45.1136,-87.7586
+20860,Wisconsin Public Service Corp,4071,Potato Rapids,2,Marinette,0.4,0.4,Conventional Hydroelectric,45.1136,-87.7586
+20860,Wisconsin Public Service Corp,4071,Potato Rapids,3,Marinette,0.4,0.4,Conventional Hydroelectric,45.1136,-87.7586
+20860,Wisconsin Public Service Corp,4072,Pulliam,31,Brown,79.8,106.3,Natural Gas Fired Combustion Turbine,44.54,-88.0086
+20860,Wisconsin Public Service Corp,4074,Sandstone Rapids,1,Marinette,1.9,1.9,Conventional Hydroelectric,45.2333,-88.0678
+20860,Wisconsin Public Service Corp,4074,Sandstone Rapids,2,Marinette,1.9,1.9,Conventional Hydroelectric,45.2333,-88.0678
+20860,Wisconsin Public Service Corp,4075,Tomahawk,1,Lincoln,1.3,1.3,Conventional Hydroelectric,45.4411,-89.7306
+20860,Wisconsin Public Service Corp,4075,Tomahawk,2,Lincoln,1.3,1.3,Conventional Hydroelectric,45.4411,-89.7306
+20860,Wisconsin Public Service Corp,4076,West Marinette,31,Marinette,38.1,49.8,Natural Gas Fired Combustion Turbine,45.0869,-87.6881
+20860,Wisconsin Public Service Corp,4076,West Marinette,32,Marinette,36.7,47.9,Natural Gas Fired Combustion Turbine,45.0869,-87.6881
+20860,Wisconsin Public Service Corp,4076,West Marinette,33,Marinette,78.2,104.1,Natural Gas Fired Combustion Turbine,45.0869,-87.6881
+20860,Wisconsin Public Service Corp,4077,Wausau,1,Marathon,1.8,1.8,Conventional Hydroelectric,44.9575,-89.6367
+20860,Wisconsin Public Service Corp,4077,Wausau,2,Marathon,1.8,1.8,Conventional Hydroelectric,44.9575,-89.6367
+20860,Wisconsin Public Service Corp,4077,Wausau,3,Marathon,1.8,1.8,Conventional Hydroelectric,44.9575,-89.6367
+20860,Wisconsin Public Service Corp,4078,Weston,3,Marathon,334.7,339.8,Conventional Steam Coal,44.8606,-89.6553
+20860,Wisconsin Public Service Corp,4078,Weston,4,Marathon,553.2,558.5,Conventional Steam Coal,44.8606,-89.6553
+20863,Wisconsin River Power Company,4079,Castle Rock,1,Adams,2.8,2.8,Conventional Hydroelectric,43.8656,-89.9514
+20863,Wisconsin River Power Company,4079,Castle Rock,2,Adams,2.8,2.8,Conventional Hydroelectric,43.8656,-89.9514
+20863,Wisconsin River Power Company,4079,Castle Rock,3,Adams,2.8,2.8,Conventional Hydroelectric,43.8656,-89.9514
+20863,Wisconsin River Power Company,4079,Castle Rock,4,Adams,2.8,2.8,Conventional Hydroelectric,43.8656,-89.9514
+20863,Wisconsin River Power Company,4079,Castle Rock,5,Adams,2.8,2.8,Conventional Hydroelectric,43.8656,-89.9514
+20863,Wisconsin River Power Company,4080,Petenwell,1,Juneau,5,5,Conventional Hydroelectric,44.0572,-90.0217
+20863,Wisconsin River Power Company,4080,Petenwell,2,Juneau,5,5,Conventional Hydroelectric,44.0572,-90.0217
+20863,Wisconsin River Power Company,4080,Petenwell,3,Juneau,5,5,Conventional Hydroelectric,44.0572,-90.0217
+20863,Wisconsin River Power Company,4080,Petenwell,4,Juneau,5,5,Conventional Hydroelectric,44.0572,-90.0217
+765,City of Arcadia - (WI),4100,Arcadia Electric,1,Trempealeau,1.3,1.3,Petroleum Liquids,44.2524,-91.5034
+765,City of Arcadia - (WI),4100,Arcadia Electric,10,Trempealeau,2,2,Petroleum Liquids,44.2524,-91.5034
+765,City of Arcadia - (WI),4100,Arcadia Electric,2,Trempealeau,1,1,Petroleum Liquids,44.2524,-91.5034
+765,City of Arcadia - (WI),4100,Arcadia Electric,3,Trempealeau,0.4,0.4,Petroleum Liquids,44.2524,-91.5034
+765,City of Arcadia - (WI),4100,Arcadia Electric,4,Trempealeau,0.2,0.2,Petroleum Liquids,44.2524,-91.5034
+765,City of Arcadia - (WI),4100,Arcadia Electric,5,Trempealeau,3,3,Natural Gas Internal Combustion Engine,44.2524,-91.5034
+765,City of Arcadia - (WI),4100,Arcadia Electric,6,Trempealeau,3,3,Natural Gas Internal Combustion Engine,44.2524,-91.5034
+765,City of Arcadia - (WI),4100,Arcadia Electric,7,Trempealeau,2,2,Petroleum Liquids,44.2524,-91.5034
+765,City of Arcadia - (WI),4100,Arcadia Electric,8,Trempealeau,2,2,Petroleum Liquids,44.2524,-91.5034
+765,City of Arcadia - (WI),4100,Arcadia Electric,9,Trempealeau,2,2,Petroleum Liquids,44.2524,-91.5034
+1278,City of Barron - (WI),4102,Barron,1A,Barron,1.1,1.1,Petroleum Liquids,45.40193,-91.84038
+1278,City of Barron - (WI),4102,Barron,2A,Barron,1.1,1.1,Petroleum Liquids,45.40193,-91.84038
+1278,City of Barron - (WI),4102,Barron,3A,Barron,1.1,1.1,Petroleum Liquids,45.40193,-91.84038
+1278,City of Barron - (WI),4102,Barron,4,Barron,1.1,1.1,Petroleum Liquids,45.40193,-91.84038
+1278,City of Barron - (WI),4102,Barron,7,Barron,0.6,0.6,Petroleum Liquids,45.40193,-91.84038
+1278,City of Barron - (WI),4102,Barron,8,Barron,1.3,1.3,Petroleum Liquids,45.40193,-91.84038
+1278,City of Barron - (WI),4102,Barron,9,Barron,2,2,Petroleum Liquids,45.40193,-91.84038
+1278,City of Barron - (WI),4102,Barron,H2,Barron,0.1,0.1,Conventional Hydroelectric,45.40193,-91.84038
+3156,Village of Cashton - (WI),4107,Cashton,3,Monroe,0.4,0.4,Petroleum Liquids,43.742874,-90.78033
+3156,Village of Cashton - (WI),4107,Cashton,5,Monroe,1.1,1.1,Natural Gas Internal Combustion Engine,43.742874,-90.78033
+3156,Village of Cashton - (WI),4107,Cashton,6,Monroe,2,2,Petroleum Liquids,43.742874,-90.78033
+4627,City of Cumberland - (WI),4112,Cumberland (WI),1,Barron,0.7,0.7,Petroleum Liquids,45.5336,-92.0224
+4627,City of Cumberland - (WI),4112,Cumberland (WI),2,Barron,0.3,0.3,Petroleum Liquids,45.5336,-92.0224
+4627,City of Cumberland - (WI),4112,Cumberland (WI),3,Barron,0.3,0.3,Petroleum Liquids,45.5336,-92.0224
+4627,City of Cumberland - (WI),4112,Cumberland (WI),4,Barron,1.2,1.2,Petroleum Liquids,45.5336,-92.0224
+4627,City of Cumberland - (WI),4112,Cumberland (WI),5,Barron,2.1,2.1,Natural Gas Internal Combustion Engine,45.5336,-92.0224
+4627,City of Cumberland - (WI),4112,Cumberland (WI),6,Barron,6.7,6.7,Petroleum Liquids,45.5336,-92.0224
+4627,City of Cumberland - (WI),4112,Cumberland (WI),7,Barron,6.2,6.2,Natural Gas Internal Combustion Engine,45.5336,-92.0224
+4627,City of Cumberland - (WI),4112,Cumberland (WI),8,Barron,3.5,3.5,Natural Gas Internal Combustion Engine,45.5336,-92.0224
+5834,City of Elroy - (WI),4113,Elroy,1A,Juneau,2.2,2.3,Petroleum Liquids,43.7395,-90.2675
+5834,City of Elroy - (WI),4113,Elroy,2A,Juneau,2.2,2.3,Petroleum Liquids,43.7395,-90.2675
+5834,City of Elroy - (WI),4113,Elroy,5,Juneau,2.2,2.2,Petroleum Liquids,43.7395,-90.2675
+6274,City of Fennimore - (WI),4114,Fennimore,4,Grant,1.1,1.1,Petroleum Liquids,42.9828,-90.6558
+6274,City of Fennimore - (WI),4114,Fennimore,5,Grant,0.9,0.9,Petroleum Liquids,42.9828,-90.6558
+6274,City of Fennimore - (WI),4114,Fennimore,6,Grant,1.8,1.8,Petroleum Liquids,42.9828,-90.6558
+6274,City of Fennimore - (WI),4114,Fennimore,7,Grant,1.8,1.8,Petroleum Liquids,42.9828,-90.6558
+6274,City of Fennimore - (WI),4114,Fennimore,8,Grant,1.8,1.8,Petroleum Liquids,42.9828,-90.6558
+10056,City of Kaukauna,4118,Kaukauna Gas Turbine,GT1,Outagamie,15.8,18.3,Natural Gas Fired Combustion Turbine,44.276199,-88.26545
+10056,City of Kaukauna,4119,Little Chute,1,Outagamie,1.1,1.1,Conventional Hydroelectric,44.279897,-88.25558
+10056,City of Kaukauna,4119,Little Chute,2,Outagamie,1.1,1.1,Conventional Hydroelectric,44.279897,-88.25558
+10056,City of Kaukauna,4119,Little Chute,3,Outagamie,1.1,1.1,Conventional Hydroelectric,44.279897,-88.25558
+10056,City of Kaukauna,4120,New Badger,3,Outagamie,4,4,Conventional Hydroelectric,44.2772,-88.2678
+10056,City of Kaukauna,4120,New Badger,4,Outagamie,4,4,Conventional Hydroelectric,44.2772,-88.2678
+10056,City of Kaukauna,4122,Rapide Croche,1,Outagamie,0.6,0.6,Conventional Hydroelectric,44.3164,-88.3147
+10056,City of Kaukauna,4122,Rapide Croche,2,Outagamie,0.6,0.6,Conventional Hydroelectric,44.3164,-88.3147
+10056,City of Kaukauna,4122,Rapide Croche,3,Outagamie,0.6,0.6,Conventional Hydroelectric,44.3164,-88.3147
+10056,City of Kaukauna,4122,Rapide Croche,4,Outagamie,0.6,0.6,Conventional Hydroelectric,44.3164,-88.3147
+10525,La Farge Municipal Electric Co,4124,La Farge,2A,Vernon,1.5,1.5,Petroleum Liquids,43.5722,-90.6391
+11571,Manitowoc Public Utilities,4125,Manitowoc,5,Manitowoc,22,22,Wood/Wood Waste Biomass,44.082,-87.6558
+11571,Manitowoc Public Utilities,4125,Manitowoc,6,Manitowoc,22,22,Wood/Wood Waste Biomass,44.082,-87.6558
+11571,Manitowoc Public Utilities,4125,Manitowoc,9,Manitowoc,58.4,58.4,Petroleum Coke,44.082,-87.6558
+13466,City of New Lisbon,4130,New Lisbon,2,Juneau,1.2,1.2,Petroleum Liquids,43.8797,-90.1645
+13466,City of New Lisbon,4130,New Lisbon,5,Juneau,2.4,2.4,Petroleum Liquids,43.8797,-90.1645
+13466,City of New Lisbon,4130,New Lisbon,6,Juneau,2,2.1,Petroleum Liquids,43.8797,-90.1645
+13466,City of New Lisbon,4130,New Lisbon,7,Juneau,2,2.1,Petroleum Liquids,43.8797,-90.1645
+19867,Village of Viola - (WI),4139,Viola,3,Richland,1.8,1.8,Petroleum Liquids,43.507,-90.669
+4716,Dairyland Power Coop,4142,Flambeau Hydroelectric Station,1,Rusk,8.1,8.1,Conventional Hydroelectric,45.491826,-91.04721
+4716,Dairyland Power Coop,4142,Flambeau Hydroelectric Station,2,Rusk,8,8,Conventional Hydroelectric,45.491826,-91.04721
+4716,Dairyland Power Coop,4142,Flambeau Hydroelectric Station,3,Rusk,8,8,Conventional Hydroelectric,45.491826,-91.04721
+13964,Oconto Electric Cooperative,4147,Stiles,1,Oconto,0.3,0.3,Conventional Hydroelectric,44.8747,-88.1586
+13964,Oconto Electric Cooperative,4147,Stiles,2,Oconto,0.3,0.3,Conventional Hydroelectric,44.8747,-88.1586
+20153,"Washington Island El Coop, Inc",4148,Washington Island,2,Door,0.1,0.1,Petroleum Liquids,45.370922,-86.93082
+20153,"Washington Island El Coop, Inc",4148,Washington Island,3,Door,0.1,0.1,Petroleum Liquids,45.370922,-86.93082
+20153,"Washington Island El Coop, Inc",4148,Washington Island,4,Door,0.2,0.2,Petroleum Liquids,45.370922,-86.93082
+20153,"Washington Island El Coop, Inc",4148,Washington Island,5,Door,0.5,0.5,Petroleum Liquids,45.370922,-86.93082
+20153,"Washington Island El Coop, Inc",4148,Washington Island,6,Door,0.9,0.9,Petroleum Liquids,45.370922,-86.93082
+20153,"Washington Island El Coop, Inc",4148,Washington Island,7,Door,1.6,1.6,Petroleum Liquids,45.370922,-86.93082
+20153,"Washington Island El Coop, Inc",4148,Washington Island,8,Door,1.6,1.6,Petroleum Liquids,45.370922,-86.93082
+10056,City of Kaukauna,4201,Combined Locks,HC1,Outagamie,3.1,3.1,Conventional Hydroelectric,44.273511,-88.30055
+10056,City of Kaukauna,4201,Combined Locks,HC2,Outagamie,3.1,3.1,Conventional Hydroelectric,44.273511,-88.30055
+4716,Dairyland Power Coop,4271,John P Madgett,1,Buffalo,389.8,392.5,Conventional Steam Coal,44.303583,-91.91265
+13781,Northern States Power Co - Minnesota,6086,Cornell,1,Chippewa,6.2,6.2,Conventional Hydroelectric,45.164024,-91.15743
+13781,Northern States Power Co - Minnesota,6086,Cornell,2,Chippewa,6.4,6.4,Conventional Hydroelectric,45.164024,-91.15743
+13781,Northern States Power Co - Minnesota,6086,Cornell,3,Chippewa,6.9,6.9,Conventional Hydroelectric,45.164024,-91.15743
+13781,Northern States Power Co - Minnesota,6086,Cornell,4,Chippewa,0.4,0.4,Conventional Hydroelectric,45.164024,-91.15743
+13781,Northern States Power Co - Minnesota,6231,Apple River,1,St Croix,0.4,0.5,Conventional Hydroelectric,45.157552,-92.71621
+13781,Northern States Power Co - Minnesota,6231,Apple River,3,St Croix,0.5,0.6,Conventional Hydroelectric,45.157552,-92.71621
+13781,Northern States Power Co - Minnesota,6231,Apple River,4,St Croix,0.5,0.6,Conventional Hydroelectric,45.157552,-92.71621
+20847,Wisconsin Electric Power Co,6253,Germantown,1,Washington,49.2,69.9,Petroleum Liquids,43.1952,-88.1496
+20847,Wisconsin Electric Power Co,6253,Germantown,2,Washington,49,69.6,Petroleum Liquids,43.1952,-88.1496
+20847,Wisconsin Electric Power Co,6253,Germantown,3,Washington,47.5,67.5,Petroleum Liquids,43.1952,-88.1496
+20847,Wisconsin Electric Power Co,6253,Germantown,4,Washington,46.8,66.5,Petroleum Liquids,43.1952,-88.1496
+20847,Wisconsin Electric Power Co,6253,Germantown,5,Washington,76.2,103.9,Natural Gas Fired Combustion Turbine,43.1952,-88.1496
+4715,Dahlberg Light & Power Co,7058,Solon Diesel,1,Douglas,0.8,0.8,Petroleum Liquids,46.358956,-91.82363
+4715,Dahlberg Light & Power Co,7058,Solon Diesel,2,Douglas,0.8,0.8,Petroleum Liquids,46.358956,-91.82363
+4715,Dahlberg Light & Power Co,7058,Solon Diesel,3,Douglas,0.8,0.8,Petroleum Liquids,46.358956,-91.82363
+4715,Dahlberg Light & Power Co,7058,Solon Diesel,4,Douglas,0.8,0.8,Petroleum Liquids,46.358956,-91.82363
+4715,Dahlberg Light & Power Co,7058,Solon Diesel,5,Douglas,0.8,0.8,Petroleum Liquids,46.358956,-91.82363
+4715,Dahlberg Light & Power Co,7058,Solon Diesel,6,Douglas,0.8,0.8,Petroleum Liquids,46.358956,-91.82363
+4715,Dahlberg Light & Power Co,7058,Solon Diesel,7,Douglas,0.8,0.8,Petroleum Liquids,46.358956,-91.82363
+4715,Dahlberg Light & Power Co,7058,Solon Diesel,8,Douglas,0.8,0.8,Petroleum Liquids,46.358956,-91.82363
+20847,Wisconsin Electric Power Co,7159,Concord,1,Jefferson,92.5,100,Natural Gas Fired Combustion Turbine,43.1669,-88.69
+20847,Wisconsin Electric Power Co,7159,Concord,2,Jefferson,91.3,100,Natural Gas Fired Combustion Turbine,43.1669,-88.69
+20847,Wisconsin Electric Power Co,7159,Concord,3,Jefferson,90.7,100,Natural Gas Fired Combustion Turbine,43.1669,-88.69
+20847,Wisconsin Electric Power Co,7159,Concord,4,Jefferson,94,100,Natural Gas Fired Combustion Turbine,43.1669,-88.69
+20856,Wisconsin Power & Light Co,7203,South Fond Du Lac,CT1,Fond Du Lac,80.8,90.8,Natural Gas Fired Combustion Turbine,43.7353,-88.49667
+20856,Wisconsin Power & Light Co,7203,South Fond Du Lac,CT2,Fond Du Lac,81.3,91.5,Natural Gas Fired Combustion Turbine,43.7353,-88.49667
+20856,Wisconsin Power & Light Co,7203,South Fond Du Lac,CT3,Fond Du Lac,83.1,93.5,Natural Gas Fired Combustion Turbine,43.7353,-88.49667
+20856,Wisconsin Power & Light Co,7203,South Fond Du Lac,CT4,Fond Du Lac,83,93.3,Natural Gas Fired Combustion Turbine,43.7353,-88.49667
+20847,Wisconsin Electric Power Co,7270,Paris (WI),1,Kenosha,90.1,100,Natural Gas Fired Combustion Turbine,42.6658,-88.0131
+20847,Wisconsin Electric Power Co,7270,Paris (WI),2,Kenosha,89.9,100,Natural Gas Fired Combustion Turbine,42.6658,-88.0131
+20847,Wisconsin Electric Power Co,7270,Paris (WI),3,Kenosha,93.5,100,Natural Gas Fired Combustion Turbine,42.6658,-88.0131
+20847,Wisconsin Electric Power Co,7270,Paris (WI),4,Kenosha,90.4,100,Natural Gas Fired Combustion Turbine,42.6658,-88.0131
+11571,Manitowoc Public Utilities,7795,Custer Energy Center,1,Manitowoc,22,24,Natural Gas Fired Combustion Turbine,44.085437,-87.7261
+11479,Madison Gas & Electric Co,7799,West Marinette 34,34,Marinette,70.2,70.2,Natural Gas Fired Combustion Turbine,45.0869,-87.6892
+792,City of Argyle - (WI),7810,Argyle,5,Lafayette,2,2,Petroleum Liquids,42.7019,-89.8697
+10056,City of Kaukauna,7822,Kaukauna City Hydro,1,Outagamie,2.4,2.4,Conventional Hydroelectric,44.274582,-88.31907
+10056,City of Kaukauna,7822,Kaukauna City Hydro,2,Outagamie,2.4,2.4,Conventional Hydroelectric,44.274582,-88.31907
+4716,Dairyland Power Coop,7863,Elk Mound,1,Chippewa,30.7,40.4,Natural Gas Fired Combustion Turbine,44.902814,-91.5681
+4716,Dairyland Power Coop,7863,Elk Mound,2,Chippewa,33.9,44.3,Natural Gas Fired Combustion Turbine,44.902814,-91.5681
+11479,Madison Gas & Electric Co,7886,Wind Turbine,1,Kewaunee,11,11,Onshore Wind Turbine,44.6694,-87.6333
+11479,Madison Gas & Electric Co,7991,West Campus Cogeneration Facility,1,Dane,30.9,30.9,Natural Gas Fired Combined Cycle,43.075071,-89.4251
+11479,Madison Gas & Electric Co,7991,West Campus Cogeneration Facility,CT2,Dane,32.6,32.6,Natural Gas Fired Combined Cycle,43.075071,-89.4251
+11479,Madison Gas & Electric Co,7991,West Campus Cogeneration Facility,STG1,Dane,66.1,66.1,Natural Gas Fired Combined Cycle,43.075071,-89.4251
+13697,North Central Power Co Inc,8013,Winter,IC 1,Sawyer,2.8,2.8,Petroleum Liquids,45.836675,-90.97352
+13697,North Central Power Co Inc,8013,Winter,IC 2,Sawyer,2.8,2.8,Petroleum Liquids,45.836675,-90.97352
+20856,Wisconsin Power & Light Co,8023,Columbia (WI),1,Columbia,579.3,582.3,Conventional Steam Coal,43.4864,-89.4203
+20856,Wisconsin Power & Light Co,8023,Columbia (WI),2,Columbia,568.8,578.8,Conventional Steam Coal,43.4864,-89.4203
+11479,Madison Gas & Electric Co,9674,Nine Springs,GT1,Dane,12.6,12.6,Natural Gas Fired Combustion Turbine,43.0386,-89.3586
+61813,"ND Paper, Inc.",10234,Biron Mill,GEN1,Wood,15.3,15.3,Conventional Steam Coal,44.43,-89.78
+61813,"ND Paper, Inc.",10234,Biron Mill,GEN3,Wood,7.5,7.5,Natural Gas Steam Turbine,44.43,-89.78
+61813,"ND Paper, Inc.",10234,Biron Mill,GEN4,Wood,12.5,12.5,Natural Gas Steam Turbine,44.43,-89.78
+61813,"ND Paper, Inc.",10234,Biron Mill,GEN5,Wood,20,20,Conventional Steam Coal,44.43,-89.78
+55919,Georgia-Pacific Consumer Oper. Green Bay LLC,10360,Consumer Operations LLC,GEN6,Brown,18,18,Natural Gas Steam Turbine,44.4936,-88.0303
+55919,Georgia-Pacific Consumer Oper. Green Bay LLC,10360,Consumer Operations LLC,GEN7,Brown,23,23,Natural Gas Steam Turbine,44.4936,-88.0303
+58149,Renewable World Energies LLC,10453,LAC Courte Oreilles Hydroelect,U1,Sawyer,0.2,0.2,Conventional Hydroelectric,45.888333,-91.07694
+58149,Renewable World Energies LLC,10453,LAC Courte Oreilles Hydroelect,U2,Sawyer,1.5,1.5,Conventional Hydroelectric,45.888333,-91.07694
+58149,Renewable World Energies LLC,10453,LAC Courte Oreilles Hydroelect,U3,Sawyer,1.5,1.5,Conventional Hydroelectric,45.888333,-91.07694
+55965,Verso Corporation,10477,Wisconsin Rapids Pulp Mill,GEN1,Wood,27.2,32,Wood/Wood Waste Biomass,44.3953,-89.826
+55965,Verso Corporation,10477,Wisconsin Rapids Pulp Mill,GEN2,Wood,37.5,40.3,Wood/Wood Waste Biomass,44.3953,-89.826
+55997,Domtar Paper Company Rothschild,50190,Domtar Paper Company Rothschild,HG3,Marathon,0.6,0.6,Conventional Hydroelectric,44.8867,-89.6272
+55997,Domtar Paper Company Rothschild,50190,Domtar Paper Company Rothschild,HG7,Marathon,0.5,0.5,Conventional Hydroelectric,44.8867,-89.6272
+5033,Domtar Industries Inc,50395,Georgia-Pacific Corp - Nekoosa Mill,HY1,Wood,0.8,0.7,Conventional Hydroelectric,44.3142,-89.8964
+5033,Domtar Industries Inc,50395,Georgia-Pacific Corp - Nekoosa Mill,HY2,Wood,0.8,0.7,Conventional Hydroelectric,44.3142,-89.8964
+5033,Domtar Industries Inc,50395,Georgia-Pacific Corp - Nekoosa Mill,HY3,Wood,0.8,0.7,Conventional Hydroelectric,44.3142,-89.8964
+5033,Domtar Industries Inc,50395,Georgia-Pacific Corp - Nekoosa Mill,HY4,Wood,0.6,0.6,Conventional Hydroelectric,44.3142,-89.8964
+5033,Domtar Industries Inc,50395,Georgia-Pacific Corp - Nekoosa Mill,HY5,Wood,0.7,0.6,Conventional Hydroelectric,44.3142,-89.8964
+5033,Domtar Industries Inc,50395,Georgia-Pacific Corp - Nekoosa Mill,NHG1,Wood,0.2,0.2,Conventional Hydroelectric,44.3142,-89.8964
+5033,Domtar Industries Inc,50395,Georgia-Pacific Corp - Nekoosa Mill,TG14,Wood,12.5,12.1,Wood/Wood Waste Biomass,44.3142,-89.8964
+5033,Domtar Industries Inc,50395,Georgia-Pacific Corp - Nekoosa Mill,TG6,Wood,5.7,5.5,Natural Gas Steam Turbine,44.3142,-89.8964
+5033,Domtar Industries Inc,50395,Georgia-Pacific Corp - Nekoosa Mill,TG8,Wood,13,15,Natural Gas Steam Turbine,44.3142,-89.8964
+57280,"Eagle Creek Renewable Energy, LLC",50408,Park Mill,1,Marinette,0.4,0.4,Conventional Hydroelectric,45.1058,-87.6514
+57280,"Eagle Creek Renewable Energy, LLC",50408,Park Mill,10,Marinette,0.3,0.3,Conventional Hydroelectric,45.1058,-87.6514
+57280,"Eagle Creek Renewable Energy, LLC",50408,Park Mill,2,Marinette,0.2,0.2,Conventional Hydroelectric,45.1058,-87.6514
+57280,"Eagle Creek Renewable Energy, LLC",50408,Park Mill,3,Marinette,0.4,0.4,Conventional Hydroelectric,45.1058,-87.6514
+57280,"Eagle Creek Renewable Energy, LLC",50408,Park Mill,6,Marinette,0.4,0.4,Conventional Hydroelectric,45.1058,-87.6514
+57280,"Eagle Creek Renewable Energy, LLC",50408,Park Mill,7,Marinette,0.4,0.4,Conventional Hydroelectric,45.1058,-87.6514
+57280,"Eagle Creek Renewable Energy, LLC",50439,Oconto Falls Lower,GEN1,Oconto,0.3,0.3,Conventional Hydroelectric,44.8719,-88.1439
+57280,"Eagle Creek Renewable Energy, LLC",50439,Oconto Falls Lower,GEN2,Oconto,1.7,1.7,Conventional Hydroelectric,44.8719,-88.1439
+14369,PCA-Tomahawk Mill,50476,Packaging of America Tomahawk Mill,GEN1,Lincoln,5.4,5.8,Wood/Wood Waste Biomass,45.4431,-89.7342
+14369,PCA-Tomahawk Mill,50476,Packaging of America Tomahawk Mill,GEN2,Lincoln,8.2,8.9,Wood/Wood Waste Biomass,45.4431,-89.7342
+14369,PCA-Tomahawk Mill,50476,Packaging of America Tomahawk Mill,GEN3,Lincoln,0.5,0.6,Conventional Hydroelectric,45.4431,-89.7342
+14369,PCA-Tomahawk Mill,50476,Packaging of America Tomahawk Mill,GEN4,Lincoln,0.3,0.2,Conventional Hydroelectric,45.4431,-89.7342
+14369,PCA-Tomahawk Mill,50476,Packaging of America Tomahawk Mill,GEN5,Lincoln,0.3,0.3,Conventional Hydroelectric,45.4431,-89.7342
+54842,WM Renewable Energy LLC,50576,Metro Gas Recovery,GEN1,Milwaukee,2.9,3.3,Landfill Gas,42.850556,-88.06972
+54842,WM Renewable Energy LLC,50576,Metro Gas Recovery,GEN2,Milwaukee,2.9,3.3,Landfill Gas,42.850556,-88.06972
+54842,WM Renewable Energy LLC,50576,Metro Gas Recovery,GEN3,Milwaukee,0.8,0.8,Landfill Gas,42.850556,-88.06972
+54842,WM Renewable Energy LLC,50576,Metro Gas Recovery,GEN4,Milwaukee,0.8,0.8,Landfill Gas,42.850556,-88.06972
+54842,WM Renewable Energy LLC,50576,Metro Gas Recovery,GEN5,Milwaukee,0.8,0.8,Landfill Gas,42.850556,-88.06972
+54842,WM Renewable Energy LLC,50576,Metro Gas Recovery,GEN6,Milwaukee,0.8,0.8,Landfill Gas,42.850556,-88.06972
+54842,WM Renewable Energy LLC,50577,Omega Hills Gas Recovery,GEN1,Washington,2.9,3.3,Landfill Gas,43.1922,-88.1597
+54842,WM Renewable Energy LLC,50577,Omega Hills Gas Recovery,GEN2,Washington,2.9,3.3,Landfill Gas,43.1922,-88.1597
+54842,WM Renewable Energy LLC,50577,Omega Hills Gas Recovery,GEN3,Washington,3,3,Landfill Gas,43.1922,-88.1597
+54842,WM Renewable Energy LLC,50577,Omega Hills Gas Recovery,GEN5,Washington,2.9,3.3,Landfill Gas,43.1922,-88.1597
+13008,"Ahlstrom-Munksjo NA Specialty Solutions, LLC",50614,Mosinee Mill,GEN1,Marathon,13,13,Wood/Wood Waste Biomass,44.7881,-89.6917
+13008,"Ahlstrom-Munksjo NA Specialty Solutions, LLC",50614,Mosinee Mill,HYD1,Marathon,2,2,Conventional Hydroelectric,44.7881,-89.6917
+13008,"Ahlstrom-Munksjo NA Specialty Solutions, LLC",50614,Mosinee Mill,HYD2,Marathon,0.7,0.7,Conventional Hydroelectric,44.7881,-89.6917
+13008,"Ahlstrom-Munksjo NA Specialty Solutions, LLC",50614,Mosinee Mill,HYD3,Marathon,0.7,0.7,Conventional Hydroelectric,44.7881,-89.6917
+13008,"Ahlstrom-Munksjo NA Specialty Solutions, LLC",50614,Mosinee Mill,WEST,Marathon,5,5,Wood/Wood Waste Biomass,44.7881,-89.6917
+61707,Ahlstrom-Munksjo,50933,Rhinelander Mill,GEN5,Oneida,4,7,Natural Gas Steam Turbine,45.6394,-89.4205
+61707,Ahlstrom-Munksjo,50933,Rhinelander Mill,GEN6,Oneida,6.3,8.5,Conventional Steam Coal,45.6394,-89.4205
+61707,Ahlstrom-Munksjo,50933,Rhinelander Mill,HYD1,Oneida,0.5,0.5,Conventional Hydroelectric,45.6394,-89.4205
+61707,Ahlstrom-Munksjo,50933,Rhinelander Mill,HYD2,Oneida,0.5,0.5,Conventional Hydroelectric,45.6394,-89.4205
+61707,Ahlstrom-Munksjo,50933,Rhinelander Mill,HYD3,Oneida,1,1,Conventional Hydroelectric,45.6394,-89.4205
+20854,Winnebago County,50936,Winnebago County Landfill Gas,EG2R,Winnebago,0.6,0.6,Landfill Gas,44.083,-88.5411
+20854,Winnebago County,50936,Winnebago County Landfill Gas,EG3,Winnebago,0.9,0.9,Landfill Gas,44.083,-88.5411
+20854,Winnebago County,50936,Winnebago County Landfill Gas,EG4,Winnebago,1,1,Landfill Gas,44.083,-88.5411
+54738,Thilmany LLC,54098,Kaukauna Paper Mill,GEN1,Outagamie,6,6,Wood/Wood Waste Biomass,44.2826,-88.2534
+54738,Thilmany LLC,54098,Kaukauna Paper Mill,GEN2,Outagamie,11,11,Wood/Wood Waste Biomass,44.2826,-88.2534
+54738,Thilmany LLC,54098,Kaukauna Paper Mill,GEN3,Outagamie,15.6,15.6,Wood/Wood Waste Biomass,44.2826,-88.2534
+54738,Thilmany LLC,54098,Kaukauna Paper Mill,GEN4,Outagamie,12,12,Conventional Steam Coal,44.2826,-88.2534
+5033,Domtar Industries Inc,54103,Port Edwards Mill,HG1,Wood,0.4,0.4,Conventional Hydroelectric,44.3364,-89.8672
+5033,Domtar Industries Inc,54103,Port Edwards Mill,HG2,Wood,0.4,0.4,Conventional Hydroelectric,44.3364,-89.8672
+5033,Domtar Industries Inc,54103,Port Edwards Mill,HG3,Wood,0.4,0.4,Conventional Hydroelectric,44.3364,-89.8672
+5033,Domtar Industries Inc,54103,Port Edwards Mill,HG4,Wood,0.4,0.4,Conventional Hydroelectric,44.3364,-89.8672
+5033,Domtar Industries Inc,54103,Port Edwards Mill,HG5,Wood,0.8,0.7,Conventional Hydroelectric,44.3364,-89.8672
+5033,Domtar Industries Inc,54103,Port Edwards Mill,HG6,Wood,0.8,0.7,Conventional Hydroelectric,44.3364,-89.8672
+5033,Domtar Industries Inc,54103,Port Edwards Mill,JHG1,Wood,1.2,1.2,Conventional Hydroelectric,44.3364,-89.8672
+5033,Domtar Industries Inc,54103,Port Edwards Mill,JHG2,Wood,0.6,0.6,Conventional Hydroelectric,44.3364,-89.8672
+5033,Domtar Industries Inc,54103,Port Edwards Mill,JHG3,Wood,0.6,0.6,Conventional Hydroelectric,44.3364,-89.8672
+5033,Domtar Industries Inc,54103,Port Edwards Mill,JHG4,Wood,0.4,0.4,Conventional Hydroelectric,44.3364,-89.8672
+5033,Domtar Industries Inc,54103,Port Edwards Mill,JHG5,Wood,0.6,0.6,Conventional Hydroelectric,44.3364,-89.8672
+18028,State of Wisconsin,54406,Capitol Heat and Power,P31,Dane,1,1,Petroleum Liquids,43.078512,-89.37726
+18028,State of Wisconsin,54406,Capitol Heat and Power,P32,Dane,1,1,Petroleum Liquids,43.078512,-89.37726
+18028,State of Wisconsin,54407,Waupun Correctional Central Heating Plt,1,Dodge,1,1,Natural Gas Steam Turbine,43.6233,-88.7297
+18028,State of Wisconsin,54407,Waupun Correctional Central Heating Plt,2,Dodge,1,1,Natural Gas Steam Turbine,43.6233,-88.7297
+18028,State of Wisconsin,54407,Waupun Correctional Central Heating Plt,3,Dodge,0.8,0.8,Petroleum Liquids,43.6233,-88.7297
+18028,State of Wisconsin,54407,Waupun Correctional Central Heating Plt,4,Dodge,1.5,1.5,Petroleum Liquids,43.6233,-88.7297
+18028,State of Wisconsin,54408,UW Madison Charter Street Plant,1,Dane,9.7,9.7,Natural Gas Steam Turbine,43.07,-89.4006
+18028,State of Wisconsin,54408,UW Madison Charter Street Plant,3,Dane,1.3,1.3,Petroleum Liquids,43.07,-89.4006
+54842,WM Renewable Energy LLC,54661,Pheasant Run Landfill Gas Recovery,GE10,Kenosha,0.8,0.8,Landfill Gas,42.5825,-88.0436
+54842,WM Renewable Energy LLC,54661,Pheasant Run Landfill Gas Recovery,GE11,Kenosha,0.8,0.8,Landfill Gas,42.5825,-88.0436
+54842,WM Renewable Energy LLC,54661,Pheasant Run Landfill Gas Recovery,GEN1,Kenosha,0.8,0.8,Landfill Gas,42.5825,-88.0436
+54842,WM Renewable Energy LLC,54661,Pheasant Run Landfill Gas Recovery,GEN2,Kenosha,0.8,0.8,Landfill Gas,42.5825,-88.0436
+54842,WM Renewable Energy LLC,54661,Pheasant Run Landfill Gas Recovery,GEN3,Kenosha,0.8,0.8,Landfill Gas,42.5825,-88.0436
+54842,WM Renewable Energy LLC,54661,Pheasant Run Landfill Gas Recovery,GEN4,Kenosha,0.8,0.8,Landfill Gas,42.5825,-88.0436
+54842,WM Renewable Energy LLC,54661,Pheasant Run Landfill Gas Recovery,GEN5,Kenosha,0.8,0.8,Landfill Gas,42.5825,-88.0436
+54842,WM Renewable Energy LLC,54661,Pheasant Run Landfill Gas Recovery,GEN6,Kenosha,0.8,0.8,Landfill Gas,42.5825,-88.0436
+54842,WM Renewable Energy LLC,54661,Pheasant Run Landfill Gas Recovery,GEN7,Kenosha,0.8,0.8,Landfill Gas,42.5825,-88.0436
+54842,WM Renewable Energy LLC,54661,Pheasant Run Landfill Gas Recovery,GEN8,Kenosha,0.8,0.8,Landfill Gas,42.5825,-88.0436
+54842,WM Renewable Energy LLC,54661,Pheasant Run Landfill Gas Recovery,GEN9,Kenosha,0.8,0.8,Landfill Gas,42.5825,-88.0436
+12619,Milwaukee Metro Sewerage Dist,54851,MMSD Jones Island Wastewater,GEN1,Milwaukee,13,15,Natural Gas Fired Combustion Turbine,43.0214,-87.9014
+12619,Milwaukee Metro Sewerage Dist,54851,MMSD Jones Island Wastewater,SOL1,Milwaukee,4.6,4.6,Natural Gas Fired Combustion Turbine,43.0214,-87.9014
+12619,Milwaukee Metro Sewerage Dist,54851,MMSD Jones Island Wastewater,SOL2,Milwaukee,4.6,4.6,Landfill Gas,43.0214,-87.9014
+12619,Milwaukee Metro Sewerage Dist,54851,MMSD Jones Island Wastewater,SOL3,Milwaukee,4.6,4.6,Landfill Gas,43.0214,-87.9014
+10056,City of Kaukauna,54885,Kimberly Mill,1H,Outagamie,0.7,0.7,Conventional Hydroelectric,44.2769,-88.3344
+10056,City of Kaukauna,54885,Kimberly Mill,2H,Outagamie,0.7,0.7,Conventional Hydroelectric,44.2769,-88.3344
+10056,City of Kaukauna,54885,Kimberly Mill,3H,Outagamie,0.7,0.7,Conventional Hydroelectric,44.2769,-88.3344
+55911,Whitewater Operating Services LLC,55011,LSP-Whitewater LP,CTG1,Jefferson,162,175,Natural Gas Fired Combined Cycle,42.855463,-88.72992
+55911,Whitewater Operating Services LLC,55011,LSP-Whitewater LP,STG1,Jefferson,99,97,Natural Gas Fired Combined Cycle,42.855463,-88.72992
+20860,Wisconsin Public Service Corp,55029,De Pere Energy Center,CT01,Brown,166,193.2,Natural Gas Fired Combustion Turbine,44.44861,-88.07204
+20856,Wisconsin Power & Light Co,55135,Alliant Energy Neenah,CT01,Winnebago,150.6,171.2,Natural Gas Fired Combustion Turbine,44.1936,-88.5064
+20856,Wisconsin Power & Light Co,55135,Alliant Energy Neenah,CT02,Winnebago,153.9,175.1,Natural Gas Fired Combustion Turbine,44.1936,-88.5064
+4716,Dairyland Power Coop,55391,RockGen Energy Center,01,Dane,163,163,Natural Gas Fired Combustion Turbine,42.9767,-89.0492
+4716,Dairyland Power Coop,55391,RockGen Energy Center,02,Dane,163,163,Natural Gas Fired Combustion Turbine,42.9767,-89.0492
+4716,Dairyland Power Coop,55391,RockGen Energy Center,03,Dane,163,163,Natural Gas Fired Combustion Turbine,42.9767,-89.0492
+12619,Milwaukee Metro Sewerage Dist,55525,MMSD South Shore Wastewater,1,Milwaukee,1.4,1.4,Other Waste Biomass,42.8869,-87.8422
+12619,Milwaukee Metro Sewerage Dist,55525,MMSD South Shore Wastewater,1CAT,Milwaukee,0.9,0.9,Other Waste Biomass,42.8869,-87.8422
+12619,Milwaukee Metro Sewerage Dist,55525,MMSD South Shore Wastewater,2CAT,Milwaukee,0.9,0.9,Other Waste Biomass,42.8869,-87.8422
+12619,Milwaukee Metro Sewerage Dist,55525,MMSD South Shore Wastewater,3CAT,Milwaukee,0.9,0.9,Other Waste Biomass,42.8869,-87.8422
+12619,Milwaukee Metro Sewerage Dist,55525,MMSD South Shore Wastewater,4CAT,Milwaukee,0.9,0.9,Other Waste Biomass,42.8869,-87.8422
+744,Appleton Coated LLC,55558,Combined Locks Energy Center,GEN1,Outagamie,45.9,47,Natural Gas Fired Combined Cycle,44.2717,-88.3011
+744,Appleton Coated LLC,55558,Combined Locks Energy Center,GEN2,Outagamie,6,6,Natural Gas Fired Combined Cycle,44.2717,-88.3011
+20856,Wisconsin Power & Light Co,55641,Riverside Energy Center,CTG1,Rock,155.2,166.7,Natural Gas Fired Combined Cycle,42.583056,-89.03583
+20856,Wisconsin Power & Light Co,55641,Riverside Energy Center,CTG2,Rock,153.3,164.6,Natural Gas Fired Combined Cycle,42.583056,-89.03583
+20856,Wisconsin Power & Light Co,55641,Riverside Energy Center,STG1,Rock,251.9,257.3,Natural Gas Fired Combined Cycle,42.583056,-89.03583
+58149,Renewable World Energies LLC,55684,Flambeau Crowley Rapids Project,GEN1,Price,1,1,Conventional Hydroelectric,45.8683,-90.5844
+58149,Renewable World Energies LLC,55684,Flambeau Crowley Rapids Project,GEN2,Price,0.5,0.5,Conventional Hydroelectric,45.8683,-90.5844
+58149,Renewable World Energies LLC,55685,Flambeau Lower Project,GEN1,Price,0.4,0.4,Conventional Hydroelectric,45.913526,-90.44746
+58149,Renewable World Energies LLC,55685,Flambeau Lower Project,GEN2,Price,0.4,0.4,Conventional Hydroelectric,45.913526,-90.44746
+58149,Renewable World Energies LLC,55685,Flambeau Lower Project,GEN3,Price,0.4,0.4,Conventional Hydroelectric,45.913526,-90.44746
+20847,Wisconsin Electric Power Co,55742,Montfort Wind Energy Center,ER15,Iowa,30,30,Onshore Wind Turbine,42.9625,-90.38667
+20858,WPPI Energy,55836,Island Street Peaking Plant,FT81,Outagamie,52.4,60,Natural Gas Fired Combustion Turbine,44.2761,-88.2658
+61723,"Pixelle Specialty Solution, LLC",55861,Stevens Point Mill,SP,Portage,7,7,Natural Gas Steam Turbine,44.3528,-89.5836
+1687,Bio-Energy Partners,55925,Ridgeview,GEN1,Manitowoc,0.8,0.8,Landfill Gas,44.175007,-87.82852
+1687,Bio-Energy Partners,55925,Ridgeview,GEN2,Manitowoc,0.8,0.8,Landfill Gas,44.175007,-87.82852
+1687,Bio-Energy Partners,55925,Ridgeview,GEN5,Manitowoc,0.8,0.8,Landfill Gas,44.175007,-87.82852
+1687,Bio-Energy Partners,55925,Ridgeview,GEN6,Manitowoc,0.8,0.8,Landfill Gas,44.175007,-87.82852
+1687,Bio-Energy Partners,55925,Ridgeview,GEN7,Manitowoc,0.8,0.8,Landfill Gas,44.175007,-87.82852
+1687,Bio-Energy Partners,55925,Ridgeview,GEN8,Manitowoc,0.8,0.8,Landfill Gas,44.175007,-87.82852
+13815,Northwestern Wisconsin Elec Co,55998,Danbury Diesel,GT1,Burnett,4,4,Petroleum Liquids,46.002834,-92.37138
+13815,Northwestern Wisconsin Elec Co,55998,Danbury Diesel,IC1,Burnett,0.5,0.5,Petroleum Liquids,46.002834,-92.37138
+13815,Northwestern Wisconsin Elec Co,55998,Danbury Diesel,IC2,Burnett,0.5,0.5,Petroleum Liquids,46.002834,-92.37138
+20860,Wisconsin Public Service Corp,56031,Fox Energy Center,CTG1,Outagamie,170.8,200.3,Natural Gas Fired Combined Cycle,44.3204,-88.20889
+20860,Wisconsin Public Service Corp,56031,Fox Energy Center,CTG2,Outagamie,162.8,200.3,Natural Gas Fired Combined Cycle,44.3204,-88.20889
+20860,Wisconsin Public Service Corp,56031,Fox Energy Center,STG,Outagamie,243.9,244.2,Natural Gas Fired Combined Cycle,44.3204,-88.20889
+20847,Wisconsin Electric Power Co,56068,Elm Road Generating Station,1,Milwaukee,635.9,637.3,Conventional Steam Coal,42.8492,-87.8336
+20847,Wisconsin Electric Power Co,56068,Elm Road Generating Station,2,Milwaukee,634.9,638.1,Conventional Steam Coal,42.8492,-87.8336
+54842,WM Renewable Energy LLC,56069,Berlin Landfill Gas,1,Green Lake,0.8,0.8,Landfill Gas,43.9603,-88.9158
+54842,WM Renewable Energy LLC,56069,Berlin Landfill Gas,2,Green Lake,0.8,0.8,Landfill Gas,43.9603,-88.9158
+54842,WM Renewable Energy LLC,56069,Berlin Landfill Gas,3,Green Lake,0.8,0.8,Landfill Gas,43.9603,-88.9158
+11479,Madison Gas & Electric Co,56070,Diesel Generators,1,Dane,53.8,53.8,Petroleum Liquids,43.0802,-89.3747
+20856,Wisconsin Power & Light Co,56166,Sheboygan Falls,1,Sheboygan,151.9,172.6,Natural Gas Fired Combustion Turbine,43.751826,-87.87806
+20856,Wisconsin Power & Light Co,56166,Sheboygan Falls,2,Sheboygan,149.2,169.5,Natural Gas Fired Combustion Turbine,43.751826,-87.87806
+20856,Wisconsin Power & Light Co,56347,Cedar Ridge,1,Fond Du Lac,67.7,67.7,Onshore Wind Turbine,43.692647,-88.32974
+20847,Wisconsin Electric Power Co,56391,Blue Sky Green Field Wind Project,1,Fond Du Lac,145.2,145.2,Onshore Wind Turbine,43.8794,-88.2708
+54813,AMERESCO Janesville LLC,56427,Ameresco Janesville,Unit1,Rock,1,1,Landfill Gas,42.7083,-89.0208
+54813,AMERESCO Janesville LLC,56427,Ameresco Janesville,Unit2,Rock,1,1,Landfill Gas,42.7083,-89.0208
+54813,AMERESCO Janesville LLC,56427,Ameresco Janesville,Unit3,Rock,1,1,Landfill Gas,42.7083,-89.0208
+11740,City of Marshfield - (WI),56480,Marshfield Utilities Gas Plant,M1,Wood,53.3,60.2,Natural Gas Fired Combustion Turbine,44.634722,-90.13444
+54842,WM Renewable Energy LLC,56520,Deertrack Park Gas Recovery,GEN1,Jefferson,0.8,0.8,Landfill Gas,43.089999,-88.73968
+54842,WM Renewable Energy LLC,56520,Deertrack Park Gas Recovery,GEN2,Jefferson,0.8,0.8,Landfill Gas,43.089999,-88.73968
+54842,WM Renewable Energy LLC,56520,Deertrack Park Gas Recovery,GEN3,Jefferson,0.8,0.8,Landfill Gas,43.089999,-88.73968
+54842,WM Renewable Energy LLC,56520,Deertrack Park Gas Recovery,GEN4,Jefferson,0.8,0.8,Landfill Gas,43.089999,-88.73968
+54842,WM Renewable Energy LLC,56520,Deertrack Park Gas Recovery,GEN5,Jefferson,0.8,0.8,Landfill Gas,43.089999,-88.73968
+54842,WM Renewable Energy LLC,56520,Deertrack Park Gas Recovery,GEN6,Jefferson,0.8,0.8,Landfill Gas,43.089999,-88.73968
+54842,WM Renewable Energy LLC,56520,Deertrack Park Gas Recovery,GEN7,Jefferson,0.8,0.8,Landfill Gas,43.089999,-88.73968
+54842,WM Renewable Energy LLC,56520,Deertrack Park Gas Recovery,GEN8,Jefferson,0.8,0.8,Landfill Gas,43.089999,-88.73968
+54842,WM Renewable Energy LLC,56525,Timberline Trail Gas Recovery,GEN2,Rusk,0.8,0.8,Landfill Gas,45.4533,-91.3583
+54842,WM Renewable Energy LLC,56525,Timberline Trail Gas Recovery,GEN3,Rusk,0.8,0.8,Landfill Gas,45.4533,-91.3583
+54842,WM Renewable Energy LLC,56525,Timberline Trail Gas Recovery,GEN4,Rusk,0.8,0.8,Landfill Gas,45.4533,-91.3583
+54842,WM Renewable Energy LLC,56525,Timberline Trail Gas Recovery,GEN5,Rusk,0.8,0.8,Landfill Gas,45.4533,-91.3583
+56484,Butler Ridge Wind Energy Center,56647,Butler Ridge,1,Dodge,54,54,Onshore Wind Turbine,43.400278,-88.48111
+20860,Wisconsin Public Service Corp,56942,Forward Wind Energy Center,1,Dodge,99,99,Onshore Wind Turbine,43.6161,-88.4969
+20860,Wisconsin Public Service Corp,56942,Forward Wind Energy Center,2,Dodge,30,30,Onshore Wind Turbine,43.6161,-88.4969
+56424,Quilt Block Wind Farm LLC,57116,Quilt Block Wind Farm LLC,GEN 1,Lafayette,98,98,Onshore Wind Turbine,42.673333,-90.26528
+57280,"Eagle Creek Renewable Energy, LLC",57190,Little Quinnesec Falls Hydro Project,UNIT1,Marinette,1.9,1.9,Conventional Hydroelectric,45.7736,-87.9894
+57280,"Eagle Creek Renewable Energy, LLC",57190,Little Quinnesec Falls Hydro Project,UNIT2,Marinette,0.8,0.8,Conventional Hydroelectric,45.7736,-87.9894
+57280,"Eagle Creek Renewable Energy, LLC",57190,Little Quinnesec Falls Hydro Project,UNIT3,Marinette,1.9,1.9,Conventional Hydroelectric,45.7736,-87.9894
+57280,"Eagle Creek Renewable Energy, LLC",57190,Little Quinnesec Falls Hydro Project,UNIT4,Marinette,1,1,Conventional Hydroelectric,45.7736,-87.9894
+57280,"Eagle Creek Renewable Energy, LLC",57190,Little Quinnesec Falls Hydro Project,UNIT5,Marinette,1,1,Conventional Hydroelectric,45.7736,-87.9894
+57280,"Eagle Creek Renewable Energy, LLC",57190,Little Quinnesec Falls Hydro Project,UNIT6,Marinette,2.4,2.4,Conventional Hydroelectric,45.7736,-87.9894
+20847,Wisconsin Electric Power Co,57199,Glacier Hills,1,Columbia,162,162,Onshore Wind Turbine,43.563889,-89.14806
+65411,Duke Energy Renewables Services,57553,Shirley Wind,1,Brown,20,20,Onshore Wind Turbine,44.3481,-87.9278
+57142,Gundersen Lutheran Biogas I LLC,57824,Onalaska Campus Landfill Biogas,416LF,La Crosse,1.1,1.1,Landfill Gas,43.873889,-91.18
+57340,Cashton Greens Wind Farm LLC,57968,Cashton Greens Wind Farm,CGWF,Monroe,4.8,4.8,Onshore Wind Turbine,43.733889,-90.805
+20847,Wisconsin Electric Power Co,58124,Rothschild Biomass Cogen Facility,1,Marathon,46.6,46.8,Wood/Wood Waste Biomass,44.887778,-89.62972
+63479,Viresco Turtle Lake,58747,Viresco Turtle Lake,GEN1,Polk,1.6,1.6,Other Waste Biomass,45.390278,-92.1625
+63479,Viresco Turtle Lake,58747,Viresco Turtle Lake,GEN2,Polk,1.6,1.6,Other Waste Biomass,45.390278,-92.1625
+58709,Richland Center Renewable Energy LLC,58834,Richland Center Renewable Energy LLC,UNIT1,Richland,0.8,0.8,Other Waste Biomass,43.314444,-90.37306
+58709,Richland Center Renewable Energy LLC,58834,Richland Center Renewable Energy LLC,UNIT2,Richland,0.8,0.8,Other Waste Biomass,43.314444,-90.37306
+59216,"S.C. Johnson & Son, Inc.",59448,Waxdale,CGEN1,Racine,3.5,3.5,Landfill Gas,42.709444,-87.88528
+59216,"S.C. Johnson & Son, Inc.",59448,Waxdale,CGEN2,Racine,3.5,3.5,Natural Gas Fired Combustion Turbine,42.709444,-87.88528
+59216,"S.C. Johnson & Son, Inc.",59448,Waxdale,WEC01,Racine,1.5,1.5,Onshore Wind Turbine,42.709444,-87.88528
+59216,"S.C. Johnson & Son, Inc.",59448,Waxdale,WEC02,Racine,1.5,1.5,Onshore Wind Turbine,42.709444,-87.88528
+59209,Concord New Energy,59771,Jefferson Solar Park,JSP01,Jefferson,1,1,Solar Photovoltaic,43.0146,-88.7992
+58303,Energy Systems Group LLC,59810,Dairyland WTE Plant,GEN1,Brown,0.7,0.7,Other Waste Biomass,44.540115,-87.80559
+58303,Energy Systems Group LLC,59810,Dairyland WTE Plant,GEN2,Brown,0.7,0.7,Other Waste Biomass,44.540115,-87.80559
+20847,Wisconsin Electric Power Co,59836,Twin Falls (WI),11,Florence,4.6,4.6,Conventional Hydroelectric,45.872778,-88.07083
+20847,Wisconsin Electric Power Co,59836,Twin Falls (WI),12,Florence,4.6,4.6,Conventional Hydroelectric,45.872778,-88.07083
+59688,"FCPC Renewable Generation, LLC",59931,FCPC Renewable Generation,GEN2,Milwaukee,1,1,Other Waste Biomass,43.030016,-87.94091
+60338,HQC Rock River Solar Power Generation Station LLC,60573,HQC Rock River Solar Power Gen Station,PV1,Rock,2.1,2.1,Solar Photovoltaic,42.578831,-89.03302
+60520,SoCore Energy LLC,60887,Sauk DPC Solar,PV1,Vernon,1,1,Solar Photovoltaic,43.59591,-90.3226
+60520,SoCore Energy LLC,60888,Lafayette DPC Solar,PV1,Chippewa,1,1,Solar Photovoltaic,44.88782,-91.3524
+60520,SoCore Energy LLC,60889,Conrath DPC Solar,PV1,Rusk,1,1,Solar Photovoltaic,45.36614,-91.0482
+60520,SoCore Energy LLC,60890,Warren DPC Solar,PV1,St Croix,2.2,2.2,Solar Photovoltaic,44.95963,-92.5182
+60520,SoCore Energy LLC,60891,Liberty Pole DPC Solar,PV1,Vernon,1.1,1.1,Solar Photovoltaic,43.49412,-90.9071
+60520,SoCore Energy LLC,60892,Downsville DPC Solar,PV1,Dunn,1,1,Solar Photovoltaic,44.81423,-91.8841
+60520,SoCore Energy LLC,60893,Mt. Hope DPC Solar,PV1,Grant,1,1,Solar Photovoltaic,42.97498,-90.8318
+60520,SoCore Energy LLC,60894,Medford DPC Solar,PV1,Taylor,2,2,Solar Photovoltaic,45.16305,-90.3729
+60520,SoCore Energy LLC,60895,Whistling Winds DPC Solar,PV1,Juneau,1.5,1.5,Solar Photovoltaic,43.9721,-90.0719
+60520,SoCore Energy LLC,60936,New Auburn DPC Solar,PV1,Chippewa,2.5,2.5,Solar Photovoltaic,45.21,-91.4353
+60520,SoCore Energy LLC,60957,Sand Lake DPC Solar,PV1,Polk,1,1,Solar Photovoltaic,45.4455,-92.549
+61202,"Flambeau Solar Partners, LLC",61595,Flambeau Solar Partners,FLAMB,Price,2.5,2.5,Solar Photovoltaic,45.7368,-90.471
+61266,"Fiber Recovery, Inc",61652,"Fiber Recovery, Inc.",ENG1,Marathon,0.8,0.8,Landfill Gas,44.8875,-89.3859
+61266,"Fiber Recovery, Inc",61652,"Fiber Recovery, Inc.",ENG2,Marathon,0.8,0.8,Landfill Gas,44.8875,-89.3859
+61266,"Fiber Recovery, Inc",61652,"Fiber Recovery, Inc.",ENG3,Marathon,0.8,0.8,Landfill Gas,44.8875,-89.3859
+57389,IKEA Property Inc,61816,IKEA Oak Creek Rooftop PV System,PV1,Milwaukee,1.2,1.2,Solar Photovoltaic,42.902949,-87.93545
+61967,Beloit Memorial Hospital,62117,Beloit Memorial Hospital Power Plant,GEN-1,Rock,1.5,1.5,Natural Gas Internal Combustion Engine,42.5486,-89.0083
+61967,Beloit Memorial Hospital,62117,Beloit Memorial Hospital Power Plant,GEN-2,Rock,1.5,1.5,Natural Gas Internal Combustion Engine,42.5486,-89.0083
+61667,Galactic Wind,62161,Galactic Wind,GWT,Dane,9.9,9.9,Onshore Wind Turbine,43.101605,-89.33186
+61702,"Epic Hosting, LLC",62676,Epic Verona,G101,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G102,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G103,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G104,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G105,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G202,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G203,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G204,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G205,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G206,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G207,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G208,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G209,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G210,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G211,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G301,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G302,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,G303,Dane,2.3,2.3,Petroleum Liquids,42.996838,-89.56875
+61702,"Epic Hosting, LLC",62676,Epic Verona,PV,Dane,1.8,1.8,Solar Photovoltaic,42.996838,-89.56875
+11479,Madison Gas & Electric Co,62731,Middleton Airport Solar,1,Dane,5.6,5.6,Solar Photovoltaic,43.11626,-89.53245
+62662,"Butter Solar, LLC",62744,Arcadia Solar,A1,Trempealeau,5,5,Solar Photovoltaic,44.243436,-91.45824
+62662,"Butter Solar, LLC",62847,Fennimore Solar,FEN6,Grant,3,3,Solar Photovoltaic,42.971,-90.662
+62662,"Butter Solar, LLC",62848,New Lisbon Solar,NEW9,Juneau,2.5,2.5,Solar Photovoltaic,43.883,-90.136
+62662,"Butter Solar, LLC",62849,Cumberland Solar,CUM4,Barron,2.5,2.5,Solar Photovoltaic,45.511,-92.025
+62662,"Butter Solar, LLC",62858,Cashton Solar,CAS3,Monroe,2,2,Solar Photovoltaic,43.737,-90.805
+62662,"Butter Solar, LLC",62868,Elroy Solar,ELR5,Juneau,1.5,1.5,Solar Photovoltaic,43.732,-90.025
+20860,Wisconsin Public Service Corp,62955,Badger Hollow I,GEN1,Iowa,150,150,Solar Photovoltaic,42.94556,-90.34942
+20860,Wisconsin Public Service Corp,63105,Two Creeks Solar,1,Manitowoc,150,150,Solar Photovoltaic,44.249598,-87.54534
+20856,Wisconsin Power & Light Co,64020,West Riverside Energy Center,CTG3,Rock,226.1,234.9,Natural Gas Fired Combined Cycle,42.582051,-89.04121
+20856,Wisconsin Power & Light Co,64020,West Riverside Energy Center,CTG4,Rock,224.8,232.7,Natural Gas Fired Combined Cycle,42.582051,-89.04121
+20856,Wisconsin Power & Light Co,64020,West Riverside Energy Center,PV1,Rock,4.4,4.4,Solar Photovoltaic,42.582051,-89.04121
+20856,Wisconsin Power & Light Co,64020,West Riverside Energy Center,STG2,Rock,255.1,258.3,Natural Gas Fired Combined Cycle,42.582051,-89.04121
+11479,Madison Gas & Electric Co,64080,Dane County Airport Solar,1,Dane,10.8,10.8,Solar Photovoltaic,43.160591,-89.3295
+64081,Point Beach Solar,64431,Point Beach Solar,PBS,Manitowoc,100,100,Solar Photovoltaic,44.28337,-87.55533
+11479,Madison Gas & Electric Co,64590,O'Brien Solar Fields,OBSFN,Dane,8.3,8.3,Solar Photovoltaic,42.997665,-89.45895
+11479,Madison Gas & Electric Co,64590,O'Brien Solar Fields,OBSFS,Dane,8.3,8.3,Solar Photovoltaic,42.997665,-89.45895
+11479,Madison Gas & Electric Co,64590,O'Brien Solar Fields,OBSFW,Dane,5.5,5.5,Solar Photovoltaic,42.997665,-89.45895
+60025,Greenbacker Renewable Energy Corporation,64698,"Blue Prairie Solar, LLC",508,Jackson,2.5,2.5,Solar Photovoltaic,44.285255,-90.9158
+60571,"AEP Onsite Partners, LLC",64714,Rice Lake Solar Array,RLK01,Barron,3.8,3.8,Solar Photovoltaic,45.526558,-91.75693
+11479,Madison Gas & Electric Co,64780,Hermsdorf Solar,1,Dane,8,8,Solar Photovoltaic,43.0596,-89.2609
+60025,Greenbacker Renewable Energy Corporation,64862,Strobus,515,Jackson,1.5,1.5,Solar Photovoltaic,44.4332,-90.85707
+60571,"AEP Onsite Partners, LLC",64969,Barron Solar Array,BAR01,Barron,3,3,Solar Photovoltaic,45.396196,-91.82757
+60571,"AEP Onsite Partners, LLC",64976,Spooner Solar Array,SPN01,Washburn,2.1,2.1,Solar Photovoltaic,45.919047,-91.86248
+20856,Wisconsin Power & Light Co,65009,Bear Creek,PV1,Richland,50,37,Solar Photovoltaic,43.198512,-90.23282
+20856,Wisconsin Power & Light Co,65010,North Rock,PV1,Rock,50,36.5,Solar Photovoltaic,42.810873,-89.10154
+20856,Wisconsin Power & Light Co,65011,Wood County,PV1,Wood,150,110.6,Solar Photovoltaic,44.27361,-89.8335
+60025,Greenbacker Renewable Energy Corporation,65087,Shamrock Solar LLC,554,Jackson,3,3,Solar Photovoltaic,44.17659,-90.84654
+60025,Greenbacker Renewable Energy Corporation,65088,Stromland Solar,510,Buffalo,3,3,Solar Photovoltaic,44.19955,-91.80897
+59496,Allete Clean Energy,65282,Red Barn Energy,WT,Grant,91.6,91.6,Onshore Wind Turbine,42.951448,-90.4407
+20856,Wisconsin Power & Light Co,65530,Portage Industrial Battery,BESS1,Columbia,5,5,Batteries,43.552111,-89.48773
+20856,Wisconsin Power & Light Co,65633,Boaz Microgrid Battery,BESS1,Richland,0.3,0.2,Batteries,43.310598,-90.53274
+64930,ENGIE 2020 ProjectCo-WI1 LLC,65659,ENGIE 2020 ProjectCo-WI1 LLC,PV1,Fond Du Lac,1,1,Solar Photovoltaic,43.735027,-88.47378
+20856,Wisconsin Power & Light Co,65680,City of Sheboygan Solar,PV1,Sheboygan,1,1,Solar Photovoltaic,43.709143,-87.75538
+20856,Wisconsin Power & Light Co,65681,Kohler Solar,PV1,Sheboygan,2.3,2.3,Solar Photovoltaic,43.747,-87.76573
+20860,Wisconsin Public Service Corp,65968,Hodag Solar,HODAG,Oneida,7.5,7.5,Solar Photovoltaic,45.61246,-89.44366
+65220,"Middleton Biogas Solar, LLC",66048,"Middleton Biogas Solar, LLC",MBS,Dane,1.9,1.7,Solar Photovoltaic,43.1233,-89.5466
+65220,"Middleton Biogas Solar, LLC",66048,"Middleton Biogas Solar, LLC",MBS-B,Dane,0.3,0.3,Batteries,43.1233,-89.5466
+20860,Wisconsin Public Service Corp,66059,Weston RICE,W11,Marathon,18.8,18.8,Natural Gas Internal Combustion Engine,44.856372,-89.65402
+20860,Wisconsin Public Service Corp,66059,Weston RICE,W12,Marathon,18.8,18.8,Natural Gas Internal Combustion Engine,44.856372,-89.65402
+20860,Wisconsin Public Service Corp,66059,Weston RICE,W13,Marathon,18.8,18.8,Natural Gas Internal Combustion Engine,44.856372,-89.65402
+20860,Wisconsin Public Service Corp,66059,Weston RICE,W14,Marathon,18.8,18.8,Natural Gas Internal Combustion Engine,44.856372,-89.65402
+20860,Wisconsin Public Service Corp,66059,Weston RICE,W15,Marathon,18.8,18.8,Natural Gas Internal Combustion Engine,44.856372,-89.65402
+20860,Wisconsin Public Service Corp,66059,Weston RICE,W16,Marathon,18.8,18.8,Natural Gas Internal Combustion Engine,44.856372,-89.65402
+20860,Wisconsin Public Service Corp,66059,Weston RICE,W17,Marathon,18.8,18.8,Natural Gas Internal Combustion Engine,44.856372,-89.65402
+65501,Dane County Solar LLC,66419,Dane County Solar LLC,DANE,Dane,17.3,17.3,Solar Photovoltaic,43.0466,-89.23931
diff --git a/lab-p6/public_tests.py b/lab-p6/public_tests.py
new file mode 100644
index 0000000..6fe3f10
--- /dev/null
+++ b/lab-p6/public_tests.py
@@ -0,0 +1,1160 @@
+#!/usr/bin/python
+# +
+import os, json, math, copy
+from collections import namedtuple
+from bs4 import BeautifulSoup
+
+HIDDEN_FILE = os.path.join("hidden", "hidden_tests.py")
+if os.path.exists(HIDDEN_FILE):
+    import hidden.hidden_tests as hidn
+# -
+
+MAX_FILE_SIZE = 750 # units - KB
+REL_TOL = 6e-04  # relative tolerance for floats
+ABS_TOL = 15e-03  # absolute tolerance for floats
+TOTAL_SCORE = 100 # total score for the project
+
+DF_FILE = 'expected_dfs.html'
+PLOT_FILE = 'expected_plots.json'
+
+PASS = "All test cases passed!"
+
+TEXT_FORMAT = "TEXT_FORMAT"  # question type when expected answer is a type, str, int, float, or bool
+TEXT_FORMAT_UNORDERED_LIST = "TEXT_FORMAT_UNORDERED_LIST"  # question type when the expected answer is a list or a set where the order does *not* matter
+TEXT_FORMAT_ORDERED_LIST = "TEXT_FORMAT_ORDERED_LIST"  # question type when the expected answer is a list or tuple where the order does matter
+TEXT_FORMAT_DICT = "TEXT_FORMAT_DICT"  # question type when the expected answer is a dictionary
+TEXT_FORMAT_SPECIAL_ORDERED_LIST = "TEXT_FORMAT_SPECIAL_ORDERED_LIST"  # question type when the expected answer is a list where order does matter, but with possible ties. Elements are ordered according to values in special_ordered_json (with ties allowed)
+TEXT_FORMAT_NAMEDTUPLE = "TEXT_FORMAT_NAMEDTUPLE"  # question type when expected answer is a namedtuple
+PNG_FORMAT_SCATTER = "PNG_FORMAT_SCATTER" # question type when the expected answer is a scatter plot
+HTML_FORMAT = "HTML_FORMAT" # question type when the expected answer is a DataFrame
+FILE_JSON_FORMAT = "FILE_JSON_FORMAT" # question type when the expected answer is a JSON file
+SLASHES = " SLASHES" # question SUFFIX when expected answer contains paths with slashes
+
+def get_expected_format():
+    """get_expected_format() returns a dict mapping each question to the format
+    of the expected answer."""
+    expected_format = {'q1': 'TEXT_FORMAT_ORDERED_LIST',
+                       'q2': 'TEXT_FORMAT',
+                       'q3': 'TEXT_FORMAT_ORDERED_LIST',
+                       'q4': 'TEXT_FORMAT_ORDERED_LIST',
+                       'q5': 'TEXT_FORMAT_ORDERED_LIST',
+                       'q6': 'TEXT_FORMAT',
+                       'q7': 'TEXT_FORMAT',
+                       'q8': 'TEXT_FORMAT',
+                       'q9': 'TEXT_FORMAT',
+                       'q10': 'TEXT_FORMAT',
+                       'q11': 'TEXT_FORMAT',
+                       'q12': 'TEXT_FORMAT',
+                       'q13': 'TEXT_FORMAT',
+                       'q14': 'TEXT_FORMAT_ORDERED_LIST',
+                       'q15': 'TEXT_FORMAT',
+                       'q16': 'TEXT_FORMAT',
+                       'q17': 'TEXT_FORMAT',
+                       'q18': 'TEXT_FORMAT',
+                       'q19': 'TEXT_FORMAT_ORDERED_LIST',
+                       'q20': 'TEXT_FORMAT',
+                       'q21': 'TEXT_FORMAT_ORDERED_LIST',
+                       'q22': 'TEXT_FORMAT',
+                       'q23': 'TEXT_FORMAT',
+                       'q24': 'TEXT_FORMAT',
+                       'q25': 'TEXT_FORMAT',
+                       'q26': 'TEXT_FORMAT_ORDERED_LIST',
+                       'q27': 'TEXT_FORMAT',
+                       'q28': 'TEXT_FORMAT_UNORDERED_LIST',
+                       'q29': 'TEXT_FORMAT',
+                       'q30': 'TEXT_FORMAT_ORDERED_LIST',
+                       'q31': 'TEXT_FORMAT_UNORDERED_LIST',
+                       'q32': 'TEXT_FORMAT_UNORDERED_LIST'}
+    return expected_format
+
+
+def get_expected_json():
+    """get_expected_json() returns a dict mapping each question to the expected
+    answer (if the format permits it)."""
+    expected_json = {'q1': ['entity_id',
+                            'entity_name',
+                            'plant_id',
+                            'plant_name',
+                            'generator_id',
+                            'county',
+                            'net_summer_capacity',
+                            'net_winter_capacity',
+                            'technology',
+                            'latitude',
+                            'longitude'],
+                     'q2': 613,
+                     'q3': [['13781',
+                             'Northern States Power Co - Minnesota',
+                             '1756',
+                             'Saxon Falls',
+                             '1',
+                             'Iron',
+                             '0.5',
+                             '0.5',
+                             'Conventional Hydroelectric',
+                             '46.5392',
+                             '-90.3742'],
+                            ['13781',
+                             'Northern States Power Co - Minnesota',
+                             '1756',
+                             'Saxon Falls',
+                             '2',
+                             'Iron',
+                             '0.5',
+                             '0.6',
+                             'Conventional Hydroelectric',
+                             '46.5392',
+                             '-90.3742'],
+                            ['20847',
+                             'Wisconsin Electric Power Co',
+                             '1775',
+                             'Brule',
+                             '1',
+                             'Florence',
+                             '1.3',
+                             '1.3',
+                             'Conventional Hydroelectric',
+                             '45.9472',
+                             '-88.2189'],
+                            ['20847',
+                             'Wisconsin Electric Power Co',
+                             '1775',
+                             'Brule',
+                             '2',
+                             'Florence',
+                             '2',
+                             '2',
+                             'Conventional Hydroelectric',
+                             '45.9472',
+                             '-88.2189'],
+                            ['20847',
+                             'Wisconsin Electric Power Co',
+                             '1775',
+                             'Brule',
+                             '3',
+                             'Florence',
+                             '2',
+                             '2',
+                             'Conventional Hydroelectric',
+                             '45.9472',
+                             '-88.2189'],
+                            ['4247',
+                             'Consolidated Water Power Co',
+                             '3971',
+                             'Biron',
+                             '1',
+                             'Wood',
+                             '1.3',
+                             '1.3',
+                             'Conventional Hydroelectric',
+                             '44.4306',
+                             '-89.7808'],
+                            ['4247',
+                             'Consolidated Water Power Co',
+                             '3971',
+                             'Biron',
+                             '2',
+                             'Wood',
+                             '1.3',
+                             '1.3',
+                             'Conventional Hydroelectric',
+                             '44.4306',
+                             '-89.7808'],
+                            ['4247',
+                             'Consolidated Water Power Co',
+                             '3971',
+                             'Biron',
+                             '3',
+                             'Wood',
+                             '0.4',
+                             '0.4',
+                             'Conventional Hydroelectric',
+                             '44.4306',
+                             '-89.7808'],
+                            ['4247',
+                             'Consolidated Water Power Co',
+                             '3971',
+                             'Biron',
+                             '4',
+                             'Wood',
+                             '0.4',
+                             '0.4',
+                             'Conventional Hydroelectric',
+                             '44.4306',
+                             '-89.7808'],
+                            ['4247',
+                             'Consolidated Water Power Co',
+                             '3971',
+                             'Biron',
+                             '5',
+                             'Wood',
+                             '0.4',
+                             '0.4',
+                             'Conventional Hydroelectric',
+                             '44.4306',
+                             '-89.7808']],
+                     'q4': [['65220',
+                             'Middleton Biogas Solar, LLC',
+                             '66048',
+                             'Middleton Biogas Solar, LLC',
+                             'MBS',
+                             'Dane',
+                             '1.9',
+                             '1.7',
+                             'Solar Photovoltaic',
+                             '43.1233',
+                             '-89.5466'],
+                            ['65220',
+                             'Middleton Biogas Solar, LLC',
+                             '66048',
+                             'Middleton Biogas Solar, LLC',
+                             'MBS-B',
+                             'Dane',
+                             '0.3',
+                             '0.3',
+                             'Batteries',
+                             '43.1233',
+                             '-89.5466'],
+                            ['20860',
+                             'Wisconsin Public Service Corp',
+                             '66059',
+                             'Weston RICE',
+                             'W11',
+                             'Marathon',
+                             '18.8',
+                             '18.8',
+                             'Natural Gas Internal Combustion Engine',
+                             '44.856372',
+                             '-89.65402'],
+                            ['20860',
+                             'Wisconsin Public Service Corp',
+                             '66059',
+                             'Weston RICE',
+                             'W12',
+                             'Marathon',
+                             '18.8',
+                             '18.8',
+                             'Natural Gas Internal Combustion Engine',
+                             '44.856372',
+                             '-89.65402'],
+                            ['20860',
+                             'Wisconsin Public Service Corp',
+                             '66059',
+                             'Weston RICE',
+                             'W13',
+                             'Marathon',
+                             '18.8',
+                             '18.8',
+                             'Natural Gas Internal Combustion Engine',
+                             '44.856372',
+                             '-89.65402'],
+                            ['20860',
+                             'Wisconsin Public Service Corp',
+                             '66059',
+                             'Weston RICE',
+                             'W14',
+                             'Marathon',
+                             '18.8',
+                             '18.8',
+                             'Natural Gas Internal Combustion Engine',
+                             '44.856372',
+                             '-89.65402'],
+                            ['20860',
+                             'Wisconsin Public Service Corp',
+                             '66059',
+                             'Weston RICE',
+                             'W15',
+                             'Marathon',
+                             '18.8',
+                             '18.8',
+                             'Natural Gas Internal Combustion Engine',
+                             '44.856372',
+                             '-89.65402'],
+                            ['20860',
+                             'Wisconsin Public Service Corp',
+                             '66059',
+                             'Weston RICE',
+                             'W16',
+                             'Marathon',
+                             '18.8',
+                             '18.8',
+                             'Natural Gas Internal Combustion Engine',
+                             '44.856372',
+                             '-89.65402'],
+                            ['20860',
+                             'Wisconsin Public Service Corp',
+                             '66059',
+                             'Weston RICE',
+                             'W17',
+                             'Marathon',
+                             '18.8',
+                             '18.8',
+                             'Natural Gas Internal Combustion Engine',
+                             '44.856372',
+                             '-89.65402'],
+                            ['65501',
+                             'Dane County Solar LLC',
+                             '66419',
+                             'Dane County Solar LLC',
+                             'DANE',
+                             'Dane',
+                             '17.3',
+                             '17.3',
+                             'Solar Photovoltaic',
+                             '43.0466',
+                             '-89.23931']],
+                     'q5': ['13781',
+                            'Northern States Power Co - Minnesota',
+                            '1756',
+                            'Saxon Falls',
+                            '1',
+                            'Iron',
+                            '0.5',
+                            '0.5',
+                            'Conventional Hydroelectric',
+                            '46.5392',
+                            '-90.3742'],
+                     'q6': 'Northern States Power Co - Minnesota',
+                     'q7': 8,
+                     'q8': 'Conventional Hydroelectric',
+                     'q9': 'Conventional Hydroelectric',
+                     'q10': 'Saxon Falls',
+                     'q11': '45.9472',
+                     'q12': '5',
+                     'q13': 2,
+                     'q14': ['Arcadia Solar',
+                             'Fennimore Solar',
+                             'New Lisbon Solar',
+                             'Cumberland Solar',
+                             'Cashton Solar',
+                             'Elroy Solar'],
+                     'q15': 65501,
+                     'q16': 66419,
+                     'q17': 2.0,
+                     'q18': 45.41167,
+                     'q19': [409.3, 172.6, 169.5, 1.0, 2.3],
+                     'q20': None,
+                     'q21': [1.0, 2.3, 169.5, 172.6, 409.3],
+                     'q22': 3,
+                     'q23': 3,
+                     'q24': 44.3364,
+                     'q25': 598.0,
+                     'q26': [9.5, None, None, None, 579.3, 568.8, 162.0, 5.0],
+                     'q27': 162.0,
+                     'q28': {'Biron', 'Brule', 'Saxon Falls'},
+                     'q29': True,
+                     'q30': ['Saxon Falls',
+                             'Saxon Falls',
+                             'Bay Front',
+                             'Bay Front',
+                             'Big Falls',
+                             'Big Falls',
+                             'Big Falls',
+                             'Ladysmith Dam',
+                             'Ladysmith Dam',
+                             'Ladysmith Dam',
+                             'Thornapple',
+                             'Thornapple',
+                             'White River (WI)',
+                             'White River (WI)',
+                             'Cedar Falls (WI)',
+                             'Cedar Falls (WI)',
+                             'Cedar Falls (WI)',
+                             'Chippewa Falls',
+                             'Chippewa Falls',
+                             'Chippewa Falls',
+                             'Chippewa Falls',
+                             'Chippewa Falls',
+                             'Chippewa Falls',
+                             'Dells',
+                             'Dells',
+                             'Dells',
+                             'Dells',
+                             'Dells',
+                             'French Island',
+                             'French Island',
+                             'French Island',
+                             'French Island',
+                             'Holcombe',
+                             'Holcombe',
+                             'Holcombe',
+                             'Jim Falls',
+                             'Jim Falls',
+                             'Jim Falls',
+                             'Menomonie',
+                             'Menomonie',
+                             'St Croix Falls',
+                             'St Croix Falls',
+                             'St Croix Falls',
+                             'St Croix Falls',
+                             'St Croix Falls',
+                             'St Croix Falls',
+                             'St Croix Falls',
+                             'St Croix Falls',
+                             'Trego',
+                             'Trego',
+                             'Wheaton',
+                             'Wheaton',
+                             'Wheaton',
+                             'Wheaton',
+                             'Wheaton',
+                             'Wissota',
+                             'Wissota',
+                             'Wissota',
+                             'Wissota',
+                             'Wissota',
+                             'Wissota',
+                             'Cornell',
+                             'Cornell',
+                             'Cornell',
+                             'Cornell',
+                             'Apple River',
+                             'Apple River',
+                             'Apple River'],
+                     'q31': {'Apple River',
+                             'Bay Front',
+                             'Big Falls',
+                             'Cedar Falls (WI)',
+                             'Chippewa Falls',
+                             'Cornell',
+                             'Dells',
+                             'French Island',
+                             'Holcombe',
+                             'Jim Falls',
+                             'Ladysmith Dam',
+                             'Menomonie',
+                             'Saxon Falls',
+                             'St Croix Falls',
+                             'Thornapple',
+                             'Trego',
+                             'Wheaton',
+                             'White River (WI)',
+                             'Wissota'},
+                     'q32': ['Biron', 'Du Bay', 'Stevens Point', 'Whiting', 'Wisconsin Rapids']}
+    return expected_json
+
+
+def get_special_json():
+    """get_special_json() returns a dict mapping each question to the expected
+    answer stored in a special format as a list of tuples. Each tuple contains
+    the element expected in the list, and its corresponding value. Any two
+    elements with the same value can appear in any order in the actual list,
+    but if two elements have different values, then they must appear in the
+    same order as in the expected list of tuples."""
+    special_json = {}
+    return special_json
+
+
+def compare(expected, actual, q_format=TEXT_FORMAT):
+    """compare(expected, actual) is used to compare when the format of
+    the expected answer is known for certain."""
+    try:
+        if q_format == TEXT_FORMAT:
+            return simple_compare(expected, actual)
+        elif q_format == TEXT_FORMAT_UNORDERED_LIST:
+            return list_compare_unordered(expected, actual)
+        elif q_format == TEXT_FORMAT_ORDERED_LIST:
+            return list_compare_ordered(expected, actual)
+        elif q_format == TEXT_FORMAT_DICT:
+            return dict_compare(expected, actual)
+        elif q_format == TEXT_FORMAT_SPECIAL_ORDERED_LIST:
+            return list_compare_special(expected, actual)
+        elif q_format == TEXT_FORMAT_NAMEDTUPLE:
+            return namedtuple_compare(expected, actual)
+        elif q_format == PNG_FORMAT_SCATTER:
+            return compare_flip_dicts(expected, actual)
+        elif q_format == HTML_FORMAT:
+            return compare_cell_html(expected, actual)
+        elif q_format == FILE_JSON_FORMAT:
+            return compare_json(expected, actual)
+        else:
+            if expected != actual:
+                return "expected %s but found %s " % (repr(expected), repr(actual))
+    except:
+        if expected != actual:
+            return "expected %s" % (repr(expected))
+    return PASS
+
+
+def print_message(expected, actual, complete_msg=True):
+    """print_message(expected, actual) displays a simple error message."""
+    msg = "expected %s" % (repr(expected))
+    if complete_msg:
+        msg = msg + " but found %s" % (repr(actual))
+    return msg
+
+
+def simple_compare(expected, actual, complete_msg=True):
+    """simple_compare(expected, actual) is used to compare when the expected answer
+    is a type/Nones/str/int/float/bool. When the expected answer is a float,
+    the actual answer is allowed to be within the tolerance limit. Otherwise,
+    the values must match exactly, or a very simple error message is displayed."""
+    msg = PASS
+    if 'numpy' in repr(type((actual))):
+        actual = actual.item()
+    if isinstance(expected, type):
+        if expected != actual:
+            if isinstance(actual, type):
+                msg = "expected %s but found %s" % (expected.__name__, actual.__name__)
+            else:
+                msg = "expected %s but found %s" % (expected.__name__, repr(actual))
+    elif not isinstance(actual, type(expected)) and not (isinstance(expected, (float, int)) and isinstance(actual, (float, int))):
+        msg = "expected to find type %s but found type %s" % (type(expected).__name__, type(actual).__name__)
+    elif isinstance(expected, float):
+        if not math.isclose(actual, expected, rel_tol=REL_TOL, abs_tol=ABS_TOL):
+            msg = print_message(expected, actual, complete_msg)
+    elif isinstance(expected, (list, tuple)) or is_namedtuple(expected):
+        new_msg = print_message(expected, actual, complete_msg)
+        if len(expected) != len(actual):
+            return new_msg
+        for i in range(len(expected)):
+            val = simple_compare(expected[i], actual[i])
+            if val != PASS:
+                return new_msg
+    elif isinstance(expected, dict):
+        new_msg = print_message(expected, actual, complete_msg)
+        if len(expected) != len(actual):
+            return new_msg
+        val = simple_compare(list(expected.keys()), list(actual.keys()))
+        if val != PASS:
+            return new_msg
+        for key in expected:
+            val = simple_compare(expected[key], actual[key])
+            if val != PASS:
+                return new_msg
+    else:
+        if expected != actual:
+            msg = print_message(expected, actual, complete_msg)
+    return msg
+
+
+def intelligent_compare(expected, actual, obj=None):
+    """intelligent_compare(expected, actual) is used to compare when the
+    data type of the expected answer is not known for certain, and default
+    assumptions  need to be made."""
+    if obj == None:
+        obj = type(expected).__name__
+    if is_namedtuple(expected):
+        msg = namedtuple_compare(expected, actual)
+    elif isinstance(expected, (list, tuple)):
+        msg = list_compare_ordered(expected, actual, obj)
+    elif isinstance(expected, set):
+        msg = list_compare_unordered(expected, actual, obj)
+    elif isinstance(expected, (dict)):
+        msg = dict_compare(expected, actual)
+    else:
+        msg = simple_compare(expected, actual)
+    msg = msg.replace("CompDict", "dict").replace("CompSet", "set").replace("NewNone", "None")
+    return msg
+
+
+def is_namedtuple(obj, init_check=True):
+    """is_namedtuple(obj) returns True if `obj` is a namedtuple object
+    defined in the test file."""
+    bases = type(obj).__bases__
+    if len(bases) != 1 or bases[0] != tuple:
+        return False
+    fields = getattr(type(obj), '_fields', None)
+    if not isinstance(fields, tuple):
+        return False
+    if init_check and not type(obj).__name__ in [nt.__name__ for nt in _expected_namedtuples]:
+        return False
+    return True
+
+
+def list_compare_ordered(expected, actual, obj=None):
+    """list_compare_ordered(expected, actual) is used to compare when the
+    expected answer is a list/tuple, where the order of the elements matters."""
+    msg = PASS
+    if not isinstance(actual, type(expected)):
+        msg = "expected to find type %s but found type %s" % (type(expected).__name__, type(actual).__name__)
+        return msg
+    if obj == None:
+        obj = type(expected).__name__
+    for i in range(len(expected)):
+        if i >= len(actual):
+            msg = "at index %d of the %s, expected missing %s" % (i, obj, repr(expected[i]))
+            break
+        val = intelligent_compare(expected[i], actual[i], "sub" + obj)
+        if val != PASS:
+            msg = "at index %d of the %s, " % (i, obj) + val
+            break
+    if len(actual) > len(expected) and msg == PASS:
+        msg = "at index %d of the %s, found unexpected %s" % (len(expected), obj, repr(actual[len(expected)]))
+    if len(expected) != len(actual):
+        msg = msg + " (found %d entries in %s, but expected %d)" % (len(actual), obj, len(expected))
+
+    if len(expected) > 0:
+        try:
+            if msg != PASS and list_compare_unordered(expected, actual, obj) == PASS:
+                msg = msg + " (%s may not be ordered as required)" % (obj)
+        except:
+            pass
+    return msg
+
+
+def list_compare_helper(larger, smaller):
+    """list_compare_helper(larger, smaller) is a helper function which takes in
+    two lists of possibly unequal sizes and finds the item that is not present
+    in the smaller list, if there is such an element."""
+    msg = PASS
+    j = 0
+    for i in range(len(larger)):
+        if i == len(smaller):
+            msg = "expected %s" % (repr(larger[i]))
+            break
+        found = False
+        while not found:
+            if j == len(smaller):
+                val = simple_compare(larger[i], smaller[j - 1], complete_msg=False)
+                break
+            val = simple_compare(larger[i], smaller[j], complete_msg=False)
+            j += 1
+            if val == PASS:
+                found = True
+                break
+        if not found:
+            msg = val
+            break
+    return msg
+
+class NewNone():
+    """alternate class in place of None, which allows for comparison with
+    all other data types."""
+    def __str__(self):
+        return 'None'
+    def __repr__(self):
+        return 'None'
+    def __lt__(self, other):
+        return True
+    def __le__(self, other):
+        return True
+    def __gt__(self, other):
+        return False
+    def __ge__(self, other):
+        return other == None
+    def __eq__(self, other):
+        return other == None
+    def __ne__(self, other):
+        return other != None
+
+class CompDict(dict):
+    """subclass of dict, which allows for comparison with other dicts."""
+    def __init__(self, vals):
+        super(self.__class__, self).__init__(vals)
+        if type(vals) == CompDict:
+            self.val = vals.val
+        elif isinstance(vals, dict):
+            self.val = self.get_equiv(vals)
+        else:
+            raise TypeError("'%s' object cannot be type casted to CompDict class" % type(vals).__name__)
+
+    def get_equiv(self, vals):
+        val = []
+        for key in sorted(list(vals.keys())):
+            val.append((key, vals[key]))
+        return val
+
+    def __str__(self):
+        return str(dict(self.val))
+    def __repr__(self):
+        return repr(dict(self.val))
+    def __lt__(self, other):
+        return self.val < CompDict(other).val
+    def __le__(self, other):
+        return self.val <= CompDict(other).val
+    def __gt__(self, other):
+        return self.val > CompDict(other).val
+    def __ge__(self, other):
+        return self.val >= CompDict(other).val
+    def __eq__(self, other):
+        return self.val == CompDict(other).val
+    def __ne__(self, other):
+        return self.val != CompDict(other).val
+
+class CompSet(set):
+    """subclass of set, which allows for comparison with other sets."""
+    def __init__(self, vals):
+        super(self.__class__, self).__init__(vals)
+        if type(vals) == CompSet:
+            self.val = vals.val
+        elif isinstance(vals, set):
+            self.val = self.get_equiv(vals)
+        else:
+            raise TypeError("'%s' object cannot be type casted to CompSet class" % type(vals).__name__)
+
+    def get_equiv(self, vals):
+        return sorted(list(vals))
+
+    def __str__(self):
+        return str(set(self.val))
+    def __repr__(self):
+        return repr(set(self.val))
+    def __getitem__(self, index):
+        return self.val[index]
+    def __lt__(self, other):
+        return self.val < CompSet(other).val
+    def __le__(self, other):
+        return self.val <= CompSet(other).val
+    def __gt__(self, other):
+        return self.val > CompSet(other).val
+    def __ge__(self, other):
+        return self.val >= CompSet(other).val
+    def __eq__(self, other):
+        return self.val == CompSet(other).val
+    def __ne__(self, other):
+        return self.val != CompSet(other).val
+
+def make_sortable(item):
+    """make_sortable(item) replaces all Nones in `item` with an alternate
+    class that allows for comparison with str/int/float/bool/list/set/tuple/dict.
+    It also replaces all dicts (and sets) with a subclass that allows for
+    comparison with other dicts (and sets)."""
+    if item == None:
+        return NewNone()
+    elif isinstance(item, (type, str, int, float, bool)):
+        return item
+    elif isinstance(item, (list, set, tuple)):
+        new_item = []
+        for subitem in item:
+            new_item.append(make_sortable(subitem))
+        if is_namedtuple(item):
+            return type(item)(*new_item)
+        elif isinstance(item, set):
+            return CompSet(new_item)
+        else:
+            return type(item)(new_item)
+    elif isinstance(item, dict):
+        new_item = {}
+        for key in item:
+            new_item[key] = make_sortable(item[key])
+        return CompDict(new_item)
+    return item
+
+def list_compare_unordered(expected, actual, obj=None):
+    """list_compare_unordered(expected, actual) is used to compare when the
+    expected answer is a list/set where the order of the elements does not matter."""
+    msg = PASS
+    if not isinstance(actual, type(expected)):
+        msg = "expected to find type %s but found type %s" % (type(expected).__name__, type(actual).__name__)
+        return msg
+    if obj == None:
+        obj = type(expected).__name__
+
+    try:
+        sort_expected = sorted(make_sortable(expected))
+        sort_actual = sorted(make_sortable(actual))
+    except:
+        return "unexpected datatype found in %s; expected entries of type %s" % (obj, obj, type(expected[0]).__name__)
+
+    if len(actual) == 0 and len(expected) > 0:
+        msg = "in the %s, missing" % (obj) + sort_expected[0]
+    elif len(actual) > 0 and len(expected) > 0:
+        val = intelligent_compare(sort_expected[0], sort_actual[0])
+        if val.startswith("expected to find type"):
+            msg = "in the %s, " % (obj) + simple_compare(sort_expected[0], sort_actual[0])
+        else:
+            if len(expected) > len(actual):
+                msg = "in the %s, missing " % (obj) + list_compare_helper(sort_expected, sort_actual)
+            elif len(expected) < len(actual):
+                msg = "in the %s, found un" % (obj) + list_compare_helper(sort_actual, sort_expected)
+            if len(expected) != len(actual):
+                msg = msg + " (found %d entries in %s, but expected %d)" % (len(actual), obj, len(expected))
+                return msg
+            else:
+                val = list_compare_helper(sort_expected, sort_actual)
+                if val != PASS:
+                    msg = "in the %s, missing " % (obj) + val + ", but found un" + list_compare_helper(sort_actual,
+                                                                                               sort_expected)
+    return msg
+
+
+def namedtuple_compare(expected, actual):
+    """namedtuple_compare(expected, actual) is used to compare when the
+    expected answer is a namedtuple defined in the test file."""
+    msg = PASS
+    if is_namedtuple(actual, False):
+        msg = "expected namedtuple but found %s" % (type(actual).__name__)
+        return msg
+    if type(expected).__name__ != type(actual).__name__:
+        return "expected namedtuple %s but found namedtuple %s" % (type(expected).__name__, type(actual).__name__)
+    expected_fields = expected._fields
+    actual_fields = actual._fields
+    msg = list_compare_ordered(list(expected_fields), list(actual_fields), "namedtuple attributes")
+    if msg != PASS:
+        return msg
+    for field in expected_fields:
+        val = intelligent_compare(getattr(expected, field), getattr(actual, field))
+        if val != PASS:
+            msg = "at attribute %s of namedtuple %s, " % (field, type(expected).__name__) + val
+            return msg
+    return msg
+
+
+def clean_slashes(item):
+    """clean_slashes()"""
+    if isinstance(item, str):
+        return item.replace("\\", "/").replace("/", os.path.sep)
+    elif item == None or isinstance(item, (type, int, float, bool)):
+        return item
+    elif isinstance(item, (list, tuple, set)) or is_namedtuple(item):
+        new_item = []
+        for subitem in item:
+            new_item.append(clean_slashes(subitem))
+        if is_namedtuple(item):
+            return type(item)(*new_item)
+        else:
+            return type(item)(new_item)
+    elif isinstance(item, dict):
+        new_item = {}
+        for key in item:
+            new_item[clean_slashes(key)] = clean_slashes(item[key])
+        return item
+
+
+def list_compare_special_initialize(special_expected):
+    """list_compare_special_initialize(special_expected) takes in the special
+    ordering stored as a sorted list of items, and returns a list of lists
+    where the ordering among the inner lists does not matter."""
+    latest_val = None
+    clean_special = []
+    for row in special_expected:
+        if latest_val == None or row[1] != latest_val:
+            clean_special.append([])
+            latest_val = row[1]
+        clean_special[-1].append(row[0])
+    return clean_special
+
+
+def list_compare_special(special_expected, actual):
+    """list_compare_special(special_expected, actual) is used to compare when the
+    expected answer is a list with special ordering defined in `special_expected`."""
+    msg = PASS
+    expected_list = []
+    special_order = list_compare_special_initialize(special_expected)
+    for expected_item in special_order:
+        expected_list.extend(expected_item)
+    val = list_compare_unordered(expected_list, actual)
+    if val != PASS:
+        return val
+    i = 0
+    for expected_item in special_order:
+        j = len(expected_item)
+        actual_item = actual[i: i + j]
+        val = list_compare_unordered(expected_item, actual_item)
+        if val != PASS:
+            if j == 1:
+                msg = "at index %d " % (i) + val
+            else:
+                msg = "between indices %d and %d " % (i, i + j - 1) + val
+            msg = msg + " (list may not be ordered as required)"
+            break
+        i += j
+    return msg
+
+
+def dict_compare(expected, actual, obj=None):
+    """dict_compare(expected, actual) is used to compare when the expected answer
+    is a dict."""
+    msg = PASS
+    if not isinstance(actual, type(expected)):
+        msg = "expected to find type %s but found type %s" % (type(expected).__name__, type(actual).__name__)
+        return msg
+    if obj == None:
+        obj = type(expected).__name__
+
+    expected_keys = list(expected.keys())
+    actual_keys = list(actual.keys())
+    val = list_compare_unordered(expected_keys, actual_keys, obj)
+
+    if val != PASS:
+        msg = "bad keys in %s: " % (obj) + val
+    if msg == PASS:
+        for key in expected:
+            new_obj = None
+            if isinstance(expected[key], (list, tuple, set)):
+                new_obj = 'value'
+            elif isinstance(expected[key], dict):
+                new_obj = 'sub' + obj
+            val = intelligent_compare(expected[key], actual[key], new_obj)
+            if val != PASS:
+                msg = "incorrect value for key %s in %s: " % (repr(key), obj) + val
+    return msg
+
+
+def is_flippable(item):
+    """is_flippable(item) determines if the given dict of lists has lists of the
+    same length and is therefore flippable."""
+    item_lens = set(([str(len(item[key])) for key in item]))
+    if len(item_lens) == 1:
+        return PASS
+    else:
+        return "found lists of lengths %s" % (", ".join(list(item_lens)))
+
+def flip_dict_of_lists(item):
+    """flip_dict_of_lists(item) flips a dict of lists into a list of dicts if the
+    lists are of same length."""
+    new_item = []
+    length = len(list(item.values())[0])
+    for i in range(length):
+        new_dict = {}
+        for key in item:
+            new_dict[key] = item[key][i]
+        new_item.append(new_dict)
+    return new_item
+
+def compare_flip_dicts(expected, actual, obj="lists"):
+    """compare_flip_dicts(expected, actual) flips a dict of lists (or dicts) into
+    a list of dicts (or dict of dicts) and then compares the list ignoring order."""
+    msg = PASS
+    example_item = list(expected.values())[0]
+    if isinstance(example_item, (list, tuple)):
+        val = is_flippable(actual)
+        if val != PASS:
+            msg = "expected to find lists of length %d, but " % (len(example_item)) + val
+            return msg
+        msg = list_compare_unordered(flip_dict_of_lists(expected), flip_dict_of_lists(actual), "lists")
+    elif isinstance(example_item, dict):
+        expected_keys = list(example_item.keys())
+        for key in actual:
+            val = list_compare_unordered(expected_keys, list(actual[key].keys()), "dictionary %s" % key)
+            if val != PASS:
+                return val
+        for cat_key in expected_keys:
+            expected_category = {}
+            actual_category = {}
+            for key in expected:
+                expected_category[key] = expected[key][cat_key]
+                actual_category[key] = actual[key][cat_key]
+            val = list_compare_unordered(flip_dict_of_lists(expected), flip_dict_of_lists(actual), "category " + repr(cat_key))
+            if val != PASS:
+                return val
+    return msg
+
+
+def get_expected_tables():
+    """get_expected_tables() reads the html file with the expected DataFrames
+    and returns a dict mapping each question to a html table."""
+    if not os.path.exists(DF_FILE):
+        return None
+
+    expected_tables = {}
+    f = open(DF_FILE, encoding='utf-8')
+    soup = BeautifulSoup(f.read(), 'html.parser')
+    f.close()
+
+    tables = soup.find_all('table')
+    for table in tables:
+        expected_tables[table.get("data-question")] = table
+
+    return expected_tables
+
+def parse_df_html_table(table):
+    """parse_df_html_table(table) takes in a table as a html string and returns
+    a dict mapping each row and column index to the value at that position."""
+    rows = []
+    for tr in table.find_all('tr'):
+        rows.append([])
+        for cell in tr.find_all(['td', 'th']):
+            rows[-1].append(cell.get_text().strip("\n "))
+
+    cells = {}
+    for r in range(1, len(rows)):
+        for c in range(1, len(rows[0])):
+            rname = rows[r][0]
+            cname = rows[0][c]
+            cells[(rname,cname)] = rows[r][c]
+    return cells
+
+
+def get_expected_namedtuples():
+    """get_expected_namedtuples() defines the required namedtuple objects
+    globally. It also returns a tuple of the classes."""
+    expected_namedtuples = []
+    
+    return tuple(expected_namedtuples)
+
+_expected_namedtuples = get_expected_namedtuples()
+
+
+def compare_cell_html(expected, actual):
+    """compare_cell_html(expected, actual) is used to compare when the
+    expected answer is a DataFrame stored in the `expected_dfs` html file."""
+    expected_cells = parse_df_html_table(expected)
+    try:
+        actual_cells = parse_df_html_table(BeautifulSoup(actual, 'html.parser').find('table'))
+    except Exception as e:
+        return "expected to find type DataFrame but found type %s instead" % type(actual).__name__
+
+    expected_cols = list(set(["column %s" % (loc[1]) for loc in expected_cells]))
+    actual_cols = list(set(["column %s" % (loc[1]) for loc in actual_cells]))
+    msg = list_compare_unordered(expected_cols, actual_cols, "DataFrame")
+    if msg != PASS:
+        return msg
+
+    expected_rows = list(set(["row index %s" % (loc[0]) for loc in expected_cells]))
+    actual_rows = list(set(["row index %s" % (loc[0]) for loc in actual_cells]))
+    msg = list_compare_unordered(expected_rows, actual_rows, "DataFrame")
+    if msg != PASS:
+        return msg
+
+    for location, expected in expected_cells.items():
+        location_name = "column {} at index {}".format(location[1], location[0])
+        actual = actual_cells.get(location, None)
+        if actual == None:
+            return "in %s, expected to find %s" % (location_name, repr(expected))
+        try:
+            actual_ans = float(actual)
+            expected_ans = float(expected)
+            if math.isnan(actual_ans) and math.isnan(expected_ans):
+                continue
+        except Exception as e:
+            actual_ans, expected_ans = actual, expected
+        msg = simple_compare(expected_ans, actual_ans)
+        if msg != PASS:
+            return "in %s, " % location_name + msg
+    return PASS
+
+
+def get_expected_plots():
+    """get_expected_plots() reads the json file with the expected plot data
+    and returns a dict mapping each question to a dictionary with the plots data."""
+    if not os.path.exists(PLOT_FILE):
+        return None
+
+    f = open(PLOT_FILE, encoding='utf-8')
+    expected_plots = json.load(f)
+    f.close()
+    return expected_plots
+
+
+def compare_file_json(expected, actual):
+    """compare_file_json(expected, actual) is used to compare when the
+    expected answer is a JSON file."""
+    msg = PASS
+    if not os.path.isfile(expected):
+        return "file %s not found; make sure it is downloaded and stored in the correct directory" % (expected)
+    elif not os.path.isfile(actual):
+        return "file %s not found; make sure that you have created the file with the correct name" % (actual)
+    try:
+        e = open(expected, encoding='utf-8')
+        expected_data = json.load(e)
+        e.close()
+    except json.JSONDecodeError:
+        return "file %s is broken and cannot be parsed; please delete and redownload the file correctly" % (expected)
+    try:
+        a = open(actual, encoding='utf-8')
+        actual_data = json.load(a)
+        a.close()
+    except json.JSONDecodeError:
+        return "file %s is broken and cannot be parsed" % (actual)
+    if type(expected_data) == list:
+        msg = list_compare_ordered(expected_data, actual_data, 'file ' + actual)
+    elif type(expected_data) == dict:
+        msg = dict_compare(expected_data, actual_data)
+    return msg
+
+
+_expected_json = get_expected_json()
+_special_json = get_special_json()
+_expected_plots = get_expected_plots()
+_expected_tables = get_expected_tables()
+_expected_format = get_expected_format()
+
+def check(qnum, actual):
+    """check(qnum, actual) is used to check if the answer in the notebook is
+    the correct answer, and provide useful feedback if the answer is incorrect."""
+    msg = PASS
+    error_msg = "<b style='color: red;'>ERROR:</b> "
+    q_format = _expected_format[qnum]
+
+    if q_format == TEXT_FORMAT_SPECIAL_ORDERED_LIST:
+        expected = _special_json[qnum]
+    elif q_format == PNG_FORMAT_SCATTER:
+        if _expected_plots == None:
+            msg = error_msg + "file %s not parsed; make sure it is downloaded and stored in the correct directory" % (PLOT_FILE)
+        else:
+            expected = _expected_plots[qnum]
+    elif q_format == HTML_FORMAT:
+        if _expected_tables == None:
+            msg = error_msg + "file %s not parsed; make sure it is downloaded and stored in the correct directory" % (DF_FILE)
+        else:
+            expected = _expected_tables[qnum]
+    else:
+        expected = _expected_json[qnum]
+
+    if SLASHES in q_format:
+        q_format = q_format.replace(SLASHES, "")
+        expected = clean_slashes(expected)
+        actual = clean_slashes(actual)
+
+    if msg != PASS:
+        print(msg)
+    else:
+        msg = compare(expected, actual, q_format)
+        if msg != PASS:
+            msg = error_msg + msg
+        print(msg)
+
+
+def check_file_size(path):
+    """check_file_size(path) throws an error if the file is too big to display
+    on Gradescope."""
+    size = os.path.getsize(path)
+    assert size < MAX_FILE_SIZE * 10**3, "Your file is too big to be displayed by Gradescope; please delete unnecessary output cells so your file size is < %s KB" % MAX_FILE_SIZE
+
+
+def reset_hidden_tests():
+    """reset_hidden_tests() resets all hidden tests on the Gradescope autograder where the hidden test file exists"""
+    if not os.path.exists(HIDDEN_FILE):
+        return
+    hidn.reset_hidden_tests()
+
+def rubric_check(rubric_point, ignore_past_errors=True):
+    """rubric_check(rubric_point) uses the hidden test file on the Gradescope autograder to grade the `rubric_point`"""
+    if not os.path.exists(HIDDEN_FILE):
+        print(PASS)
+        return
+    error_msg_1 = "ERROR: "
+    error_msg_2 = "TEST DETAILS: "
+    try:
+        msg = hidn.rubric_check(rubric_point, ignore_past_errors)
+    except:
+        msg = "hidden tests crashed before execution"
+    if msg != PASS:
+        hidn.make_deductions(rubric_point)
+        if msg == "public tests failed":
+            comment = "The public tests have failed, so you will not receive any points for this question."
+            comment += "\nPlease confirm that the public tests pass locally before submitting."
+        elif msg == "answer is hardcoded":
+            comment = "In the datasets for testing hardcoding, all numbers are replaced with random values."
+            comment += "\nIf the answer is the same as in the original dataset for all these datasets"
+            comment += "\ndespite this, that implies that the answer in the notebook is hardcoded."
+            comment += "\nYou will not receive any points for this question."
+        else:
+            comment = hidn.get_comment(rubric_point)
+        msg = error_msg_1 + msg
+        if comment != "":
+            msg = msg + "\n" + error_msg_2 + comment
+    print(msg)
+
+def get_summary():
+    """get_summary() returns the summary of the notebook using the hidden test file on the Gradescope autograder"""
+    if not os.path.exists(HIDDEN_FILE):
+        print("Total Score: %d/%d" % (TOTAL_SCORE, TOTAL_SCORE))
+        return
+    score = min(TOTAL_SCORE, hidn.get_score(TOTAL_SCORE))
+    display_msg = "Total Score: %d/%d" % (score, TOTAL_SCORE)
+    if score != TOTAL_SCORE:
+        display_msg += "\n" + hidn.get_deduction_string()
+    print(display_msg)
+
+def get_score_digit(digit):
+    """get_score_digit(digit) returns the `digit` of the score using the hidden test file on the Gradescope autograder"""
+    if not os.path.exists(HIDDEN_FILE):
+        score = TOTAL_SCORE
+    else:
+        score = hidn.get_score(TOTAL_SCORE)
+    digits = bin(score)[2:]
+    digits = "0"*(7 - len(digits)) + digits
+    return int(digits[6 - digit])
diff --git a/p6/README.md b/p6/README.md
index ab42db5..7177177 100644
--- a/p6/README.md
+++ b/p6/README.md
@@ -17,7 +17,7 @@ You are **allowed** to work with a partner on your projects. While it is not req
 
 ## Instructions:
 
-This project will focus on **accessing data in csv file** and **string methods**. To start, download [`p6.ipynb`](https://git.doit.wisc.edu/cdis/cs/courses/cs220/cs220-f23-projectdesign/-/raw/main/p6/p6.ipynb), [`public_tests.py`](https://git.doit.wisc.edu/cdis/cs/courses/cs220/cs220-f23-projectdesign/-/raw/main/p6/public_tests.py) and [`power_generators.csv`](https://git.doit.wisc.edu/cdis/cs/courses/cs220/cs220-f23-projectdesign/-/raw/main/p6/power_generators.csv).
+This project will focus on **accessing data in csv file** and **string methods**. To start, download [`p6.ipynb`](https://git.doit.wisc.edu/cdis/cs/courses/cs220/cs220-f23-projects/-/tree/main/p6/p6.ipynb), [`public_tests.py`](https://git.doit.wisc.edu/cdis/cs/courses/cs220/cs220-f23-projects/-/tree/main/p6/public_tests.py) and [`power_generators.csv`](https://git.doit.wisc.edu/cdis/cs/courses/cs220/cs220-f23-projects/-/tree/main/p6/power_generators.csv).
 
 **Note:** Please go through [Lab-P6](https://git.doit.wisc.edu/cdis/cs/courses/cs220/cs220-f23-projects/-/tree/main/lab-p6) before you start the project. The lab contains some very important information that will be necessary for you to finish the project.
 
diff --git a/p6/p6.ipynb b/p6/p6.ipynb
index 7354a26..7bc3a1a 100644
--- a/p6/p6.ipynb
+++ b/p6/p6.ipynb
@@ -3,7 +3,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8da9b8bc",
+   "id": "6393eba3",
    "metadata": {
     "cell_type": "code",
     "deletable": false,
@@ -23,10 +23,10 @@
    "metadata": {
     "editable": false,
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:47.438834Z",
-     "iopub.status.busy": "2023-10-11T02:27:47.438834Z",
-     "iopub.status.idle": "2023-10-11T02:27:48.833718Z",
-     "shell.execute_reply": "2023-10-11T02:27:48.832693Z"
+     "iopub.execute_input": "2023-10-11T03:31:54.387438Z",
+     "iopub.status.busy": "2023-10-11T03:31:54.387438Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.094863Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.094863Z"
     }
    },
    "outputs": [],
@@ -40,10 +40,10 @@
    "id": "c2d3d239",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:48.838719Z",
-     "iopub.status.busy": "2023-10-11T02:27:48.837718Z",
-     "iopub.status.idle": "2023-10-11T02:27:48.843512Z",
-     "shell.execute_reply": "2023-10-11T02:27:48.842503Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.098874Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.098874Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.102183Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.102183Z"
     }
    },
    "outputs": [],
@@ -223,10 +223,10 @@
    "id": "cb349cfe",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:48.848521Z",
-     "iopub.status.busy": "2023-10-11T02:27:48.848521Z",
-     "iopub.status.idle": "2023-10-11T02:27:48.853596Z",
-     "shell.execute_reply": "2023-10-11T02:27:48.852585Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.107195Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.106197Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.110245Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.110245Z"
     },
     "tags": []
    },
@@ -259,10 +259,10 @@
    "id": "fcc96412",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:48.858595Z",
-     "iopub.status.busy": "2023-10-11T02:27:48.857615Z",
-     "iopub.status.idle": "2023-10-11T02:27:48.868258Z",
-     "shell.execute_reply": "2023-10-11T02:27:48.867246Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.114257Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.113253Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.122566Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.121556Z"
     },
     "tags": []
    },
@@ -272,7 +272,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "58b80213",
+   "id": "80fb90b1",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -301,10 +301,10 @@
    "id": "558e7e76",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:48.934460Z",
-     "iopub.status.busy": "2023-10-11T02:27:48.933458Z",
-     "iopub.status.idle": "2023-10-11T02:27:48.945678Z",
-     "shell.execute_reply": "2023-10-11T02:27:48.944668Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.167035Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.167035Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.175202Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.175202Z"
     },
     "tags": []
    },
@@ -316,7 +316,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "d537fb5d",
+   "id": "45b31970",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -343,10 +343,10 @@
    "id": "640e47c1",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.002883Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.001885Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.010638Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.009630Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.217057Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.216046Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.222719Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.222719Z"
     },
     "tags": []
    },
@@ -358,7 +358,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "5800b3c0",
+   "id": "54a53e37",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -387,10 +387,10 @@
    "id": "948071a4",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.055016Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.054015Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.064338Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.063329Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.257007Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.256008Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.262885Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.262885Z"
     },
     "tags": []
    },
@@ -402,7 +402,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "b57617f1",
+   "id": "b09aa6ca",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -431,10 +431,10 @@
    "id": "dcb08e62",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.106523Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.106523Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.113072Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.112064Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.298926Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.298926Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.303495Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.303495Z"
     },
     "tags": []
    },
@@ -456,7 +456,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "54f9b43d",
+   "id": "e09b023c",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -485,10 +485,10 @@
    "id": "c540e0c8",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.164805Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.164805Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.172798Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.171789Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.338136Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.338136Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.343527Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.343527Z"
     },
     "tags": []
    },
@@ -500,7 +500,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "0a781c1c",
+   "id": "46490509",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -533,10 +533,10 @@
    "id": "1f63eeb7",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.196177Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.196177Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.204674Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.203662Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.363832Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.363832Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.370655Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.370655Z"
     },
     "tags": []
    },
@@ -548,7 +548,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "815f8251",
+   "id": "f51f2fdd",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -579,10 +579,10 @@
    "id": "8f243866",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.244229Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.244229Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.253218Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.252210Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.405977Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.405977Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.412434Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.412434Z"
     },
     "tags": []
    },
@@ -594,7 +594,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c7bd0a09",
+   "id": "b385dfbf",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -623,10 +623,10 @@
    "id": "14e60189",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.294837Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.294837Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.303357Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.302349Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.447054Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.447054Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.453350Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.453350Z"
     },
     "tags": []
    },
@@ -638,7 +638,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "16793e9a",
+   "id": "b277a44f",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -669,10 +669,10 @@
    "id": "22bf0bd6",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.362779Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.362779Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.371703Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.371703Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.506916Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.506916Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.513981Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.513981Z"
     },
     "tags": []
    },
@@ -684,7 +684,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "311ca32a",
+   "id": "c1697c9a",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -713,10 +713,10 @@
    "id": "c15d3cff",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.431821Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.431821Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.437784Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.436774Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.561835Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.561835Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.565661Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.565661Z"
     },
     "tags": []
    },
@@ -734,7 +734,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "176f7127",
+   "id": "99a2c66d",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -763,10 +763,10 @@
    "id": "7b63cd92",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.471254Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.471254Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.478589Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.477579Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.592583Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.591582Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.597622Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.597622Z"
     },
     "tags": []
    },
@@ -778,7 +778,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "b4295606",
+   "id": "5e871581",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -807,10 +807,10 @@
    "id": "47a40343",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.501049Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.501049Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.508903Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.507894Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.617344Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.616345Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.626446Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.626446Z"
     },
     "tags": []
    },
@@ -822,7 +822,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "be57d52b",
+   "id": "c062fb7c",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -855,10 +855,10 @@
    "id": "005d5411",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.549342Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.549342Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.615539Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.614528Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.662445Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.662445Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.702945Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.702945Z"
     },
     "tags": []
    },
@@ -870,7 +870,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "e2779914",
+   "id": "7ce1a9f1",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -899,10 +899,10 @@
    "id": "c6802dc2",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.667401Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.666398Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.673783Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.672567Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.742713Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.742713Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.747672Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.747672Z"
     },
     "tags": []
    },
@@ -921,7 +921,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "e5488d98",
+   "id": "9887996d",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -952,10 +952,10 @@
    "id": "aee6c489",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.719054Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.719054Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.729853Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.728843Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.782686Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.782686Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.788923Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.788923Z"
     },
     "tags": []
    },
@@ -967,7 +967,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ff3ece04",
+   "id": "e954de09",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -998,10 +998,10 @@
    "id": "5f1b89a6",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.771496Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.769497Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.785802Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.784788Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.816357Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.816357Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.823320Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.823320Z"
     },
     "tags": []
    },
@@ -1013,7 +1013,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8159bf47",
+   "id": "bb9c14d7",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1046,10 +1046,10 @@
    "id": "4b85701d",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.850101Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.849103Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.865571Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.864561Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.861310Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.861310Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.869128Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.869128Z"
     },
     "tags": []
    },
@@ -1061,7 +1061,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "4e6aa753",
+   "id": "0a966dcd",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1090,10 +1090,10 @@
    "id": "3497c585",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.926577Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.925577Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.932074Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.932074Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.910156Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.910156Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.914376Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.914376Z"
     },
     "tags": []
    },
@@ -1110,7 +1110,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "343ea46f",
+   "id": "f46cdb59",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1141,10 +1141,10 @@
    "id": "2369bd91",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:49.967292Z",
-     "iopub.status.busy": "2023-10-11T02:27:49.967292Z",
-     "iopub.status.idle": "2023-10-11T02:27:49.977881Z",
-     "shell.execute_reply": "2023-10-11T02:27:49.976873Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.940269Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.939261Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.946410Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.946410Z"
     },
     "tags": []
    },
@@ -1156,7 +1156,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "2232d972",
+   "id": "820c5723",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1187,10 +1187,10 @@
    "id": "5e413275",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:50.032782Z",
-     "iopub.status.busy": "2023-10-11T02:27:50.032782Z",
-     "iopub.status.idle": "2023-10-11T02:27:50.040092Z",
-     "shell.execute_reply": "2023-10-11T02:27:50.039085Z"
+     "iopub.execute_input": "2023-10-11T03:32:07.988037Z",
+     "iopub.status.busy": "2023-10-11T03:32:07.988037Z",
+     "iopub.status.idle": "2023-10-11T03:32:07.992118Z",
+     "shell.execute_reply": "2023-10-11T03:32:07.992118Z"
     },
     "tags": []
    },
@@ -1210,7 +1210,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "acf7cc42",
+   "id": "6800edfc",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1241,10 +1241,10 @@
    "id": "b7c3401b",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:50.094056Z",
-     "iopub.status.busy": "2023-10-11T02:27:50.094056Z",
-     "iopub.status.idle": "2023-10-11T02:27:50.102246Z",
-     "shell.execute_reply": "2023-10-11T02:27:50.101232Z"
+     "iopub.execute_input": "2023-10-11T03:32:08.024448Z",
+     "iopub.status.busy": "2023-10-11T03:32:08.024448Z",
+     "iopub.status.idle": "2023-10-11T03:32:08.029784Z",
+     "shell.execute_reply": "2023-10-11T03:32:08.029784Z"
     },
     "tags": []
    },
@@ -1256,7 +1256,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c58a655b",
+   "id": "08c46c44",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1291,10 +1291,10 @@
    "id": "8d4b30df",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:50.127465Z",
-     "iopub.status.busy": "2023-10-11T02:27:50.127465Z",
-     "iopub.status.idle": "2023-10-11T02:27:50.207825Z",
-     "shell.execute_reply": "2023-10-11T02:27:50.206815Z"
+     "iopub.execute_input": "2023-10-11T03:32:08.049147Z",
+     "iopub.status.busy": "2023-10-11T03:32:08.049147Z",
+     "iopub.status.idle": "2023-10-11T03:32:08.109623Z",
+     "shell.execute_reply": "2023-10-11T03:32:08.108609Z"
     },
     "tags": []
    },
@@ -1306,7 +1306,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "b4efe698",
+   "id": "35eb860b",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1337,10 +1337,10 @@
    "id": "26778535",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:50.289565Z",
-     "iopub.status.busy": "2023-10-11T02:27:50.288567Z",
-     "iopub.status.idle": "2023-10-11T02:27:50.296554Z",
-     "shell.execute_reply": "2023-10-11T02:27:50.295542Z"
+     "iopub.execute_input": "2023-10-11T03:32:08.161762Z",
+     "iopub.status.busy": "2023-10-11T03:32:08.160764Z",
+     "iopub.status.idle": "2023-10-11T03:32:08.166116Z",
+     "shell.execute_reply": "2023-10-11T03:32:08.166116Z"
     },
     "tags": []
    },
@@ -1360,7 +1360,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "7a5d3206",
+   "id": "1f3d18e8",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1389,10 +1389,10 @@
    "id": "1327b28f",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:50.357674Z",
-     "iopub.status.busy": "2023-10-11T02:27:50.356674Z",
-     "iopub.status.idle": "2023-10-11T02:27:50.369511Z",
-     "shell.execute_reply": "2023-10-11T02:27:50.368494Z"
+     "iopub.execute_input": "2023-10-11T03:32:08.201823Z",
+     "iopub.status.busy": "2023-10-11T03:32:08.200823Z",
+     "iopub.status.idle": "2023-10-11T03:32:08.206812Z",
+     "shell.execute_reply": "2023-10-11T03:32:08.206812Z"
     },
     "tags": []
    },
@@ -1404,7 +1404,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "186f538d",
+   "id": "c2125509",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1435,10 +1435,10 @@
    "id": "cb4b3515",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:50.398993Z",
-     "iopub.status.busy": "2023-10-11T02:27:50.398993Z",
-     "iopub.status.idle": "2023-10-11T02:27:50.420956Z",
-     "shell.execute_reply": "2023-10-11T02:27:50.419946Z"
+     "iopub.execute_input": "2023-10-11T03:32:08.223823Z",
+     "iopub.status.busy": "2023-10-11T03:32:08.223823Z",
+     "iopub.status.idle": "2023-10-11T03:32:08.243704Z",
+     "shell.execute_reply": "2023-10-11T03:32:08.243704Z"
     },
     "tags": []
    },
@@ -1450,7 +1450,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "dbd1c5a7",
+   "id": "18752e8b",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1483,10 +1483,10 @@
    "id": "fda50bf0",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2023-10-11T02:27:50.487976Z",
-     "iopub.status.busy": "2023-10-11T02:27:50.487976Z",
-     "iopub.status.idle": "2023-10-11T02:27:50.503476Z",
-     "shell.execute_reply": "2023-10-11T02:27:50.502465Z"
+     "iopub.execute_input": "2023-10-11T03:32:08.297371Z",
+     "iopub.status.busy": "2023-10-11T03:32:08.297371Z",
+     "iopub.status.idle": "2023-10-11T03:32:08.309543Z",
+     "shell.execute_reply": "2023-10-11T03:32:08.309543Z"
     },
     "tags": []
    },
@@ -1498,7 +1498,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "2bb63bdf",
+   "id": "2fe35f4c",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1511,7 +1511,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "36501521",
+   "id": "2f024df6",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1524,7 +1524,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8646562e",
+   "id": "1890becd",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1536,7 +1536,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "54aebf55",
+   "id": "ea6be86e",
    "metadata": {
     "deletable": false,
     "editable": false
@@ -1559,7 +1559,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "50a954f7",
+   "id": "6946ae2e",
    "metadata": {
     "cell_type": "code",
     "deletable": false,
@@ -1575,7 +1575,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c27d5953",
+   "id": "ed901788",
    "metadata": {
     "cell_type": "code",
     "deletable": false,
@@ -1589,7 +1589,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "4c156ffd",
+   "id": "baa2367b",
    "metadata": {
     "cell_type": "code",
     "deletable": false,
@@ -1603,7 +1603,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "7ac48f2e",
+   "id": "11b99768",
    "metadata": {
     "deletable": false,
     "editable": false
-- 
GitLab