From 34a621de4379f4cb0d4041b862d055faf1ea8998 Mon Sep 17 00:00:00 2001 From: Drew Camron Date: Mon, 19 Apr 2021 17:07:31 -0600 Subject: [PATCH 01/17] Init datetime from python-training --- core/datetime/Times_and_Dates.ipynb | 631 ++++++++++++++++++++++++++++ 1 file changed, 631 insertions(+) create mode 100644 core/datetime/Times_and_Dates.ipynb diff --git a/core/datetime/Times_and_Dates.ipynb b/core/datetime/Times_and_Dates.ipynb new file mode 100644 index 000000000..d0cf08a35 --- /dev/null +++ b/core/datetime/Times_and_Dates.ipynb @@ -0,0 +1,631 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "# Times and Dates\n", + "Time is an essential component of nearly all geoscience data. Timescales span orders of magnitude from microseconds for lightning, hours for a supercell thunderstorm, days for a global weather model, millenia and beyond for the earth's climate. To properly analyze geoscience data, you must have a firm understanding of how to handle time in Python. In this notebook, we will examine the Python Standard Library for handling dates and times. We will also briefly make use of the [pytz](https://pypi.python.org/pypi/pytz) module to handle some thorny time zone issues in Python.\n", + "\n", + "## `Time` Versus `Datetime` Modules and Some Core Concepts\n", + "\n", + "Python comes with [time](https://docs.python.org/3/library/time.html) and [datetime](https://docs.python.org/3/library/datetime.html) modules. Unfortunately, Python can be initially disorienting because of the heavily overlapping terminology concerning dates and times:\n", + "\n", + "- `datetime` **module** has a `datetime` **class**\n", + "- `datetime` **module** has a `time` **class**\n", + "- `datetime` **module** has a `date` **class**\n", + "- `time` **module** has a `time` function which returns (almost always) [Unix time](#What-is-Unix-Time?)\n", + "- `datetime` **class** has a `date` method which returns a `date` object\n", + "- `datetime` **class** has a `time` method which returns a `time` object\n", + "\n", + "This confusion can be partially alleviated by aliasing our imported modules:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "import datetime as dt\n", + "# we can now reference the datetime module (alaised to 'dt') and datetime\n", + "# object unambiguously\n", + "pisecond = dt.datetime(2016, 3, 14, 15, 9, 26)\n", + "print(pisecond)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "import time as tm\n", + "now = tm.time()\n", + "print(now)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "### `time` module\n", + "The `time` module is well-suited for measuring [Unix time](#What-is-Unix-Time?). For example, when you are calculating how long it takes a Python function to run (so-called \"benchmarking\"), you can employ the `time()` function from the `time` module to obtain Unix time before and after the function completes and take the difference of those two times.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "import time as tm\n", + "start = tm.time()\n", + "tm.sleep(1) # The sleep function will stop the program for n seconds\n", + "end = tm.time()\n", + "diff = end - start\n", + "print(\"The benchmark took {} seconds\".format(diff))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "(For more accurate benchmarking, see the [timeit](https://docs.python.org/3/library/timeit.html) module.)\n", + "### `datetime` module\n", + "\n", + "The `datetime` module handles time with the Gregorian calendar (the calendar we are all familiar with) and is independent of Unix time. The `datetime` module has an [object-oriented](#The-Thirty-Second-Introduction-to-Object-Oriented-Programming) approach with the `date`, `time`, `datetime`, `timedelta`, and `tzinfo` classes.\n", + "\n", + "- `date` class represents the day, month and year\n", + "- `time` class represents the time of day\n", + "- `datetime` class is a combination of the `date` and `time` classes\n", + "- `timedelta` class represents a time duration\n", + "- `tzinfo` (abstract) class represents time zones\n", + "\n", + "The `datetime` module is effective for:\n", + "\n", + "- performing date and time arithmetic and calculating time duration\n", + "- reading and writing date and time strings in a particular format\n", + "- handling time zones (with the help of third-party libraries)\n", + "\n", + "The `time` and `datetime` modules overlap in functionality, but in your geoscientific work, you will probably be using the `datetime` module more than the `time` module.\n", + "\n", + "### What is Unix Time?\n", + "\n", + "Unix time is an example of system time which is the computer's notion of passing time. It is measured in seconds from the the start of the epoch which is January 1, 1970 00:00 [UTC](#What-is-UTC?). It is represented \"under the hood\" as a [floating point number](https://en.wikipedia.org/wiki/Floating_point) which is how computers represent real (ℝ) numbers .\n", + "\n", + "### The Thirty Second Introduction to Object-Oriented Programming\n", + "\n", + "We have been talking about object-oriented (OO) programming by mentioning terms like \"class\", \"object\", and \"method\", but never really explaining what they mean. A class is a collection of related variables, similar to a [struct](https://en.wikipedia.org/wiki/Struct_(C_programming_language)), in the C programming language or even a tuple in Python) coupled with functions, or \"methods\" in OO parlance, that can act on those variables. An object is a concrete example of a class.\n", + "\n", + "For example, if you have a `Coord` class that represents an earth location with latitude, and longitude, you may have a method that returns the distance between two locations, `distancekm()` in this example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "import math\n", + "class Coord:\n", + " \"\"\"Earth location identified by (latitude, longitude) coordinates.\n", + " distancekm -- distance between two points in kilometers\n", + " \"\"\"\n", + "\n", + " def __init__(self, latitude=0.0, longitude=0.0):\n", + " self.lat = latitude\n", + " self.lon = longitude\n", + "\n", + " def distancekm(self, p):\n", + " \"\"\"Distance between two points in kilometers.\"\"\"\n", + " DEGREES_TO_RADIANS = math.pi / 180.0\n", + " EARTH_RADIUS = 6373 # in KMs\n", + " phi1 = (90.0 - self.lat) * DEGREES_TO_RADIANS\n", + " phi2 = (90.0 - p.lat) * DEGREES_TO_RADIANS\n", + " theta1 = self.lon * DEGREES_TO_RADIANS\n", + " theta2 = p.lon * DEGREES_TO_RADIANS\n", + " cos = (math.sin(phi1) * math.sin(phi2) *\n", + " math.cos(theta1 - theta2) + math.cos(phi1) * math.cos(phi2))\n", + " arc = math.acos(cos)\n", + " return arc * EARTH_RADIUS" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "To create a concrete example of a **class**, also known as an **object**, initialize the object with data:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "timbuktu = Coord(16.77, 3.00)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "Here, `timbuktu` is an **object** of the **class** `Coord` initialized with a latitude of `16.77` and a longitude of `3.00`.\n", + "Next, we create two `Coord` objects: `ny` and `paris`. We will invoke the `distancekm()` method on the `ny` object and pass the `paris` object as an argument to determine the distance between New York and Paris in kilometers.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "ny = Coord(40.71, 74.01)\n", + "paris = Coord(48.86, 2.35)\n", + "distance = ny.distancekm(paris)\n", + "print(\"The distance from New York to Paris is {:.1f} kilometers.\".format(\n", + " distance))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "The old joke about OO programming is that they simply moved the struct that the function takes as an argument and put it first because it is special. So instead of having `distancekm(ny, paris)`, you have `ny.distancekm(paris)`. We have not talked about inheritance or polymorphism but that is OO in a nutshell.\n", + "## Reading and Writing Dates and Times\n", + "\n", + "### Parsing Lightning Data Timestamps with the `datetime.strptime` Method\n", + "\n", + "Suppose you want to analyze [US NLDN lightning data](https://ghrc.nsstc.nasa.gov/uso/ds_docs/vaiconus/vaiconus_dataset.html). Here is a sample row of data:\n", + "\n", + " 06/27/07 16:18:21.898 18.739 -88.184 0.0 kA 0 1.0 0.4 2.5 8 1.2 13 G\n", + "\n", + "Part of the task involves parsing the `06/27/07 16:18:21.898` time string into a `datetime` object. (The full description of the data are [described here](https://ghrc.nsstc.nasa.gov/uso/ds_docs/vaiconus/vaiconus_dataset.html#a6).) In order to parse this string or others that follow the same format, you will employ the [datetime.strptime()](https://docs.python.org/3/library/datetime.html#datetime.datetime.strptime) method from the `datetime` module. This method takes two arguments: the first is the date time string you wish to parse, the second is the format which describes exactly how the date and time are arranged. [The full range of format options is described in the Python documentation](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior). In reality, the format will take some degree of experimentation to get right. This is a situation where Python shines as you can quickly try out different solutions in the IPython interpreter. Beyond the official documentation, Google and [Stack Overflow](https://stackoverflow.com/) are your friends in this process. Eventually, after some trial and error, you will find the '%m/%d/%y %H:%M:%S.%f' format will properly parse the date and time." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "import datetime as dt\n", + "strike_time = dt.datetime.strptime('06/27/07 16:18:21.898',\n", + " '%m/%d/%y %H:%M:%S.%f')\n", + "# print strike_time to see if we have properly parsed our time\n", + "print(strike_time)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Retrieving METAR from the MesoWest API with Help from the `datetime.strftime` Method\n", + "Let's say you are interested in obtaining [METAR](https://en.wikipedia.org/wiki/METAR) data from the Aleutian Islands with the [MesoWest API](http://mesowest.org/api). In order to retrieve these data, you will have to assemble a URL that abides by the [MesoWest API reference](http://synopticlabs.org/api/mesonet/reference/), and specifically create [date time strings that the API understands](http://synopticlabs.org/api/mesonet/reference/) (e.g., `201606010000` for the year, month, date, hour and minute). For example, typing the following URL in a web browser will return a human-readable nested data structure called a [JSON object](https://en.wikipedia.org/wiki/JSON) which will contain the data along with additional \"metadata\" to help you interpret the data (e.g., units etc.). Here, we are asking for air temperature information from the METAR station at [Eareckson air force base](https://en.wikipedia.org/wiki/Eareckson_Air_Station) (ICAO identifier \"PASY\") in the Aleutians from June 1, 2016, 00:00 UTC to June 1, 2016, 06:00 UTC.\n", + "\n", + "[http://api.mesowest.net/v2/stations/timeseries?stid=pasy&start=201606010000&end=201606010600&vars=air_temp&token=demotoken](http://api.mesowest.net/v2/stations/timeseries?stid=pasy&start=201606010000&end=201606010600&vars=air_temp&token=demotoken)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " {\n", + " \"SUMMARY\": {\n", + " \"FUNCTION_USED\": \"time_data_parser\",\n", + " \"NUMBER_OF_OBJECTS\": 1,\n", + " \"TOTAL_DATA_TIME\": \"5.50103187561 ms\",\n", + " \"DATA_PARSING_TIME\": \"0.313997268677 ms\",\n", + " \"METADATA_RESPONSE_TIME\": \"97.2690582275 ms\",\n", + " \"RESPONSE_MESSAGE\": \"OK\",\n", + " \"RESPONSE_CODE\": 1,\n", + " \"DATA_QUERY_TIME\": \"5.18608093262 ms\"\n", + " },\n", + " \"STATION\": [\n", + " {\n", + " \"ID\": \"12638\",\n", + " \"TIMEZONE\": \"America/Adak\",\n", + " \"LATITUDE\": \"52.71667\",\n", + " \"OBSERVATIONS\": {\n", + " \"air_temp_set_1\": [\n", + " 8.3,\n", + " 8.0,\n", + " 8.3,\n", + " 8.0,\n", + " 7.8,\n", + " 7.8,\n", + " 7.0,\n", + " 7.2,\n", + " 7.2\n", + " ],\n", + " \"date_time\": [\n", + " \"2016-06-01T00:56:00Z\",\n", + " \"2016-06-01T01:26:00Z\",\n", + " \"2016-06-01T01:56:00Z\",\n", + " \"2016-06-01T02:40:00Z\",\n", + " \"2016-06-01T02:56:00Z\",\n", + " \"2016-06-01T03:56:00Z\",\n", + " \"2016-06-01T04:45:00Z\",\n", + " \"2016-06-01T04:56:00Z\",\n", + " \"2016-06-01T05:56:00Z\"\n", + " ]\n", + " },\n", + " \"STATE\": \"AK\",\n", + " \"LONGITUDE\": \"174.11667\",\n", + " \"SENSOR_VARIABLES\": {\n", + " \"air_temp\": {\n", + " \"air_temp_set_1\": {\n", + " \"end\": \"\",\n", + " \"start\": \"\"\n", + " }\n", + " },\n", + " \"date_time\": {\n", + " \"date_time\": {}\n", + " }\n", + " },\n", + " \"STID\": \"PASY\",\n", + " \"NAME\": \"Shemya, Eareckson AFB\",\n", + " \"ELEVATION\": \"98\",\n", + " \"PERIOD_OF_RECORD\": {\n", + " \"end\": \"\",\n", + " \"start\": \"\"\n", + " },\n", + " \"MNET_ID\": \"1\",\n", + " \"STATUS\": \"ACTIVE\"\n", + " }\n", + " ],\n", + " \"UNITS\": {\n", + " \"air_temp\": \"Celsius\"\n", + " }\n", + " }\n", + " // GET http://api.mesowest.net/v2/stations/timeseries?stid=pasy&start=201606010000&end=201606010600&vars=air_temp&token=demotoken\n", + " // HTTP/1.1 200 OK\n", + " // Content-Type: application/json\n", + " // Date: Mon, 27 Jun 2016 18:17:08 GMT\n", + " // Server: nginx/1.4.6 (Ubuntu)\n", + " // Vary: Accept-Encoding\n", + " // Content-Length: 944\n", + " // Connection: keep-alive\n", + " // Request duration: 0.271790s" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "Continuing with this example, let's create a function that takes a station identifier, start and end time, a meteorological field and returns the JSON object as a Python dictionary data structure. We will draw upon our knowledge from the [Basic Input and Output notebook](https://github.com/Unidata/online-python-training/blob/master/notebooks/Basic%20Input%20and%20Output.ipynb) to properly construct the URL. In addition, we will employ the [urllib.request](https://docs.python.org/3/library/urllib.request.html) module for opening and reading URLs.\n", + "\n", + "But first, we must figure out how to properly format our date with the [datetime.strftime()](https://docs.python.org/2/library/datetime.html#datetime.date.strftime) method. This method takes a format identical to the one we employed for `strptime()`. After some trial and error from the IPython interpreter, we arrive at '%Y%m%d%H%M':" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "import datetime as dt\n", + "print(dt.datetime(2016, 6, 1, 0, 0).strftime('%Y%m%d%H%M'))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "Armed with this knowledge of how to format the date and time according to the MesoWest API reference, we can write our `metar()` function:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "import urllib.request\n", + "import json # json module to help us with the HTTP response\n", + "def metar(icao, starttime, endtime, var):\n", + " \"\"\"\n", + " Retrieves METAR with the icao identifier, the starttime and endtime\n", + " datetime objects and the var atmospheric field (e.g., \"air_temp\".)\n", + " Returns a dictionary data structure that mirros the JSON object from\n", + " returned from the MesoWest API.\n", + " \"\"\"\n", + " fmt = '%Y%m%d%H%M'\n", + " st = starttime.strftime(fmt)\n", + " et = endtime.strftime(fmt)\n", + " url = \"http://api.mesowest.net/v2/stations/timeseries?\"\\\n", + " \"stid={}&start={}&end={}&vars={}&token=demotoken\"\n", + " reply = urllib.request.urlopen(url.format(icao, st, et, var))\n", + " return json.loads(reply.read().decode('utf8'))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "We can now try out our new `metar` function to fetch some air temperature data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "import datetime as dt\n", + "pasy = metar(\"pasy\", dt.datetime(2016, 6, 1, 0, 0),\n", + " dt.datetime(2016, 6, 1, 6, 0), \"air_temp\")\n", + "print(pasy)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "The data are returned in a nested data structure composed of dictionaries and lists. We can pull that data structure apart to fetch our data. Also, observe that the times are returned in UTC according to the [ISO 8601 international time standard](https://en.wikipedia.org/wiki/ISO_8601)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "print(pasy['STATION'][0]['OBSERVATIONS'])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "We could continue with this exercise by parsing the returned date time strings in to `datetime` objects, but we will leave that exercise to the reader.\n", + "## Calculating Coastal Tides with the `timedelta` Class\n", + "\n", + "Let's suppose we are looking at coastal tide and current data perhaps in a [tropical cyclone storm surge scenario](http://www.nhc.noaa.gov/surge/). The [lunar day](http://oceanservice.noaa.gov/education/kits/tides/media/supp_tide05.html) is 24 hours, 50 minutes with two low tides and two high tides in that time duration. If we know the time of the current high tide, we can easily calculate the occurrence of the next low and high tides with the `timedelta` class. (In reality, the *exact time* of tides is influenced by local coastal effects, in addition to the laws of celestial mechanics, but we will ignore that fact for this exercise.)\n", + "\n", + "The `timedelta` class is initialized by supplying time duration usually supplied with [keyword arguments](https://docs.python.org/3/glossary.html#term-argument) to clearly express the length of time. Significantly, you can use the `timedelta` class with arithmetic operators (i.e., `+`, `-`, `*`, `/`) to obtain new dates and times as the next code sample illustrates. This convenient language feature is known as [operator overloading](https://en.wikipedia.org/wiki/Operator_overloading) and again illustrates Python's batteries-included philosophy of making life easier for the programmer. (In another language such as Java, you would have to call a method significantly obfuscating the code.) Another great feature is that the difference of two times will yield a `datetime` object. Let's examine all these features in the following code block." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "import datetime as dt\n", + "high_tide = dt.datetime(2016, 6, 1, 4, 38, 0)\n", + "lunar_day = dt.timedelta(hours=24, minutes=50)\n", + "tide_duration = lunar_day / 4\n", + "next_low_tide = high_tide + tide_duration\n", + "next_high_tide = high_tide + (2 * tide_duration)\n", + "tide_length = next_high_tide - high_tide\n", + "print(\"The time between high and low tide is {}.\".format(tide_duration))\n", + "print(\"The current high tide is {}.\".format(high_tide))\n", + "print(\"The next low tide is {}.\".format(next_low_tide))\n", + "print(\"The next high tide {}.\".format(next_high_tide))\n", + "print(\"The tide length is {}.\".format(tide_length))\n", + "print(\"The type of the 'tide_length' variable is {}.\".format(type(\n", + " tide_length)))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "In the last `print` statement, we use the [type()](https://docs.python.org/3/library/functions.html#type) built-in Python function to simply illustrate the difference between two times yields a `timedelta` object.\n", + "## Dealing with Time Zones\n", + "\n", + "Time zones can be a source of confusion and frustration in geoscientific data and in computer programming in general. Core date and time libraries in various programming languages inevitably have design flaws (Python is no different) leading to third-party libraries that attempt to fix the core library limitations. To avoid these issues, it is best to handle data in UTC, or at the very least operate in a consistent time zone, but that is not always possible. Users will expect their tornado alerts in local time.\n", + "\n", + "### What is UTC?\n", + "\n", + "[UTC](https://en.wikipedia.org/wiki/Coordinated_Universal_Time) is an abbreviation of Coordinated Universal Time and is equivalent to Greenwich Mean Time (GMT), in practice. (Greenwich at 0 degrees longitude, is a district of London, England.) In geoscientific data, times are often in UTC though you should always verify this assumption is actually true!\n", + "\n", + "### Time Zone Naive Versus Time Zone Aware `datetime` Objects\n", + "\n", + "When you create `datetime` objects in Python, they are so-called \"naive\" which means they are time zone unaware. In many situations, you can happily go forward without this detail getting in the way of your work. As the [Python documentation states](https://docs.python.org/3/library/datetime.html): \"Naive objects are easy to understand and to work with, at the cost of ignoring some aspects of reality\". However, if you wish to convey time zone information, you will have to make your `datetime` objects time zone aware. In order to handle time zones in Python, you will need the third-party [pytz](https://pypi.python.org/pypi/pytz) module whose classes build upon, or \"inherit\" in OO terminology, from the `tzinfo` class. You cannot solely rely on the Python Standard Library unfortunately. Here, we create time zone naive and time zone aware `datetime` objects:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "import datetime as dt\n", + "import pytz\n", + "naive = dt.datetime.now()\n", + "aware = dt.datetime.now(pytz.timezone('US/Mountain'))\n", + "print(\"I am time zone naive {}.\".format(naive))\n", + "print(\"I am time zone aware {}.\".format(aware))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "The `pytz.timezone()` method takes a time zone string and returns a `tzinfo` object which can be used to initialize the time zone. The `-06:00` denotes we are operating in a time zone six hours behind UTC.\n", + "\n", + "### Print Time with a Different Time Zone\n", + "\n", + "If you have data that are in UTC, and wish to convert them to another time zone, Mountain Time Zone for example, you will again make use of the `pytz` module. First, we will create a UTC time with the [utcnow()](https://docs.python.org/3/library/datetime.html#datetime.datetime.utcnow) method which inexplicably returns a time zone naive object so you must still specify the UTC time zone with the [replace()](https://docs.python.org/3/library/datetime.html#datetime.datetime.replace) method. We then create a \"US/Mountain\" `tzinfo` object as before, but this time we will use the [astimzone()](https://docs.python.org/3/library/datetime.html#datetime.datetime.astimezone) method to adjust the time to the specified time zone." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "autoscroll": "json-false", + "ein.tags": [ + "worksheet-0" + ] + }, + "outputs": [], + "source": [ + "import datetime as dt\n", + "import pytz\n", + "utc = dt.datetime.utcnow().replace(tzinfo=pytz.utc)\n", + "print(\"The UTC time is {}.\".format(utc.strftime('%B %d, %Y, %-I:%M%p')))\n", + "mountaintz = pytz.timezone(\"US/Mountain\")\n", + "ny = utc.astimezone(mountaintz)\n", + "print(\"The 'US/Mountain' time is {}.\".format(ny.strftime(\n", + " '%B %d, %Y, %-I:%M%p')))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ein.tags": [ + "worksheet-0" + ] + }, + "source": [ + "We also draw upon our earlier knowledge of the `strftime()` method to format a human-friendly date and time string." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + }, + "name": "Times and Dates.ipynb", + "widgets": { + "state": {}, + "version": "1.1.1" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From a25c5f76f634add0aa01123f4f17b3aaabff120f Mon Sep 17 00:00:00 2001 From: Drew Camron Date: Mon, 19 Apr 2021 17:19:00 -0600 Subject: [PATCH 02/17] Rename notebook --- core/datetime/{Times_and_Dates.ipynb => datetime.ipynb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core/datetime/{Times_and_Dates.ipynb => datetime.ipynb} (100%) diff --git a/core/datetime/Times_and_Dates.ipynb b/core/datetime/datetime.ipynb similarity index 100% rename from core/datetime/Times_and_Dates.ipynb rename to core/datetime/datetime.ipynb From 1b6f07c1e7a0d4fd0d35ba8d52d33dfa1101a8a0 Mon Sep 17 00:00:00 2001 From: Drew Camron Date: Mon, 19 Apr 2021 17:19:14 -0600 Subject: [PATCH 03/17] Update TOC with datetime notebook --- _toc.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_toc.yml b/_toc.yml index 8385aec8e..7ba8fb03f 100644 --- a/_toc.yml +++ b/_toc.yml @@ -37,6 +37,8 @@ - file: core/matplotlib - file: core/cartopy - file: core/datetime + section: + - file: core/datetime/datetime - file: core/pandas - file: core/data-formats - file: core/xarray From 57300d702c0d486e30405fa77c1b5c6c62af6189 Mon Sep 17 00:00:00 2001 From: Drew Camron Date: Mon, 19 Apr 2021 17:21:40 -0600 Subject: [PATCH 04/17] Allow pre-commit nbqa.mutate for isort --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index b05d384bc..d28feaaf1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,6 +10,7 @@ black = "pyproject.toml" [tool.nbqa.mutate] black = 1 pyupgrade = 1 +isort = 1 [tool.nbqa.addopts] pyupgrade = ["--py36-plus"] From 9279454a7a0a0b59fbb503bfd9d824d79ddfad29 Mon Sep 17 00:00:00 2001 From: Drew Camron Date: Mon, 19 Apr 2021 17:23:04 -0600 Subject: [PATCH 05/17] Full lint for pre-commit happiness --- core/datetime/datetime.ipynb | 59 ++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/core/datetime/datetime.ipynb b/core/datetime/datetime.ipynb index d0cf08a35..ba078a944 100644 --- a/core/datetime/datetime.ipynb +++ b/core/datetime/datetime.ipynb @@ -37,6 +37,7 @@ "outputs": [], "source": [ "import datetime as dt\n", + "\n", "# we can now reference the datetime module (alaised to 'dt') and datetime\n", "# object unambiguously\n", "pisecond = dt.datetime(2016, 3, 14, 15, 9, 26)\n", @@ -55,6 +56,7 @@ "outputs": [], "source": [ "import time as tm\n", + "\n", "now = tm.time()\n", "print(now)" ] @@ -83,11 +85,12 @@ "outputs": [], "source": [ "import time as tm\n", + "\n", "start = tm.time()\n", "tm.sleep(1) # The sleep function will stop the program for n seconds\n", "end = tm.time()\n", "diff = end - start\n", - "print(\"The benchmark took {} seconds\".format(diff))" + "print(f\"The benchmark took {diff} seconds\")" ] }, { @@ -140,6 +143,8 @@ "outputs": [], "source": [ "import math\n", + "\n", + "\n", "class Coord:\n", " \"\"\"Earth location identified by (latitude, longitude) coordinates.\n", " distancekm -- distance between two points in kilometers\n", @@ -157,8 +162,9 @@ " phi2 = (90.0 - p.lat) * DEGREES_TO_RADIANS\n", " theta1 = self.lon * DEGREES_TO_RADIANS\n", " theta2 = p.lon * DEGREES_TO_RADIANS\n", - " cos = (math.sin(phi1) * math.sin(phi2) *\n", - " math.cos(theta1 - theta2) + math.cos(phi1) * math.cos(phi2))\n", + " cos = math.sin(phi1) * math.sin(phi2) * math.cos(theta1 - theta2) + math.cos(\n", + " phi1\n", + " ) * math.cos(phi2)\n", " arc = math.acos(cos)\n", " return arc * EARTH_RADIUS" ] @@ -214,8 +220,7 @@ "ny = Coord(40.71, 74.01)\n", "paris = Coord(48.86, 2.35)\n", "distance = ny.distancekm(paris)\n", - "print(\"The distance from New York to Paris is {:.1f} kilometers.\".format(\n", - " distance))" + "print(f\"The distance from New York to Paris is {distance:.1f} kilometers.\")" ] }, { @@ -250,8 +255,8 @@ "outputs": [], "source": [ "import datetime as dt\n", - "strike_time = dt.datetime.strptime('06/27/07 16:18:21.898',\n", - " '%m/%d/%y %H:%M:%S.%f')\n", + "\n", + "strike_time = dt.datetime.strptime('06/27/07 16:18:21.898', '%m/%d/%y %H:%M:%S.%f')\n", "# print strike_time to see if we have properly parsed our time\n", "print(strike_time)" ] @@ -374,6 +379,7 @@ "outputs": [], "source": [ "import datetime as dt\n", + "\n", "print(dt.datetime(2016, 6, 1, 0, 0).strftime('%Y%m%d%H%M'))" ] }, @@ -399,8 +405,10 @@ }, "outputs": [], "source": [ - "import urllib.request\n", "import json # json module to help us with the HTTP response\n", + "import urllib.request\n", + "\n", + "\n", "def metar(icao, starttime, endtime, var):\n", " \"\"\"\n", " Retrieves METAR with the icao identifier, the starttime and endtime\n", @@ -411,8 +419,10 @@ " fmt = '%Y%m%d%H%M'\n", " st = starttime.strftime(fmt)\n", " et = endtime.strftime(fmt)\n", - " url = \"http://api.mesowest.net/v2/stations/timeseries?\"\\\n", + " url = (\n", + " \"http://api.mesowest.net/v2/stations/timeseries?\"\n", " \"stid={}&start={}&end={}&vars={}&token=demotoken\"\n", + " )\n", " reply = urllib.request.urlopen(url.format(icao, st, et, var))\n", " return json.loads(reply.read().decode('utf8'))" ] @@ -440,8 +450,10 @@ "outputs": [], "source": [ "import datetime as dt\n", - "pasy = metar(\"pasy\", dt.datetime(2016, 6, 1, 0, 0),\n", - " dt.datetime(2016, 6, 1, 6, 0), \"air_temp\")\n", + "\n", + "pasy = metar(\n", + " \"pasy\", dt.datetime(2016, 6, 1, 0, 0), dt.datetime(2016, 6, 1, 6, 0), \"air_temp\"\n", + ")\n", "print(pasy)" ] }, @@ -498,19 +510,19 @@ "outputs": [], "source": [ "import datetime as dt\n", + "\n", "high_tide = dt.datetime(2016, 6, 1, 4, 38, 0)\n", "lunar_day = dt.timedelta(hours=24, minutes=50)\n", "tide_duration = lunar_day / 4\n", "next_low_tide = high_tide + tide_duration\n", "next_high_tide = high_tide + (2 * tide_duration)\n", "tide_length = next_high_tide - high_tide\n", - "print(\"The time between high and low tide is {}.\".format(tide_duration))\n", - "print(\"The current high tide is {}.\".format(high_tide))\n", - "print(\"The next low tide is {}.\".format(next_low_tide))\n", - "print(\"The next high tide {}.\".format(next_high_tide))\n", - "print(\"The tide length is {}.\".format(tide_length))\n", - "print(\"The type of the 'tide_length' variable is {}.\".format(type(\n", - " tide_length)))\n" + "print(f\"The time between high and low tide is {tide_duration}.\")\n", + "print(f\"The current high tide is {high_tide}.\")\n", + "print(f\"The next low tide is {next_low_tide}.\")\n", + "print(f\"The next high tide {next_high_tide}.\")\n", + "print(f\"The tide length is {tide_length}.\")\n", + "print(\"The type of the 'tide_length' variable is {}.\".format(type(tide_length)))" ] }, { @@ -547,11 +559,13 @@ "outputs": [], "source": [ "import datetime as dt\n", + "\n", "import pytz\n", + "\n", "naive = dt.datetime.now()\n", "aware = dt.datetime.now(pytz.timezone('US/Mountain'))\n", - "print(\"I am time zone naive {}.\".format(naive))\n", - "print(\"I am time zone aware {}.\".format(aware))" + "print(f\"I am time zone naive {naive}.\")\n", + "print(f\"I am time zone aware {aware}.\")" ] }, { @@ -581,13 +595,14 @@ "outputs": [], "source": [ "import datetime as dt\n", + "\n", "import pytz\n", + "\n", "utc = dt.datetime.utcnow().replace(tzinfo=pytz.utc)\n", "print(\"The UTC time is {}.\".format(utc.strftime('%B %d, %Y, %-I:%M%p')))\n", "mountaintz = pytz.timezone(\"US/Mountain\")\n", "ny = utc.astimezone(mountaintz)\n", - "print(\"The 'US/Mountain' time is {}.\".format(ny.strftime(\n", - " '%B %d, %Y, %-I:%M%p')))" + "print(\"The 'US/Mountain' time is {}.\".format(ny.strftime('%B %d, %Y, %-I:%M%p')))" ] }, { From 02ac39054a93a48ec148a6d22e527205d1e7d2e7 Mon Sep 17 00:00:00 2001 From: Drew Camron Date: Tue, 20 Apr 2021 13:39:53 -0600 Subject: [PATCH 06/17] Add the cursed s --- _toc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_toc.yml b/_toc.yml index 7ba8fb03f..77f72cf31 100644 --- a/_toc.yml +++ b/_toc.yml @@ -37,7 +37,7 @@ - file: core/matplotlib - file: core/cartopy - file: core/datetime - section: + sections: - file: core/datetime/datetime - file: core/pandas - file: core/data-formats From bf9c69fb06eb05ed024a6e93490ec03f631ee684 Mon Sep 17 00:00:00 2001 From: Drew Camron Date: Tue, 20 Apr 2021 13:47:23 -0600 Subject: [PATCH 07/17] Change some formatting on the road to build --- core/datetime/datetime.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/datetime/datetime.ipynb b/core/datetime/datetime.ipynb index ba078a944..c30dec429 100644 --- a/core/datetime/datetime.ipynb +++ b/core/datetime/datetime.ipynb @@ -240,7 +240,7 @@ "\n", " 06/27/07 16:18:21.898 18.739 -88.184 0.0 kA 0 1.0 0.4 2.5 8 1.2 13 G\n", "\n", - "Part of the task involves parsing the `06/27/07 16:18:21.898` time string into a `datetime` object. (The full description of the data are [described here](https://ghrc.nsstc.nasa.gov/uso/ds_docs/vaiconus/vaiconus_dataset.html#a6).) In order to parse this string or others that follow the same format, you will employ the [datetime.strptime()](https://docs.python.org/3/library/datetime.html#datetime.datetime.strptime) method from the `datetime` module. This method takes two arguments: the first is the date time string you wish to parse, the second is the format which describes exactly how the date and time are arranged. [The full range of format options is described in the Python documentation](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior). In reality, the format will take some degree of experimentation to get right. This is a situation where Python shines as you can quickly try out different solutions in the IPython interpreter. Beyond the official documentation, Google and [Stack Overflow](https://stackoverflow.com/) are your friends in this process. Eventually, after some trial and error, you will find the '%m/%d/%y %H:%M:%S.%f' format will properly parse the date and time." + "Part of the task involves parsing the `06/27/07 16:18:21.898` time string into a `datetime` object. (The full description of the data are [described here](https://ghrc.nsstc.nasa.gov/uso/ds_docs/vaiconus/vaiconus_dataset.html#a6).) In order to parse this string or others that follow the same format, you will employ the [datetime.strptime()](https://docs.python.org/3/library/datetime.html#datetime.datetime.strptime) method from the `datetime` module. This method takes two arguments: the first is the date time string you wish to parse, the second is the format which describes exactly how the date and time are arranged. [The full range of format options is described in the Python documentation](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior). In reality, the format will take some degree of experimentation to get right. This is a situation where Python shines as you can quickly try out different solutions in the IPython interpreter. Beyond the official documentation, Google and [Stack Overflow](https://stackoverflow.com/) are your friends in this process. Eventually, after some trial and error, you will find the `'%m/%d/%y %H:%M:%S.%f'`format will properly parse the date and time." ] }, { @@ -364,7 +364,7 @@ "source": [ "Continuing with this example, let's create a function that takes a station identifier, start and end time, a meteorological field and returns the JSON object as a Python dictionary data structure. We will draw upon our knowledge from the [Basic Input and Output notebook](https://github.com/Unidata/online-python-training/blob/master/notebooks/Basic%20Input%20and%20Output.ipynb) to properly construct the URL. In addition, we will employ the [urllib.request](https://docs.python.org/3/library/urllib.request.html) module for opening and reading URLs.\n", "\n", - "But first, we must figure out how to properly format our date with the [datetime.strftime()](https://docs.python.org/2/library/datetime.html#datetime.date.strftime) method. This method takes a format identical to the one we employed for `strptime()`. After some trial and error from the IPython interpreter, we arrive at '%Y%m%d%H%M':" + "But first, we must figure out how to properly format our date with the [datetime.strftime()](https://docs.python.org/2/library/datetime.html#datetime.date.strftime) method. This method takes a format identical to the one we employed for `strptime()`. After some trial and error from the IPython interpreter, we arrive at `'%Y%m%d%H%M'`:" ] }, { From 276c1d98e2dc43a74490b981eb99e6e93abbc20e Mon Sep 17 00:00:00 2001 From: Drew Camron Date: Tue, 20 Apr 2021 13:48:47 -0600 Subject: [PATCH 08/17] Strip metadata to fix jupyter-book build issue --- core/datetime/datetime.ipynb | 187 ++++++----------------------------- 1 file changed, 28 insertions(+), 159 deletions(-) diff --git a/core/datetime/datetime.ipynb b/core/datetime/datetime.ipynb index c30dec429..8aee9f9ae 100644 --- a/core/datetime/datetime.ipynb +++ b/core/datetime/datetime.ipynb @@ -2,11 +2,7 @@ "cells": [ { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "# Times and Dates\n", "Time is an essential component of nearly all geoscience data. Timescales span orders of magnitude from microseconds for lightning, hours for a supercell thunderstorm, days for a global weather model, millenia and beyond for the earth's climate. To properly analyze geoscience data, you must have a firm understanding of how to handle time in Python. In this notebook, we will examine the Python Standard Library for handling dates and times. We will also briefly make use of the [pytz](https://pypi.python.org/pypi/pytz) module to handle some thorny time zone issues in Python.\n", @@ -28,12 +24,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "import datetime as dt\n", @@ -47,12 +38,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "import time as tm\n", @@ -63,11 +49,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "### `time` module\n", "The `time` module is well-suited for measuring [Unix time](#What-is-Unix-Time?). For example, when you are calculating how long it takes a Python function to run (so-called \"benchmarking\"), you can employ the `time()` function from the `time` module to obtain Unix time before and after the function completes and take the difference of those two times.\n" @@ -76,12 +58,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "import time as tm\n", @@ -95,11 +72,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "(For more accurate benchmarking, see the [timeit](https://docs.python.org/3/library/timeit.html) module.)\n", "### `datetime` module\n", @@ -134,12 +107,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "import math\n", @@ -171,11 +139,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "To create a concrete example of a **class**, also known as an **object**, initialize the object with data:" ] @@ -183,12 +147,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "timbuktu = Coord(16.77, 3.00)" @@ -196,11 +155,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "Here, `timbuktu` is an **object** of the **class** `Coord` initialized with a latitude of `16.77` and a longitude of `3.00`.\n", "Next, we create two `Coord` objects: `ny` and `paris`. We will invoke the `distancekm()` method on the `ny` object and pass the `paris` object as an argument to determine the distance between New York and Paris in kilometers.\n" @@ -209,12 +164,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "ny = Coord(40.71, 74.01)\n", @@ -225,11 +175,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "The old joke about OO programming is that they simply moved the struct that the function takes as an argument and put it first because it is special. So instead of having `distancekm(ny, paris)`, you have `ny.distancekm(paris)`. We have not talked about inheritance or polymorphism but that is OO in a nutshell.\n", "## Reading and Writing Dates and Times\n", @@ -246,12 +192,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "import datetime as dt\n", @@ -356,11 +297,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "Continuing with this example, let's create a function that takes a station identifier, start and end time, a meteorological field and returns the JSON object as a Python dictionary data structure. We will draw upon our knowledge from the [Basic Input and Output notebook](https://github.com/Unidata/online-python-training/blob/master/notebooks/Basic%20Input%20and%20Output.ipynb) to properly construct the URL. In addition, we will employ the [urllib.request](https://docs.python.org/3/library/urllib.request.html) module for opening and reading URLs.\n", "\n", @@ -370,12 +307,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "import datetime as dt\n", @@ -385,11 +317,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "Armed with this knowledge of how to format the date and time according to the MesoWest API reference, we can write our `metar()` function:" ] @@ -397,12 +325,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "import json # json module to help us with the HTTP response\n", @@ -429,11 +352,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "We can now try out our new `metar` function to fetch some air temperature data." ] @@ -441,12 +360,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "import datetime as dt\n", @@ -459,11 +373,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "The data are returned in a nested data structure composed of dictionaries and lists. We can pull that data structure apart to fetch our data. Also, observe that the times are returned in UTC according to the [ISO 8601 international time standard](https://en.wikipedia.org/wiki/ISO_8601)." ] @@ -471,12 +381,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "print(pasy['STATION'][0]['OBSERVATIONS'])" @@ -484,11 +389,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "We could continue with this exercise by parsing the returned date time strings in to `datetime` objects, but we will leave that exercise to the reader.\n", "## Calculating Coastal Tides with the `timedelta` Class\n", @@ -501,12 +402,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "import datetime as dt\n", @@ -527,11 +423,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "In the last `print` statement, we use the [type()](https://docs.python.org/3/library/functions.html#type) built-in Python function to simply illustrate the difference between two times yields a `timedelta` object.\n", "## Dealing with Time Zones\n", @@ -550,12 +442,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "import datetime as dt\n", @@ -570,11 +457,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "The `pytz.timezone()` method takes a time zone string and returns a `tzinfo` object which can be used to initialize the time zone. The `-06:00` denotes we are operating in a time zone six hours behind UTC.\n", "\n", @@ -586,12 +469,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "autoscroll": "json-false", - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "outputs": [], "source": [ "import datetime as dt\n", @@ -607,11 +485,7 @@ }, { "cell_type": "markdown", - "metadata": { - "ein.tags": [ - "worksheet-0" - ] - }, + "metadata": {}, "source": [ "We also draw upon our earlier knowledge of the `strftime()` method to format a human-friendly date and time string." ] @@ -634,11 +508,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" - }, - "name": "Times and Dates.ipynb", - "widgets": { - "state": {}, - "version": "1.1.1" } }, "nbformat": 4, From 44088ff6531e66f50eac5db6939effdb00e2cb38 Mon Sep 17 00:00:00 2001 From: Brian Rose Date: Wed, 9 Jun 2021 14:31:03 -0400 Subject: [PATCH 09/17] Adapt datetime notebook to template --- core/datetime/datetime.ipynb | 308 +++++++++++++++++++++++++++-------- 1 file changed, 239 insertions(+), 69 deletions(-) diff --git a/core/datetime/datetime.ipynb b/core/datetime/datetime.ipynb index 8aee9f9ae..dd2730462 100644 --- a/core/datetime/datetime.ipynb +++ b/core/datetime/datetime.ipynb @@ -4,10 +4,85 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Times and Dates\n", - "Time is an essential component of nearly all geoscience data. Timescales span orders of magnitude from microseconds for lightning, hours for a supercell thunderstorm, days for a global weather model, millenia and beyond for the earth's climate. To properly analyze geoscience data, you must have a firm understanding of how to handle time in Python. In this notebook, we will examine the Python Standard Library for handling dates and times. We will also briefly make use of the [pytz](https://pypi.python.org/pypi/pytz) module to handle some thorny time zone issues in Python.\n", + "# Times and dates in Python" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "Time is an essential component of nearly all geoscience data. Timescales span orders of magnitude from microseconds for lightning, hours for a supercell thunderstorm, days for a global weather model, millenia and beyond for the earth's climate. To properly analyze geoscience data, you must have a firm understanding of how to handle time in Python. \n", + "\n", + "In this notebook, we will:\n", + "\n", + "1. Introduce the [time](https://docs.python.org/3/library/time.html) and [datetime](https://docs.python.org/3/library/datetime.html) modules from the Python Standard Library\n", + "1. Take a brief aside into Object-Oriented programming and Python classes\n", + "1. Look at formatted input and output of dates and times\n", + "1. See how we can do simple arithmetic on date/time data, making use of the `timedelta` object\n", + "1. Briefly make use of the [pytz](https://pypi.python.org/pypi/pytz) module to handle some thorny time zone issues in Python." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "Label the importance of each concept explicitly as **helpful/necessary**.\n", + "\n", + "| Concepts | Importance | Notes |\n", + "| --- | --- | --- |\n", + "| Basic Python string formatting | Helpful | |\n", + "\n", + "- **Experience level**: **beginner**\n", + "- **Time to learn**: **medium**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import datetime as dt\n", + "import json\n", + "import math\n", + "import time as tm\n", + "import urllib.request\n", "\n", - "## `Time` Versus `Datetime` Modules and Some Core Concepts\n", + "import pytz" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `Time` Versus `Datetime` modules \n", + "\n", + "### Some core terminology\n", "\n", "Python comes with [time](https://docs.python.org/3/library/time.html) and [datetime](https://docs.python.org/3/library/datetime.html) modules. Unfortunately, Python can be initially disorienting because of the heavily overlapping terminology concerning dates and times:\n", "\n", @@ -18,7 +93,14 @@ "- `datetime` **class** has a `date` method which returns a `date` object\n", "- `datetime` **class** has a `time` method which returns a `time` object\n", "\n", - "This confusion can be partially alleviated by aliasing our imported modules:" + "This confusion can be partially alleviated by aliasing our imported modules, we did above:\n", + "\n", + "```\n", + "import datetime as dt\n", + "import time as tm\n", + "```\n", + "\n", + "We can now reference the `datetime` module (alaised to `dt`) and `datetime` object unambiguously" ] }, { @@ -27,10 +109,6 @@ "metadata": {}, "outputs": [], "source": [ - "import datetime as dt\n", - "\n", - "# we can now reference the datetime module (alaised to 'dt') and datetime\n", - "# object unambiguously\n", "pisecond = dt.datetime(2016, 3, 14, 15, 9, 26)\n", "print(pisecond)" ] @@ -41,8 +119,6 @@ "metadata": {}, "outputs": [], "source": [ - "import time as tm\n", - "\n", "now = tm.time()\n", "print(now)" ] @@ -52,7 +128,8 @@ "metadata": {}, "source": [ "### `time` module\n", - "The `time` module is well-suited for measuring [Unix time](#What-is-Unix-Time?). For example, when you are calculating how long it takes a Python function to run (so-called \"benchmarking\"), you can employ the `time()` function from the `time` module to obtain Unix time before and after the function completes and take the difference of those two times.\n" + "\n", + "The `time` module is well-suited for measuring [Unix time](#What-is-Unix-Time?). For example, when you are calculating how long it takes a Python function to run (so-called \"benchmarking\"), you can employ the `time()` function from the `time` module to obtain Unix time before and after the function completes and take the difference of those two times." ] }, { @@ -61,8 +138,6 @@ "metadata": {}, "outputs": [], "source": [ - "import time as tm\n", - "\n", "start = tm.time()\n", "tm.sleep(1) # The sleep function will stop the program for n seconds\n", "end = tm.time()\n", @@ -74,10 +149,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "(For more accurate benchmarking, see the [timeit](https://docs.python.org/3/library/timeit.html) module.)\n", + "
\n", + "

Info

\n", + " For more accurate benchmarking, see the timeit module.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "### `datetime` module\n", "\n", - "The `datetime` module handles time with the Gregorian calendar (the calendar we are all familiar with) and is independent of Unix time. The `datetime` module has an [object-oriented](#The-Thirty-Second-Introduction-to-Object-Oriented-Programming) approach with the `date`, `time`, `datetime`, `timedelta`, and `tzinfo` classes.\n", + "The `datetime` module handles time with the Gregorian calendar (the calendar we are all familiar with) and is independent of Unix time. The `datetime` module has an [object-oriented](#Thirty-second-introduction-to-Object-Oriented-programming) approach with the `date`, `time`, `datetime`, `timedelta`, and `tzinfo` classes.\n", "\n", "- `date` class represents the day, month and year\n", "- `time` class represents the time of day\n", @@ -95,13 +179,24 @@ "\n", "### What is Unix Time?\n", "\n", - "Unix time is an example of system time which is the computer's notion of passing time. It is measured in seconds from the the start of the epoch which is January 1, 1970 00:00 [UTC](#What-is-UTC?). It is represented \"under the hood\" as a [floating point number](https://en.wikipedia.org/wiki/Floating_point) which is how computers represent real (ℝ) numbers .\n", - "\n", - "### The Thirty Second Introduction to Object-Oriented Programming\n", + "Unix time is an example of system time which is the computer's notion of passing time. It is measured in seconds from the the start of the epoch which is January 1, 1970 00:00 [UTC](#What-is-UTC?). It is represented \"under the hood\" as a [floating point number](https://en.wikipedia.org/wiki/Floating_point) which is how computers represent real (ℝ) numbers ." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Thirty second introduction to Object-Oriented programming\n", "\n", "We have been talking about object-oriented (OO) programming by mentioning terms like \"class\", \"object\", and \"method\", but never really explaining what they mean. A class is a collection of related variables, similar to a [struct](https://en.wikipedia.org/wiki/Struct_(C_programming_language)), in the C programming language or even a tuple in Python) coupled with functions, or \"methods\" in OO parlance, that can act on those variables. An object is a concrete example of a class.\n", "\n", - "For example, if you have a `Coord` class that represents an earth location with latitude, and longitude, you may have a method that returns the distance between two locations, `distancekm()` in this example." + "For example, you might have a `Coord` class that represents an earth location with latitude, and longitude, and along with those data you could have a method that returns the distance between two locations. \n", + "\n", + "In our example, we name our method `distancekm()`, and it implements the formula for the [great-circle distance](https://en.wikipedia.org/wiki/Great-circle_distance) between two points on the sphere:\n", + "\n", + "$$ d = R~\\arccos\\Big( \\sin(\\phi_1)\\sin(\\phi_2) + \\cos(\\phi_1)\\cos(\\phi_2)\\cos(\\lambda_1-\\lambda_2) \\Big) $$\n", + "\n", + "where $\\phi_1, \\lambda_1$ and $\\phi_2, \\lambda_2$ are the *latitude* and *longitude* of points 1 and 2 in *radians*, and $R$ is the radius of the Earth." ] }, { @@ -110,9 +205,6 @@ "metadata": {}, "outputs": [], "source": [ - "import math\n", - "\n", - "\n", "class Coord:\n", " \"\"\"Earth location identified by (latitude, longitude) coordinates.\n", " distancekm -- distance between two points in kilometers\n", @@ -126,14 +218,14 @@ " \"\"\"Distance between two points in kilometers.\"\"\"\n", " DEGREES_TO_RADIANS = math.pi / 180.0\n", " EARTH_RADIUS = 6373 # in KMs\n", - " phi1 = (90.0 - self.lat) * DEGREES_TO_RADIANS\n", - " phi2 = (90.0 - p.lat) * DEGREES_TO_RADIANS\n", - " theta1 = self.lon * DEGREES_TO_RADIANS\n", - " theta2 = p.lon * DEGREES_TO_RADIANS\n", - " cos = math.sin(phi1) * math.sin(phi2) * math.cos(theta1 - theta2) + math.cos(\n", - " phi1\n", - " ) * math.cos(phi2)\n", - " arc = math.acos(cos)\n", + " phi1 = self.lat * DEGREES_TO_RADIANS\n", + " phi2 = p.lat * DEGREES_TO_RADIANS\n", + " lambda1 = self.lon * DEGREES_TO_RADIANS\n", + " lambda2 = p.lon * DEGREES_TO_RADIANS\n", + " cosarc = math.sin(phi1) * math.sin(phi2) + math.cos(phi1) * math.cos(\n", + " phi2\n", + " ) * math.cos(lambda1 - lambda2)\n", + " arc = math.acos(cosarc)\n", " return arc * EARTH_RADIUS" ] }, @@ -141,7 +233,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To create a concrete example of a **class**, also known as an **object**, initialize the object with data:" + "To create a concrete example of a **class**, also known as an **object**, initialize the object with some data:" ] }, { @@ -150,14 +242,15 @@ "metadata": {}, "outputs": [], "source": [ - "timbuktu = Coord(16.77, 3.00)" + "timbuktu = Coord(latitude=16.77, longitude=3.00)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Here, `timbuktu` is an **object** of the **class** `Coord` initialized with a latitude of `16.77` and a longitude of `3.00`.\n", + "Here, `timbuktu` is an **object** of the **class** `Coord` initialized with a latitude of `16.77` and a longitude of `3.00`. Great!\n", + "\n", "Next, we create two `Coord` objects: `ny` and `paris`. We will invoke the `distancekm()` method on the `ny` object and pass the `paris` object as an argument to determine the distance between New York and Paris in kilometers.\n" ] }, @@ -167,8 +260,12 @@ "metadata": {}, "outputs": [], "source": [ - "ny = Coord(40.71, 74.01)\n", - "paris = Coord(48.86, 2.35)\n", + "ny = Coord(\n", + " 40.71, 74.01\n", + ") # note that using the keywords for latitude and longitude is optional\n", + "paris = Coord(\n", + " latitude=48.86, longitude=2.35\n", + ") # but tends to make the code more readable!\n", "distance = ny.distancekm(paris)\n", "print(f\"The distance from New York to Paris is {distance:.1f} kilometers.\")" ] @@ -177,7 +274,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The old joke about OO programming is that they simply moved the struct that the function takes as an argument and put it first because it is special. So instead of having `distancekm(ny, paris)`, you have `ny.distancekm(paris)`. We have not talked about inheritance or polymorphism but that is OO in a nutshell.\n", + "The old joke about OO programming is that they simply moved the struct that the function takes as an argument and put it first because it is special. So instead of having `distancekm(ny, paris)`, you have `ny.distancekm(paris)`. We have not talked about inheritance or polymorphism but that is OO in a nutshell: packaging together the data and the methods that operate on the data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "## Reading and Writing Dates and Times\n", "\n", "### Parsing Lightning Data Timestamps with the `datetime.strptime` Method\n", @@ -186,7 +289,13 @@ "\n", " 06/27/07 16:18:21.898 18.739 -88.184 0.0 kA 0 1.0 0.4 2.5 8 1.2 13 G\n", "\n", - "Part of the task involves parsing the `06/27/07 16:18:21.898` time string into a `datetime` object. (The full description of the data are [described here](https://ghrc.nsstc.nasa.gov/uso/ds_docs/vaiconus/vaiconus_dataset.html#a6).) In order to parse this string or others that follow the same format, you will employ the [datetime.strptime()](https://docs.python.org/3/library/datetime.html#datetime.datetime.strptime) method from the `datetime` module. This method takes two arguments: the first is the date time string you wish to parse, the second is the format which describes exactly how the date and time are arranged. [The full range of format options is described in the Python documentation](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior). In reality, the format will take some degree of experimentation to get right. This is a situation where Python shines as you can quickly try out different solutions in the IPython interpreter. Beyond the official documentation, Google and [Stack Overflow](https://stackoverflow.com/) are your friends in this process. Eventually, after some trial and error, you will find the `'%m/%d/%y %H:%M:%S.%f'`format will properly parse the date and time." + "Part of the task involves parsing the `06/27/07 16:18:21.898` time string into a `datetime` object. (The full description of the data is [here](https://ghrc.nsstc.nasa.gov/uso/ds_docs/vaiconus/vaiconus_dataset.html#a6).) In order to parse this string or others that follow the same format, you will employ the [datetime.strptime()](https://docs.python.org/3/library/datetime.html#datetime.datetime.strptime) method from the `datetime` module. This method takes two arguments: \n", + "1. the date time string you wish to parse\n", + "2. the format which describes exactly how the date and time are arranged. \n", + "\n", + "[The full range of format options is described in the Python documentation](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior). In reality, the format will take some degree of experimentation to get right. This is a situation where Python shines as you can quickly try out different solutions in the IPython interpreter (or in a notebook). Beyond the official documentation, Google and [Stack Overflow](https://stackoverflow.com/) are your friends in this process. \n", + "\n", + "Eventually, after some trial and error, you will find the `'%m/%d/%y %H:%M:%S.%f'` format will properly parse the date and time." ] }, { @@ -195,8 +304,6 @@ "metadata": {}, "outputs": [], "source": [ - "import datetime as dt\n", - "\n", "strike_time = dt.datetime.strptime('06/27/07 16:18:21.898', '%m/%d/%y %H:%M:%S.%f')\n", "# print strike_time to see if we have properly parsed our time\n", "print(strike_time)" @@ -207,7 +314,10 @@ "metadata": {}, "source": [ "### Retrieving METAR from the MesoWest API with Help from the `datetime.strftime` Method\n", - "Let's say you are interested in obtaining [METAR](https://en.wikipedia.org/wiki/METAR) data from the Aleutian Islands with the [MesoWest API](http://mesowest.org/api). In order to retrieve these data, you will have to assemble a URL that abides by the [MesoWest API reference](http://synopticlabs.org/api/mesonet/reference/), and specifically create [date time strings that the API understands](http://synopticlabs.org/api/mesonet/reference/) (e.g., `201606010000` for the year, month, date, hour and minute). For example, typing the following URL in a web browser will return a human-readable nested data structure called a [JSON object](https://en.wikipedia.org/wiki/JSON) which will contain the data along with additional \"metadata\" to help you interpret the data (e.g., units etc.). Here, we are asking for air temperature information from the METAR station at [Eareckson air force base](https://en.wikipedia.org/wiki/Eareckson_Air_Station) (ICAO identifier \"PASY\") in the Aleutians from June 1, 2016, 00:00 UTC to June 1, 2016, 06:00 UTC.\n", + "\n", + "Let's say you are interested in obtaining [METAR](https://en.wikipedia.org/wiki/METAR) data from the Aleutian Islands with the [MesoWest API](http://mesowest.org/api). In order to retrieve these data, you will have to assemble a URL that abides by the [MesoWest API reference](http://synopticlabs.org/api/mesonet/reference/), and specifically create [date time strings that the API understands](http://synopticlabs.org/api/mesonet/reference/) (e.g., `201606010000` for the year, month, date, hour and minute). \n", + "\n", + "For example, typing the following URL in a web browser will return a human-readable nested data structure called a [JSON object](https://en.wikipedia.org/wiki/JSON) which will contain the data along with additional \"metadata\" to help you interpret the data (e.g., units etc.). Here, we are asking for air temperature information from the METAR station at [Eareckson air force base](https://en.wikipedia.org/wiki/Eareckson_Air_Station) (ICAO identifier \"PASY\") in the Aleutians from June 1, 2016, 00:00 UTC to June 1, 2016, 06:00 UTC.\n", "\n", "[http://api.mesowest.net/v2/stations/timeseries?stid=pasy&start=201606010000&end=201606010600&vars=air_temp&token=demotoken](http://api.mesowest.net/v2/stations/timeseries?stid=pasy&start=201606010000&end=201606010600&vars=air_temp&token=demotoken)" ] @@ -299,7 +409,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Continuing with this example, let's create a function that takes a station identifier, start and end time, a meteorological field and returns the JSON object as a Python dictionary data structure. We will draw upon our knowledge from the [Basic Input and Output notebook](https://github.com/Unidata/online-python-training/blob/master/notebooks/Basic%20Input%20and%20Output.ipynb) to properly construct the URL. In addition, we will employ the [urllib.request](https://docs.python.org/3/library/urllib.request.html) module for opening and reading URLs.\n", + "Continuing with this example, let's **create a function** that take as input\n", + "- a station identifier\n", + "- start and end time\n", + "- a meteorological field \n", + "\n", + "and returns the JSON object as a Python dictionary data structure. \n", + "\n", + "We will draw upon our knowledge of basic Python string formatting to properly construct the URL. In addition, we will employ the [urllib.request](https://docs.python.org/3/library/urllib.request.html) module for opening and reading URLs.\n", "\n", "But first, we must figure out how to properly format our date with the [datetime.strftime()](https://docs.python.org/2/library/datetime.html#datetime.date.strftime) method. This method takes a format identical to the one we employed for `strptime()`. After some trial and error from the IPython interpreter, we arrive at `'%Y%m%d%H%M'`:" ] @@ -310,8 +427,6 @@ "metadata": {}, "outputs": [], "source": [ - "import datetime as dt\n", - "\n", "print(dt.datetime(2016, 6, 1, 0, 0).strftime('%Y%m%d%H%M'))" ] }, @@ -328,10 +443,6 @@ "metadata": {}, "outputs": [], "source": [ - "import json # json module to help us with the HTTP response\n", - "import urllib.request\n", - "\n", - "\n", "def metar(icao, starttime, endtime, var):\n", " \"\"\"\n", " Retrieves METAR with the icao identifier, the starttime and endtime\n", @@ -363,8 +474,6 @@ "metadata": {}, "outputs": [], "source": [ - "import datetime as dt\n", - "\n", "pasy = metar(\n", " \"pasy\", dt.datetime(2016, 6, 1, 0, 0), dt.datetime(2016, 6, 1, 6, 0), \"air_temp\"\n", ")\n", @@ -391,12 +500,24 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We could continue with this exercise by parsing the returned date time strings in to `datetime` objects, but we will leave that exercise to the reader.\n", + "We could continue with this exercise by parsing the returned date time strings in to `datetime` objects, but we will leave that exercise to the reader." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "## Calculating Coastal Tides with the `timedelta` Class\n", "\n", - "Let's suppose we are looking at coastal tide and current data perhaps in a [tropical cyclone storm surge scenario](http://www.nhc.noaa.gov/surge/). The [lunar day](http://oceanservice.noaa.gov/education/kits/tides/media/supp_tide05.html) is 24 hours, 50 minutes with two low tides and two high tides in that time duration. If we know the time of the current high tide, we can easily calculate the occurrence of the next low and high tides with the `timedelta` class. (In reality, the *exact time* of tides is influenced by local coastal effects, in addition to the laws of celestial mechanics, but we will ignore that fact for this exercise.)\n", + "Let's suppose we are looking at coastal tide and current data perhaps in a [tropical cyclone storm surge scenario](http://www.nhc.noaa.gov/surge/). \n", "\n", - "The `timedelta` class is initialized by supplying time duration usually supplied with [keyword arguments](https://docs.python.org/3/glossary.html#term-argument) to clearly express the length of time. Significantly, you can use the `timedelta` class with arithmetic operators (i.e., `+`, `-`, `*`, `/`) to obtain new dates and times as the next code sample illustrates. This convenient language feature is known as [operator overloading](https://en.wikipedia.org/wiki/Operator_overloading) and again illustrates Python's batteries-included philosophy of making life easier for the programmer. (In another language such as Java, you would have to call a method significantly obfuscating the code.) Another great feature is that the difference of two times will yield a `datetime` object. Let's examine all these features in the following code block." + "The [lunar day](http://oceanservice.noaa.gov/education/kits/tides/media/supp_tide05.html) is 24 hours, 50 minutes with two low tides and two high tides in that time duration. If we know the time of the current high tide, we can easily calculate the occurrence of the next low and high tides with the `timedelta` class. (In reality, the *exact time* of tides is influenced by local coastal effects, in addition to the laws of celestial mechanics, but we will ignore that fact for this exercise.)\n", + "\n", + "The `timedelta` class is initialized by supplying time duration usually supplied with [keyword arguments](https://docs.python.org/3/glossary.html#term-argument) to clearly express the length of time. Significantly, you can use the `timedelta` class with arithmetic operators (i.e., `+`, `-`, `*`, `/`) to obtain new dates and times as the next code sample illustrates. \n", + "\n", + "This convenient language feature is known as [operator overloading](https://en.wikipedia.org/wiki/Operator_overloading) and again illustrates Python's batteries-included philosophy of making life easier for the programmer. (In another language such as Java, you would have to call a method significantly obfuscating the code.) \n", + "\n", + "Another great feature is that the difference of two times will yield a `datetime` object. Let's examine all these features in the following code block." ] }, { @@ -405,13 +526,13 @@ "metadata": {}, "outputs": [], "source": [ - "import datetime as dt\n", - "\n", "high_tide = dt.datetime(2016, 6, 1, 4, 38, 0)\n", "lunar_day = dt.timedelta(hours=24, minutes=50)\n", - "tide_duration = lunar_day / 4\n", - "next_low_tide = high_tide + tide_duration\n", - "next_high_tide = high_tide + (2 * tide_duration)\n", + "tide_duration = lunar_day / 4 # Here we do some arithmetic on the timedelta object!\n", + "next_low_tide = (\n", + " high_tide + tide_duration\n", + ") # Here we add a timedelta object to a datetime object\n", + "next_high_tide = high_tide + (2 * tide_duration) # and so on\n", "tide_length = next_high_tide - high_tide\n", "print(f\"The time between high and low tide is {tide_duration}.\")\n", "print(f\"The current high tide is {high_tide}.\")\n", @@ -425,7 +546,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In the last `print` statement, we use the [type()](https://docs.python.org/3/library/functions.html#type) built-in Python function to simply illustrate the difference between two times yields a `timedelta` object.\n", + "In the last `print` statement, we use the [type()](https://docs.python.org/3/library/functions.html#type) built-in Python function to simply illustrate the difference between two times yields a `timedelta` object." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "## Dealing with Time Zones\n", "\n", "Time zones can be a source of confusion and frustration in geoscientific data and in computer programming in general. Core date and time libraries in various programming languages inevitably have design flaws (Python is no different) leading to third-party libraries that attempt to fix the core library limitations. To avoid these issues, it is best to handle data in UTC, or at the very least operate in a consistent time zone, but that is not always possible. Users will expect their tornado alerts in local time.\n", @@ -436,7 +563,11 @@ "\n", "### Time Zone Naive Versus Time Zone Aware `datetime` Objects\n", "\n", - "When you create `datetime` objects in Python, they are so-called \"naive\" which means they are time zone unaware. In many situations, you can happily go forward without this detail getting in the way of your work. As the [Python documentation states](https://docs.python.org/3/library/datetime.html): \"Naive objects are easy to understand and to work with, at the cost of ignoring some aspects of reality\". However, if you wish to convey time zone information, you will have to make your `datetime` objects time zone aware. In order to handle time zones in Python, you will need the third-party [pytz](https://pypi.python.org/pypi/pytz) module whose classes build upon, or \"inherit\" in OO terminology, from the `tzinfo` class. You cannot solely rely on the Python Standard Library unfortunately. Here, we create time zone naive and time zone aware `datetime` objects:" + "When you create `datetime` objects in Python, they are so-called \"naive\" which means they are time zone unaware. In many situations, you can happily go forward without this detail getting in the way of your work. As the [Python documentation states](https://docs.python.org/3/library/datetime.html): \"Naive objects are easy to understand and to work with, at the cost of ignoring some aspects of reality\". \n", + "\n", + "However, if you wish to convey time zone information, you will have to make your `datetime` objects time zone aware. In order to handle time zones in Python, you will need the third-party [pytz](https://pypi.python.org/pypi/pytz) module whose classes build upon, or \"inherit\" in OO terminology, from the `tzinfo` class. You cannot solely rely on the Python Standard Library unfortunately. \n", + "\n", + "Here, we create time zone naive and time zone aware `datetime` objects:" ] }, { @@ -445,10 +576,6 @@ "metadata": {}, "outputs": [], "source": [ - "import datetime as dt\n", - "\n", - "import pytz\n", - "\n", "naive = dt.datetime.now()\n", "aware = dt.datetime.now(pytz.timezone('US/Mountain'))\n", "print(f\"I am time zone naive {naive}.\")\n", @@ -463,7 +590,9 @@ "\n", "### Print Time with a Different Time Zone\n", "\n", - "If you have data that are in UTC, and wish to convert them to another time zone, Mountain Time Zone for example, you will again make use of the `pytz` module. First, we will create a UTC time with the [utcnow()](https://docs.python.org/3/library/datetime.html#datetime.datetime.utcnow) method which inexplicably returns a time zone naive object so you must still specify the UTC time zone with the [replace()](https://docs.python.org/3/library/datetime.html#datetime.datetime.replace) method. We then create a \"US/Mountain\" `tzinfo` object as before, but this time we will use the [astimzone()](https://docs.python.org/3/library/datetime.html#datetime.datetime.astimezone) method to adjust the time to the specified time zone." + "If you have data that are in UTC, and wish to convert them to another time zone, Mountain Time Zone for example, you will again make use of the `pytz` module. \n", + "\n", + "First, we will create a UTC time with the [utcnow()](https://docs.python.org/3/library/datetime.html#datetime.datetime.utcnow) method which inexplicably returns a time zone naive object so you must still specify the UTC time zone with the [replace()](https://docs.python.org/3/library/datetime.html#datetime.datetime.replace) method. We then create a \"US/Mountain\" `tzinfo` object as before, but this time we will use the [astimzone()](https://docs.python.org/3/library/datetime.html#datetime.datetime.astimezone) method to adjust the time to the specified time zone." ] }, { @@ -472,10 +601,6 @@ "metadata": {}, "outputs": [], "source": [ - "import datetime as dt\n", - "\n", - "import pytz\n", - "\n", "utc = dt.datetime.utcnow().replace(tzinfo=pytz.utc)\n", "print(\"The UTC time is {}.\".format(utc.strftime('%B %d, %Y, %-I:%M%p')))\n", "mountaintz = pytz.timezone(\"US/Mountain\")\n", @@ -489,6 +614,51 @@ "source": [ "We also draw upon our earlier knowledge of the `strftime()` method to format a human-friendly date and time string." ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "The Python Standard Library (included with every Python distribution) contains several modules for dealing with date and time data. We saw how we can avoid some name ambiguities by aliasing the module names with `import datetime as dt, time as tm`. The `tm.time()` method just returns the current [Unix time](#What-is-Unix-Time?) in seconds -- which can be useful for measuring elapsed time, but not all that useful for working with geophysical data.\n", + "\n", + "The `datetime` module contains various classes for storing, converting, comparing, and formatting date and time data. Importantly, we saw how we can do arithmetic on time and date data, making use of the `dt.timedelta` class to represent intervals of time.\n", + "\n", + "Finally, we looked at using the third-party [pytz](https://pypi.python.org/pypi/pytz) module to handle timezone awareness and conversions.\n", + "\n", + "### What's Next?\n", + "\n", + "In subsequent tutorials, we will dig deeper into different time and date formats, and how they are handled by important Python modules such as Numpy, Pandas, and Xarray." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Resources and References\n", + "\n", + "This notebook was adapted from material in [Unidata's Python Training](https://unidata.github.io/python-training/python/times_and_dates/).\n", + "\n", + "For further reading, take a look at the official documentation for:\n", + "- [time module](https://docs.python.org/3/library/time.html)\n", + "- [datetime module](https://docs.python.org/3/library/datetime.html)\n", + "- [pytz module](https://pypi.org/project/pytz/)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -507,7 +677,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.8.10" } }, "nbformat": 4, From 566d7f6a155f93be4c58e33d4e659235a89b8923 Mon Sep 17 00:00:00 2001 From: Brian Rose Date: Wed, 9 Jun 2021 14:42:20 -0400 Subject: [PATCH 10/17] Fix broken link --- core/datetime/datetime.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/datetime/datetime.ipynb b/core/datetime/datetime.ipynb index dd2730462..cb5aa7749 100644 --- a/core/datetime/datetime.ipynb +++ b/core/datetime/datetime.ipynb @@ -315,7 +315,7 @@ "source": [ "### Retrieving METAR from the MesoWest API with Help from the `datetime.strftime` Method\n", "\n", - "Let's say you are interested in obtaining [METAR](https://en.wikipedia.org/wiki/METAR) data from the Aleutian Islands with the [MesoWest API](http://mesowest.org/api). In order to retrieve these data, you will have to assemble a URL that abides by the [MesoWest API reference](http://synopticlabs.org/api/mesonet/reference/), and specifically create [date time strings that the API understands](http://synopticlabs.org/api/mesonet/reference/) (e.g., `201606010000` for the year, month, date, hour and minute). \n", + "Let's say you are interested in obtaining [METAR](https://en.wikipedia.org/wiki/METAR) data from the Aleutian Islands with the [MesoWest API](http://mesowest.org/api). In order to retrieve these data, you will have to assemble a URL that abides by the [MesoWest API reference](http://synopticlabs.org/api/mesonet/reference/), and specifically create [date time strings that the API understands](https://developers.synopticdata.com/mesonet/v2/) (e.g., `201606010000` for the year, month, date, hour and minute). \n", "\n", "For example, typing the following URL in a web browser will return a human-readable nested data structure called a [JSON object](https://en.wikipedia.org/wiki/JSON) which will contain the data along with additional \"metadata\" to help you interpret the data (e.g., units etc.). Here, we are asking for air temperature information from the METAR station at [Eareckson air force base](https://en.wikipedia.org/wiki/Eareckson_Air_Station) (ICAO identifier \"PASY\") in the Aleutians from June 1, 2016, 00:00 UTC to June 1, 2016, 06:00 UTC.\n", "\n", From 10e2bbb0f7e3c6cae3b8e07a0fca411dd0fd2d79 Mon Sep 17 00:00:00 2001 From: Brian Rose Date: Wed, 9 Jun 2021 15:04:37 -0400 Subject: [PATCH 11/17] Try again to fix broken link --- core/datetime/datetime.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/datetime/datetime.ipynb b/core/datetime/datetime.ipynb index cb5aa7749..c4efd5b00 100644 --- a/core/datetime/datetime.ipynb +++ b/core/datetime/datetime.ipynb @@ -315,7 +315,7 @@ "source": [ "### Retrieving METAR from the MesoWest API with Help from the `datetime.strftime` Method\n", "\n", - "Let's say you are interested in obtaining [METAR](https://en.wikipedia.org/wiki/METAR) data from the Aleutian Islands with the [MesoWest API](http://mesowest.org/api). In order to retrieve these data, you will have to assemble a URL that abides by the [MesoWest API reference](http://synopticlabs.org/api/mesonet/reference/), and specifically create [date time strings that the API understands](https://developers.synopticdata.com/mesonet/v2/) (e.g., `201606010000` for the year, month, date, hour and minute). \n", + "Let's say you are interested in obtaining [METAR](https://en.wikipedia.org/wiki/METAR) data from the Aleutian Islands with the [MesoWest API](http://mesowest.org/api). In order to retrieve these data, you will have to assemble a URL that abides by the [MesoWest API reference](https://developers.synopticdata.com/mesonet/), and specifically create [date time strings that the API understands](https://developers.synopticdata.com/mesonet/v2/stations/nearesttime/) (e.g., `201606010000` for the year, month, date, hour and minute). \n", "\n", "For example, typing the following URL in a web browser will return a human-readable nested data structure called a [JSON object](https://en.wikipedia.org/wiki/JSON) which will contain the data along with additional \"metadata\" to help you interpret the data (e.g., units etc.). Here, we are asking for air temperature information from the METAR station at [Eareckson air force base](https://en.wikipedia.org/wiki/Eareckson_Air_Station) (ICAO identifier \"PASY\") in the Aleutians from June 1, 2016, 00:00 UTC to June 1, 2016, 06:00 UTC.\n", "\n", From 7a57cf54310f2c71f433dc60c56bcb33e36445d5 Mon Sep 17 00:00:00 2001 From: Brian Rose Date: Thu, 10 Jun 2021 16:21:33 -0400 Subject: [PATCH 12/17] Respond to John Clyne feedback, remove METAR section --- core/datetime/datetime.ipynb | 270 +++++++++++++---------------------- 1 file changed, 101 insertions(+), 169 deletions(-) diff --git a/core/datetime/datetime.ipynb b/core/datetime/datetime.ipynb index c4efd5b00..301b5ca36 100644 --- a/core/datetime/datetime.ipynb +++ b/core/datetime/datetime.ipynb @@ -41,7 +41,7 @@ "\n", "| Concepts | Importance | Notes |\n", "| --- | --- | --- |\n", - "| Basic Python string formatting | Helpful | |\n", + "| Basic Python string formatting | Helpful | Try this [Real Python string formatting tutorial](https://realpython.com/python-string-formatting/) |\n", "\n", "- **Experience level**: **beginner**\n", "- **Time to learn**: **medium**" @@ -67,12 +67,13 @@ "metadata": {}, "outputs": [], "source": [ + "# Python Standard Library packages\n", + "# We'll discuss below WHY we alias the packages this way\n", "import datetime as dt\n", - "import json\n", "import math\n", "import time as tm\n", - "import urllib.request\n", "\n", + "# Third-party package for time zone handling, we'll discuss below!\n", "import pytz" ] }, @@ -84,7 +85,7 @@ "\n", "### Some core terminology\n", "\n", - "Python comes with [time](https://docs.python.org/3/library/time.html) and [datetime](https://docs.python.org/3/library/datetime.html) modules. Unfortunately, Python can be initially disorienting because of the heavily overlapping terminology concerning dates and times:\n", + "Python comes with [time](https://docs.python.org/3/library/time.html) and [datetime](https://docs.python.org/3/library/datetime.html) modules as part of the Standard Library included with every Python installation. Unfortunately, Python can be initially disorienting because of the heavily overlapping terminology concerning dates and times:\n", "\n", "- `datetime` **module** has a `datetime` **class**\n", "- `datetime` **module** has a `time` **class**\n", @@ -109,10 +110,17 @@ "metadata": {}, "outputs": [], "source": [ - "pisecond = dt.datetime(2016, 3, 14, 15, 9, 26)\n", + "pisecond = dt.datetime(2021, 3, 14, 15, 9, 26)\n", "print(pisecond)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our variable `pisecond` now stores a particular date and time, which just happens to be $\\pi$-day 2021 down to the nearest second (3.1415926...)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -123,6 +131,13 @@ "print(now)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The variable `now` holds the current time in seconds since January 1, 1970 00:00 [UTC](#What-is-UTC?) (see [What is Unix Time](#What-is-Unix-Time?) below)." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -155,6 +170,15 @@ "" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### What is Unix Time?\n", + "\n", + "Unix time is an example of system time which is the computer's notion of passing time. It is measured in seconds from the the start of the epoch which is January 1, 1970 00:00 [UTC](#What-is-UTC?). It is represented \"under the hood\" as a [floating point number](https://en.wikipedia.org/wiki/Floating_point) which is how computers represent real (ℝ) numbers ." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -172,14 +196,26 @@ "The `datetime` module is effective for:\n", "\n", "- performing date and time arithmetic and calculating time duration\n", - "- reading and writing date and time strings in a particular format\n", + "- reading and writing date and time strings with various formats\n", "- handling time zones (with the help of third-party libraries)\n", "\n", - "The `time` and `datetime` modules overlap in functionality, but in your geoscientific work, you will probably be using the `datetime` module more than the `time` module.\n", - "\n", - "### What is Unix Time?\n", - "\n", - "Unix time is an example of system time which is the computer's notion of passing time. It is measured in seconds from the the start of the epoch which is January 1, 1970 00:00 [UTC](#What-is-UTC?). It is represented \"under the hood\" as a [floating point number](https://en.wikipedia.org/wiki/Floating_point) which is how computers represent real (ℝ) numbers ." + "The `time` and `datetime` modules overlap in functionality, but in your geoscientific work, you will probably be using the `datetime` module more than the `time` module." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll delve into more details below, but here's a quick example of writing out our `pisecond` datetime object as a formatted string. Suppose we wanted to write out just the date, and write it in the _month/day/year_ format typically used in the US. We can use the `strftime()` method with a format specifier:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('Pi day occurred on:', pisecond.strftime(format='%m/%d/%Y'))" ] }, { @@ -190,13 +226,13 @@ "\n", "We have been talking about object-oriented (OO) programming by mentioning terms like \"class\", \"object\", and \"method\", but never really explaining what they mean. A class is a collection of related variables, similar to a [struct](https://en.wikipedia.org/wiki/Struct_(C_programming_language)), in the C programming language or even a tuple in Python) coupled with functions, or \"methods\" in OO parlance, that can act on those variables. An object is a concrete example of a class.\n", "\n", - "For example, you might have a `Coord` class that represents an earth location with latitude, and longitude, and along with those data you could have a method that returns the distance between two locations. \n", - "\n", - "In our example, we name our method `distancekm()`, and it implements the formula for the [great-circle distance](https://en.wikipedia.org/wiki/Great-circle_distance) between two points on the sphere:\n", + "For example, suppose we wanted a class to represent a location on Earth with latitude, and longitude, and along with those data we want a method to compute the [great-circle distance](https://en.wikipedia.org/wiki/Great-circle_distance) between this location and another point on the sphere:\n", "\n", "$$ d = R~\\arccos\\Big( \\sin(\\phi_1)\\sin(\\phi_2) + \\cos(\\phi_1)\\cos(\\phi_2)\\cos(\\lambda_1-\\lambda_2) \\Big) $$\n", "\n", - "where $\\phi_1, \\lambda_1$ and $\\phi_2, \\lambda_2$ are the *latitude* and *longitude* of points 1 and 2 in *radians*, and $R$ is the radius of the Earth." + "where $\\phi_1, \\lambda_1$ and $\\phi_2, \\lambda_2$ are the *latitude* and *longitude* of points 1 and 2 in *radians*, and $R$ is the radius of the Earth.\n", + "\n", + "In the next cell, we first *define* our custom class called `Coord` (including the code to implement the great-circle calculation). In subsequent cells we'll show how to use our new class by creating objects of type `Coord`." ] }, { @@ -281,9 +317,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Reading and Writing Dates and Times\n", + "## Reading and writing dates and times\n", "\n", - "### Parsing Lightning Data Timestamps with the `datetime.strptime` Method\n", + "### Parsing lightning data timestamps with the `datetime.strptime` method\n", "\n", "Suppose you want to analyze [US NLDN lightning data](https://ghrc.nsstc.nasa.gov/uso/ds_docs/vaiconus/vaiconus_dataset.html). Here is a sample row of data:\n", "\n", @@ -313,128 +349,27 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Retrieving METAR from the MesoWest API with Help from the `datetime.strftime` Method\n", - "\n", - "Let's say you are interested in obtaining [METAR](https://en.wikipedia.org/wiki/METAR) data from the Aleutian Islands with the [MesoWest API](http://mesowest.org/api). In order to retrieve these data, you will have to assemble a URL that abides by the [MesoWest API reference](https://developers.synopticdata.com/mesonet/), and specifically create [date time strings that the API understands](https://developers.synopticdata.com/mesonet/v2/stations/nearesttime/) (e.g., `201606010000` for the year, month, date, hour and minute). \n", - "\n", - "For example, typing the following URL in a web browser will return a human-readable nested data structure called a [JSON object](https://en.wikipedia.org/wiki/JSON) which will contain the data along with additional \"metadata\" to help you interpret the data (e.g., units etc.). Here, we are asking for air temperature information from the METAR station at [Eareckson air force base](https://en.wikipedia.org/wiki/Eareckson_Air_Station) (ICAO identifier \"PASY\") in the Aleutians from June 1, 2016, 00:00 UTC to June 1, 2016, 06:00 UTC.\n", - "\n", - "[http://api.mesowest.net/v2/stations/timeseries?stid=pasy&start=201606010000&end=201606010600&vars=air_temp&token=demotoken](http://api.mesowest.net/v2/stations/timeseries?stid=pasy&start=201606010000&end=201606010600&vars=air_temp&token=demotoken)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " {\n", - " \"SUMMARY\": {\n", - " \"FUNCTION_USED\": \"time_data_parser\",\n", - " \"NUMBER_OF_OBJECTS\": 1,\n", - " \"TOTAL_DATA_TIME\": \"5.50103187561 ms\",\n", - " \"DATA_PARSING_TIME\": \"0.313997268677 ms\",\n", - " \"METADATA_RESPONSE_TIME\": \"97.2690582275 ms\",\n", - " \"RESPONSE_MESSAGE\": \"OK\",\n", - " \"RESPONSE_CODE\": 1,\n", - " \"DATA_QUERY_TIME\": \"5.18608093262 ms\"\n", - " },\n", - " \"STATION\": [\n", - " {\n", - " \"ID\": \"12638\",\n", - " \"TIMEZONE\": \"America/Adak\",\n", - " \"LATITUDE\": \"52.71667\",\n", - " \"OBSERVATIONS\": {\n", - " \"air_temp_set_1\": [\n", - " 8.3,\n", - " 8.0,\n", - " 8.3,\n", - " 8.0,\n", - " 7.8,\n", - " 7.8,\n", - " 7.0,\n", - " 7.2,\n", - " 7.2\n", - " ],\n", - " \"date_time\": [\n", - " \"2016-06-01T00:56:00Z\",\n", - " \"2016-06-01T01:26:00Z\",\n", - " \"2016-06-01T01:56:00Z\",\n", - " \"2016-06-01T02:40:00Z\",\n", - " \"2016-06-01T02:56:00Z\",\n", - " \"2016-06-01T03:56:00Z\",\n", - " \"2016-06-01T04:45:00Z\",\n", - " \"2016-06-01T04:56:00Z\",\n", - " \"2016-06-01T05:56:00Z\"\n", - " ]\n", - " },\n", - " \"STATE\": \"AK\",\n", - " \"LONGITUDE\": \"174.11667\",\n", - " \"SENSOR_VARIABLES\": {\n", - " \"air_temp\": {\n", - " \"air_temp_set_1\": {\n", - " \"end\": \"\",\n", - " \"start\": \"\"\n", - " }\n", - " },\n", - " \"date_time\": {\n", - " \"date_time\": {}\n", - " }\n", - " },\n", - " \"STID\": \"PASY\",\n", - " \"NAME\": \"Shemya, Eareckson AFB\",\n", - " \"ELEVATION\": \"98\",\n", - " \"PERIOD_OF_RECORD\": {\n", - " \"end\": \"\",\n", - " \"start\": \"\"\n", - " },\n", - " \"MNET_ID\": \"1\",\n", - " \"STATUS\": \"ACTIVE\"\n", - " }\n", - " ],\n", - " \"UNITS\": {\n", - " \"air_temp\": \"Celsius\"\n", - " }\n", - " }\n", - " // GET http://api.mesowest.net/v2/stations/timeseries?stid=pasy&start=201606010000&end=201606010600&vars=air_temp&token=demotoken\n", - " // HTTP/1.1 200 OK\n", - " // Content-Type: application/json\n", - " // Date: Mon, 27 Jun 2016 18:17:08 GMT\n", - " // Server: nginx/1.4.6 (Ubuntu)\n", - " // Vary: Accept-Encoding\n", - " // Content-Length: 944\n", - " // Connection: keep-alive\n", - " // Request duration: 0.271790s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Continuing with this example, let's **create a function** that take as input\n", - "- a station identifier\n", - "- start and end time\n", - "- a meteorological field \n", - "\n", - "and returns the JSON object as a Python dictionary data structure. \n", - "\n", - "We will draw upon our knowledge of basic Python string formatting to properly construct the URL. In addition, we will employ the [urllib.request](https://docs.python.org/3/library/urllib.request.html) module for opening and reading URLs.\n", - "\n", - "But first, we must figure out how to properly format our date with the [datetime.strftime()](https://docs.python.org/2/library/datetime.html#datetime.date.strftime) method. This method takes a format identical to the one we employed for `strptime()`. After some trial and error from the IPython interpreter, we arrive at `'%Y%m%d%H%M'`:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(dt.datetime(2016, 6, 1, 0, 0).strftime('%Y%m%d%H%M'))" + "### Example usage of the `datetime` object\n", + "\n", + "Why did we bother doing this? It might look like all we've done here is take the string `06/27/07 16:18:21.898` and reformatted it to `2007-06-27 16:18:21.898000`.\n", + "\n", + "But in fact our variable `strike_time` is a `datetime` object that we can manipulate in many useful ways. \n", + "\n", + "A few quick examples:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Armed with this knowledge of how to format the date and time according to the MesoWest API reference, we can write our `metar()` function:" + "#### Controlling the output format with `strftime()`\n", + "\n", + "Suppose we want to write out just the time (not date) in particular format like this:\n", + "```\n", + "16h 18m 21s\n", + "```\n", + "\n", + "We can do this with the [datetime.strftime()](https://docs.python.org/2/library/datetime.html#datetime.date.strftime) method, which takes a format identical to the one we employed for `strptime()`. After some trial and error from the IPython interpreter, we arrive at `'%Hh %Mm %Ss'`:" ] }, { @@ -443,29 +378,16 @@ "metadata": {}, "outputs": [], "source": [ - "def metar(icao, starttime, endtime, var):\n", - " \"\"\"\n", - " Retrieves METAR with the icao identifier, the starttime and endtime\n", - " datetime objects and the var atmospheric field (e.g., \"air_temp\".)\n", - " Returns a dictionary data structure that mirros the JSON object from\n", - " returned from the MesoWest API.\n", - " \"\"\"\n", - " fmt = '%Y%m%d%H%M'\n", - " st = starttime.strftime(fmt)\n", - " et = endtime.strftime(fmt)\n", - " url = (\n", - " \"http://api.mesowest.net/v2/stations/timeseries?\"\n", - " \"stid={}&start={}&end={}&vars={}&token=demotoken\"\n", - " )\n", - " reply = urllib.request.urlopen(url.format(icao, st, et, var))\n", - " return json.loads(reply.read().decode('utf8'))" + "print(strike_time.strftime(format='%Hh %Mm %Ss'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We can now try out our new `metar` function to fetch some air temperature data." + "#### A simple query of just the year:\n", + "\n", + "Here's a useful shortcut that doesn't even need a format specifier:" ] }, { @@ -474,17 +396,22 @@ "metadata": {}, "outputs": [], "source": [ - "pasy = metar(\n", - " \"pasy\", dt.datetime(2016, 6, 1, 0, 0), dt.datetime(2016, 6, 1, 6, 0), \"air_temp\"\n", - ")\n", - "print(pasy)" + "strike_time.year" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This works because the `datetime` object stores the data as individual attributes: \n", + "`year`, `month`, `day`, `hour`, `minute`, `second`, `microsecond`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The data are returned in a nested data structure composed of dictionaries and lists. We can pull that data structure apart to fetch our data. Also, observe that the times are returned in UTC according to the [ISO 8601 international time standard](https://en.wikipedia.org/wiki/ISO_8601)." + "#### See how many days have elapsed since the strike:" ] }, { @@ -493,31 +420,31 @@ "metadata": {}, "outputs": [], "source": [ - "print(pasy['STATION'][0]['OBSERVATIONS'])" + "(dt.datetime.now() - strike_time).days" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We could continue with this exercise by parsing the returned date time strings in to `datetime` objects, but we will leave that exercise to the reader." + "This last example actually shows how we can do simple arithmetic with `datetime` objects! We'll see more of this in the next section." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Calculating Coastal Tides with the `timedelta` Class\n", + "## Calculating coastal tides with the `timedelta` class\n", "\n", "Let's suppose we are looking at coastal tide and current data perhaps in a [tropical cyclone storm surge scenario](http://www.nhc.noaa.gov/surge/). \n", "\n", - "The [lunar day](http://oceanservice.noaa.gov/education/kits/tides/media/supp_tide05.html) is 24 hours, 50 minutes with two low tides and two high tides in that time duration. If we know the time of the current high tide, we can easily calculate the occurrence of the next low and high tides with the `timedelta` class. (In reality, the *exact time* of tides is influenced by local coastal effects, in addition to the laws of celestial mechanics, but we will ignore that fact for this exercise.)\n", + "The [lunar day](http://oceanservice.noaa.gov/education/kits/tides/media/supp_tide05.html) is 24 hours, 50 minutes with two low tides and two high tides in that time duration. If we know the time of the current high tide, we can easily calculate the occurrence of the next low and high tides with the [timedelta class](https://docs.python.org/3/library/datetime.html#timedelta-objects). (In reality, the *exact time* of tides is influenced by local coastal effects, in addition to the laws of celestial mechanics, but we will ignore that fact for this exercise.)\n", "\n", "The `timedelta` class is initialized by supplying time duration usually supplied with [keyword arguments](https://docs.python.org/3/glossary.html#term-argument) to clearly express the length of time. Significantly, you can use the `timedelta` class with arithmetic operators (i.e., `+`, `-`, `*`, `/`) to obtain new dates and times as the next code sample illustrates. \n", "\n", "This convenient language feature is known as [operator overloading](https://en.wikipedia.org/wiki/Operator_overloading) and again illustrates Python's batteries-included philosophy of making life easier for the programmer. (In another language such as Java, you would have to call a method significantly obfuscating the code.) \n", "\n", - "Another great feature is that the difference of two times will yield a `datetime` object. Let's examine all these features in the following code block." + "Another great feature is that the difference of two times (like we did above with the [lightning strike data](#See-how-many-days-have-elapsed-since-the-strike:)) will yield a `timedelta` object. Let's examine all these features in the following code block." ] }, { @@ -546,7 +473,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In the last `print` statement, we use the [type()](https://docs.python.org/3/library/functions.html#type) built-in Python function to simply illustrate the difference between two times yields a `timedelta` object." + "In the last `print` statement, we use the [type()](https://docs.python.org/3/library/functions.html#type) built-in Python function to show that the difference between two times yields a `timedelta` object." ] }, { @@ -563,7 +490,8 @@ "\n", "### Time Zone Naive Versus Time Zone Aware `datetime` Objects\n", "\n", - "When you create `datetime` objects in Python, they are so-called \"naive\" which means they are time zone unaware. In many situations, you can happily go forward without this detail getting in the way of your work. As the [Python documentation states](https://docs.python.org/3/library/datetime.html): \"Naive objects are easy to understand and to work with, at the cost of ignoring some aspects of reality\". \n", + "When you create `datetime` objects in Python, they are so-called \"naive\" which means they are time zone unaware. In many situations, you can happily go forward without this detail getting in the way of your work. As the [Python documentation states](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects):\n", + ">Naive objects are easy to understand and to work with, at the cost of ignoring some aspects of reality. \n", "\n", "However, if you wish to convey time zone information, you will have to make your `datetime` objects time zone aware. In order to handle time zones in Python, you will need the third-party [pytz](https://pypi.python.org/pypi/pytz) module whose classes build upon, or \"inherit\" in OO terminology, from the `tzinfo` class. You cannot solely rely on the Python Standard Library unfortunately. \n", "\n", @@ -612,7 +540,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We also draw upon our earlier knowledge of the `strftime()` method to format a human-friendly date and time string." + "Here we've also used the `strftime()` method to format a human-friendly date and time string." ] }, { @@ -628,9 +556,9 @@ "source": [ "## Summary\n", "\n", - "The Python Standard Library (included with every Python distribution) contains several modules for dealing with date and time data. We saw how we can avoid some name ambiguities by aliasing the module names with `import datetime as dt, time as tm`. The `tm.time()` method just returns the current [Unix time](#What-is-Unix-Time?) in seconds -- which can be useful for measuring elapsed time, but not all that useful for working with geophysical data.\n", + "The Python Standard Library contains several modules for dealing with date and time data. We saw how we can avoid some name ambiguities by aliasing the module names with `import datetime as dt` and `import time as tm`. The `tm.time()` method just returns the current [Unix time](#What-is-Unix-Time?) in seconds -- which can be useful for measuring elapsed time, but not all that useful for working with geophysical data.\n", "\n", - "The `datetime` module contains various classes for storing, converting, comparing, and formatting date and time data. Importantly, we saw how we can do arithmetic on time and date data, making use of the `dt.timedelta` class to represent intervals of time.\n", + "The `datetime` module contains various classes for storing, converting, comparing, and formatting date and time data on the Gregorian calendar. We saw how we can parse data files with date and time strings into `dt.datetime` objects using the `dt.datetime.strptime()` method. We also saw how we can do arithmetic on time and date data, making use of the `dt.timedelta` class to represent intervals of time.\n", "\n", "Finally, we looked at using the third-party [pytz](https://pypi.python.org/pypi/pytz) module to handle timezone awareness and conversions.\n", "\n", @@ -647,10 +575,14 @@ "\n", "This notebook was adapted from material in [Unidata's Python Training](https://unidata.github.io/python-training/python/times_and_dates/).\n", "\n", - "For further reading, take a look at the official documentation for:\n", - "- [time module](https://docs.python.org/3/library/time.html)\n", - "- [datetime module](https://docs.python.org/3/library/datetime.html)\n", - "- [pytz module](https://pypi.org/project/pytz/)" + "For further reading on these modules, take a look at the official documentation for:\n", + "- [time](https://docs.python.org/3/library/time.html)\n", + "- [datetime](https://docs.python.org/3/library/datetime.html)\n", + "- [pytz](https://pypi.org/project/pytz/)\n", + "\n", + "For more information on Python string formatting, try:\n", + "- [Python string documentation](https://docs.python.org/3/library/string.html)\n", + "- A nice tutorial from [RealPython](https://realpython.com/python-string-formatting/)" ] }, { From 153282e4a6324bca074820fbf9133e24333e90a4 Mon Sep 17 00:00:00 2001 From: Brian Rose Date: Thu, 10 Jun 2021 16:42:41 -0400 Subject: [PATCH 13/17] Flesh out the datetime landing page --- core/datetime.md | 9 ++++++++- core/datetime/datetime.ipynb | 6 +++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/core/datetime.md b/core/datetime.md index 55ffdd1ff..a121da735 100644 --- a/core/datetime.md +++ b/core/datetime.md @@ -4,4 +4,11 @@ This content is under construction! ``` -This section will contain tutorials on dealing with times and calendars in scientific Python, including use of the [datetime](https://docs.python.org/3/library/datetime.html) library. +This section contains tutorials on dealing with times and calendars in scientific Python, beginning with use of the [datetime](https://docs.python.org/3/library/datetime.html) standard library. + +When this chapter is fully built out, it will include a comprehensive guide to different time libraries and when/where to use them, including + +- [Numpy `datetime64`](https://numpy.org/doc/stable/reference/arrays.datetime.html) for efficient vectorized datetime operations +- [cftime library](https://unidata.github.io/cftime/) for dealing with non-standard calendars + +These will be cross-referenced with tutorials on dealing with timeseries data in [Pandas](pandas) and [Xarray](xarray). diff --git a/core/datetime/datetime.ipynb b/core/datetime/datetime.ipynb index 301b5ca36..9b6254a20 100644 --- a/core/datetime/datetime.ipynb +++ b/core/datetime/datetime.ipynb @@ -28,7 +28,7 @@ "1. Take a brief aside into Object-Oriented programming and Python classes\n", "1. Look at formatted input and output of dates and times\n", "1. See how we can do simple arithmetic on date/time data, making use of the `timedelta` object\n", - "1. Briefly make use of the [pytz](https://pypi.python.org/pypi/pytz) module to handle some thorny time zone issues in Python." + "1. Briefly make use of the [pytz](https://pypi.org/project/pytz/) module to handle some thorny time zone issues in Python." ] }, { @@ -493,7 +493,7 @@ "When you create `datetime` objects in Python, they are so-called \"naive\" which means they are time zone unaware. In many situations, you can happily go forward without this detail getting in the way of your work. As the [Python documentation states](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects):\n", ">Naive objects are easy to understand and to work with, at the cost of ignoring some aspects of reality. \n", "\n", - "However, if you wish to convey time zone information, you will have to make your `datetime` objects time zone aware. In order to handle time zones in Python, you will need the third-party [pytz](https://pypi.python.org/pypi/pytz) module whose classes build upon, or \"inherit\" in OO terminology, from the `tzinfo` class. You cannot solely rely on the Python Standard Library unfortunately. \n", + "However, if you wish to convey time zone information, you will have to make your `datetime` objects time zone aware. In order to handle time zones in Python, you will need the third-party [pytz](https://pypi.org/project/pytz/) module whose classes build upon, or \"inherit\" in OO terminology, from the `tzinfo` class. You cannot solely rely on the Python Standard Library unfortunately. \n", "\n", "Here, we create time zone naive and time zone aware `datetime` objects:" ] @@ -560,7 +560,7 @@ "\n", "The `datetime` module contains various classes for storing, converting, comparing, and formatting date and time data on the Gregorian calendar. We saw how we can parse data files with date and time strings into `dt.datetime` objects using the `dt.datetime.strptime()` method. We also saw how we can do arithmetic on time and date data, making use of the `dt.timedelta` class to represent intervals of time.\n", "\n", - "Finally, we looked at using the third-party [pytz](https://pypi.python.org/pypi/pytz) module to handle timezone awareness and conversions.\n", + "Finally, we looked at using the third-party [pytz](https://pypi.org/project/pytz/) module to handle timezone awareness and conversions.\n", "\n", "### What's Next?\n", "\n", From ab66288094365ece55a7bfd0dce766c7f2f9e2f4 Mon Sep 17 00:00:00 2001 From: Brian Rose Date: Mon, 14 Jun 2021 15:43:04 -0400 Subject: [PATCH 14/17] Use pythia-datasets in pandas notebook --- core/pandas/enso_data.csv | 473 --- core/pandas/pandas_fullNotebook.ipynb | 4181 ++----------------------- environment.yml | 4 + 3 files changed, 263 insertions(+), 4395 deletions(-) delete mode 100644 core/pandas/enso_data.csv diff --git a/core/pandas/enso_data.csv b/core/pandas/enso_data.csv deleted file mode 100644 index 1ada455af..000000000 --- a/core/pandas/enso_data.csv +++ /dev/null @@ -1,473 +0,0 @@ -datetime,Nino12,Nino12anom,Nino3,Nino3anom,Nino4,Nino4anom,Nino34,Nino34anom -1982-01-01,24.29,-0.17,25.87,0.24,28.3,0.0,26.72,0.15 -1982-02-01,25.49,-0.58,26.38,0.01,28.21,0.11,26.7,-0.02 -1982-03-01,25.21,-1.31,26.98,-0.16,28.41,0.22,27.2,-0.02 -1982-04-01,24.5,-0.97,27.68,0.18,28.92,0.42,28.02,0.24 -1982-05-01,23.97,-0.23,27.79,0.71,29.49,0.7,28.54,0.69 -1982-06-01,22.89,0.07,27.46,1.03,29.76,0.92,28.75,1.1 -1982-07-01,22.47,0.87,26.44,0.82,29.38,0.58,28.1,0.88 -1982-08-01,21.75,1.1,26.15,1.16,29.04,0.36,27.93,1.11 -1982-09-01,21.8,1.44,26.52,1.67,29.16,0.47,28.11,1.39 -1982-10-01,22.94,2.12,27.11,2.19,29.38,0.72,28.64,1.95 -1982-11-01,24.59,3.0,27.62,2.64,29.23,0.6,28.81,2.16 -1982-12-01,26.13,3.34,28.39,3.25,29.15,0.66,29.21,2.64 -1983-01-01,27.42,2.96,28.92,3.29,29.0,0.7,29.36,2.79 -1983-02-01,28.09,2.02,28.92,2.55,28.79,0.69,29.13,2.41 -1983-03-01,28.68,2.16,29.1,1.96,28.76,0.57,29.03,1.81 -1983-04-01,28.56,3.09,29.12,1.62,28.85,0.35,28.91,1.13 -1983-05-01,28.19,3.99,28.97,1.89,29.08,0.29,28.89,1.04 -1983-06-01,27.44,4.62,28.15,1.72,28.88,0.04,28.24,0.59 -1983-07-01,25.95,4.35,26.62,1.0,28.65,-0.15,27.07,-0.15 -1983-08-01,23.78,3.13,25.87,0.88,28.38,-0.3,26.53,-0.29 -1983-09-01,22.24,1.88,25.24,0.39,28.23,-0.46,26.44,-0.28 -1983-10-01,21.86,1.04,24.61,-0.31,27.75,-0.91,25.87,-0.82 -1983-11-01,21.9,0.31,24.17,-0.81,27.76,-0.87,25.58,-1.07 -1983-12-01,23.01,0.22,24.44,-0.7,27.82,-0.67,25.59,-0.98 -1984-01-01,24.18,-0.28,24.82,-0.81,27.64,-0.66,25.64,-0.93 -1984-02-01,25.18,-0.89,26.22,-0.15,27.25,-0.85,26.39,-0.33 -1984-03-01,26.0,-0.52,27.12,-0.02,27.21,-0.98,26.86,-0.36 -1984-04-01,25.16,-0.31,27.34,-0.16,27.7,-0.8,27.39,-0.39 -1984-05-01,23.23,-0.97,26.46,-0.62,27.95,-0.84,27.39,-0.46 -1984-06-01,21.96,-0.86,25.38,-1.05,28.13,-0.71,26.86,-0.79 -1984-07-01,21.24,-0.36,24.96,-0.66,28.35,-0.45,26.74,-0.48 -1984-08-01,20.17,-0.48,24.5,-0.49,28.17,-0.51,26.34,-0.48 -1984-09-01,20.37,0.01,24.35,-0.5,28.61,-0.08,26.43,-0.29 -1984-10-01,20.52,-0.3,23.95,-0.97,28.28,-0.38,25.93,-0.76 -1984-11-01,21.5,-0.09,24.03,-0.95,27.99,-0.64,25.41,-1.24 -1984-12-01,22.58,-0.21,23.7,-1.44,27.44,-1.05,25.0,-1.57 -1985-01-01,23.59,-0.87,24.51,-1.12,27.71,-0.59,25.43,-1.14 -1985-02-01,24.87,-1.2,25.19,-1.18,27.55,-0.55,25.67,-1.05 -1985-03-01,25.74,-0.78,26.11,-1.03,27.38,-0.81,26.23,-0.99 -1985-04-01,24.25,-1.22,26.52,-0.98,27.72,-0.78,26.8,-0.98 -1985-05-01,22.29,-1.91,26.12,-0.96,28.06,-0.73,27.11,-0.74 -1985-06-01,21.75,-1.07,25.6,-0.83,28.08,-0.76,26.86,-0.79 -1985-07-01,20.44,-1.16,24.74,-0.88,28.28,-0.52,26.69,-0.53 -1985-08-01,19.29,-1.36,24.4,-0.59,28.32,-0.36,26.5,-0.32 -1985-09-01,19.44,-0.92,24.15,-0.7,28.33,-0.36,26.25,-0.47 -1985-10-01,19.9,-0.92,24.15,-0.77,28.28,-0.38,26.19,-0.5 -1985-11-01,20.69,-0.9,24.28,-0.7,28.52,-0.11,26.19,-0.46 -1985-12-01,22.4,-0.39,24.29,-0.85,28.53,0.04,26.11,-0.46 -1986-01-01,24.61,0.15,24.73,-0.9,28.11,-0.19,25.79,-0.78 -1986-02-01,26.06,-0.01,25.81,-0.56,27.93,-0.17,25.94,-0.78 -1986-03-01,25.91,-0.61,26.84,-0.3,27.97,-0.22,26.65,-0.57 -1986-04-01,24.58,-0.89,27.17,-0.33,28.21,-0.29,27.44,-0.34 -1986-05-01,23.38,-0.82,26.68,-0.4,28.58,-0.21,27.5,-0.35 -1986-06-01,21.98,-0.84,26.3,-0.13,28.84,0.0,27.69,0.04 -1986-07-01,21.12,-0.48,25.7,0.08,28.9,0.1,27.37,0.15 -1986-08-01,20.97,0.32,25.02,0.03,29.04,0.36,27.15,0.33 -1986-09-01,20.44,0.08,25.25,0.4,29.18,0.49,27.33,0.61 -1986-10-01,21.07,0.25,25.62,0.7,29.38,0.72,27.57,0.88 -1986-11-01,22.03,0.44,25.92,0.94,29.4,0.77,27.73,1.08 -1986-12-01,23.0,0.21,25.86,0.72,29.19,0.7,27.7,1.13 -1987-01-01,25.3,0.84,26.69,1.06,29.02,0.72,27.91,1.34 -1987-02-01,27.14,1.07,27.42,1.05,28.93,0.83,28.02,1.3 -1987-03-01,28.01,1.49,28.2,1.06,29.04,0.85,28.47,1.25 -1987-04-01,27.17,1.7,28.49,0.99,29.21,0.71,28.8,1.02 -1987-05-01,25.58,1.38,28.22,1.14,29.25,0.46,28.75,0.9 -1987-06-01,24.06,1.24,27.71,1.28,29.53,0.69,29.03,1.38 -1987-07-01,22.78,1.18,27.07,1.45,29.47,0.67,28.8,1.58 -1987-08-01,21.73,1.08,26.52,1.53,29.41,0.73,28.58,1.76 -1987-09-01,21.45,1.09,26.57,1.72,29.51,0.82,28.39,1.67 -1987-10-01,22.39,1.57,26.2,1.28,29.61,0.95,28.07,1.38 -1987-11-01,22.63,1.04,26.13,1.15,29.8,1.17,27.99,1.34 -1987-12-01,23.47,0.68,26.2,1.06,29.44,0.95,27.6,1.03 -1988-01-01,24.64,0.18,26.12,0.49,29.13,0.83,27.32,0.75 -1988-02-01,25.74,-0.33,26.55,0.18,28.69,0.59,27.22,0.5 -1988-03-01,25.78,-0.74,27.14,0.0,28.2,0.01,27.31,0.09 -1988-04-01,24.54,-0.93,26.73,-0.77,28.15,-0.35,27.32,-0.46 -1988-05-01,23.6,-0.6,25.22,-1.86,28.36,-0.43,26.48,-1.37 -1988-06-01,21.27,-1.55,24.46,-1.97,28.13,-0.71,26.11,-1.54 -1988-07-01,20.26,-1.34,23.71,-1.91,27.88,-0.92,25.57,-1.65 -1988-08-01,19.12,-1.53,23.37,-1.62,27.68,-1.0,25.24,-1.58 -1988-09-01,19.19,-1.17,23.61,-1.24,27.63,-1.06,25.43,-1.29 -1988-10-01,19.5,-1.32,23.17,-1.75,27.06,-1.6,24.62,-2.07 -1988-11-01,20.55,-1.04,23.03,-1.95,26.76,-1.87,24.27,-2.38 -1988-12-01,21.8,-0.99,23.07,-2.07,26.75,-1.74,24.33,-2.24 -1989-01-01,24.09,-0.37,24.15,-1.48,26.54,-1.76,24.53,-2.04 -1989-02-01,26.26,0.19,25.61,-0.76,26.55,-1.55,25.33,-1.39 -1989-03-01,26.66,0.14,26.02,-1.12,27.0,-1.19,25.9,-1.32 -1989-04-01,25.63,0.16,26.67,-0.83,27.54,-0.96,26.69,-1.09 -1989-05-01,23.18,-1.02,26.37,-0.71,28.14,-0.65,27.09,-0.76 -1989-06-01,22.0,-0.82,26.08,-0.35,27.94,-0.9,26.98,-0.67 -1989-07-01,21.12,-0.48,25.28,-0.34,28.2,-0.6,26.74,-0.48 -1989-08-01,20.32,-0.33,24.56,-0.43,28.14,-0.54,26.33,-0.49 -1989-09-01,19.87,-0.49,24.45,-0.4,28.25,-0.44,26.25,-0.47 -1989-10-01,20.33,-0.49,24.49,-0.43,28.39,-0.27,26.26,-0.43 -1989-11-01,21.31,-0.28,24.56,-0.42,28.23,-0.4,26.24,-0.41 -1989-12-01,22.19,-0.6,24.71,-0.43,28.52,0.03,26.38,-0.19 -1990-01-01,24.02,-0.44,25.34,-0.29,28.56,0.26,26.55,-0.02 -1990-02-01,25.88,-0.19,26.37,0.0,28.62,0.52,26.95,0.23 -1990-03-01,26.16,-0.36,27.03,-0.11,28.78,0.59,27.46,0.24 -1990-04-01,25.22,-0.25,27.67,0.17,28.93,0.43,28.02,0.24 -1990-05-01,24.05,-0.15,27.35,0.27,28.96,0.17,28.06,0.21 -1990-06-01,22.68,-0.14,26.45,0.02,28.94,0.1,27.58,-0.07 -1990-07-01,21.0,-0.6,25.45,-0.17,28.98,0.18,27.25,0.03 -1990-08-01,20.25,-0.4,25.06,0.07,29.17,0.49,27.05,0.23 -1990-09-01,20.13,-0.23,24.85,0.0,29.04,0.35,26.75,0.03 -1990-10-01,20.28,-0.54,24.9,-0.02,29.23,0.57,26.98,0.29 -1990-11-01,20.84,-0.75,24.82,-0.16,29.06,0.43,26.72,0.07 -1990-12-01,22.45,-0.34,25.08,-0.06,29.14,0.65,26.91,0.34 -1991-01-01,23.86,-0.6,25.65,0.02,29.0,0.7,27.01,0.44 -1991-02-01,25.97,-0.1,26.27,-0.1,28.73,0.63,26.93,0.21 -1991-03-01,26.51,-0.01,26.99,-0.15,28.64,0.45,27.25,0.03 -1991-04-01,24.99,-0.48,27.32,-0.18,29.13,0.63,27.98,0.2 -1991-05-01,24.37,0.17,27.58,0.5,29.42,0.63,28.35,0.5 -1991-06-01,23.05,0.23,27.34,0.91,29.35,0.51,28.36,0.71 -1991-07-01,22.05,0.45,26.57,0.95,29.26,0.46,27.92,0.7 -1991-08-01,21.08,0.43,25.47,0.48,29.25,0.57,27.44,0.62 -1991-09-01,20.75,0.39,25.05,0.2,29.19,0.5,27.07,0.35 -1991-10-01,21.13,0.31,25.6,0.68,29.44,0.78,27.63,0.94 -1991-11-01,22.18,0.59,25.98,1.0,29.45,0.82,27.86,1.21 -1991-12-01,23.43,0.64,26.52,1.38,29.45,0.96,28.37,1.8 -1992-01-01,24.83,0.37,27.0,1.37,29.06,0.76,28.41,1.84 -1992-02-01,26.68,0.61,27.67,1.3,29.02,0.92,28.63,1.91 -1992-03-01,27.76,1.24,28.33,1.19,29.08,0.89,28.83,1.61 -1992-04-01,27.68,2.21,28.72,1.22,29.42,0.92,29.14,1.36 -1992-05-01,26.31,2.11,28.43,1.35,29.46,0.67,28.99,1.14 -1992-06-01,23.82,1.0,26.66,0.23,29.31,0.47,28.02,0.37 -1992-07-01,21.95,0.35,25.53,-0.09,29.35,0.55,27.53,0.31 -1992-08-01,20.55,-0.1,24.7,-0.29,28.9,0.22,26.64,-0.18 -1992-09-01,20.06,-0.3,24.52,-0.33,28.79,0.1,26.48,-0.24 -1992-10-01,20.82,0.0,24.62,-0.3,28.69,0.03,26.34,-0.35 -1992-11-01,21.49,-0.1,24.79,-0.19,28.7,0.07,26.51,-0.14 -1992-12-01,22.48,-0.31,25.01,-0.13,28.76,0.27,26.73,0.16 -1993-01-01,24.43,-0.03,25.56,-0.07,28.6,0.3,26.69,0.12 -1993-02-01,26.49,0.42,26.61,0.24,28.41,0.31,26.97,0.25 -1993-03-01,27.17,0.65,27.54,0.4,28.6,0.41,27.66,0.44 -1993-04-01,26.44,0.97,28.45,0.95,28.93,0.43,28.59,0.81 -1993-05-01,25.15,0.95,28.16,1.08,29.13,0.34,28.82,0.97 -1993-06-01,23.76,0.94,27.11,0.68,29.17,0.33,28.28,0.63 -1993-07-01,22.06,0.46,25.77,0.15,29.2,0.4,27.55,0.33 -1993-08-01,21.05,0.4,24.93,-0.06,28.94,0.26,26.84,0.02 -1993-09-01,20.83,0.47,24.97,0.12,29.07,0.38,26.92,0.2 -1993-10-01,20.99,0.17,25.21,0.29,28.9,0.24,26.93,0.24 -1993-11-01,21.64,0.05,25.17,0.19,28.97,0.34,26.91,0.26 -1993-12-01,22.75,-0.04,25.32,0.18,28.9,0.41,26.76,0.19 -1994-01-01,24.32,-0.14,25.71,0.08,28.47,0.17,26.6,0.03 -1994-02-01,25.79,-0.28,26.07,-0.3,28.07,-0.03,26.59,-0.13 -1994-03-01,25.43,-1.09,26.89,-0.25,28.26,0.07,27.27,0.05 -1994-04-01,24.32,-1.15,27.06,-0.44,28.62,0.12,27.9,0.12 -1994-05-01,23.22,-0.98,26.97,-0.11,29.0,0.21,28.04,0.19 -1994-06-01,22.43,-0.39,26.5,0.07,29.18,0.34,27.99,0.34 -1994-07-01,21.21,-0.39,25.19,-0.43,29.4,0.6,27.35,0.13 -1994-08-01,19.7,-0.95,24.71,-0.28,29.46,0.78,27.35,0.53 -1994-09-01,20.16,-0.2,24.81,-0.04,29.23,0.54,27.0,0.28 -1994-10-01,21.53,0.71,25.53,0.61,29.45,0.79,27.49,0.8 -1994-11-01,22.41,0.82,25.87,0.89,29.63,1.0,27.87,1.22 -1994-12-01,23.61,0.82,26.07,0.93,29.5,1.01,27.87,1.3 -1995-01-01,25.33,0.87,26.34,0.71,29.2,0.9,27.55,0.98 -1995-02-01,26.43,0.36,26.87,0.5,29.01,0.91,27.45,0.73 -1995-03-01,26.12,-0.4,27.08,-0.06,28.96,0.77,27.63,0.41 -1995-04-01,24.47,-1.0,27.1,-0.4,28.89,0.39,27.93,0.15 -1995-05-01,23.1,-1.1,26.4,-0.68,29.15,0.36,27.73,-0.12 -1995-06-01,22.45,-0.37,26.2,-0.23,29.01,0.17,27.59,-0.06 -1995-07-01,21.23,-0.37,25.42,-0.2,28.78,-0.02,27.01,-0.21 -1995-08-01,20.01,-0.64,24.33,-0.66,28.43,-0.25,26.33,-0.49 -1995-09-01,20.17,-0.19,24.02,-0.83,28.25,-0.44,25.96,-0.76 -1995-10-01,20.15,-0.67,24.01,-0.91,28.07,-0.59,25.67,-1.02 -1995-11-01,21.2,-0.39,24.03,-0.95,27.97,-0.66,25.66,-0.99 -1995-12-01,22.02,-0.77,24.19,-0.95,28.07,-0.42,25.57,-1.0 -1996-01-01,23.84,-0.62,24.96,-0.67,27.92,-0.38,25.74,-0.83 -1996-02-01,25.71,-0.36,25.72,-0.65,27.57,-0.53,25.85,-0.87 -1996-03-01,26.09,-0.43,26.71,-0.43,27.71,-0.48,26.62,-0.6 -1996-04-01,23.85,-1.62,26.72,-0.78,28.07,-0.43,27.36,-0.42 -1996-05-01,22.89,-1.31,26.33,-0.75,28.43,-0.36,27.37,-0.48 -1996-06-01,21.56,-1.26,25.89,-0.54,28.55,-0.29,27.32,-0.33 -1996-07-01,20.02,-1.58,25.35,-0.27,28.5,-0.3,27.09,-0.13 -1996-08-01,19.53,-1.12,24.6,-0.39,28.54,-0.14,26.56,-0.26 -1996-09-01,19.24,-1.12,24.37,-0.48,28.43,-0.26,26.35,-0.37 -1996-10-01,19.95,-0.87,24.37,-0.55,28.42,-0.24,26.24,-0.45 -1996-11-01,20.26,-1.33,24.38,-0.6,28.33,-0.3,26.19,-0.46 -1996-12-01,21.61,-1.18,24.2,-0.94,28.44,-0.05,26.02,-0.55 -1997-01-01,23.67,-0.79,24.7,-0.93,28.41,0.11,25.96,-0.61 -1997-02-01,25.74,-0.33,25.75,-0.62,28.33,0.23,26.36,-0.36 -1997-03-01,26.95,0.43,26.98,-0.16,28.52,0.33,27.03,-0.19 -1997-04-01,26.64,1.17,27.59,0.09,29.32,0.82,28.03,0.25 -1997-05-01,26.71,2.51,28.06,0.98,29.45,0.66,28.6,0.75 -1997-06-01,26.27,3.45,28.14,1.71,29.4,0.56,28.94,1.29 -1997-07-01,25.59,3.99,28.01,2.39,29.5,0.7,28.92,1.7 -1997-08-01,24.8,4.15,27.84,2.85,29.26,0.58,28.84,2.02 -1997-09-01,24.4,4.04,27.84,2.99,29.32,0.63,28.93,2.21 -1997-10-01,24.58,3.76,28.17,3.25,29.32,0.66,29.23,2.54 -1997-11-01,25.63,4.04,28.55,3.57,29.49,0.86,29.32,2.67 -1997-12-01,26.92,4.13,28.76,3.62,29.32,0.83,29.26,2.69 -1998-01-01,28.22,3.76,28.94,3.31,29.01,0.71,29.1,2.53 -1998-02-01,28.98,2.91,28.93,2.56,28.87,0.77,28.86,2.14 -1998-03-01,29.15,2.63,29.14,2.0,28.65,0.46,28.67,1.45 -1998-04-01,28.61,3.14,29.09,1.59,28.53,0.03,28.56,0.78 -1998-05-01,27.69,3.49,28.17,1.09,28.71,-0.08,28.47,0.62 -1998-06-01,25.18,2.36,26.0,-0.43,28.61,-0.23,26.72,-0.93 -1998-07-01,23.43,1.83,25.24,-0.38,28.07,-0.73,25.94,-1.28 -1998-08-01,21.77,1.12,24.63,-0.36,27.77,-0.91,25.49,-1.33 -1998-09-01,20.87,0.51,24.19,-0.66,27.88,-0.81,25.61,-1.11 -1998-10-01,21.16,0.34,24.06,-0.86,27.33,-1.33,25.34,-1.35 -1998-11-01,21.43,-0.16,24.11,-0.87,27.23,-1.4,25.18,-1.47 -1998-12-01,22.56,-0.23,23.86,-1.28,27.11,-1.38,24.79,-1.78 -1999-01-01,23.73,-0.73,24.41,-1.22,26.59,-1.71,24.9,-1.67 -1999-02-01,25.64,-0.43,25.57,-0.8,26.52,-1.58,25.41,-1.31 -1999-03-01,26.62,0.1,26.67,-0.47,26.9,-1.29,26.25,-0.97 -1999-04-01,24.3,-1.17,26.66,-0.84,27.35,-1.15,26.84,-0.94 -1999-05-01,23.46,-0.74,26.44,-0.64,27.87,-0.92,26.97,-0.88 -1999-06-01,21.83,-0.99,25.59,-0.84,28.01,-0.83,26.6,-1.05 -1999-07-01,20.44,-1.16,24.85,-0.77,27.92,-0.88,26.35,-0.87 -1999-08-01,19.75,-0.9,24.02,-0.97,27.73,-0.95,25.59,-1.23 -1999-09-01,19.23,-1.13,23.72,-1.13,27.82,-0.87,25.71,-1.01 -1999-10-01,20.05,-0.77,23.75,-1.17,27.85,-0.81,25.64,-1.05 -1999-11-01,20.51,-1.08,23.46,-1.52,27.56,-1.07,25.12,-1.53 -1999-12-01,21.72,-1.07,23.54,-1.6,27.23,-1.26,24.9,-1.67 -2000-01-01,23.86,-0.6,23.88,-1.75,26.96,-1.34,24.65,-1.92 -2000-02-01,25.71,-0.36,25.31,-1.06,26.66,-1.44,25.19,-1.53 -2000-03-01,26.19,-0.33,26.61,-0.53,26.76,-1.43,26.08,-1.14 -2000-04-01,25.84,0.37,27.46,-0.04,27.37,-1.13,27.01,-0.77 -2000-05-01,24.1,-0.1,26.8,-0.28,27.81,-0.98,27.12,-0.73 -2000-06-01,22.25,-0.57,25.84,-0.59,28.11,-0.73,27.03,-0.62 -2000-07-01,20.59,-1.01,25.13,-0.49,28.2,-0.6,26.72,-0.5 -2000-08-01,20.1,-0.55,24.47,-0.52,28.32,-0.36,26.45,-0.37 -2000-09-01,19.94,-0.42,24.35,-0.5,28.44,-0.25,26.21,-0.51 -2000-10-01,20.37,-0.45,24.41,-0.51,28.17,-0.49,25.96,-0.73 -2000-11-01,20.6,-0.99,24.17,-0.81,28.09,-0.54,25.78,-0.87 -2000-12-01,22.22,-0.57,24.43,-0.71,27.6,-0.89,25.59,-0.98 -2001-01-01,23.88,-0.58,24.99,-0.64,27.5,-0.8,25.74,-0.83 -2001-02-01,25.91,-0.16,26.06,-0.31,27.27,-0.83,26.11,-0.61 -2001-03-01,27.44,0.92,27.23,0.09,27.62,-0.57,26.84,-0.38 -2001-04-01,26.69,1.22,27.52,0.02,28.19,-0.31,27.52,-0.26 -2001-05-01,23.77,-0.43,26.89,-0.19,28.64,-0.15,27.6,-0.25 -2001-06-01,21.74,-1.08,26.35,-0.08,28.83,-0.01,27.68,0.03 -2001-07-01,20.88,-0.72,25.43,-0.19,29.06,0.26,27.32,0.1 -2001-08-01,19.9,-0.75,24.72,-0.27,28.96,0.28,26.87,0.05 -2001-09-01,19.39,-0.97,24.27,-0.58,29.14,0.45,26.55,-0.17 -2001-10-01,19.52,-1.3,24.45,-0.47,29.01,0.35,26.59,-0.1 -2001-11-01,20.49,-1.1,24.35,-0.63,28.96,0.33,26.45,-0.2 -2001-12-01,21.96,-0.83,24.6,-0.54,28.6,0.11,26.17,-0.4 -2002-01-01,23.64,-0.82,25.09,-0.54,28.81,0.51,26.5,-0.07 -2002-02-01,26.06,-0.01,26.21,-0.16,28.76,0.66,26.95,0.23 -2002-03-01,27.53,1.01,27.22,0.08,28.68,0.49,27.32,0.1 -2002-04-01,26.53,1.06,27.56,0.06,29.09,0.59,27.94,0.16 -2002-05-01,24.8,0.6,27.24,0.16,29.45,0.66,28.15,0.3 -2002-06-01,22.67,-0.15,27.06,0.63,29.63,0.79,28.43,0.78 -2002-07-01,21.01,-0.59,26.03,0.41,29.49,0.69,27.98,0.76 -2002-08-01,19.94,-0.71,25.47,0.48,29.4,0.72,27.79,0.97 -2002-09-01,19.89,-0.47,25.54,0.69,29.44,0.75,27.83,1.11 -2002-10-01,21.16,0.34,25.85,0.93,29.56,0.9,28.05,1.36 -2002-11-01,22.25,0.66,26.37,1.39,29.83,1.2,28.27,1.62 -2002-12-01,23.44,0.65,26.48,1.34,29.49,1.0,28.09,1.52 -2003-01-01,24.38,-0.08,26.38,0.75,29.25,0.95,27.76,1.19 -2003-02-01,25.81,-0.26,26.7,0.33,29.03,0.93,27.49,0.77 -2003-03-01,25.97,-0.55,27.28,0.14,29.03,0.84,27.81,0.59 -2003-04-01,24.44,-1.03,27.15,-0.35,28.96,0.46,27.81,0.03 -2003-05-01,22.49,-1.71,26.14,-0.94,28.92,0.13,27.37,-0.48 -2003-06-01,21.58,-1.24,25.83,-0.6,29.09,0.25,27.48,-0.17 -2003-07-01,20.75,-0.85,25.75,0.13,29.11,0.31,27.43,0.21 -2003-08-01,20.14,-0.51,25.04,0.05,29.05,0.37,26.85,0.03 -2003-09-01,20.0,-0.36,24.97,0.12,29.02,0.33,26.96,0.24 -2003-10-01,20.99,0.17,25.33,0.41,29.22,0.56,27.19,0.5 -2003-11-01,21.92,0.33,25.4,0.42,29.31,0.68,27.05,0.4 -2003-12-01,22.99,0.2,25.56,0.42,29.02,0.53,26.89,0.32 -2004-01-01,24.6,0.14,25.92,0.29,28.83,0.53,26.74,0.17 -2004-02-01,25.81,-0.26,26.46,0.09,28.59,0.49,26.86,0.14 -2004-03-01,25.94,-0.58,27.16,0.02,28.43,0.24,27.1,-0.12 -2004-04-01,25.32,-0.15,27.37,-0.13,28.75,0.25,27.84,0.06 -2004-05-01,23.05,-1.15,26.72,-0.36,29.16,0.37,28.06,0.21 -2004-06-01,21.6,-1.22,26.27,-0.16,29.17,0.33,27.76,0.11 -2004-07-01,20.71,-0.89,25.41,-0.21,29.39,0.59,27.69,0.47 -2004-08-01,19.62,-1.03,25.05,0.06,29.31,0.63,27.54,0.72 -2004-09-01,20.07,-0.29,25.17,0.32,29.6,0.91,27.47,0.75 -2004-10-01,20.92,0.1,25.32,0.4,29.55,0.89,27.38,0.69 -2004-11-01,21.96,0.37,25.46,0.48,29.57,0.94,27.31,0.66 -2004-12-01,22.94,0.15,25.77,0.63,29.4,0.91,27.31,0.74 -2005-01-01,24.47,0.01,25.89,0.26,29.21,0.91,27.1,0.53 -2005-02-01,25.49,-0.58,26.2,-0.17,28.83,0.73,26.96,0.24 -2005-03-01,25.6,-0.92,27.01,-0.13,28.91,0.72,27.55,0.33 -2005-04-01,24.9,-0.57,27.77,0.27,28.96,0.46,28.07,0.29 -2005-05-01,24.4,0.2,27.48,0.4,29.18,0.39,28.2,0.35 -2005-06-01,22.47,-0.35,26.81,0.38,29.18,0.34,28.05,0.4 -2005-07-01,21.18,-0.42,25.93,0.31,29.05,0.25,27.47,0.25 -2005-08-01,20.61,-0.04,25.19,0.2,28.86,0.18,26.88,0.06 -2005-09-01,19.71,-0.65,24.57,-0.28,28.84,0.15,26.63,-0.09 -2005-10-01,19.72,-1.1,24.69,-0.23,28.89,0.23,26.75,0.06 -2005-11-01,20.62,-0.97,24.28,-0.7,28.67,0.04,26.34,-0.31 -2005-12-01,22.29,-0.5,24.28,-0.86,28.35,-0.14,25.89,-0.68 -2006-01-01,24.33,-0.13,25.0,-0.63,27.68,-0.62,25.64,-0.93 -2006-02-01,26.46,0.39,26.08,-0.29,27.39,-0.71,26.08,-0.64 -2006-03-01,26.77,0.25,26.54,-0.6,27.79,-0.4,26.57,-0.65 -2006-04-01,24.15,-1.32,27.25,-0.25,28.38,-0.12,27.59,-0.19 -2006-05-01,23.86,-0.34,27.04,-0.04,28.91,0.12,27.91,0.06 -2006-06-01,22.77,-0.05,26.44,0.01,29.15,0.31,27.85,0.2 -2006-07-01,22.19,0.59,25.8,0.18,29.07,0.27,27.35,0.13 -2006-08-01,21.59,0.94,25.45,0.46,29.22,0.54,27.22,0.4 -2006-09-01,21.43,1.07,25.74,0.89,29.4,0.71,27.34,0.62 -2006-10-01,22.22,1.4,25.96,1.04,29.44,0.78,27.47,0.78 -2006-11-01,22.69,1.1,26.07,1.09,29.63,1.0,27.73,1.08 -2006-12-01,23.45,0.66,26.36,1.22,29.47,0.98,27.76,1.19 -2007-01-01,24.99,0.53,26.5,0.87,28.93,0.63,27.26,0.69 -2007-02-01,26.24,0.17,26.45,0.08,28.62,0.52,26.81,0.09 -2007-03-01,25.74,-0.78,26.79,-0.35,28.57,0.38,27.18,-0.04 -2007-04-01,24.3,-1.17,27.13,-0.37,28.7,0.2,27.78,0.0 -2007-05-01,22.73,-1.47,26.35,-0.73,28.86,0.07,27.57,-0.28 -2007-06-01,21.59,-1.23,25.83,-0.6,28.98,0.14,27.55,-0.1 -2007-07-01,20.27,-1.33,24.79,-0.83,28.81,0.01,26.79,-0.43 -2007-08-01,19.16,-1.49,23.86,-1.13,28.58,-0.1,26.2,-0.62 -2007-09-01,18.57,-1.79,23.52,-1.33,28.12,-0.57,25.77,-0.95 -2007-10-01,18.8,-2.02,23.36,-1.56,27.86,-0.8,25.22,-1.47 -2007-11-01,19.49,-2.1,23.17,-1.81,27.42,-1.21,25.06,-1.59 -2007-12-01,21.02,-1.77,23.59,-1.55,27.3,-1.19,24.97,-1.6 -2008-01-01,23.86,-0.6,24.13,-1.5,26.62,-1.68,24.71,-1.86 -2008-02-01,26.32,0.25,25.05,-1.32,26.43,-1.67,24.83,-1.89 -2008-03-01,27.3,0.78,26.56,-0.58,26.84,-1.35,26.07,-1.15 -2008-04-01,25.89,0.42,27.18,-0.32,27.44,-1.06,26.83,-0.95 -2008-05-01,24.41,0.21,27.08,0.0,27.9,-0.89,27.18,-0.67 -2008-06-01,23.55,0.73,26.53,0.1,28.08,-0.76,27.17,-0.48 -2008-07-01,22.63,1.03,26.12,0.5,28.25,-0.55,27.19,-0.03 -2008-08-01,21.79,1.14,25.63,0.64,28.18,-0.5,26.85,0.03 -2008-09-01,21.19,0.83,25.09,0.24,28.14,-0.55,26.44,-0.28 -2008-10-01,20.75,-0.07,24.79,-0.13,28.29,-0.37,26.33,-0.36 -2008-11-01,21.44,-0.15,24.75,-0.23,28.08,-0.55,26.3,-0.35 -2008-12-01,22.43,-0.36,24.6,-0.54,27.72,-0.77,25.74,-0.83 -2009-01-01,24.42,-0.1,25.03,-0.6,27.42,-0.88,25.54,-1.03 -2009-02-01,26.03,-0.11,25.85,-0.52,27.37,-0.73,26.04,-0.68 -2009-03-01,26.38,-0.26,26.44,-0.7,27.79,-0.4,26.67,-0.55 -2009-04-01,25.98,0.37,27.39,-0.11,28.37,-0.13,27.5,-0.27 -2009-05-01,24.83,0.56,27.4,0.32,28.99,0.2,28.03,0.18 -2009-06-01,23.73,0.85,27.12,0.69,29.2,0.36,28.11,0.47 -2009-07-01,22.63,1.02,26.56,0.94,29.21,0.4,27.94,0.72 -2009-08-01,21.64,1.0,25.94,0.95,29.21,0.53,27.53,0.71 -2009-09-01,20.82,0.47,25.66,0.8,29.28,0.58,27.47,0.75 -2009-10-01,20.96,0.17,25.73,0.81,29.65,0.99,27.63,0.94 -2009-11-01,22.11,0.51,26.23,1.26,29.88,1.25,28.19,1.54 -2009-12-01,23.16,0.35,26.67,1.53,29.67,1.18,28.3,1.72 -2010-01-01,24.82,0.3,26.63,1.0,29.51,1.21,28.07,1.5 -2010-02-01,26.08,-0.06,27.12,0.75,29.1,1.0,27.94,1.22 -2010-03-01,26.24,-0.4,27.73,0.6,29.21,1.02,28.29,1.08 -2010-04-01,26.05,0.45,28.05,0.55,29.25,0.74,28.36,0.59 -2010-05-01,24.28,0.0,26.97,-0.11,29.03,0.24,27.68,-0.17 -2010-06-01,22.6,-0.27,25.75,-0.68,28.64,-0.21,27.0,-0.65 -2010-07-01,20.08,-1.54,24.53,-1.09,28.09,-0.71,26.09,-1.13 -2010-08-01,19.27,-1.37,23.87,-1.12,27.47,-1.2,25.5,-1.32 -2010-09-01,18.9,-1.44,23.59,-1.26,27.13,-1.56,25.07,-1.65 -2010-10-01,19.06,-1.73,23.25,-1.66,27.06,-1.6,25.01,-1.68 -2010-11-01,20.03,-1.56,23.4,-1.58,27.07,-1.57,25.07,-1.58 -2010-12-01,21.48,-1.34,23.5,-1.64,26.89,-1.6,24.95,-1.62 -2011-01-01,24.08,-0.44,24.31,-1.32,26.72,-1.58,24.93,-1.64 -2011-02-01,26.22,0.08,25.55,-0.82,26.95,-1.15,25.46,-1.27 -2011-03-01,26.21,-0.43,26.39,-0.75,27.42,-0.77,26.23,-0.98 -2011-04-01,25.76,0.16,27.18,-0.32,27.86,-0.64,27.02,-0.76 -2011-05-01,24.89,0.62,26.94,-0.14,28.28,-0.51,27.42,-0.43 -2011-06-01,23.72,0.85,26.54,0.1,28.47,-0.37,27.46,-0.18 -2011-07-01,22.07,0.45,25.61,-0.01,28.47,-0.33,26.96,-0.26 -2011-08-01,20.64,0.0,24.58,-0.42,28.32,-0.36,26.19,-0.64 -2011-09-01,19.75,-0.59,24.22,-0.63,28.05,-0.64,25.98,-0.74 -2011-10-01,20.19,-0.6,23.97,-0.95,27.94,-0.72,25.72,-0.97 -2011-11-01,20.79,-0.8,23.89,-1.09,27.87,-0.77,25.6,-1.05 -2011-12-01,21.85,-0.96,24.2,-0.94,27.39,-1.1,25.53,-1.04 -2012-01-01,23.88,-0.64,24.9,-0.73,27.09,-1.21,25.49,-1.08 -2012-02-01,26.3,0.16,26.19,-0.18,27.2,-0.9,26.03,-0.69 -2012-03-01,26.91,0.27,26.92,-0.21,27.53,-0.66,26.63,-0.58 -2012-04-01,26.9,1.3,27.58,0.08,28.16,-0.34,27.38,-0.39 -2012-05-01,25.48,1.2,27.23,0.15,28.53,-0.26,27.8,-0.05 -2012-06-01,24.47,1.59,27.09,0.66,28.73,-0.11,27.95,0.31 -2012-07-01,22.61,0.99,26.54,0.92,28.86,0.06,27.75,0.53 -2012-08-01,20.99,0.35,25.72,0.73,29.1,0.42,27.55,0.73 -2012-09-01,20.83,0.49,25.28,0.43,29.12,0.43,27.24,0.51 -2012-10-01,20.68,-0.11,24.93,0.01,29.16,0.5,26.98,0.29 -2012-11-01,21.21,-0.38,25.11,0.14,29.17,0.54,27.01,0.36 -2012-12-01,22.13,-0.68,24.91,-0.23,28.71,0.23,26.46,-0.11 -2013-01-01,24.0,-0.52,25.06,-0.57,28.28,-0.02,26.16,-0.41 -2013-02-01,25.74,-0.41,25.9,-0.46,28.06,-0.04,26.32,-0.4 -2013-03-01,26.71,0.07,27.21,0.07,27.95,-0.24,27.0,-0.22 -2013-04-01,24.74,-0.86,27.35,-0.15,28.47,-0.03,27.68,-0.1 -2013-05-01,22.89,-1.38,26.39,-0.69,28.71,-0.08,27.57,-0.27 -2013-06-01,21.48,-1.4,25.8,-0.64,28.76,-0.08,27.43,-0.21 -2013-07-01,20.29,-1.33,24.97,-0.66,28.76,-0.04,26.91,-0.31 -2013-08-01,19.66,-0.98,24.44,-0.55,28.71,0.03,26.54,-0.28 -2013-09-01,19.78,-0.57,24.72,-0.13,28.7,0.01,26.65,-0.07 -2013-10-01,20.16,-0.63,24.7,-0.21,28.7,0.04,26.36,-0.33 -2013-11-01,21.06,-0.54,24.81,-0.17,28.91,0.27,26.65,0.01 -2013-12-01,22.61,-0.2,25.1,-0.04,28.64,0.15,26.53,-0.04 -2014-01-01,24.79,0.27,25.26,-0.37,28.14,-0.17,26.06,-0.51 -2014-02-01,25.4,-0.75,25.56,-0.81,28.37,0.27,26.18,-0.55 -2014-03-01,25.86,-0.78,26.9,-0.24,28.71,0.52,26.99,-0.22 -2014-04-01,25.23,-0.37,27.73,0.23,29.13,0.63,28.01,0.24 -2014-05-01,25.57,1.3,27.69,0.61,29.56,0.77,28.31,0.46 -2014-06-01,24.51,1.64,27.32,0.89,29.43,0.59,28.11,0.46 -2014-07-01,22.98,1.36,26.27,0.65,29.09,0.29,27.4,0.18 -2014-08-01,21.91,1.27,25.51,0.52,29.14,0.46,27.02,0.2 -2014-09-01,21.3,0.96,25.31,0.45,29.34,0.65,27.17,0.45 -2014-10-01,21.54,0.75,25.58,0.66,29.31,0.64,27.17,0.49 -2014-11-01,22.33,0.74,25.88,0.91,29.52,0.88,27.5,0.85 -2014-12-01,22.9,0.08,25.94,0.8,29.4,0.91,27.35,0.78 -2015-01-01,24.13,-0.39,25.99,0.36,29.16,0.86,27.1,0.53 -2015-02-01,25.59,-0.55,26.55,0.18,29.12,1.02,27.29,0.56 -2015-03-01,26.69,0.06,27.29,0.15,29.32,1.13,27.79,0.58 -2015-04-01,26.95,1.35,28.17,0.67,29.73,1.23,28.56,0.78 -2015-05-01,26.71,2.43,28.28,1.19,29.88,1.09,28.88,1.03 -2015-06-01,25.42,2.54,28.1,1.66,29.93,1.09,28.96,1.32 -2015-07-01,24.48,2.87,27.79,2.17,29.8,1.0,28.82,1.6 -2015-08-01,22.88,2.24,27.33,2.34,29.66,0.98,28.89,2.07 -2015-09-01,22.91,2.57,27.48,2.63,29.73,1.04,29.0,2.28 -2015-10-01,23.31,2.52,27.58,2.66,29.79,1.12,29.15,2.46 -2015-11-01,23.83,2.24,27.91,2.93,30.3,1.67,29.6,2.95 -2015-12-01,25.01,2.19,27.99,2.85,30.11,1.63,29.39,2.82 -2016-01-01,25.93,1.41,28.21,2.58,29.65,1.35,29.17,2.6 -2016-02-01,26.81,0.67,28.36,1.99,29.55,1.45,29.12,2.4 -2016-03-01,27.57,0.93,28.7,1.57,29.53,1.34,28.9,1.68 -2016-04-01,25.83,0.23,28.34,0.84,29.39,0.89,28.87,1.09 -2016-05-01,24.55,0.27,27.11,0.03,29.39,0.6,28.15,0.3 -2016-06-01,23.17,0.29,26.31,-0.12,29.36,0.52,27.53,-0.12 -2016-07-01,21.79,0.17,25.14,-0.48,29.06,0.26,26.73,-0.49 -2016-08-01,21.03,0.39,24.53,-0.46,28.68,-0.0,26.28,-0.54 -2016-09-01,20.87,0.53,24.67,-0.18,28.48,-0.21,26.11,-0.61 -2016-10-01,21.18,0.39,24.47,-0.45,28.26,-0.4,25.96,-0.73 -2016-11-01,21.68,0.09,24.58,-0.4,28.27,-0.37,26.1,-0.55 -2016-12-01,23.35,0.53,24.78,-0.36,28.35,-0.14,26.16,-0.41 -2017-01-01,25.75,1.23,25.61,-0.02,28.18,-0.12,26.25,-0.32 -2017-02-01,27.76,1.62,27.0,0.63,28.03,-0.07,26.87,0.14 -2017-03-01,28.52,1.89,27.7,0.57,28.13,-0.06,27.34,0.13 -2017-04-01,26.53,0.93,28.09,0.59,28.65,0.15,28.1,0.32 -2017-05-01,25.06,0.78,27.6,0.51,29.08,0.29,28.3,0.46 -2017-06-01,22.98,0.1,26.73,0.3,29.39,0.55,28.19,0.55 -2017-07-01,21.54,-0.07,25.85,0.23,29.21,0.4,27.61,0.39 -2017-08-01,20.19,-0.45,24.82,-0.17,28.87,0.19,26.67,-0.15 -2017-09-01,19.67,-0.67,24.17,-0.68,28.69,0.0,26.29,-0.43 -2017-10-01,19.45,-1.34,24.28,-0.64,28.55,-0.11,26.23,-0.46 -2017-11-01,20.44,-1.15,23.92,-1.05,28.46,-0.18,25.79,-0.86 -2017-12-01,21.44,-1.38,24.05,-1.09,28.24,-0.25,25.8,-0.77 -2018-01-01,23.71,-0.81,24.48,-1.14,28.03,-0.27,25.82,-0.75 -2018-02-01,25.57,-0.57,25.36,-1.01,27.86,-0.24,25.83,-0.9 -2018-03-01,25.83,-0.8,26.37,-0.76,28.14,-0.05,26.48,-0.73 -2018-04-01,24.58,-1.02,27.12,-0.38,28.63,0.12,27.42,-0.36 -2018-05-01,23.73,-0.54,26.94,-0.15,29.01,0.22,27.72,-0.13 -2018-06-01,22.19,-0.69,26.72,0.29,29.16,0.32,27.85,0.2 -2018-07-01,21.43,-0.19,26.05,0.43,29.1,0.3,27.52,0.3 -2018-08-01,20.66,0.02,25.14,0.15,29.19,0.51,27.11,0.29 -2018-09-01,20.31,-0.03,25.2,0.35,29.17,0.48,27.1,0.38 -2018-10-01,21.23,0.43,25.78,0.86,29.61,0.95,27.55,0.86 -2018-11-01,22.27,0.68,26.02,1.05,29.59,0.95,27.64,0.99 -2018-12-01,23.6,0.78,26.12,0.98,29.52,1.03,27.53,0.96 -2019-01-01,25.1,0.57,26.17,0.55,29.0,0.65,27.08,0.52 -2019-02-01,26.45,0.24,26.91,0.55,29.06,0.86,27.41,0.68 -2019-03-01,26.8,0.07,27.89,0.71,29.1,0.77,28.22,0.95 -2019-04-01,25.68,-0.01,28.17,0.56,29.24,0.56,28.6,0.71 -2019-05-01,24.38,-0.08,27.69,0.51,29.58,0.63,28.57,0.62 -2019-06-01,22.62,-0.38,26.81,0.27,29.62,0.6,28.24,0.47 -2019-07-01,21.34,-0.33,25.68,-0.07,29.73,0.77,27.63,0.3 -2019-08-01,20.2,-0.46,24.89,-0.15,29.5,0.68,26.97,0.1 -2019-09-01,19.5,-0.83,24.61,-0.23,29.33,0.55,26.7,-0.03 -2019-10-01,20.02,-0.71,25.12,0.17,29.64,0.88,27.31,0.59 -2019-11-01,21.32,-0.22,25.46,0.41,29.47,0.7,27.26,0.51 -2019-12-01,23.16,0.4,25.47,0.26,29.5,0.91,27.07,0.43 -2020-01-01,24.55,0.02,25.81,0.2,29.28,0.93,27.09,0.53 -2020-02-01,26.56,0.35,26.61,0.24,29.17,0.98,27.14,0.41 -2020-03-01,27.11,0.38,27.43,0.24,29.22,0.89,27.82,0.55 -2020-04-01,26.0,0.32,28.01,0.4,29.29,0.61,28.32,0.44 -2020-05-01,24.24,-0.22,26.82,-0.36,28.94,-0.01,27.59,-0.36 -2020-06-01,22.13,-0.87,25.75,-0.79,29.07,0.05,27.3,-0.47 -2020-07-01,20.44,-1.23,25.08,-0.66,28.83,-0.13,26.89,-0.44 -2020-08-01,19.69,-0.97,24.42,-0.62,28.47,-0.35,26.18,-0.69 -2020-09-01,19.48,-0.85,23.58,-1.26,28.29,-0.49,25.77,-0.96 -2020-10-01,19.67,-1.07,23.61,-1.34,27.89,-0.87,25.3,-1.42 -2020-11-01,20.94,-0.61,23.82,-1.23,27.91,-0.86,25.34,-1.42 -2020-12-01,22.16,-0.6,24.38,-0.83,27.65,-0.95,25.53,-1.12 -2021-01-01,23.89,-0.64,25.06,-0.55,27.1,-1.25,25.58,-0.99 -2021-02-01,25.55,-0.66,25.8,-0.57,27.2,-1.0,25.81,-0.92 -2021-03-01,26.48,-0.26,26.8,-0.39,27.79,-0.55,26.75,-0.51 -2021-04-01,24.89,-0.8,26.96,-0.65,28.47,-0.21,27.4,-0.49 diff --git a/core/pandas/pandas_fullNotebook.ipynb b/core/pandas/pandas_fullNotebook.ipynb index 1781edbdc..666e1c0c4 100644 --- a/core/pandas/pandas_fullNotebook.ipynb +++ b/core/pandas/pandas_fullNotebook.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "1d7850d7", + "id": "9f59d3f1", "metadata": {}, "source": [ "
\"pandas
\n", @@ -24,7 +24,7 @@ }, { "cell_type": "markdown", - "id": "449d3086-2fa1-4520-a390-8ba043db7258", + "id": "b8627bb7", "metadata": {}, "source": [ "
\n", @@ -33,17 +33,18 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "0912eaec", + "execution_count": null, + "id": "daf58736", "metadata": {}, "outputs": [], "source": [ - "import pandas as pd" + "import pandas as pd\n", + "from pythia_datasets import DATASETS # Project Pythia's custom store of example data" ] }, { "cell_type": "markdown", - "id": "85f7c6a5", + "id": "dab3da7f", "metadata": {}, "source": [ "## The pandas [`DataFrame`](https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe)...\n", @@ -56,19 +57,47 @@ "Let's take a look by reading in some `.csv` data, which comes from the NCDC teleconnections database, including various El Niño Southern Oscillation (ENSO) indices! [[ref](https://www.ncdc.noaa.gov/teleconnections/enso/indicators/sst/)]." ] }, + { + "cell_type": "markdown", + "id": "1f2329c8", + "metadata": {}, + "source": [ + "
\n", + " Tip: Here we're getting the data from Project Pythia's custom library of example data, which we already imported above with from pythia_datasets import DATASETS. The DATASETS.fetch() method will automatically download and cache our example data file enso_data.csv locally.\n", + "
" + ] + }, { "cell_type": "code", - "execution_count": 2, - "id": "ed076336-6bb7-4008-ba1c-451f08b9b31f", + "execution_count": null, + "id": "0be820cd", "metadata": {}, "outputs": [], "source": [ - "df = pd.read_csv('enso_data.csv')" + "filepath = DATASETS.fetch('enso_data.csv')" ] }, { "cell_type": "markdown", - "id": "ecd8e8f4-2857-43e7-a6c3-8484f36e2d8f", + "id": "68316c6c", + "metadata": {}, + "source": [ + "Once we have a valid path to a data file that Pandas knows how to read, we can open it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e99652d5", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(filepath)" + ] + }, + { + "cell_type": "markdown", + "id": "ae9dcbbd", "metadata": {}, "source": [ "If we print out our dataframe, you will notice that is text based, which is okay, but not the \"best\" looking output" @@ -76,51 +105,17 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "fd65e146-f213-4156-859c-1f3b30c5ea24", + "execution_count": null, + "id": "25a23571", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " datetime Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom \\\n", - "0 1982-01-01 24.29 -0.17 25.87 0.24 28.30 0.00 \n", - "1 1982-02-01 25.49 -0.58 26.38 0.01 28.21 0.11 \n", - "2 1982-03-01 25.21 -1.31 26.98 -0.16 28.41 0.22 \n", - "3 1982-04-01 24.50 -0.97 27.68 0.18 28.92 0.42 \n", - "4 1982-05-01 23.97 -0.23 27.79 0.71 29.49 0.70 \n", - ".. ... ... ... ... ... ... ... \n", - "467 2020-12-01 22.16 -0.60 24.38 -0.83 27.65 -0.95 \n", - "468 2021-01-01 23.89 -0.64 25.06 -0.55 27.10 -1.25 \n", - "469 2021-02-01 25.55 -0.66 25.80 -0.57 27.20 -1.00 \n", - "470 2021-03-01 26.48 -0.26 26.80 -0.39 27.79 -0.55 \n", - "471 2021-04-01 24.89 -0.80 26.96 -0.65 28.47 -0.21 \n", - "\n", - " Nino34 Nino34anom \n", - "0 26.72 0.15 \n", - "1 26.70 -0.02 \n", - "2 27.20 -0.02 \n", - "3 28.02 0.24 \n", - "4 28.54 0.69 \n", - ".. ... ... \n", - "467 25.53 -1.12 \n", - "468 25.58 -0.99 \n", - "469 25.81 -0.92 \n", - "470 26.75 -0.51 \n", - "471 27.40 -0.49 \n", - "\n", - "[472 rows x 9 columns]\n" - ] - } - ], + "outputs": [], "source": [ "print(df)" ] }, { "cell_type": "markdown", - "id": "11e7d697-f5ae-4487-a74c-2406afcdfafb", + "id": "f22bb442", "metadata": {}, "source": [ "Instead, if we just use the pandas dataframe itself (without wrapping it in `print`), we have a nicely rendered table which is native to pandas and Jupyter Notebooks. See how much nicer that looks?" @@ -128,222 +123,17 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "4ff69abc", + "execution_count": null, + "id": "b8942e69", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
datetimeNino12Nino12anomNino3Nino3anomNino4Nino4anomNino34Nino34anom
01982-01-0124.29-0.1725.870.2428.300.0026.720.15
11982-02-0125.49-0.5826.380.0128.210.1126.70-0.02
21982-03-0125.21-1.3126.98-0.1628.410.2227.20-0.02
31982-04-0124.50-0.9727.680.1828.920.4228.020.24
41982-05-0123.97-0.2327.790.7129.490.7028.540.69
..............................
4672020-12-0122.16-0.6024.38-0.8327.65-0.9525.53-1.12
4682021-01-0123.89-0.6425.06-0.5527.10-1.2525.58-0.99
4692021-02-0125.55-0.6625.80-0.5727.20-1.0025.81-0.92
4702021-03-0126.48-0.2626.80-0.3927.79-0.5526.75-0.51
4712021-04-0124.89-0.8026.96-0.6528.47-0.2127.40-0.49
\n", - "

472 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " datetime Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom \\\n", - "0 1982-01-01 24.29 -0.17 25.87 0.24 28.30 0.00 \n", - "1 1982-02-01 25.49 -0.58 26.38 0.01 28.21 0.11 \n", - "2 1982-03-01 25.21 -1.31 26.98 -0.16 28.41 0.22 \n", - "3 1982-04-01 24.50 -0.97 27.68 0.18 28.92 0.42 \n", - "4 1982-05-01 23.97 -0.23 27.79 0.71 29.49 0.70 \n", - ".. ... ... ... ... ... ... ... \n", - "467 2020-12-01 22.16 -0.60 24.38 -0.83 27.65 -0.95 \n", - "468 2021-01-01 23.89 -0.64 25.06 -0.55 27.10 -1.25 \n", - "469 2021-02-01 25.55 -0.66 25.80 -0.57 27.20 -1.00 \n", - "470 2021-03-01 26.48 -0.26 26.80 -0.39 27.79 -0.55 \n", - "471 2021-04-01 24.89 -0.80 26.96 -0.65 28.47 -0.21 \n", - "\n", - " Nino34 Nino34anom \n", - "0 26.72 0.15 \n", - "1 26.70 -0.02 \n", - "2 27.20 -0.02 \n", - "3 28.02 0.24 \n", - "4 28.54 0.69 \n", - ".. ... ... \n", - "467 25.53 -1.12 \n", - "468 25.58 -0.99 \n", - "469 25.81 -0.92 \n", - "470 26.75 -0.51 \n", - "471 27.40 -0.49 \n", - "\n", - "[472 rows x 9 columns]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df" ] }, { "cell_type": "markdown", - "id": "03aa6062-ce17-4e9e-97e7-afd4930faabe", + "id": "377d4803", "metadata": {}, "source": [ "The `index` within pandas is essentially a list of the unique row IDs, which by default, is a list of sequential integers which start at 0" @@ -351,28 +141,17 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "36fff562", + "execution_count": null, + "id": "cde6999b", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "RangeIndex(start=0, stop=472, step=1)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.index" ] }, { "cell_type": "markdown", - "id": "407c2b57", + "id": "8af49ac9", "metadata": {}, "source": [ "Our indexing column isn't particularly helpful currently. Pandas is clever! A few optional keyword arguments later, and..." @@ -380,253 +159,29 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "a8b10c82", + "execution_count": null, + "id": "b4657f7e", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nino12Nino12anomNino3Nino3anomNino4Nino4anomNino34Nino34anom
datetime
1982-01-0124.29-0.1725.870.2428.300.0026.720.15
1982-02-0125.49-0.5826.380.0128.210.1126.70-0.02
1982-03-0125.21-1.3126.98-0.1628.410.2227.20-0.02
1982-04-0124.50-0.9727.680.1828.920.4228.020.24
1982-05-0123.97-0.2327.790.7129.490.7028.540.69
...........................
2020-12-0122.16-0.6024.38-0.8327.65-0.9525.53-1.12
2021-01-0123.89-0.6425.06-0.5527.10-1.2525.58-0.99
2021-02-0125.55-0.6625.80-0.5727.20-1.0025.81-0.92
2021-03-0126.48-0.2626.80-0.3927.79-0.5526.75-0.51
2021-04-0124.89-0.8026.96-0.6528.47-0.2127.40-0.49
\n", - "

472 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom Nino34 \\\n", - "datetime \n", - "1982-01-01 24.29 -0.17 25.87 0.24 28.30 0.00 26.72 \n", - "1982-02-01 25.49 -0.58 26.38 0.01 28.21 0.11 26.70 \n", - "1982-03-01 25.21 -1.31 26.98 -0.16 28.41 0.22 27.20 \n", - "1982-04-01 24.50 -0.97 27.68 0.18 28.92 0.42 28.02 \n", - "1982-05-01 23.97 -0.23 27.79 0.71 29.49 0.70 28.54 \n", - "... ... ... ... ... ... ... ... \n", - "2020-12-01 22.16 -0.60 24.38 -0.83 27.65 -0.95 25.53 \n", - "2021-01-01 23.89 -0.64 25.06 -0.55 27.10 -1.25 25.58 \n", - "2021-02-01 25.55 -0.66 25.80 -0.57 27.20 -1.00 25.81 \n", - "2021-03-01 26.48 -0.26 26.80 -0.39 27.79 -0.55 26.75 \n", - "2021-04-01 24.89 -0.80 26.96 -0.65 28.47 -0.21 27.40 \n", - "\n", - " Nino34anom \n", - "datetime \n", - "1982-01-01 0.15 \n", - "1982-02-01 -0.02 \n", - "1982-03-01 -0.02 \n", - "1982-04-01 0.24 \n", - "1982-05-01 0.69 \n", - "... ... \n", - "2020-12-01 -1.12 \n", - "2021-01-01 -0.99 \n", - "2021-02-01 -0.92 \n", - "2021-03-01 -0.51 \n", - "2021-04-01 -0.49 \n", - "\n", - "[472 rows x 8 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "df = pd.read_csv('enso_data.csv', index_col=0, parse_dates=True)\n", + "df = pd.read_csv(filepath, index_col=0, parse_dates=True)\n", "\n", "df" ] }, { "cell_type": "code", - "execution_count": 7, - "id": "d648b36a", + "execution_count": null, + "id": "b0d3ae28", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "DatetimeIndex(['1982-01-01', '1982-02-01', '1982-03-01', '1982-04-01',\n", - " '1982-05-01', '1982-06-01', '1982-07-01', '1982-08-01',\n", - " '1982-09-01', '1982-10-01',\n", - " ...\n", - " '2020-07-01', '2020-08-01', '2020-09-01', '2020-10-01',\n", - " '2020-11-01', '2020-12-01', '2021-01-01', '2021-02-01',\n", - " '2021-03-01', '2021-04-01'],\n", - " dtype='datetime64[ns]', name='datetime', length=472, freq=None)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.index" ] }, { "cell_type": "markdown", - "id": "1757f632", + "id": "8d26ed71", "metadata": {}, "source": [ "... now we have our data helpfully organized by a proper `datetime`-like object. Each of our multiple columns of data can now be referenced by their date! This sneak preview at the pandas `DatetimeIndex` also unlocks for us much of pandas most useful time series functionality. Don't worry, we'll get there. What are the actual columns of data we've read in here?" @@ -634,30 +189,17 @@ }, { "cell_type": "code", - "execution_count": 8, - "id": "33a95505", + "execution_count": null, + "id": "847347f8", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['Nino12', 'Nino12anom', 'Nino3', 'Nino3anom', 'Nino4', 'Nino4anom',\n", - " 'Nino34', 'Nino34anom'],\n", - " dtype='object')" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.columns" ] }, { "cell_type": "markdown", - "id": "c3ab938b", + "id": "08d3b2fb", "metadata": {}, "source": [ "## The pandas [`Series`](https://pandas.pydata.org/docs/user_guide/dsintro.html#series)...\n", @@ -671,40 +213,17 @@ }, { "cell_type": "code", - "execution_count": 9, - "id": "dc4d61cf", + "execution_count": null, + "id": "ee085815", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "1982-01-01 26.72\n", - "1982-02-01 26.70\n", - "1982-03-01 27.20\n", - "1982-04-01 28.02\n", - "1982-05-01 28.54\n", - " ... \n", - "2020-12-01 25.53\n", - "2021-01-01 25.58\n", - "2021-02-01 25.81\n", - "2021-03-01 26.75\n", - "2021-04-01 27.40\n", - "Name: Nino34, Length: 472, dtype: float64" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df[\"Nino34\"]" ] }, { "cell_type": "markdown", - "id": "2b73e16d-f921-48c4-91f7-6eb2c8bd7b08", + "id": "2fcc97fa", "metadata": {}, "source": [ "
\n", @@ -713,40 +232,17 @@ }, { "cell_type": "code", - "execution_count": 10, - "id": "c4849ee1", + "execution_count": null, + "id": "7d46cbb9", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "1982-01-01 26.72\n", - "1982-02-01 26.70\n", - "1982-03-01 27.20\n", - "1982-04-01 28.02\n", - "1982-05-01 28.54\n", - " ... \n", - "2020-12-01 25.53\n", - "2021-01-01 25.58\n", - "2021-02-01 25.81\n", - "2021-03-01 26.75\n", - "2021-04-01 27.40\n", - "Name: Nino34, Length: 472, dtype: float64" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.Nino34" ] }, { "cell_type": "markdown", - "id": "3bed7402", + "id": "c2a10249", "metadata": {}, "source": [ "## Slicing and Dicing the `DataFrame` and `Series`" @@ -754,7 +250,7 @@ }, { "cell_type": "markdown", - "id": "9b0bdcaa", + "id": "e38faac9", "metadata": {}, "source": [ "We will expand on what you just saw, soon! Importantly,\n", @@ -768,33 +264,10 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "bdb5ebff", + "execution_count": null, + "id": "ec9ed333", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "1982-01-01 26.72\n", - "1982-02-01 26.70\n", - "1982-03-01 27.20\n", - "1982-04-01 28.02\n", - "1982-05-01 28.54\n", - " ... \n", - "2020-12-01 25.53\n", - "2021-01-01 25.58\n", - "2021-02-01 25.81\n", - "2021-03-01 26.75\n", - "2021-04-01 27.40\n", - "Name: Nino34, Length: 472, dtype: float64" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nino34_series = df[\"Nino34\"]\n", "\n", @@ -803,7 +276,7 @@ }, { "cell_type": "markdown", - "id": "75bc2403", + "id": "c84a81b9", "metadata": {}, "source": [ "`Series` can be indexed, selected, and subset as both `ndarray`-like," @@ -811,28 +284,17 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "37d20e44", + "execution_count": null, + "id": "39bb0ae3", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "28.02" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nino34_series[3]" ] }, { "cell_type": "markdown", - "id": "6e7ac685", + "id": "a1a55a7c", "metadata": {}, "source": [ "and `dict`-like, using labels" @@ -840,28 +302,17 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "f64e5695", + "execution_count": null, + "id": "62006988", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "28.02" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nino34_series[\"1982-04-01\"]" ] }, { "cell_type": "markdown", - "id": "686a3ecf", + "id": "cb17f245", "metadata": {}, "source": [ "and these can be extended in ways that you might expect, but perhaps also in unexpected ways:" @@ -869,7 +320,7 @@ }, { "cell_type": "markdown", - "id": "251cb40a-06cd-4bfa-b959-a434e0e601eb", + "id": "ae740b50", "metadata": {}, "source": [ "### Numpy-like Interval Slices" @@ -877,7 +328,7 @@ }, { "cell_type": "markdown", - "id": "ee4a8bfd-e63c-4bf6-9b43-addfeca9b4b2", + "id": "85123793", "metadata": {}, "source": [ "
\n", @@ -887,41 +338,17 @@ }, { "cell_type": "code", - "execution_count": 14, - "id": "2ddc17a0", + "execution_count": null, + "id": "221e798d", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "1982-01-01 26.72\n", - "1982-02-01 26.70\n", - "1982-03-01 27.20\n", - "1982-04-01 28.02\n", - "1982-05-01 28.54\n", - "1982-06-01 28.75\n", - "1982-07-01 28.10\n", - "1982-08-01 27.93\n", - "1982-09-01 28.11\n", - "1982-10-01 28.64\n", - "1982-11-01 28.81\n", - "1982-12-01 29.21\n", - "Name: Nino34, dtype: float64" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nino34_series[0:12]" ] }, { "cell_type": "markdown", - "id": "606352a3-6596-4683-ab9c-c72a0bf609d1", + "id": "6281e3a6", "metadata": {}, "source": [ "### Label-based Slicing" @@ -929,7 +356,7 @@ }, { "cell_type": "markdown", - "id": "849645a7-d3a2-4a61-9cf9-52a765086049", + "id": "b6dceb40", "metadata": {}, "source": [ "
\n", @@ -938,41 +365,17 @@ }, { "cell_type": "code", - "execution_count": 15, - "id": "1c31803c", + "execution_count": null, + "id": "f7a06967", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "1982-01-01 26.72\n", - "1982-02-01 26.70\n", - "1982-03-01 27.20\n", - "1982-04-01 28.02\n", - "1982-05-01 28.54\n", - "1982-06-01 28.75\n", - "1982-07-01 28.10\n", - "1982-08-01 27.93\n", - "1982-09-01 28.11\n", - "1982-10-01 28.64\n", - "1982-11-01 28.81\n", - "1982-12-01 29.21\n", - "Name: Nino34, dtype: float64" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nino34_series[\"1982-01-01\":\"1982-12-01\"]" ] }, { "cell_type": "markdown", - "id": "057795dd-ac38-4812-a04c-25a9516931bc", + "id": "84edfd6f", "metadata": {}, "source": [ "### Another Way of Slicing" @@ -980,41 +383,17 @@ }, { "cell_type": "code", - "execution_count": 16, - "id": "a629daf5", + "execution_count": null, + "id": "771d6f04", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "1982-01-01 26.72\n", - "1982-02-01 26.70\n", - "1982-03-01 27.20\n", - "1982-04-01 28.02\n", - "1982-05-01 28.54\n", - "1982-06-01 28.75\n", - "1982-07-01 28.10\n", - "1982-08-01 27.93\n", - "1982-09-01 28.11\n", - "1982-10-01 28.64\n", - "1982-11-01 28.81\n", - "1982-12-01 29.21\n", - "Name: Nino34, dtype: float64" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nino34_series[slice(\"1982-01-01\", \"1982-12-01\")]" ] }, { "cell_type": "markdown", - "id": "fab92608", + "id": "9798abf4", "metadata": {}, "source": [ "### Using `.iloc` and `.loc` to index\n", @@ -1024,117 +403,47 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "8828ebae", + "execution_count": null, + "id": "d5eb9de2", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "28.02" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nino34_series.iloc[3]" ] }, { "cell_type": "code", - "execution_count": 18, - "id": "d37ca35a", + "execution_count": null, + "id": "8d0bc3e8", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "1982-01-01 26.72\n", - "1982-02-01 26.70\n", - "1982-03-01 27.20\n", - "1982-04-01 28.02\n", - "1982-05-01 28.54\n", - "1982-06-01 28.75\n", - "1982-07-01 28.10\n", - "1982-08-01 27.93\n", - "1982-09-01 28.11\n", - "1982-10-01 28.64\n", - "1982-11-01 28.81\n", - "1982-12-01 29.21\n", - "Name: Nino34, dtype: float64" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nino34_series.iloc[0:12]" ] }, { "cell_type": "code", - "execution_count": 19, - "id": "1cd4b99d", + "execution_count": null, + "id": "59a10070", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "28.02" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nino34_series.loc[\"1982-04-01\"]" ] }, { "cell_type": "code", - "execution_count": 20, - "id": "df53360c", + "execution_count": null, + "id": "3e2b3fc1", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "1982-01-01 26.72\n", - "1982-02-01 26.70\n", - "1982-03-01 27.20\n", - "1982-04-01 28.02\n", - "1982-05-01 28.54\n", - "1982-06-01 28.75\n", - "1982-07-01 28.10\n", - "1982-08-01 27.93\n", - "1982-09-01 28.11\n", - "1982-10-01 28.64\n", - "1982-11-01 28.81\n", - "1982-12-01 29.21\n", - "Name: Nino34, dtype: float64" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nino34_series.loc[\"1982-01-01\":\"1982-12-01\"]" ] }, { "cell_type": "markdown", - "id": "67be0464", + "id": "44824b21", "metadata": {}, "source": [ "These capabilities extend back to our original `DataFrame`, as well! :" @@ -1142,7 +451,7 @@ }, { "cell_type": "markdown", - "id": "183e94a7-36dd-4f93-a8fe-e51b58ca0c15", + "id": "481cde44", "metadata": {}, "source": [ "
\n", @@ -1152,114 +461,47 @@ }, { "cell_type": "code", - "execution_count": 21, - "id": "6d0c9bd7", + "execution_count": null, + "id": "b8971371", "metadata": { "tags": [ "raises-exception" ] }, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'1982-01-01'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m~/anaconda3/envs/pythia-book-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3079\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3080\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mKeyError\u001b[0m: '1982-01-01'", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"1982-01-01\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/anaconda3/envs/pythia-book-dev/lib/python3.8/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3022\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlevels\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3023\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3024\u001b[0;31m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3025\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_integer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3026\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/pythia-book-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3080\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3082\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3083\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3084\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyError\u001b[0m: '1982-01-01'" - ] - } - ], + "outputs": [], "source": [ "df[\"1982-01-01\"]" ] }, { "cell_type": "code", - "execution_count": 22, - "id": "006ba58a", + "execution_count": null, + "id": "3c147c06", "metadata": { "tags": [ "raises-exception" ] }, - "outputs": [ - { - "ename": "KeyError", - "evalue": "0", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m~/anaconda3/envs/pythia-book-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3079\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3080\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mKeyError\u001b[0m: 0", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/anaconda3/envs/pythia-book-dev/lib/python3.8/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3022\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlevels\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3023\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3024\u001b[0;31m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3025\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_integer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3026\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/pythia-book-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3080\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3082\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3083\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3084\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyError\u001b[0m: 0" - ] - } - ], + "outputs": [], "source": [ "df[0]" ] }, { "cell_type": "code", - "execution_count": 23, - "id": "94bff713", + "execution_count": null, + "id": "0b05470d", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "1982-01-01 26.72\n", - "1982-02-01 26.70\n", - "1982-03-01 27.20\n", - "1982-04-01 28.02\n", - "1982-05-01 28.54\n", - " ... \n", - "2020-12-01 25.53\n", - "2021-01-01 25.58\n", - "2021-02-01 25.81\n", - "2021-03-01 26.75\n", - "2021-04-01 27.40\n", - "Name: Nino34, Length: 472, dtype: float64" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df[\"Nino34\"]" ] }, { "cell_type": "markdown", - "id": "0d7f203e", + "id": "d4e6213d", "metadata": {}, "source": [ "With this plus our knowledge of the `Series` `df[\"Nino34\"]` gives us, we can chain our brackets to pull out any value from any of our columns in `df`." @@ -1267,49 +509,27 @@ }, { "cell_type": "code", - "execution_count": 24, - "id": "e8b04193", + "execution_count": null, + "id": "c61fa6d4", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "28.02" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df[\"Nino34\"][\"1982-04-01\"] # selecting the Series, then selecting a label within" ] }, { "cell_type": "code", - "execution_count": 25, - "id": "7ca8eadc", + "execution_count": null, + "id": "3bd7cf95", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "28.02" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df[\"Nino34\"][3]" ] }, { "cell_type": "markdown", - "id": "09d33515", + "id": "afb0d6ef", "metadata": {}, "source": [ "However, this is not a pandas-preferred way to index and subset our data, and has limited capabilities for us. As we touched on before, `.loc` and `.iloc` give us more to work with, and their functionality grows further for `df`." @@ -1317,28 +537,17 @@ }, { "cell_type": "code", - "execution_count": 26, - "id": "6c9ac325", + "execution_count": null, + "id": "9fb5df7b", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "28.02" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.loc[\"1982-04-01\", \"Nino34\"] # note [, ] ordering" ] }, { "cell_type": "markdown", - "id": "e7cfdd38", + "id": "e710252f", "metadata": {}, "source": [ "These allow us to pull out entire rows of `df`," @@ -1346,517 +555,47 @@ }, { "cell_type": "code", - "execution_count": 27, - "id": "f51c7741", + "execution_count": null, + "id": "aad4fde6", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Nino12 24.50\n", - "Nino12anom -0.97\n", - "Nino3 27.68\n", - "Nino3anom 0.18\n", - "Nino4 28.92\n", - "Nino4anom 0.42\n", - "Nino34 28.02\n", - "Nino34anom 0.24\n", - "Name: 1982-04-01 00:00:00, dtype: float64" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.loc[\"1982-04-01\"]" ] }, { "cell_type": "code", - "execution_count": 28, - "id": "e42c3508", + "execution_count": null, + "id": "f93737ba", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nino12Nino12anomNino3Nino3anomNino4Nino4anomNino34Nino34anom
datetime
1982-01-0124.29-0.1725.870.2428.300.0026.720.15
1982-02-0125.49-0.5826.380.0128.210.1126.70-0.02
1982-03-0125.21-1.3126.98-0.1628.410.2227.20-0.02
1982-04-0124.50-0.9727.680.1828.920.4228.020.24
1982-05-0123.97-0.2327.790.7129.490.7028.540.69
1982-06-0122.890.0727.461.0329.760.9228.751.10
1982-07-0122.470.8726.440.8229.380.5828.100.88
1982-08-0121.751.1026.151.1629.040.3627.931.11
1982-09-0121.801.4426.521.6729.160.4728.111.39
1982-10-0122.942.1227.112.1929.380.7228.641.95
1982-11-0124.593.0027.622.6429.230.6028.812.16
1982-12-0126.133.3428.393.2529.150.6629.212.64
\n", - "
" - ], - "text/plain": [ - " Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom Nino34 \\\n", - "datetime \n", - "1982-01-01 24.29 -0.17 25.87 0.24 28.30 0.00 26.72 \n", - "1982-02-01 25.49 -0.58 26.38 0.01 28.21 0.11 26.70 \n", - "1982-03-01 25.21 -1.31 26.98 -0.16 28.41 0.22 27.20 \n", - "1982-04-01 24.50 -0.97 27.68 0.18 28.92 0.42 28.02 \n", - "1982-05-01 23.97 -0.23 27.79 0.71 29.49 0.70 28.54 \n", - "1982-06-01 22.89 0.07 27.46 1.03 29.76 0.92 28.75 \n", - "1982-07-01 22.47 0.87 26.44 0.82 29.38 0.58 28.10 \n", - "1982-08-01 21.75 1.10 26.15 1.16 29.04 0.36 27.93 \n", - "1982-09-01 21.80 1.44 26.52 1.67 29.16 0.47 28.11 \n", - "1982-10-01 22.94 2.12 27.11 2.19 29.38 0.72 28.64 \n", - "1982-11-01 24.59 3.00 27.62 2.64 29.23 0.60 28.81 \n", - "1982-12-01 26.13 3.34 28.39 3.25 29.15 0.66 29.21 \n", - "\n", - " Nino34anom \n", - "datetime \n", - "1982-01-01 0.15 \n", - "1982-02-01 -0.02 \n", - "1982-03-01 -0.02 \n", - "1982-04-01 0.24 \n", - "1982-05-01 0.69 \n", - "1982-06-01 1.10 \n", - "1982-07-01 0.88 \n", - "1982-08-01 1.11 \n", - "1982-09-01 1.39 \n", - "1982-10-01 1.95 \n", - "1982-11-01 2.16 \n", - "1982-12-01 2.64 " - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.loc[\"1982-01-01\":\"1982-12-01\"]" ] }, { "cell_type": "code", - "execution_count": 29, - "id": "dc66c1d6", + "execution_count": null, + "id": "6c23cbca", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Nino12 24.50\n", - "Nino12anom -0.97\n", - "Nino3 27.68\n", - "Nino3anom 0.18\n", - "Nino4 28.92\n", - "Nino4anom 0.42\n", - "Nino34 28.02\n", - "Nino34anom 0.24\n", - "Name: 1982-04-01 00:00:00, dtype: float64" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.iloc[3]" ] }, { "cell_type": "code", - "execution_count": 30, - "id": "9e1fc528", + "execution_count": null, + "id": "22c07d7d", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nino12Nino12anomNino3Nino3anomNino4Nino4anomNino34Nino34anom
datetime
1982-01-0124.29-0.1725.870.2428.300.0026.720.15
1982-02-0125.49-0.5826.380.0128.210.1126.70-0.02
1982-03-0125.21-1.3126.98-0.1628.410.2227.20-0.02
1982-04-0124.50-0.9727.680.1828.920.4228.020.24
1982-05-0123.97-0.2327.790.7129.490.7028.540.69
1982-06-0122.890.0727.461.0329.760.9228.751.10
1982-07-0122.470.8726.440.8229.380.5828.100.88
1982-08-0121.751.1026.151.1629.040.3627.931.11
1982-09-0121.801.4426.521.6729.160.4728.111.39
1982-10-0122.942.1227.112.1929.380.7228.641.95
1982-11-0124.593.0027.622.6429.230.6028.812.16
1982-12-0126.133.3428.393.2529.150.6629.212.64
\n", - "
" - ], - "text/plain": [ - " Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom Nino34 \\\n", - "datetime \n", - "1982-01-01 24.29 -0.17 25.87 0.24 28.30 0.00 26.72 \n", - "1982-02-01 25.49 -0.58 26.38 0.01 28.21 0.11 26.70 \n", - "1982-03-01 25.21 -1.31 26.98 -0.16 28.41 0.22 27.20 \n", - "1982-04-01 24.50 -0.97 27.68 0.18 28.92 0.42 28.02 \n", - "1982-05-01 23.97 -0.23 27.79 0.71 29.49 0.70 28.54 \n", - "1982-06-01 22.89 0.07 27.46 1.03 29.76 0.92 28.75 \n", - "1982-07-01 22.47 0.87 26.44 0.82 29.38 0.58 28.10 \n", - "1982-08-01 21.75 1.10 26.15 1.16 29.04 0.36 27.93 \n", - "1982-09-01 21.80 1.44 26.52 1.67 29.16 0.47 28.11 \n", - "1982-10-01 22.94 2.12 27.11 2.19 29.38 0.72 28.64 \n", - "1982-11-01 24.59 3.00 27.62 2.64 29.23 0.60 28.81 \n", - "1982-12-01 26.13 3.34 28.39 3.25 29.15 0.66 29.21 \n", - "\n", - " Nino34anom \n", - "datetime \n", - "1982-01-01 0.15 \n", - "1982-02-01 -0.02 \n", - "1982-03-01 -0.02 \n", - "1982-04-01 0.24 \n", - "1982-05-01 0.69 \n", - "1982-06-01 1.10 \n", - "1982-07-01 0.88 \n", - "1982-08-01 1.11 \n", - "1982-09-01 1.39 \n", - "1982-10-01 1.95 \n", - "1982-11-01 2.16 \n", - "1982-12-01 2.64 " - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.iloc[0:12]" ] }, { "cell_type": "markdown", - "id": "c1aa8b6a", + "id": "4c2ed15e", "metadata": {}, "source": [ "Even further," @@ -1864,155 +603,10 @@ }, { "cell_type": "code", - "execution_count": 31, - "id": "abb48564", + "execution_count": null, + "id": "8390a35b", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nino12Nino3Nino4Nino34
datetime
1982-01-0124.2925.8728.3026.72
1982-02-0125.4926.3828.2126.70
1982-03-0125.2126.9828.4127.20
1982-04-0124.5027.6828.9228.02
1982-05-0123.9727.7929.4928.54
1982-06-0122.8927.4629.7628.75
1982-07-0122.4726.4429.3828.10
1982-08-0121.7526.1529.0427.93
1982-09-0121.8026.5229.1628.11
1982-10-0122.9427.1129.3828.64
1982-11-0124.5927.6229.2328.81
1982-12-0126.1328.3929.1529.21
\n", - "
" - ], - "text/plain": [ - " Nino12 Nino3 Nino4 Nino34\n", - "datetime \n", - "1982-01-01 24.29 25.87 28.30 26.72\n", - "1982-02-01 25.49 26.38 28.21 26.70\n", - "1982-03-01 25.21 26.98 28.41 27.20\n", - "1982-04-01 24.50 27.68 28.92 28.02\n", - "1982-05-01 23.97 27.79 29.49 28.54\n", - "1982-06-01 22.89 27.46 29.76 28.75\n", - "1982-07-01 22.47 26.44 29.38 28.10\n", - "1982-08-01 21.75 26.15 29.04 27.93\n", - "1982-09-01 21.80 26.52 29.16 28.11\n", - "1982-10-01 22.94 27.11 29.38 28.64\n", - "1982-11-01 24.59 27.62 29.23 28.81\n", - "1982-12-01 26.13 28.39 29.15 29.21" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.loc[\n", " \"1982-01-01\":\"1982-12-01\", # slice of rows\n", @@ -2022,7 +616,7 @@ }, { "cell_type": "markdown", - "id": "317de007-32dd-435b-be58-7af6c5739f1a", + "id": "e65349af", "metadata": {}, "source": [ "
\n", @@ -2031,7 +625,7 @@ }, { "cell_type": "markdown", - "id": "848ba67d-490d-4d6a-8538-a9f59ff92b9c", + "id": "2e2739dc", "metadata": {}, "source": [ "## Exploratory Data Analysis\n", @@ -2042,277 +636,27 @@ }, { "cell_type": "code", - "execution_count": 32, - "id": "d14272a0-fba2-426c-85f3-84640df66003", + "execution_count": null, + "id": "3c11b92a", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nino12Nino12anomNino3Nino3anomNino4Nino4anomNino34Nino34anom
datetime
1982-01-0124.29-0.1725.870.2428.300.0026.720.15
1982-02-0125.49-0.5826.380.0128.210.1126.70-0.02
1982-03-0125.21-1.3126.98-0.1628.410.2227.20-0.02
1982-04-0124.50-0.9727.680.1828.920.4228.020.24
1982-05-0123.97-0.2327.790.7129.490.7028.540.69
\n", - "
" - ], - "text/plain": [ - " Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom Nino34 \\\n", - "datetime \n", - "1982-01-01 24.29 -0.17 25.87 0.24 28.30 0.00 26.72 \n", - "1982-02-01 25.49 -0.58 26.38 0.01 28.21 0.11 26.70 \n", - "1982-03-01 25.21 -1.31 26.98 -0.16 28.41 0.22 27.20 \n", - "1982-04-01 24.50 -0.97 27.68 0.18 28.92 0.42 28.02 \n", - "1982-05-01 23.97 -0.23 27.79 0.71 29.49 0.70 28.54 \n", - "\n", - " Nino34anom \n", - "datetime \n", - "1982-01-01 0.15 \n", - "1982-02-01 -0.02 \n", - "1982-03-01 -0.02 \n", - "1982-04-01 0.24 \n", - "1982-05-01 0.69 " - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "code", - "execution_count": 33, - "id": "64cb13f6-8f70-4e37-9c4c-16b5d9b6112f", + "execution_count": null, + "id": "3bf87294", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nino12Nino12anomNino3Nino3anomNino4Nino4anomNino34Nino34anom
datetime
2020-12-0122.16-0.6024.38-0.8327.65-0.9525.53-1.12
2021-01-0123.89-0.6425.06-0.5527.10-1.2525.58-0.99
2021-02-0125.55-0.6625.80-0.5727.20-1.0025.81-0.92
2021-03-0126.48-0.2626.80-0.3927.79-0.5526.75-0.51
2021-04-0124.89-0.8026.96-0.6528.47-0.2127.40-0.49
\n", - "
" - ], - "text/plain": [ - " Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom Nino34 \\\n", - "datetime \n", - "2020-12-01 22.16 -0.60 24.38 -0.83 27.65 -0.95 25.53 \n", - "2021-01-01 23.89 -0.64 25.06 -0.55 27.10 -1.25 25.58 \n", - "2021-02-01 25.55 -0.66 25.80 -0.57 27.20 -1.00 25.81 \n", - "2021-03-01 26.48 -0.26 26.80 -0.39 27.79 -0.55 26.75 \n", - "2021-04-01 24.89 -0.80 26.96 -0.65 28.47 -0.21 27.40 \n", - "\n", - " Nino34anom \n", - "datetime \n", - "2020-12-01 -1.12 \n", - "2021-01-01 -0.99 \n", - "2021-02-01 -0.92 \n", - "2021-03-01 -0.51 \n", - "2021-04-01 -0.49 " - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.tail()" ] }, { "cell_type": "markdown", - "id": "0da2b376-8964-4b7b-b313-fa2ffb8ef372", + "id": "cba9f221", "metadata": {}, "source": [ "### Quick Plots of Your Data\n", @@ -2321,30 +665,17 @@ }, { "cell_type": "code", - "execution_count": 34, - "id": "7b09fdb4", + "execution_count": null, + "id": "bf317171", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "df.Nino34.plot();" ] }, { "cell_type": "markdown", - "id": "92800a25", + "id": "99c2c7a3", "metadata": {}, "source": [ "Before, we called `.plot()` which generated a single line plot. This is helpful, but there are other plots which can also help with understanding your data! Let's try using a histogram to understand distributions...\n", @@ -2354,30 +685,17 @@ }, { "cell_type": "code", - "execution_count": 35, - "id": "c4db0c16", + "execution_count": null, + "id": "5f85e2dd", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "df[['Nino12', 'Nino34']].plot.hist();" ] }, { "cell_type": "markdown", - "id": "db891ecb", + "id": "a4e07618", "metadata": {}, "source": [ "We can see some clear differences in the distributions, which is helpful! Another plot one might like to use would be a `boxplot`. Here, we replace `hist` with `box`" @@ -2385,30 +703,17 @@ }, { "cell_type": "code", - "execution_count": 36, - "id": "b353ed8b", + "execution_count": null, + "id": "6329d231", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "df[['Nino12', 'Nino34']].plot.box();" ] }, { "cell_type": "markdown", - "id": "6346ecd3", + "id": "c338385b", "metadata": {}, "source": [ "Here, we again see a clear difference in the distributions. These are not the only plots you can use within pandas! For more examples of plotting choices, check out [the pandas plot documentation](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html)" @@ -2416,7 +721,7 @@ }, { "cell_type": "markdown", - "id": "fd10d71d-63df-44d5-bca3-6eb436cfd68d", + "id": "69fc4078", "metadata": {}, "source": [ "#### Customize your Plot\n", @@ -2425,23 +730,10 @@ }, { "cell_type": "code", - "execution_count": 37, - "id": "cadb301b-2f22-4cff-9c58-bd8394e9e5fc", + "execution_count": null, + "id": "da22f990", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "df.Nino34.plot(\n", " color='black',\n", @@ -2454,7 +746,7 @@ }, { "cell_type": "markdown", - "id": "14ef06ef", + "id": "e7145ef6", "metadata": {}, "source": [ "This can be a great way to take a quick look at your data, but what if you wanted a more ***quantitative*** perspective? We can use the `describe` method on our `DataFrame`; this returns a table of summary statistics for all columns in the `DataFrame`\n", @@ -2466,168 +758,17 @@ }, { "cell_type": "code", - "execution_count": 38, - "id": "0b7011a6", + "execution_count": null, + "id": "3b5c27a8", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nino12Nino12anomNino3Nino3anomNino4Nino4anomNino34Nino34anom
count472.000000472.000000472.000000472.000000472.000000472.000000472.000000472.000000
mean23.2096190.05972525.9365680.03942828.6250640.06381427.0767800.034894
std2.4315221.1575901.3496210.9654640.7554220.7094011.0630040.947936
min18.570000-2.10000023.030000-2.07000026.430000-1.87000024.270000-2.380000
25%21.152500-0.71250024.850000-0.60000028.140000-0.43000026.330000-0.572500
50%22.980000-0.16000025.885000-0.11500028.7600000.20500027.1000000.015000
75%25.3225000.51500026.9625000.51250029.1900000.63000027.7925000.565000
max29.1500004.62000029.1400003.62000030.3000001.67000029.6000002.950000
\n", - "
" - ], - "text/plain": [ - " Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom \\\n", - "count 472.000000 472.000000 472.000000 472.000000 472.000000 472.000000 \n", - "mean 23.209619 0.059725 25.936568 0.039428 28.625064 0.063814 \n", - "std 2.431522 1.157590 1.349621 0.965464 0.755422 0.709401 \n", - "min 18.570000 -2.100000 23.030000 -2.070000 26.430000 -1.870000 \n", - "25% 21.152500 -0.712500 24.850000 -0.600000 28.140000 -0.430000 \n", - "50% 22.980000 -0.160000 25.885000 -0.115000 28.760000 0.205000 \n", - "75% 25.322500 0.515000 26.962500 0.512500 29.190000 0.630000 \n", - "max 29.150000 4.620000 29.140000 3.620000 30.300000 1.670000 \n", - "\n", - " Nino34 Nino34anom \n", - "count 472.000000 472.000000 \n", - "mean 27.076780 0.034894 \n", - "std 1.063004 0.947936 \n", - "min 24.270000 -2.380000 \n", - "25% 26.330000 -0.572500 \n", - "50% 27.100000 0.015000 \n", - "75% 27.792500 0.565000 \n", - "max 29.600000 2.950000 " - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.describe()" ] }, { "cell_type": "markdown", - "id": "a09a3ca9", + "id": "a92bb8b3", "metadata": {}, "source": [ "You can look at specific statistics too, such as mean! Notice how the output is a `Series` (column) now" @@ -2635,36 +776,17 @@ }, { "cell_type": "code", - "execution_count": 39, - "id": "2a4b8b6a", + "execution_count": null, + "id": "db9e4a16", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Nino12 23.209619\n", - "Nino12anom 0.059725\n", - "Nino3 25.936568\n", - "Nino3anom 0.039428\n", - "Nino4 28.625064\n", - "Nino4anom 0.063814\n", - "Nino34 27.076780\n", - "Nino34anom 0.034894\n", - "dtype: float64" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.mean()" ] }, { "cell_type": "markdown", - "id": "c3ead9af", + "id": "1ff5aec7", "metadata": {}, "source": [ "If you are interested in a single column mean, subset for that and use `.mean`" @@ -2672,28 +794,17 @@ }, { "cell_type": "code", - "execution_count": 40, - "id": "2123223e", + "execution_count": null, + "id": "9aa38e59", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "27.07677966101695" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.Nino34.mean()" ] }, { "cell_type": "markdown", - "id": "678fde2f", + "id": "7295e7b0", "metadata": {}, "source": [ "### Subsetting Using the Datetime Column\n", @@ -2705,590 +816,10 @@ }, { "cell_type": "code", - "execution_count": 41, - "id": "8a82e067", + "execution_count": null, + "id": "a506724a", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nino12Nino12anomNino3Nino3anomNino4Nino4anomNino34Nino34anom
datetime
1982-01-0124.29-0.1725.870.2428.300.0026.720.15
1983-01-0127.422.9628.923.2929.000.7029.362.79
1984-01-0124.18-0.2824.82-0.8127.64-0.6625.64-0.93
1985-01-0123.59-0.8724.51-1.1227.71-0.5925.43-1.14
1986-01-0124.610.1524.73-0.9028.11-0.1925.79-0.78
1987-01-0125.300.8426.691.0629.020.7227.911.34
1988-01-0124.640.1826.120.4929.130.8327.320.75
1989-01-0124.09-0.3724.15-1.4826.54-1.7624.53-2.04
1990-01-0124.02-0.4425.34-0.2928.560.2626.55-0.02
1991-01-0123.86-0.6025.650.0229.000.7027.010.44
1992-01-0124.830.3727.001.3729.060.7628.411.84
1993-01-0124.43-0.0325.56-0.0728.600.3026.690.12
1994-01-0124.32-0.1425.710.0828.470.1726.600.03
1995-01-0125.330.8726.340.7129.200.9027.550.98
1996-01-0123.84-0.6224.96-0.6727.92-0.3825.74-0.83
1997-01-0123.67-0.7924.70-0.9328.410.1125.96-0.61
1998-01-0128.223.7628.943.3129.010.7129.102.53
1999-01-0123.73-0.7324.41-1.2226.59-1.7124.90-1.67
2000-01-0123.86-0.6023.88-1.7526.96-1.3424.65-1.92
2001-01-0123.88-0.5824.99-0.6427.50-0.8025.74-0.83
2002-01-0123.64-0.8225.09-0.5428.810.5126.50-0.07
2003-01-0124.38-0.0826.380.7529.250.9527.761.19
2004-01-0124.600.1425.920.2928.830.5326.740.17
2005-01-0124.470.0125.890.2629.210.9127.100.53
2006-01-0124.33-0.1325.00-0.6327.68-0.6225.64-0.93
2007-01-0124.990.5326.500.8728.930.6327.260.69
2008-01-0123.86-0.6024.13-1.5026.62-1.6824.71-1.86
2009-01-0124.42-0.1025.03-0.6027.42-0.8825.54-1.03
2010-01-0124.820.3026.631.0029.511.2128.071.50
2011-01-0124.08-0.4424.31-1.3226.72-1.5824.93-1.64
2012-01-0123.88-0.6424.90-0.7327.09-1.2125.49-1.08
2013-01-0124.00-0.5225.06-0.5728.28-0.0226.16-0.41
2014-01-0124.790.2725.26-0.3728.14-0.1726.06-0.51
2015-01-0124.13-0.3925.990.3629.160.8627.100.53
2016-01-0125.931.4128.212.5829.651.3529.172.60
2017-01-0125.751.2325.61-0.0228.18-0.1226.25-0.32
2018-01-0123.71-0.8124.48-1.1428.03-0.2725.82-0.75
2019-01-0125.100.5726.170.5529.000.6527.080.52
2020-01-0124.550.0225.810.2029.280.9327.090.53
2021-01-0123.89-0.6425.06-0.5527.10-1.2525.58-0.99
\n", - "
" - ], - "text/plain": [ - " Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom Nino34 \\\n", - "datetime \n", - "1982-01-01 24.29 -0.17 25.87 0.24 28.30 0.00 26.72 \n", - "1983-01-01 27.42 2.96 28.92 3.29 29.00 0.70 29.36 \n", - "1984-01-01 24.18 -0.28 24.82 -0.81 27.64 -0.66 25.64 \n", - "1985-01-01 23.59 -0.87 24.51 -1.12 27.71 -0.59 25.43 \n", - "1986-01-01 24.61 0.15 24.73 -0.90 28.11 -0.19 25.79 \n", - "1987-01-01 25.30 0.84 26.69 1.06 29.02 0.72 27.91 \n", - "1988-01-01 24.64 0.18 26.12 0.49 29.13 0.83 27.32 \n", - "1989-01-01 24.09 -0.37 24.15 -1.48 26.54 -1.76 24.53 \n", - "1990-01-01 24.02 -0.44 25.34 -0.29 28.56 0.26 26.55 \n", - "1991-01-01 23.86 -0.60 25.65 0.02 29.00 0.70 27.01 \n", - "1992-01-01 24.83 0.37 27.00 1.37 29.06 0.76 28.41 \n", - "1993-01-01 24.43 -0.03 25.56 -0.07 28.60 0.30 26.69 \n", - "1994-01-01 24.32 -0.14 25.71 0.08 28.47 0.17 26.60 \n", - "1995-01-01 25.33 0.87 26.34 0.71 29.20 0.90 27.55 \n", - "1996-01-01 23.84 -0.62 24.96 -0.67 27.92 -0.38 25.74 \n", - "1997-01-01 23.67 -0.79 24.70 -0.93 28.41 0.11 25.96 \n", - "1998-01-01 28.22 3.76 28.94 3.31 29.01 0.71 29.10 \n", - "1999-01-01 23.73 -0.73 24.41 -1.22 26.59 -1.71 24.90 \n", - "2000-01-01 23.86 -0.60 23.88 -1.75 26.96 -1.34 24.65 \n", - "2001-01-01 23.88 -0.58 24.99 -0.64 27.50 -0.80 25.74 \n", - "2002-01-01 23.64 -0.82 25.09 -0.54 28.81 0.51 26.50 \n", - "2003-01-01 24.38 -0.08 26.38 0.75 29.25 0.95 27.76 \n", - "2004-01-01 24.60 0.14 25.92 0.29 28.83 0.53 26.74 \n", - "2005-01-01 24.47 0.01 25.89 0.26 29.21 0.91 27.10 \n", - "2006-01-01 24.33 -0.13 25.00 -0.63 27.68 -0.62 25.64 \n", - "2007-01-01 24.99 0.53 26.50 0.87 28.93 0.63 27.26 \n", - "2008-01-01 23.86 -0.60 24.13 -1.50 26.62 -1.68 24.71 \n", - "2009-01-01 24.42 -0.10 25.03 -0.60 27.42 -0.88 25.54 \n", - "2010-01-01 24.82 0.30 26.63 1.00 29.51 1.21 28.07 \n", - "2011-01-01 24.08 -0.44 24.31 -1.32 26.72 -1.58 24.93 \n", - "2012-01-01 23.88 -0.64 24.90 -0.73 27.09 -1.21 25.49 \n", - "2013-01-01 24.00 -0.52 25.06 -0.57 28.28 -0.02 26.16 \n", - "2014-01-01 24.79 0.27 25.26 -0.37 28.14 -0.17 26.06 \n", - "2015-01-01 24.13 -0.39 25.99 0.36 29.16 0.86 27.10 \n", - "2016-01-01 25.93 1.41 28.21 2.58 29.65 1.35 29.17 \n", - "2017-01-01 25.75 1.23 25.61 -0.02 28.18 -0.12 26.25 \n", - "2018-01-01 23.71 -0.81 24.48 -1.14 28.03 -0.27 25.82 \n", - "2019-01-01 25.10 0.57 26.17 0.55 29.00 0.65 27.08 \n", - "2020-01-01 24.55 0.02 25.81 0.20 29.28 0.93 27.09 \n", - "2021-01-01 23.89 -0.64 25.06 -0.55 27.10 -1.25 25.58 \n", - "\n", - " Nino34anom \n", - "datetime \n", - "1982-01-01 0.15 \n", - "1983-01-01 2.79 \n", - "1984-01-01 -0.93 \n", - "1985-01-01 -1.14 \n", - "1986-01-01 -0.78 \n", - "1987-01-01 1.34 \n", - "1988-01-01 0.75 \n", - "1989-01-01 -2.04 \n", - "1990-01-01 -0.02 \n", - "1991-01-01 0.44 \n", - "1992-01-01 1.84 \n", - "1993-01-01 0.12 \n", - "1994-01-01 0.03 \n", - "1995-01-01 0.98 \n", - "1996-01-01 -0.83 \n", - "1997-01-01 -0.61 \n", - "1998-01-01 2.53 \n", - "1999-01-01 -1.67 \n", - "2000-01-01 -1.92 \n", - "2001-01-01 -0.83 \n", - "2002-01-01 -0.07 \n", - "2003-01-01 1.19 \n", - "2004-01-01 0.17 \n", - "2005-01-01 0.53 \n", - "2006-01-01 -0.93 \n", - "2007-01-01 0.69 \n", - "2008-01-01 -1.86 \n", - "2009-01-01 -1.03 \n", - "2010-01-01 1.50 \n", - "2011-01-01 -1.64 \n", - "2012-01-01 -1.08 \n", - "2013-01-01 -0.41 \n", - "2014-01-01 -0.51 \n", - "2015-01-01 0.53 \n", - "2016-01-01 2.60 \n", - "2017-01-01 -0.32 \n", - "2018-01-01 -0.75 \n", - "2019-01-01 0.52 \n", - "2020-01-01 0.53 \n", - "2021-01-01 -0.99 " - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Uses the datetime column\n", "df[df.index.month == 1]" @@ -3296,7 +827,7 @@ }, { "cell_type": "markdown", - "id": "373000f5", + "id": "16d4e0e7", "metadata": {}, "source": [ "You could even assign this month to a new column!" @@ -3304,8 +835,8 @@ }, { "cell_type": "code", - "execution_count": 42, - "id": "2d694ebc", + "execution_count": null, + "id": "fe5d5ee4", "metadata": {}, "outputs": [], "source": [ @@ -3314,7 +845,7 @@ }, { "cell_type": "markdown", - "id": "49100623", + "id": "8750443f", "metadata": {}, "source": [ "Now that it is its own column (`Series`), we can use `groupby` to group by the month, then taking the average, to determine average monthly values over the dataset" @@ -3322,30 +853,17 @@ }, { "cell_type": "code", - "execution_count": 43, - "id": "035b2a37", + "execution_count": null, + "id": "f94c91f9", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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W716NY2Njee0zr333otpmlRWVvL5z3++T3eyDz74IM888wyTJ09m165dHD16lEceeYRdu3Yxf/585s2bF+kXfO3atdx8880sXry4zxUx/Zk/fz633347CxcuZNGiRdx1111UVVWd+4ELIZKOdCcrYsjzIUTiOVN3shduJwJCCJHkJMCFECJJSYALIUSSkgAXQogkJQEuhBBJSgJcCCGSlAQ4dneyq1evjkyvW7cucgfkT3/6U5577rkhbXfLli3MmzePefPmMXfuXF588cV4VFcIIQD5QQdg5LqTnT17dqSHwuPHjzN37lxuuOEG3G552IUQwyctcGK7k+1t7dq1rFu3DoCrrrqKb3zjGyxcuJAZM2ZEOo3y+/3ccccdVFZWUlVVxcaNGwG729hwWPv9fum8XggRVwnVFPzBlh9Q01wT122W5ZbxjYUDd1M+Ut3Jbt68mTvvvJNDhw7xy1/+UlrfQoi4kRa4Y6S6k120aBHV1dVs3bqV73//+/j9/pE7CCHEBSWhmoODaSmPpJHsTra8vJz09HR27tzJggV9ujQQQohzJi3wKPHuTvbgwYORkD906BAfffQRxcXF8a62EOICJQHeSzy7k920aRNz585l3rx5rFy5kieffHJQXcQKIcRgSHeyIoY8H0IkHulOVgghxhgJcCGESFIS4EIIkaQkwIUQIklJgAshRJKSABdCiCQlAY50JyuESE4JdSv9aJHuZIUQyUha4IxOd7L33HMPCxYsoKKigjVr1kTmFxcXs2bNGubPn09lZSU1NXbvjM3Nzdx4443MmTOHyy67jB07dkTqd9ttt7F06VKKi4t54YUXeOihh6isrGTZsmUEg8EReMSEEIkgoZqCJ773Pbp3x7c72ZTyMsZ/61sDljvf3ck+8sgj5ObmYpomS5YsYceOHcyZMweA/Px83n//fZ588knWrVvH008/zZo1a6iqqmL9+vW8+eab3HrrrWzfvh2A/fv3s3HjRnbt2sXll1/OH/7wBx577DFWrlzJyy+/zI033jj0B1AIkbCkBe44393J/va3v2X+/PlUVVVRXV3Nrl27Br2Pa665hqamJlpbWwFYvnw5Ho+HyspKTNNk2bJlAFRWVkbWF0KMPQO2wJVSPwc+DTRorWc789YC/ws46RT7ltb6z8OtzGBayiPpfHUnm5eXx7p169i6dSs5OTncfvvt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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "df.groupby('month').mean().plot();" ] }, { "cell_type": "markdown", - "id": "b04c22fc", + "id": "a0c9481b", "metadata": {}, "source": [ "### Investigating Extreme Values" @@ -3353,7 +871,7 @@ }, { "cell_type": "markdown", - "id": "e3aea3cc", + "id": "fec15b77", "metadata": {}, "source": [ "You can also use ***conditional indexing***, such that you can search where rows meet a certain criteria. In this case, we are interested in where the Nino34 anomaly is greater than 2" @@ -3361,331 +879,17 @@ }, { "cell_type": "code", - "execution_count": 44, - "id": "4e723968", + "execution_count": null, + "id": "098fc88d", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nino12Nino12anomNino3Nino3anomNino4Nino4anomNino34Nino34anommonth
datetime
1982-11-0124.593.0027.622.6429.230.6028.812.1611
1982-12-0126.133.3428.393.2529.150.6629.212.6412
1983-01-0127.422.9628.923.2929.000.7029.362.791
1983-02-0128.092.0228.922.5528.790.6929.132.412
1997-08-0124.804.1527.842.8529.260.5828.842.028
1997-09-0124.404.0427.842.9929.320.6328.932.219
1997-10-0124.583.7628.173.2529.320.6629.232.5410
1997-11-0125.634.0428.553.5729.490.8629.322.6711
1997-12-0126.924.1328.763.6229.320.8329.262.6912
1998-01-0128.223.7628.943.3129.010.7129.102.531
1998-02-0128.982.9128.932.5628.870.7728.862.142
2015-08-0122.882.2427.332.3429.660.9828.892.078
2015-09-0122.912.5727.482.6329.731.0429.002.289
2015-10-0123.312.5227.582.6629.791.1229.152.4610
2015-11-0123.832.2427.912.9330.301.6729.602.9511
2015-12-0125.012.1927.992.8530.111.6329.392.8212
2016-01-0125.931.4128.212.5829.651.3529.172.601
2016-02-0126.810.6728.361.9929.551.4529.122.402
\n", - "
" - ], - "text/plain": [ - " Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom Nino34 \\\n", - "datetime \n", - "1982-11-01 24.59 3.00 27.62 2.64 29.23 0.60 28.81 \n", - "1982-12-01 26.13 3.34 28.39 3.25 29.15 0.66 29.21 \n", - "1983-01-01 27.42 2.96 28.92 3.29 29.00 0.70 29.36 \n", - "1983-02-01 28.09 2.02 28.92 2.55 28.79 0.69 29.13 \n", - "1997-08-01 24.80 4.15 27.84 2.85 29.26 0.58 28.84 \n", - "1997-09-01 24.40 4.04 27.84 2.99 29.32 0.63 28.93 \n", - "1997-10-01 24.58 3.76 28.17 3.25 29.32 0.66 29.23 \n", - "1997-11-01 25.63 4.04 28.55 3.57 29.49 0.86 29.32 \n", - "1997-12-01 26.92 4.13 28.76 3.62 29.32 0.83 29.26 \n", - "1998-01-01 28.22 3.76 28.94 3.31 29.01 0.71 29.10 \n", - "1998-02-01 28.98 2.91 28.93 2.56 28.87 0.77 28.86 \n", - "2015-08-01 22.88 2.24 27.33 2.34 29.66 0.98 28.89 \n", - "2015-09-01 22.91 2.57 27.48 2.63 29.73 1.04 29.00 \n", - "2015-10-01 23.31 2.52 27.58 2.66 29.79 1.12 29.15 \n", - "2015-11-01 23.83 2.24 27.91 2.93 30.30 1.67 29.60 \n", - "2015-12-01 25.01 2.19 27.99 2.85 30.11 1.63 29.39 \n", - "2016-01-01 25.93 1.41 28.21 2.58 29.65 1.35 29.17 \n", - "2016-02-01 26.81 0.67 28.36 1.99 29.55 1.45 29.12 \n", - "\n", - " Nino34anom month \n", - "datetime \n", - "1982-11-01 2.16 11 \n", - "1982-12-01 2.64 12 \n", - "1983-01-01 2.79 1 \n", - "1983-02-01 2.41 2 \n", - "1997-08-01 2.02 8 \n", - "1997-09-01 2.21 9 \n", - "1997-10-01 2.54 10 \n", - "1997-11-01 2.67 11 \n", - "1997-12-01 2.69 12 \n", - "1998-01-01 2.53 1 \n", - "1998-02-01 2.14 2 \n", - "2015-08-01 2.07 8 \n", - "2015-09-01 2.28 9 \n", - "2015-10-01 2.46 10 \n", - "2015-11-01 2.95 11 \n", - "2015-12-01 2.82 12 \n", - "2016-01-01 2.60 1 \n", - "2016-02-01 2.40 2 " - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df[df.Nino34anom > 2]" ] }, { "cell_type": "markdown", - "id": "2bc0275e", + "id": "f26bc439", "metadata": {}, "source": [ "You can also sort columns based on the values!" @@ -3693,236 +897,17 @@ }, { "cell_type": "code", - "execution_count": 45, - "id": "a3cd6935", + "execution_count": null, + "id": "8051c4f6", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nino12Nino12anomNino3Nino3anomNino4Nino4anomNino34Nino34anommonth
datetime
1988-11-0120.55-1.0423.03-1.9526.76-1.8724.27-2.3811
1988-12-0121.80-0.9923.07-2.0726.75-1.7424.33-2.2412
1988-10-0119.50-1.3223.17-1.7527.06-1.6024.62-2.0710
1989-01-0124.09-0.3724.15-1.4826.54-1.7624.53-2.041
2000-01-0123.86-0.6023.88-1.7526.96-1.3424.65-1.921
..............................
1997-11-0125.634.0428.553.5729.490.8629.322.6711
1997-12-0126.924.1328.763.6229.320.8329.262.6912
1983-01-0127.422.9628.923.2929.000.7029.362.791
2015-12-0125.012.1927.992.8530.111.6329.392.8212
2015-11-0123.832.2427.912.9330.301.6729.602.9511
\n", - "

472 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom Nino34 \\\n", - "datetime \n", - "1988-11-01 20.55 -1.04 23.03 -1.95 26.76 -1.87 24.27 \n", - "1988-12-01 21.80 -0.99 23.07 -2.07 26.75 -1.74 24.33 \n", - "1988-10-01 19.50 -1.32 23.17 -1.75 27.06 -1.60 24.62 \n", - "1989-01-01 24.09 -0.37 24.15 -1.48 26.54 -1.76 24.53 \n", - "2000-01-01 23.86 -0.60 23.88 -1.75 26.96 -1.34 24.65 \n", - "... ... ... ... ... ... ... ... \n", - "1997-11-01 25.63 4.04 28.55 3.57 29.49 0.86 29.32 \n", - "1997-12-01 26.92 4.13 28.76 3.62 29.32 0.83 29.26 \n", - "1983-01-01 27.42 2.96 28.92 3.29 29.00 0.70 29.36 \n", - "2015-12-01 25.01 2.19 27.99 2.85 30.11 1.63 29.39 \n", - "2015-11-01 23.83 2.24 27.91 2.93 30.30 1.67 29.60 \n", - "\n", - " Nino34anom month \n", - "datetime \n", - "1988-11-01 -2.38 11 \n", - "1988-12-01 -2.24 12 \n", - "1988-10-01 -2.07 10 \n", - "1989-01-01 -2.04 1 \n", - "2000-01-01 -1.92 1 \n", - "... ... ... \n", - "1997-11-01 2.67 11 \n", - "1997-12-01 2.69 12 \n", - "1983-01-01 2.79 1 \n", - "2015-12-01 2.82 12 \n", - "2015-11-01 2.95 11 \n", - "\n", - "[472 rows x 9 columns]" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.sort_values('Nino34anom')" ] }, { "cell_type": "markdown", - "id": "9af53b83", + "id": "a293de79", "metadata": {}, "source": [ "Let's change the way that is ordered..." @@ -3930,236 +915,17 @@ }, { "cell_type": "code", - "execution_count": 46, - "id": "d89c47e8", + "execution_count": null, + "id": "be7ff8ce", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nino12Nino12anomNino3Nino3anomNino4Nino4anomNino34Nino34anommonth
datetime
2015-11-0123.832.2427.912.9330.301.6729.602.9511
2015-12-0125.012.1927.992.8530.111.6329.392.8212
1983-01-0127.422.9628.923.2929.000.7029.362.791
1997-12-0126.924.1328.763.6229.320.8329.262.6912
1997-11-0125.634.0428.553.5729.490.8629.322.6711
..............................
2000-01-0123.86-0.6023.88-1.7526.96-1.3424.65-1.921
1989-01-0124.09-0.3724.15-1.4826.54-1.7624.53-2.041
1988-10-0119.50-1.3223.17-1.7527.06-1.6024.62-2.0710
1988-12-0121.80-0.9923.07-2.0726.75-1.7424.33-2.2412
1988-11-0120.55-1.0423.03-1.9526.76-1.8724.27-2.3811
\n", - "

472 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom Nino34 \\\n", - "datetime \n", - "2015-11-01 23.83 2.24 27.91 2.93 30.30 1.67 29.60 \n", - "2015-12-01 25.01 2.19 27.99 2.85 30.11 1.63 29.39 \n", - "1983-01-01 27.42 2.96 28.92 3.29 29.00 0.70 29.36 \n", - "1997-12-01 26.92 4.13 28.76 3.62 29.32 0.83 29.26 \n", - "1997-11-01 25.63 4.04 28.55 3.57 29.49 0.86 29.32 \n", - "... ... ... ... ... ... ... ... \n", - "2000-01-01 23.86 -0.60 23.88 -1.75 26.96 -1.34 24.65 \n", - "1989-01-01 24.09 -0.37 24.15 -1.48 26.54 -1.76 24.53 \n", - "1988-10-01 19.50 -1.32 23.17 -1.75 27.06 -1.60 24.62 \n", - "1988-12-01 21.80 -0.99 23.07 -2.07 26.75 -1.74 24.33 \n", - "1988-11-01 20.55 -1.04 23.03 -1.95 26.76 -1.87 24.27 \n", - "\n", - " Nino34anom month \n", - "datetime \n", - "2015-11-01 2.95 11 \n", - "2015-12-01 2.82 12 \n", - "1983-01-01 2.79 1 \n", - "1997-12-01 2.69 12 \n", - "1997-11-01 2.67 11 \n", - "... ... ... \n", - "2000-01-01 -1.92 1 \n", - "1989-01-01 -2.04 1 \n", - "1988-10-01 -2.07 10 \n", - "1988-12-01 -2.24 12 \n", - "1988-11-01 -2.38 11 \n", - "\n", - "[472 rows x 9 columns]" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.sort_values('Nino34anom', ascending=False)" ] }, { "cell_type": "markdown", - "id": "089d75db", + "id": "5504a0da", "metadata": {}, "source": [ "### Resampling\n", @@ -4168,53 +934,27 @@ }, { "cell_type": "code", - "execution_count": 47, - "id": "1a5c0bf6", + "execution_count": null, + "id": "597cfeac", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEGCAYAAAB8Ys7jAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABygElEQVR4nO19ebwsV1Xut7uqej7n3DPeObnJzSwhAzEEwgwigj5QQUFAVAREVPChT0Af+h4+RXzwnEUQUN4DB0ycAMNkIARCQhIy38zTnc+5wxl7qmG/P6pW1a7qXdXVfaqnk/39fvnl3D59undXV6369rfW+hbjnENBQUFBYfyQG/YCFBQUFBR6gwrgCgoKCmMKFcAVFBQUxhQqgCsoKCiMKVQAV1BQUBhT6IN8s7m5Ob5v375BvqWCgoLC2OO22247wTmfjz4+0AC+b98+3HrrrYN8SwUFBYWxB2PsCdnjSkJRUFBQGFOoAK6goKAwplABXEFBQWFMoQK4goKCwphCBXAFBQWFMYUK4AoKCgpjChXAFRQUFMYUKoArKChseTgOxz9+9yBaljPspWQKFcAVFBS2PO4+vIL/ds1duP6BxWEvJVOoAK6goLDlsd60AACLa80hryRbqACuoKCw5VFr2QCAEyqAKygoKIwXai2XgZ9YVwFcQUFBYaxQJwauAriCgoLCeMGXUNZbQ15JtlABXEFBYcujbroB/KRi4AoKCgrjhUADVwy8L6i3bPzJ1x5C07KHvRQFBYUtBpJQ1psWGubWiTEjE8D/4usP4yNfeRDX3n542EtRGDBM24Fpb60OOYXRghi0l7ZQKeHIBPDjqw0AgMP5kFeiMGi8+qM34Qf/zw3DXobCFgYxcGBrVaIMdCZmEugAm1vMq0AhGY7DcefBZQDuhTVXLQx3QQpbEuEAvnV08JFh4KsNN8lwcmPrHFyFznj0xLr/838e2Fo+FQqjg3rLxo7JIoCtxcBHJoAfPl0DoAL4Uw13HFzxf35ocW2IK1HYyqi1LOydKQHYWqWEoxPAl+sAgFNbaHuj0BmHT7vf+5mzZf8cUFDIGrWWjalSHhNFXUkoWaNlOWiYrvZ9cmPr3B0VOmOlbqKS13DGTNkP5goKWaNu2ijnNcxXC1hSDDxbUJE9oCSUXtAwbXzlvuPDXkZPWG2YmCwZ2L2tpBi4Qt9Qa7kB/Ky5Cr73xGnYztaodhuJAE5evUUjh6W1JrgqJewKf3Dd/XjLp2/F7U+eHvZSusZq3cRk0Q3gJ9ZbW6rJQmE0YNkOTm20MFct4Ecv340jKw18+5ETw15WJhiJAE4lPk/fsw1rDQvHvJpwhXQ4tuIer0NjKEGs1E1MlQzsnnYTTEcUC1fIGEdXGrAdjj3TJbzoggUA7oSerYCOAZwxtpcxdj1j7ABj7F7G2Du9xy9hjN3EGLubMfbvjLHJXhex4THwZ541AwC45/Bqry/1lMRUyQAAnB5D+Wm1YWGypGN+wq3/3koJJoXRwEGvwm3vTBnlvI5KXsOJta1xnqVh4BaAd3POLwRwFYB3MMYuAvDXAN7DOb8YwD8D+PVeF0EM/PIzp8EYcO+R0bk7nlhv4sHjo13eVtDdr/GQd6KOE0hCmankAQCnxvAmpDDaoJ3pHm+XN1stbJliiY4BnHN+lHN+u/fzGoADAHYDOB8A9T9/BcCP97oI0sDnqwWcNVvBgaOjw8D/5GsP4U2fvGXYy0jEmtcENY4SymrdTWKqAK7QLxw6VUOOAbu2UQDP4+QW2el1pYEzxvYBuAzAzQDuAfBfvF+9BsDemL95K2PsVsbYrUtLS9LXpSqUSkHHOQtVPLy4Ln3eMLC42sSx1cZIZ61XGyaAYKs4LrAdjrWmhcmSgemyG8BP17bGhaUwOnjiVA07p0owNDfczVULW6YbM3UAZ4xVAVwD4F2c81UAPwdXTrkNwAQA6ZXHOf8Y5/wKzvkV8/Pz0tfeaLoSSiWv4ZyFKp44WRsZd7rlegucj3ZgIRuC9YbV4ZmjA865v96pkoGioaGS17YMM1IYPj590+P47M1P4oFjazh3e9V/fK6a3zK5llRmVowxA27w/gzn/FoA4JzfD+Cl3u/PA/CKXhdBSUxi4JbD8cTJDZyzMNHrS2aGlbrn0bLeGlmjpdW6y8BNe3R3CSLuObyCV3/02/iVF58LAJgsuqfhTDU/0jdKhfEB5xzv/9d7AQB5LYfnnx+Qx9lKAac2mnAcjlyODWuJmSBNFQoD8AkABzjnHxEeX/D+nwPwWwA+2usiNrwkZslwGTgA3PjQaNRprngBZZT9E0gDt5zR2LV0wiNL62iYDj503QMAgJ1TrjY5U84rDVwhEzx2YsP/uWU7OH97QAZnq3k4I76rTos0EsrVAN4I4EWMsTu8/14O4HWMsQcB3A/gCIBP9bqIWtNCOa8hl2P4vl1TuHLfDH7vi/eHOjSHhRWP3Z4Y4cBCDNwaEwZOSWvC0/dOAQBmKiqAK2SDWx8PN7WdvyMI4BfscCue/+HWgwNdUz/QUULhnN8IIG6f8cdZLGKjZaNScJei5Rheedku3PL4Kaw1LJTzw7MsN23H3x2cGlEGTolAACOTN+iEqFY/WXTr2KcreTx4fHQS2Arji2hJLQVtAHjW/lk8e/8s/um2Q/jFF5wz6KVlipHoxNxoWqjkNf/feS9b3BrycAdi38DoerRQMMyxZA2cc45PfesxLI/AtnGtYYGkx+ecM+c/vjBRVFYKCplgNUIStIjWvWtbCY3W+Ns2jMREnvWm5TNwACgYbjAf5oBjzjne+Img/ntUs9YnvIaE7ZPFxNKomx87hf/x7/fhzoPL+KPXXjao5Umx3rRQLej41ntehLwecIiFiQJatoPlmolpry5cQaEXrDZMLEwUsHemjF94/v623+f1HFpjsmNNwkgE8GMrDeyYKvr/ps5CspgdBtabVqihaFSTmCe8Aa07poo4utIA5xxu3jkMarOvj4BZ1GrDxETRwIQnnRC2exNTjq81VABX2BTWGhZmKnlc8/ZnS3+f13JoboHxjUORUO4/top97/kCHvJa1I+u1LFTCODEyoZ5h1wTtmB5LTeyEgrtDOj4xTUckZZfGWJOgbDesDBRbF/H9km3TPP46mjeLBXGB2sNU3qOEfJ6bugSbRYYSgC/5rZDAICv3b+IesvG6ZoZCuDEwJtDZOAUwK8+ZxY/cNH20WXg3rqoFM+KC+BeorNc0KS/HyTWGq6EEsXChMfAlRulwiaxWrf85LgMec2VUMY93zKUAE7BcaKo4+iK699BAQgIAvhwGbibwHzb8/ZjfqIwsgx8aa0JLcew4Ln5xVWiLNfcz1Myhh/A15sWqhJ2tOAx8KW10bxZKowP1pqdGTjn8YRnXDCUAE7eHdWCjqOel/XObSID95KYQ9RrxZvMbCWPtYY11KRqHE6sNzFTyfuyU1wtOLmvjcIJu9602vRvACgaGqZKhn9TV1DoFWsN+TlGoOtlXEpv4zCcAO61p9sODwK4wMBHQQOnm8xE0cCs10I/ik0mJ9abmKsWoHull2ZMNybtIIaZGCasNUyphAIAZ81V8MjihvR3CgppwDnHmuczH4dRKVXeLIbKwJuW40sV20rB3XIUNHDqFpwo6pituhURo2i0tLTWxPxEAYZX5xrHwE95ax/mroaw1rB8/5Mozt8+gQeOr429NqkwPNRaNmyHp2Lg/Q7gX39gMdRPkjWGxMDdD9SyHL+srShosyShjEIVCkkoAEbSgvLEegtz1bzPwOMCOPk+NIYsA5m2g6blhOr+RZy/YwKnNlpbanK4wmBB125iEpNIYh8D+ErdxM986rt43oeu7xshGRIDdw9w07L9LX1BaOjwD+5QNXATWo6hZGj+uK9RS65xzrG03sR8tQBDcxl4nIRCw4KHLaHQBVM05KfeBZ5nxQPHRnsKksLoYs2XP1NIKH0kiURUV+omDp7qT15nKAGc2r9bloOmaSOv50K2jqNRheLWKjPG/PK2xREL4KsNCy3LwfxEAXoumYFTm/2wp743JDsuERftcj0r7jo0OmP1FMYLRFLizjFgMBJKTWjVP9UnC4uBB3DOuR+Ym5aDhmm3lbblR0ADXxOaTUp5DRNFHYsjVp9Mko6bxPQYeMxNjx4fdgAnBi7uuERsK+dx1lwFdx5cHuCqFLYSWrZ7judjzjFgMElM0XWTdgVZY+ABXNScSAOPbqf1HEOO9Vef6oS1homJQqChbZ8sjlyHILXRzwkSSlyZID0+bAmlEwMHgEv3bsMdB5dVIlOhJ7Qs97yha0KGQZQRboQCeH+ssQcewEUG6DJwp+1iZowN3WyGDJcI2ycLOL42WgycEn1hCaUDAx9yEpO+/zgGDgD75ytYXGuOhNmQ4/CRnoeq0A4615POsUFIKBtbkYGLDNBNYtoo6u1srKBrQ01i1ls2SoLF7faJIhZHloHnBQklTgP3ZKsRSWIWEhi45t2MRmHA0Gs//h3sf98Xh70MhS5AQZmGGMvgy7R9JAnrW5GB16MM3HJQzLdfzMNm4LWWjbKwroXJIhbXGiO1rb/9yWVU8hqmy3n/ZI3bElqjlsSU3LQJlM+2R+BY3/LYqWEvQaFL0DWQGMAHoIGLDDzqT54Vhi+htGwUJVudgp4bKlusRRj4XDUP0+Z9+yI64Y6Dy/jCXUf9fx9dqePzdx3B6686E7kcg06NPBLayjn3NfBh28kGDDz+1CPzfWcEArhCgG8/fAL3HVnt/MQhg4hfUhKzMAgJxatCyWu5tilUWWHg3qJiAGlZDhqWjelyu/dzQc/1dXvTCXUzzMCpImWtYWKqFN8g0A8cXq7jVX/+LQDAiy98GYqGhoOn6nA48Lxz3WnbAQNvD3riYw3TjvUMHwSaqRi4F8CV9jwysB2On/rrmwEAj3/wFUNeTTIoKOdTSCj9rkLRcwyz1fxW0sCjScz2MkIAyOvakBl4eB4ndXX1S8tKwuHTQRMAbcvoRljKu18haeCyOnBi5RMFHQ5PHr3WbwQ1up0Z+CglD8fd9KhXnN5o4dhKA/ceGa26/L/6xiOxzV50fidJKEaKRh7TdvDwYu8NZRvepLGJoh4bNz503f3Y954v9PweQwvgrqG6LS0jBFwGPiwN3HE4GqYTurGQr8JqH30N4rDeDN6TmgOi5Xh0QsokFDqhaRcxzEoUcnRMSmJSU9ewNXAx30E3zOVaa6TyIP3GVb//NVz1+1/DjQ+fABB0yg4TTcvG7//H/fixv/iW9PctK0UdeAoG/uEvP4iXfOQGHDxVi31OEqiSbaJoYK0pjxt/8fVHenptwtCqUKZKRmwZIeAe4GFVodDFKkoo5Gw2DAa+3gyOQ92MCeC5JAnFPebkwT3MnY3PwBMuLkpiDrsKZUPopKu3bCytNXHp//zKpi+6cQLlLI4uuyW0cS6SgwSZQ23EDCUOGPjm6sBvf/I0AODhxfWe1ukycC2RgRPiyn87YWgMfKpkuBq4aUsDeEEf3sw6YrlhDdyTUGLupP2EmM32JRRvjbRLCCSU9mNGsgpJQsOs7knDwDU2GknMZaH9uday/UlB//K9w8Na0kAhlsFR0ByF2nyyo45DmiQm6eNJMWa67F7zDx7vTUaptWxPQjE6BvBej+vQygiJgTdjGLih5YamgfrBUdDASX7odPL0A2IAr0cklGgANyXHjFhGxRunNkwP5FQMfEQ0cJpiBLg5Efp31nr4DQ8u4duPnMj0NbPAQ0LgOnTalRFGwT+7kz2rXwee21wZIf3ugR4D+EbTQjmvoZhCTTCt3s71oUoo9ZaNlu1INXAtx4Y2PaZmevMjY6pQBg3x7k3bxnrEsMdI6MSkgOMz8KEGcBt6jvn2tzKMCgMX8x31lu1PNco6CfzTn7wFP/XxmzN9zSzwyFIwWOOJk6MTwFc7XIOm7bh2HLl4CSWXYzA0lsh8qdNZPA7dwLQ5CrqGgtFZTWjavcnFQ5VQ6AKRMXA9x2APSQSNyhOA2xla0HND0cBFBl5rhatQqJ41uQrFfazi3ZCGWVHRtJzEFmdgdKpQluvh5DHZCcsSxb1i2J8xCeJ5RxOdhulPRBBvrLIxh6btJMonhLyWPJmeOq9rzd6uedN2YGjM7SrvcNx6vTEOJYAz5iZD1rwDI9tOazkWa43abwQSSvjGMlE0htLIs9ESA7i7tqZpoyDY8BoJI9V8Bu4loIZ5EcblPETkRqSRRxyhV2vZfhCrNbNLrh9ZDkpE6zFJuUHi+GrDX4csOI5aAD8hmZLVspzEEkKCWwkn/zy2w4MxhD1WbbVsdx2FhPfxnzsuAbzecr1PRBYm1lsTDC03PAlFksQE3EqUTtu3fmC9aWPGmwpU8yWUcKeonjBSjR6jCoJhboPTMHC/CmXI5FQc4FE3LZz0ttRrTcvfCW0Wj50ItuekMw8Llu3gmb/3Nfzy390OQO5c2RqBwd4iiToh8ehv2XzTAfx0reXvjnqt2jJtB3kt59uCJDWm9SrLdfyUjLG9jLHrGWMHGGP3Msbe6T1+KWPsO4yxOxhjtzLGrkzzhg3LDTzTlaD7cn6y0PY8LceGtr2sScoIAY+B96EO/ImTG4kNA+sNEwveVKC6FziiDVBaLr4KJdDAhz+qLg0DJw182PKCOEKv1rJDbC/tdCbH4fjmQ0uxteOPnwwC+MEhB/D7jrpt8l89sAgg2C2LGIUqlJWQhCK7yXQmCYBLEuPkRJKPJot6z7sO0+IeA+983fWTgVsA3s05vxDAVQDewRi7CMCHAPwPzvmlAN7v/bsjGqaDop7Drm1F/7Edk8W25+k5lqnW2A0oSJYiO4MzZsp46Ph6po0clu3g+X/4dbzkIzfEPmejaWOqZEDPsVASUwyEjLlJGXkVCpURJleh3Pr4KXz6psd7/Sip0DCdxBJCYHSqUE6sN7Fryj036y3bZ+BA+n6Aj3/zUbzxE7fg6w8uxbxHcFMQO26HATLuIrLQMB1U8rq/+wPcc2fYjUwiiZKdy6Q9d0I+wa6DXneiaPRsANeyHRg6SzWkvdWvJCbn/Cjn/Hbv5zUABwDsBsABTHpPmwJwJM0b1j0GtmOy5D+2c6o9gA+TgW94Gmc5Emiu3DeNY6sNHMrwQiO2k4T1pjsdqJzXfH2y3mpnsnouB1NyQtONkKSqONbx05+8Be//13txeLl/gaRp2R0TTKNShbK01sSemTKAgIFTQE8bwKndO46xizrzeobaei+457DbLk9HvWm5XdLzVTegz1bycHj80JBBQWTgssCXRRKT2PKEx8B7uWmZnhZPxm1JlSa9svyuNHDG2D4AlwG4GcC7APwhY+wggP8N4L1pXqNluQdXZOAycyg9x4bm2fHkqRrKea1tXd9/1gwA4OYMLUafPOVuoUWWE8VGy/VUKOd1f2tHF5eIoiG3H/A7MTto4MQUrr3tUJefIj0smyPfgR2NShXKifUWdk4VYWjMC+BN7JurAEhfTkrfRxwjbJpOYHEwZKdIuoGcWG96TXYOCnow1Hu26p6jwy4l3GjZia3waZOYSclFepw8kHoJsC3SwDU5AxdvCn3TwAmMsSqAawC8i3O+CuDtAH6Vc74XwK8C+ETM373V08hvXVpa8u+OOwTWLXPG04fYyPPAsTWct32irY50/3wVAHA0Q4ZKiaKkO/xG03VGLBc0X5+vt9pNwEqGJq1kSCOhiJazj53sre41DSzH8acHxYGNSBLzxHoT89UCqgUdx1bqaFqOEMDTMXC6edZiKkwol5EfYucxgXYDnLvVKA3LRsHI+QGcvrfNBnDH4Zsyx7JsxycjUg3c3nwVStQ/qJfvxqQqFO86jb6GGLT7WoXCGDPgBu/PcM6v9R5+EwD6+XMApElMzvnHOOdXcM6vmJ+fDz5Ugp0oMDwNnHOOB46v4fzt7aY9hnc3Xc+oAgEI6rmT7sAty0ZB18ISiiQZWMxrUr9vqkKp0EkvYenLNdMPSnEn640PncB3H9/c7sO0uV+zHodR8AOvtSzUWjbmJgpYmCjifk8KOWu2OwZO32tcB2/DdINkQc8NnYGL739kuY6mNy1r/7z7mel722wi88+vfxiv+JMbe/YWt2yeSEZSSygJhnmBBk7+Qd19N7bD4XD4ZYRAe1lm1Fq7F6SpQmFw2fUBzvlHhF8dAfB87+cXAXgozRu6mVn3RHjF03fil154jvR5w9LAT6y3cGqjhfNjXNcqBS3TOmC6aGotK5aFt7wTsmwEEorMhrdkaNIg0FaFIjlZnhAc1+JOpjd84ma85qM3dfpIibCczuxoFKpQKA9SLehYmCz4AbxbBk5+InHt325SX0PRiG/2OLnexJs+eUtfcxO0ljlP715tWJ7RXA5vfd5+/Pcfvgivu/IMAJtn4N9+5CQA9Dxj1nTc5Cogv5m0LCfRC5yQpIGbvgbem4TiTwXSWazcI16rvTbXpWHgVwN4I4AXeSWDdzDGXg7gLQA+zBi7E8DvAXhrmjcUtzd//lOX49d+8Hzp8/QhtdLTRXKGl7yKolLQQx1qmwVJKA6PZzam7d70ygVNcCNs95ApGXIGHnihxGvgx1bci8nQmH+ytiwH191zDPcfy24Ki2Vzv2Y9Dn4jzxADuG+6peewXaiS2jlVdDtyU54DVLkS1z/QsNydlGveJicGNz58At94cAm/+c93d/MRukbdtDFXpX4Dy8uzuPLOm59zVrCD22QtOP19ryW5ls39Hgg5A+epq1DiAngzwsC73R35hlohBh5+L1Hu7PWm2NEbknN+I4C4o/GMbt+Qits7QcvlwLnLwrQOF3yWoMYA0v2iqOT1UGfkZiFuzRotp01asr2p6HnNlVAOngpa6aNJzFJek95c6EZYTmilp4tqqmT4a7r+gUX8wv+7DZNFHXf9zg/2+hFDMFPok9oI+IHTxZbXc9gu9CnMVvOp3OUI1M0XF6yaHsstGvEDTGhC0bcfPpl6/b2gYdo+cdlo2miYTsg+No2DXxrQ3/c6JNxyuB9YZecyFUp0QlIdeFoGbtkO/uqGR/GGq84MFT2YwvlD13RbABeH24yLG2GaCxgQvD0GrIOTgc1cXAAvaP72OguIbboy9twSToRyXke9ZcNxOFbqJraVw1UyRUPzTa5EUHNP0dCQY/GZe8A9YYk9UCv5asMKseHNdCFaKW7Io9CJScG0oGtYmAgY+Ewlj8mijrWGiZPrzcTdmO1w38EwVkJJwcDpZtGy+1uD3TAdoePXamu6ymqOJB2TpfUeA7jtJBqzpY0xSYnjqId+HAP/wt1H8YdfegB/8rWwgixOBYo7bo1BaOBZw7I5jBR3R31IpWTEwGdjyvoqBT3kk7xZiO3KSQHc0BjKeQ0bLRsrdRO2wzFTCd9k4jTwFp1MuVxs4kbcMlLwCk/VDgJQ2i5EGawUScxRmIkZ+Jbn/KBWMjQUdNeg/9bHT+MZv/tVXP0H/xn7GuJFGeehQ6V6bhJTfhGLCdN+ltY2Tds/7zeatn9zIWQxR9K0HRxdcWXKxdXeNHDLSZZQWimTmElTv4IywuQqFOoJiZ7RvgaeMonZTw08U7RSdkn5reGDDuDrTUwW9dh270pez8wHAwjrYLLXpROsIDBw2pZHbzJxZYTEwHWNxSZuxKw7nWjiTkNMoC1uJoA7TqJPMzAadeB0wRb0HC7c6Sa0P/TqpwNwdynHvOCzXDNjbzRicIiXUOxAQolh4OLNky56zjkeXlwD5xz/esdh7HvPFzZtdVw33QEEBT3nauBm2Oo5H6PldoPVuunvrHpl4KbtwMix2E7KbJOYyQyc7BYmIz0jYv2/L6FEbtDie48NA0+rgfsMfIDNPLbD8fjJWqx8AlASsz8Sipw9ixKKhpbt+MyFGisIpbgyQifYzsVtG5s+4wgkFFHrF7tPB8XAR0EDL+gazlmYwP0feBl+5JJdAIKLmhDnVkcXZY65bFN2Q2qYts/A4wKjqLfTOfKhLz2Al3zkBtx9eAUf/+ajAHr3rQbcm7zlcBQNzT3HPQlFzMlkIaGI9fA9a+DeOVSICcCyElsZ0iUxkzVwGjUXve7oBpAXOzGtLRHA0zmFaQn2qP3Ch750P77x4JIfQGSoFLRMk5gN0/G17HornhlTAAeCYBrt3izGVKGIMkw+JnFDz6kWAglFlIrEAH68x60v0F0Sc6gSSsRvXQwI0dxDXJMO3QifvX8OGy0bdx5abn8fK0hixrG8aADnnOMvvbmcpzZamCh44/42wcAbFuVJ3POs1rTRsBw/+ACChLKJOnC6duaqhd41cMeBRnKgJPA1Ik6dcUiqA29v5JF/N2RGFj32NGEnrIGHX0N877EZqUb+AJ0wCA3cdjj+4Lr7/YD05XuPA0Di+rIuI2yaNmbKbiBOKgE0tJyfuCHXulmJBt6ynLZj5p7wDIyx2JO+abmTcsr5oB5Z/Jyi0dKTPU7pdteSoozQ90Lp+W1S48DRVemNoikEtCimSuEbZ5yPN1UivPCCBTAGfPPB9rFplChMYuChyUCmHbphNEzbH7jdadRYEsQh2ZW869XfstwadUKaMWSdQGvfN1vGcs2UBsYDR5PLVi3HLROUncuW7cC0eVuPhAx5TfOrvKIQCQ0gt9YFAjkxWpXkSyh6LlZ6EiWVsWHg5NDVCUn+1lnhO4+exF9+/RH89r/eC8ANgJW8hr94/eWxf1Mt6DBtvulaWELDtH1rXakGbgVbMWLgB70AGmXgpbz7dUZvBGLtdVwAp9KrgncTAMIBnLyqJwo6njy5iQBu88RxagBAv+63hHLP4RX80B9/Ezc81O4UKEooUUQZeNyOjC7i7ZMF7J+vStvHGx4DL+jxZYRicKi3bJwWhi3XTdvf5su8sdOCbkJFw7VsOO3lWbJOYlIT3JleR2t0IMM3HlzCD/3xN/GP3z0Y+xru+SxPyNNOIlUAT5hMb9ou6aGGIVknJufcv7lGA7gpaOBx5ZfjycDTauBa/xk4bXtIIz6yUsePXr4bZ3nddjJQEM2qG7NhOf70a9kWuhkjoUwU9bZMO520UUbYEo55UhVKQXetApqWu01fb1p+PTxJKBfvmQp1bXYL0+mcxB5UFQoNEpYlZVt+AG8/V6fTSihWsHs6Y6bc5mJp2u5uye3EzMVq6asN09/K1007NGy53nL8771XSQIIJAJi4KdqFMCDzx/UM/d+7tPNbt+sW28erUShXcRXDxyPfQ2yi5UlIYMbUboyQiDJT4X5ElJD8py6afuxg2LJv915BL/3xQMhDVzXctBzrO24iefY2DBw8gfoBI2G9PbxIqbSLmqAWa6Z2L1N3oFJoG60rEoJ6y0b20hCkQSCMAN33/voSqONBQIBW4reCMTGhqQqFLfpIOdbhm40bd8+9clTNWg5hot2TuLJU7WegqvtcHCOjmZWg6pCueWx0wAglcSCTsx2JpdWQhET0HumS20DG0TZopDQyLPWsASP7nAAr7UsP1icWGsfL5YWJBEUPaJw3OvMrQie+FlUodAu80yPJEUT4mTh/HiCoZrluElM2W5SPKadQK6YsdeD4Nkk+25EyYoY+K/83ffwsRse9W/qhkicYpKYE0V9PMoIaUfcjQbez0YeOnnKhuaXyYk2tzJMZBjAOedoWMG4NFkTjikEAUrMnNxoSreI9PuohCIGcCMmgDc9wyxiHC3LwUbT8tvI15tuENk3V0HLcnrysaDPMgpVKI7DfWOudUmNti+hSJhc6iSmcPPdO13GWsPCihB8KWgWjByKusvAZY06qw3TbyZqmE5IQmmYtr/WE5tg4HVRAy/o/uCQXdsC3/5CBklMUQMH2nc/9NriqDkRnLuatZ7LuedyZC30OdImMcX3jK4jr+eg5Rg0CXsGAoOyouEOOxenYZEPPMU6WY6DXlMsHOgWAw3gDigz20UdeB81cEpetmzHHy67WzhhZaB6zyxGq7mddW77eo7JmaBYhVIpEMNu90EBOkgoerKEQs8R9br1poXpct7fjm6fLPrBK20ruYignDGdF0o/uw4fWlz3GZTMXZIuKJnc1x7A5cdCvPnunXHPK5GF+7KF7jJwzuWNOi1LrFSysRzRwOl1bnvydM/5iYYQ+MRRgiKhySSJ6UmPZ8yUwVg7A6fXNm0u3eXROaTn5AzcH0jehQYu7eYUaskNTe7LROfP7m0lrDZMPLS47v/ubm84Rt7L98lyHPS+U+V8z4RwKAw8nU9B/7fRFMBX66bfNk5ubHEgv4PlDAK4v201NFRjOjxDdeBGsJ0tSrb2dNJGGWHTDGYExult9JzAu9jGRtMdJEHVLjsmi4lbyk4ghqJ1klB8N8Ku3yI1bvHYt5ZjMQzchqGxNk94ANiWVkIRGPieaZdxisxSZOBx3XpA2Pujbto47bF4t+HGRtN0dfDlmolrv9fbMI5AQtF8mRAIM/BcjkHPsU0FcNLAJ4oGtpWMtl2D+PlluzwidDpNe49j4CmrUID4bk7qGDdy8tJbInG7p8tYb1p4WAjgNN3IZ+CSYStNjzRtKxk9VxCNrIQyCA1cLAGiAD6dMBkHCAK4uBXuFU0zSLhMFA2pY52YCCsXhKYKydbelz8iJ0o3DJwCScN0UDNtVAua34m4Y6ros/G4hFsS0jNw9//9lFAOHF3FdNnA7m0l6Y3TTerKg0B7FUrnJOb5OyZQLei46dHAkCqqgbuPhb8bkgyo0qRhulUo1YKOyZI7r7Fh2bho1yTyek5aipoGDeFcFJP40Z1eUrljGrijAF1pYqrUbgomBtMnJLsJ6guJJjG/8eASvnbguP85Os1dBTowcCHxr2tMqgTQ9bp7WwmchyWso767Z5B7kiUxC1oO28ryaz8NBhzAg+L2Tuh3HXi9Zfv1pqsNl4HrOeZ7H8SBLt7N1Nz6azCDLfREUZfKEqItpbi1lQUXSg5GJ9OLrcVxSUxi4HRSL9da4BwoF3S/5GuqZGySgdP2Nx0D72cVSqPlto1PFOV1/W5OQL5OCmrP3j8LAPjA5+/D7U+ebnueuHsytByetX8WNzwYTKgXKz/iGDhJKlSP7EoorpEZDfjwd09azm8g6RZi2eRLLtwe+7yk7kUCGa7JsNGy/MToZKk9cIk3B5kcFJxDYQnlTZ+8BW/+21sDKaibAC6ZVSmOZdO1nDQXRzGAZvpSABdv8CIDl0koeT2HqbFh4N7/u9PA+7OP/saDS2iYDnZMFn0GPl3JS8e7iagWdGg5huV67xl/giihTBYNaSedWGpU1DV/3JisTIpOluh2L1US03aQ1zU/QJNEVM5r/gnasgNvjF6mx6RNYg6iCoW2r5WC/MYpyk4y3PK+F+OTP/P9/r/f8Nc3tz0nWop49f5ZHDpdxxGPnYmVH8UYBk6Bo5TXoOcYGpaN46sNzFULKBmaK6F4JaCGnut5urk4gGB+ooCrz5nFzz/nrLbndQrgLcvBhe+/Du+L8S6vNYMuycmi0ZZLEneHskqUwNdHXgdO8mGqJKav6UvyDjYPrpmY+byUxKTxkFQFJHoU5f0kZvvADvrepkruceiFsAyFgXfjhdIvCeW2J04hr+fwkosWfAZOHZFJYIxt6o4pohGSUGIYuJDEzOWYzyxkSUy6MUZPNgrO9DpSP3DTZZwUbOjCKhoaXnflGfjJK/bizc85K9bbOA26TWL2c6Qa7UomYnIPTctJ3IYvTBZD30GtZbe9jmgpCgCXnTENALjz4LL3HukZuO599/WWg0eXNnD2XMW3TvAHL2yCgYsdvwDwmZ+/Cr/1wxe1PS+p/RwA/uV7hwEA/3HPMenvRQYuO+fpfN87U5J2/IaSmBIyQtJFdwxcVkZoB0nMmGtmtWGiktf8wccnN5pgDJgW4ojhJzHlZYTEwB0uT6Z3wshq4NStJ2Nh9x1Zxe//x4GOLbdJaFoOKnkNM14G+MR6M3EyvIhtJSNUi9srRA00LoBHLyySUbpm4An1qIBQheJLKO7nK3llZX/w6qdjrlrYFAP32VMHCSVope9vAC/oOVR7kFDiIFaHuO/hHiM6phfunERey+EOL4DLk5jh78YWAlYxr+HkRhPHVhvYv1BFOa/5ZYQuA2c9l/iJen0SZFquiNuecKWk7983Lf19rRVh4BIJRc8xTMdUZohJTNm5/NBxt3wvTQBPMucyBQau5+QaeK1loVzQ/eqwpfUWSoaGspAEFuvAZRp4Xs/5lW2yvBrnHJd/4Cuxn2E4EkoXfuAyBv6pbz2Gv/rGo/jbbz/e81pI45ooGuAcePJUPXUAn8yKgft+G5o35SVeQqGTiZp5pBq4Ji+9bAnBKM6C09dRvedReVf0Qkhi4JxzfPjLD+A3/ukuaQlgwEg7SCgDqEKhiyfO352CYjeIa5UWE8jft3vSD3INIQcS14QlSgZFI+cPAj57ruJLKOQaKKuLTgv6bjrtjgu6liihUJVJnHdIrWX7JGSypLcNe6Yba1GXWyOLSUz6/OK5RqV8siR/FIYWH8Dd+MD858nb7TmMHPOvyRNrTZTzmt+MVDRyiXXgRJr8wghJTDFt7hdYyDCkJGZ6DdyWJA9q/iDg3lt66QKmhENXDLycvYRS9Rh4NPC1bAeMBTe0JAZOF1/UwVGsQiELTtn7FLyABgB/dv3DANq1xCQGftsTp/Gn//kw/uHWg9KkHum5HRm49+u+MnDvmMRKKGZ8FYqIP/jxi/ETV+zx/0aE7Ib17P2zuOPgMtYaZigHEsfATUF2Khu6H6DOnq+imCcJxXUNTPK37gTLDgJjEpKm2ABBL0NcNUxLuDFOFg3UTbvNVjWv51DMa9L2dTERXinoqJt2aD7pQ4vrYExugSD7LIA8iSm6ZuoxdeCmV2pIDPzEejNUR0+VQ4BcA6ed8VRCb0mnG/JQGHg3GrgseUDld71s4wl0AYve32kD+FTJwNJaE7/02dvx2o/d1HPDSVRCsRzexlxop0DJVT+ASxm4F8BjThRANPCJ6OQeizt3oYpL927zH28vI4tn4OKFdO3th9t+7+u5qRl4/zXwakFHw3TaGFbTslP1K/zk95+BH7p4J4D20krfx0Y435977jxsh+Nt//c2P9iRmRXQbpokyk7UVMMYcOZsGWVDQ0OoQonLb6SB6RGFTuPuOiUxqaQyqTaejitJB+LO0w/geg4NGQMXEuFUmUNt//T3JUPrWIxAn4X+JoqGafs5kDgGTiZxvuGV5aBs6D7pEX3j6bhd/8AibnrkpPd895pLYuAyEy0RI1tGmFSJQHf3XmtegeACnhMsWcXp40k4c7aCoysNfP6uo/jOo6d63raGA7jc07llu7WiBNquJSUxo2yhZQW+zrE6uXdDY4zhDVed6T/eLqHEM3BxkGtSBUFqP/B+JzEFe4Lobk7c6neCz56lN18WCiaXnzGNvJ7Dtx856UspRUPzdzZtDFy46Z01VwXg1h0XDQ2lvIaal8Qs6Fqs13satDyf/k6BL2kMGRB0pcaRK5HZkg2uOG6ObpylvCbtNRBzArRbPLoSbvhJ44MCJHeW1k3bl0LiGnnos4jnSTGWgbsa+M9+6rt43ce/A8fhbRq4tA9kpBh4F0lMeo5s60J39179AwCvUF/PhabaULlcJ3zfrsnIa/XKwIMyMqo/X2u2a4IiE6SAI9P4fE2vQxKTHiNwzkOarziJPCqh5Lzsf5yDG+Aex5Pr7bqdWEGQBDaAOvCWV5lDN8QoY1xvWqHjkARfv26rIGl33szrOXzubc8CABxadqssQh2wkXM6CFg5nDXndnPSukqGhrWGBYcHemuvEkpal9CC3l7PLIKmVcUF8KbIwCWkxZXyNBR1+YALX4bTAuniWCSAy4zeZEgy56oLyda4Rh4y1RI7V8uGhpJ3TlXFxrtIK/23HznpH4uq93zZpK9OMW44EkoKP/AkDZxMn3rpBiS0vLunGMDTMvCn7Z4K/bvXWnXRf4JO5mh1SzSZVkmQUPybXjSJGenEpMf89XsugXQBi1s/WTY/boI6sZQdk0V/bqfs950kFMD9/vvZiUk3Nd8eOFLCtdG0/InknZDEwGUyzJxg0Vvwdj1F2tlIbgKAe8yooYqqdIqG5gf4gq55JX69lxGmyU11KiPspIGLNwpiqKJ0QN9LKR+TxPQHdAcSCs0npXN1+0S665i+NxkBq5tiAM/5uYjoZ9FzbuKfOElZYOAiUS0YbvEAybR3HV72r8tSzDkIjBwD774TU8bAKfDF6WxpYFo8ZBcJBAX5nbAr8rzeJRRi4Jrvux31hlhrmKGtGN3dZQzcnboTlkcch4dKomTbxqjzXoiBywK4oUmrDKgGeedUEac3Wm25AZFNdoLGWF+rUJodJJSNph1iVkkgBt607BBrjBsfN+eRhuWaGXjUxDBwsXaeWtxfcuECAIQ7c1My8JbVrvcnrTWKTolSOo6xSUyBTBBTFkkLfS8FI5ecxNRybRLKmZ7D4fbJZD8j8bMA7RKKaYen+hg5JiVpdDNiLNDBxSSmuNOk40bEdHG16bfSk4mczJJhpBi404WEkqSB00WyGQbeFMxqCFGj/jgwxvCd974Yv/0jbqNDzxKK1yyQyzE/gEftNVfrVogR+ww8RudzEy7BemSlbEB42yiaLgEIMc9ivv27imPgVJ64Y6oEy+FtJWJpk5iAW4nSTw3c9Kpu6GITA07TstGyndQSCgXh7z25jKf99pfwyJJbKRLHwAu65ktm9D3G5RbEJObemTK+8esvwDtfch6AsLxFJaBxGnjDtPGOz96O837rP/DOv/9e2+9bVrpZtUlJTM55qIxQJoGJIxWDAB7s1vzchDcZKvoaphPsSOj7+btbngQA3zAs7U7aN+eKVKHQdyAy6dgkpncuk09ROa/5gV9MCBM5okqTxbWGXz1Ef19L8KWP/QwdPmOmoAsyTZE9sbS47Q0QX2uaBqJdJCFN5pqwYyqwVo1WfaRFvWX7X+BsJS+111xrmqEAXu4QwKOJrGglhJyBhw2AJoTAJdNFixJfByA4Dr43xEb4s1h+DW9aBt5fCcXQWBDABfZDWmQlZRKTvot7Dq/Acjju9Wq1m7Y8gAPwb9hFodLB9Z2OT2ICbgKdAoN4DhQNDYYW7xT4wLE1fOGuowDkXZJZSCh10wbnQWCOy5P4DLwU7EQIJBnG5RUsX0LJte2QaGfTyVFUhGzXIo6XA+I1cNMJxgMSAy/ndf86Enea0eqt4x4Dzwt/L2PgnXZUQ0lipvEpCEaqyRMMQHIZIec8cUq3eyK57/GbL78Qb3/B/o5ralujf5PpLYBTCzTgbglnK3ksRSw01xqWn6UGBAklJjC4J1s7uy5EGLgpeY6Mgctuam5Nq+Rk8xm4G8CjDQiiEVEn5BjbFAM/ud7EP373YGyJp68/eha9tVAAd5lQtZhuR0bHljzlaX6ojCQQKMiER5a172ySZCdRQqERe3HnItW6TxZ1nDXbPjIwrYTiJuPk1x3d+OizRWUUzl05T+xOrBZ03x4XCOrEieRFSRrFA3deZfD5P/vzz0z0CYqD1FNcxsAlcciyHRi5MAMv5TV/1xBi4JHr9ZGldd+umd5LpoF3sqwYCgNPU2SvxWjgjsP9D5UUwD9z85O4+He+7A8AjkJMprzleWfjN152QecPEEFc1Ud0vV+977h0O+kOZgiOxfxEsY2Br9bDDJwy70kSSiuFhNKSsHTaDXTaIRWNXIwGHiQxAbRVokRtAZKQy7FNVaH8xjV3479dcxce8FqrRdAk8rymCRJKcPFQsBOrCJJA3wWZVB085QbyVgIDn4swcPo5elxFySAK8Xuq5PVEDZxsGs6er4bK9vz3SauBJzBwuvGRmVPbaD87TCYAt6ciJKF4x4yui+hNQGyOEhn4BTsnQ8ndtEg0xPKZdAwDF44Z+Z+UDC1IPIsaeOQ8WK6ZsByOl37fDgCu66e0CmW0AjhSF9n7drKRA0dbqkpeg2nz2G32dd428eGldenvRbvIXkEMPkkD/+I9R/Hzn74Vf3vT422/a5h26CKcnyiENHB3F2GFk5hCm64M0YRLtBVfJqFEGXjnWuB4Bs5YEJyi3iB+GeEAqlCIBd9zeLV9ncIxKUuSmBTA0yYx9RyDuKmg915rWKGZkiIoES4GMxkDFyWDKEIBvKAnttLTZ9q1rYj1pqzemKeyuMh7ORbZzZX07zgGLmvXn64YoRFxJCvEWgsIZYTiDmS6bOC//sB5eMNVZ+BHLtnV8XOInycaJKNj2eLMrEQN/AOvfBrecNUZeNnTdvjBfO9MMF9X/J5pvume6RIu2eNWtFViGfgmNXDG2F7G2PWMsQOMsXsZY+/0Hv8Hxtgd3n+PM8bu6PRanPNU8gkQVFS0TdzwLrTpmLu8+PdA+w2AEJdg6gZB2V78XZKCxa2Pt7eWN0w7xBYWJgpYXG0Kv3dC01gA4JlnzeIHLtqOM2fat8FA+8kWBOfAjVB8HGjXwDshjoG3vF1NOe7iS2lmBbgSymaqUOgY3HFQ4tMtBPCiRAPvNoAzxkLfI+36Tm+0MFOVd/ee4ckYYgmdzC8j8EKRMHDhWqoW9MTp5uuenLhjsiTtPLVsxx/ym4QkBz+6CVJpbttoP98wK3if6XI+JKFQI09cABfdGUWiwRjDbLWA333VxV0xcDfxGyGJEQYeZydrOgEJ3DdXwe++6mKct30CL75wAX/5+svxSy86R3ifYE0/cNF2PP+8efzdW64SOqzlDLyTBp7mDLUAvJtzfjtjbALAbYyxr3DOf5KewBj7MICVTi/kcPj1rp3g1sa2F/NTadF0OY9Dp+tomPJyL2LwaxK2AQR14JtBGgmFtnWHTrdLOQ3TCdVzz1TyIZ/xf7vTbUefFBj4GbNlfPynr4h9Pz3HQjWrcRp4MxTAwwy8E2IZeJQ9xSTk0nnh9N7I07Icf5oLJRRFNO3AJZBuNjINfCJlAAeC8WYAcHi5DsfhOFWLtyg+02Nnx4UbtiuhRAJWggVvKIAX9dhqCSC4KVGCeb1hhaZPpdfAg/MnGijpPWZiyFUwIzT4u23lPL750Ak8eHwN522f8DTwJHOv9KXIaeBq4O1duABCdeAykkat9FEwxnx7BYLIwC/Zuw3/60cvDv2+UuiTBs45P8o5v937eQ3AAQC7hcUyAD8B4O86vZbDuc940kDG9Oiu7g957cDAT2/EBPAe3OaiCNrS4wMNbSsPnq63/a5u2qF67smi68vx3cdPYXGtgd+45m4A4caaNGsSq2JaQrACBMOrBA28EwpxGrgdHssmG64sriUJm0liHltp+HKNzMnNv6lpOdeWVMtJA3haBg6EdVfT5jiyUsdyzYz116Ga5U4MPEjaJUso1YKbxHS4vPR2rWmhoOf8oN3mw22nKyNMsmClyiT6zNFrU8bA6Rx54ydu9p9DZYRAchITAD74Yxfjsz//zI7rjkOaJKausZhGnqAKpROiUlkU5bzWUxVK+jMUAGNsH4DLAIjjR54L4Djn/KGYv3krgLcCwMSus1OVEBJkjIT+TTpTp1LC0zW5FaOZkGBKC3+AQlJjg7ctOuU1tojbvoZp++VkQGDu85qP3oQrz5oJHk9ZDeGuKRdK/DatcNCUSShRDRwAvvpfn484KTxuq055hZw37ipaAiZ7nzjkWLIGfvUH/xM/95yz8GbJ1Bi6UcQN3ojmBdyuvyCgUXDrJoDTRXn2XAWPntjA3YfcDWlcABeHBfuvIWPgCZU70Tpw0R41KlWuN9x+Aqqdju5MxfrsJAQWF3IJDQjO1+i1GT0XAdc3/KsHjvuyWlsSsyU/HnTtvfbKMzquOQl5Sd4gWkZo5OQM3EwpOwFhciRzuSzn9Zg68IySmIyxKoBrALyLcy7uS1+HBPbNOf8Y5/wKzvkVhpHvPoDH3B2p6SZOA6ftnCyAW7YDh29+GxZnDCViQwgM0TtsdBs6JZQL3vLYKf/nNEm/YE0stB4KRnTh0sXznUdP4rp7jvrrAMKJ0XMWqtg/X5W+R1wlgtjxWTK0tlrxpmVDy7FUrEVLqEJZrrVweLmOD3z+Punv6fPPVvNYrZtS61z6HACVcPVeBw4EN4Xv3+feeO/sEMANLYcXnD+P333V0/zH5Bp4vGQgXkuMsUR9mrxdqIFoPcLATaGsNgmB46W8SQcIdoztScz2G/hbnns2LjtjG+YmCkHXsCYw8Bhrgc2SL0IyA3c/h6HJdzaW7aRm4GIhgqwAoeIZk0XP+UwaeRhjBtzg/RnO+bXC4zqAHwPwD2lex+kiiQm4J3Q0QAcSSnISk5y9ZBKKnw3PSEJJ4w0BAKciZXUbTStUqhbHtM/bPpF6TXpEB6UpHyQ50cXzudsO4Rf+3+34x1sPtiU6OyGvyU39RRN8V/5qZ+BpdXa3CkX+u8dOuE6HcZ2SFPTmqgV3VJXEIMz9HAEDrwlrrZkW8nou9cUJBCWEL7xgAYwBdx1aBpBsUfw3P3tlyPkxangEiFUXyWWE7udxnyP7btYbrrcL1fhHJZS0Gri/65QwcDrvaOciG64NhK+7XI5hrlpA07RDN1YiNu0MPH0pahpIG3kig5Hp2EeJmunw1ORqW0l0JpQw8IIOzttvWOI1JUOaKhQG4BMADnDOPxL59UsA3M85P9TpdQAviZmZhCLfphHoBJUx8LTjozqBAoCsRpQgsu5TkbW4lqVBECJ7TcLzz5vH4x98RerWYFqTqMmThEDsXrx4Jos6rrvnmFCFku54JI9lC+rUZRpo2ptmjsUnMcmqdmFC3nFHgYA686IySvuUo7BxUr0LK9koLt4zhe0TRX/uZVqPecC76cXMxJSVEUZvMLImLcKax8CJCcrmd3YjocT5qQBBV6LMY0R8DQJd534uRvCoidPR0zSDpYFsQEXNl1By3nrlPSluI0+681lsxpNdZ7Tbi1aiNDuQnjTvfjWANwJ4kVA2+HLvd69FiuQlweG8ywAuYeAUwGMSJQTyHJAmsTLahhm6/M4sQtS1TgtrId8IcZsuSihA0BDTDaKdmMv1FjTBuU28eJ559iwOna51pU0DgYTSJk1YgSYoqyDqZkxZUhLzsSU3gE/HBEf6/LOe13vnAB6ei1lrBV7Q3WLXVBF7pkv+jbubAF7J623SBn0WLQXTSxoRtt6wUC0YgQYu8Z3vymRONmjFIgbuHjvZbFag/bor6m5SXKyYonW27Z48iaUb24skyORAt7w3eA/S58XrynZ4VzKsGPdk10DQat9+w0oq7+2YpeGc3whAerQ45z/T6e9Dz3eAUhdtrkVDa+vmo6Cwz6ujPSwpz+Oc+91m0c5GQAjgXWjLMqTTwG1UvAyzaLFKvhFioiwqoaR1VYuuqRVh4FMlwz8Z6eS5cOck9kyX8K2HT3RfhRJTSiYmhov59q7Cbhi4lov3QnnCq7OOy9ATU6KGkmgAb0Zu4BMF3bckBcJe0Gnx+meegYeOr4Mxhr0zZdz6xGl34lMXvhzTlTyWa2Yo2Z3WQx1IPh/Xm24ScyLGdz6tF4qRwPJpt0DBN25GqJSBW2EJpaDnoOdY28DptOtMi4Kk9LIZ6c+gzywG+m6skdveUyKhxE0HanqGd3Hoqgpls3DAu0piliQSCm11986UMVHUpZ2WtZYN2+GoFnSc3Gj5E0sIZgwT6BaBBp4goTQt7J0p4/5jayEGTlslcYL1ZISBL/TAwI0oA6+ZIf2NMYbP//JzsG+ugr+/5UnUWjaOe8ErfR14cEKLJ7oYoIuS/EWSuVMUSQycjp1smjytCwgaSqKzBqM7jomijocWRQZuhaStNBDrevdOuxUmZ86UO44oEzFdNtCyHdRatqAjp697ThxQ4AUl8q5u05bTVqEkmMxRUKNzOvqcaE8CgczRRIbOmNsqL0+2ZqN/03u1B83wTtGQ7DqshPr8TpAx8LgEtDhNS4bsjkQKOE63deDtY5VomEM5r+GchSoeXmwP4HRhnz3vsnSxuxGIZwLdwohJboTW0nJLBQ2NhRi4X2ssjmOK3Ny60b6DNUWSmHWz7cbwtN1TqBZ0337zkaWN1NUhQDxbCDFwyc037aBgIJmB0zYzyiIJQRIzWQP3h+uWjNA4q1oPDFwEHddyF2WIQCAJibKf5STPqvznX3w2rv+1FwBI7pKkvgfyro5qrWk1cGKcsrK6luUgx4LkX1vSL6Z4gK5z+l4pmV4t6FhvW+fmG/BExAfw4PvXJbmubrqKo5AF5Dhv8iw08MzAkc5KliBr5KGgUNBzOGe+iocX22cvEgMhmUXcHgPd1SMnwd+yJtaBu8mjmUo+zMC98sIkpheXpEuCngsnMU/XWrEjpvZ4TPHRpfWujkXSyUbHRPbdJZk7RZFLqEKhSo04Bh6UEabTwCeKOtYalq/pN8zek5hAYBXbbaMY9Ta85qM3YdE7Z02bJybKLjtj2h/0kNRkI0oP5UjXH+fcs0HoQmePSWKSLW6Ota+DmspkEgrnwfcpjvaLfsdpfcvTQjagwt2xCwxcUnnTTVdxFN1JKMnXzEADONBdFUpB1krvGUAxxrBvroIT683YSpV9XrdbdGaez8A3uRUjXVLWpUUgy8htpXyoIoYy3dFSOLEueDbGRyMJeT2oA3/vtXfjnsOrseWJez2meOh0PbX+DQQMIomBlyS7p5ZlhwY0J0FjiLWCJaZWa7XXzdI6ALd0K8fQNlgimsSeKBqwHe4nxLsZaCzDhTsnAQA/d/W+rv5upuJ+T8dWG/h/Nz8JgGqNUzaL6PL2cyAsb0W9p20nvUzjV2RI7q7iDVrW1k+149GARMGSvid/nQUt1EcB9ElC6SBbBEnM4DNvppwxUUJJuKZkGKgGDnRX/lOUNIPUvQwxEAS/jaYVujEQ86MZgsdjGHjaYBIHxljHSeCUxKwUwmV1xCzKEcvSN1x1Ji7ePYVP3/QEdk21d+t1gp4LOjFpUolMZgLcskV3m2p1ycDdNbed+Haw3ZNJKC3LSa0t6zGTwIFw6ehGK+zWCAQXGk38jmXg3lrpBrdad7XvWsv2fcJ7wY6pIh7/4Cu6/rtpwTeFEtiWw1Pr6GJyWYTjcFhOwFyj0198NpkiMCZ1YooWzbLA2PSDXvjz0LVL31MQwPWYevXskpiu/SsPNeVEJRSZVCqOdkuL+YkCltaa0mvNz1+0yU7JpYoDZeC7por4L5emt3osGu5JIGqh9VZgwSqzAgUChjY/UUDJ0PyZeQQzIwYOeJ2PCRJK3bRRzGuoRLaDQbdfe6C4ZO82fPgnLkGuh1pX0Qtl74x7AxBd0UQwxnwZpRsG7p9sUe9qb84o4NWBSzpP08oKhi53gHNfp905MLQOgR3J2ullEgoQlNa5A20HvjkNBXAGqkJJr/kGsznl1R+hskmB2dLv01W6eM1CMgYuSGgyaSIgTmHSQuumPERekFDWGm5VDsWArDVwfyaqOFLPjCQxJdU9piO/GSXhX95xNf70dZdJr+s4WVK0rJVhoGfpbLWAhZQTo4HwsFgCBURAYOCRbZY/LNjQsHOq2DcNHIj3CgZoAok7uLStXdvXwHvfqkvXozH/glypmXjTs87EyyPOaCIogHfFwP1kWbtZFdXGy4bSdlNGmLSzaVqOfxOX6eAkaekakwfwNgnFPY+o9LSXKpQsICabSaOOc7yTIW6uZrSFvRI5F/3A2sWoQ7k3CE+WUHziFGXgJKGYoc9RLeh4ZGkDZ733i9j/vi/itidOpTbdSgu/YUg4HlENnMiNuIMOpkulX8vubaVYr/IkCSXp8w6eZnSBon9CBh9KHIJQ9iUUuQZeNHLYPlnE8RgGnoWWpudysWWEtsPBvWL/SoT10BY27eDctJgsGWhaDlZqJlYblp/IiwNVTORTVocAQSBom99oOb68IhtK200SM2m6TMO0/QaZaJUCEAQXIydn4FH7XAqcqw0TjsPRMJ2uku1ZQZRKKMCmrQ4BgkDTxsA7NC75nbhpJBS9XQ/230eQN2TVHXHEieQKuoEWBAlFxBfuOpY4pq4XyHbxUQmlKokzZowc1CviGLj7/Y8IA+8WMk9g8eIK2k8jDNw/ITXsmCq2SSh0gmdxJ89HzKNEiNqiqzuKDJzqwLMNFMSo7/C8ODolQs/d7hpWxVV0yBCXxGwKDFw2lDa6NU2CEWOYBbjfH5UIyuaeihLZZMmQ1oEbWjAQgAyefvZT3/UnImW9M0qL+z/wMmg55t/sLSd9EtPfscaOIaMArrUFLCBlAM+RhCJh4IKE4pqqRQYlmDZ0SblqlIETCYjuPJbWmy4jTWG6lRbBTFTxhhYmGhUh10bI2pMlzgbBcpxElj/4fWIXkAXwusDA6cBGjdCbvoTiMvDFtQYch/vaE51Ym/UDB5IlFNFzJcrAN5oW9BzLlE0AwRinO55cBtB5QvdPXLEXls19vTwNZGxBlIuA8O6JpN1uGLisQ47QtByvRn4lNNGcIFqwxmng4nEXk6DfefQkgOEF8KKhYaKo+1t6y958EjPKfKP5GLpe0lwPQU20pA5c+H7zutaexIzJgcQlMY9GpM+ltQZM2wkN3d4syjIJxQxLKLK2/m7GA6ZBXA1/Jw18xAN4u4RSb9l+socSgG0SihX4+e6cKsK03ekoFMyyMrOi14gzsxJb9st5d1iD7VUVrDZMVIt6Zp4OBCoNpFFicx0YuKHl8KZn7+vqPWSBwhLkIiCQJVbqwVCDliCxdIKbjG0/rpaX1KbJMjKzMlkSU2xPb9l26EYi1snTEOTSEDRwQtkIGHJ0bmoSXI+QdgYeLZst58MVUU1hx9oJQUWGvHzTr0LRWNsOLTpCkFD0JZRwAJ+MBOojyw1/9mdWiJVQjHQMvJdGHhliNfAOSeyRllCoIUIcR9Ywgy45kh/ikpgFPed3M4q14Flq4EmDZMX3IYMf2i0cXW70ZFbVCXPVPIpGDnf4bnjdNwN1guxkix5TulmeWA+6YJuWnbraxdCZ9LhSYpRsBmR2wZbNkfO6F6dKBiyHtyXtxO++oGu4/wMvg6Ex3H90FcDwGDjg2du2KKGaviadMSb1FJcxcNPm/uNxLe4y+BUZsjJCoclGlsSMZ+AkoYQ18Pe9/EK8+IIF/3nHVxuhm0QWKKXQwMuShLm1iUYeGeLzSmOsgX/friloOYY7PT0XIAmFsulyBt4UGPiCV08rmlrJRjv1ChnTIIhMkKoa6EQ5utKQTmXZLNzSwLI/KLYfNwnZdi+6q6GbLx130aw/DaKj4QjELl1rVF3OwJ2gpndKSFD6vxeqJQhFQ8Oe6TIOHHUZ+DADeKWg++dJPYa1xsGdVyqv/qCBDQHrdANSN2ZmwSBviRuh7fgsPy+RFmMZeEwZ4UTRCE3caVoOmpadaR04XZd1M5zUFW80uRxDJa+FEuaBmVVGDDyujNBJHhox0gG8aGi4YMcE7jwYzEsWt5RFwzXmiWrgIgOnobLihZ6VnSwgH4Plv4+ogXsMnHS0oyt1XwbIGmSmtK1sbMrTIw7ETkJj2Tow8G6PedzUH3F60EwlL7ULFuvRpwQpx19rTCXDGTNlv+Q02hw0SJSMIOHdrTe5y8BjJBQtQny8m0RQldP5fbQcA2MxboTCcZVVETVMuTUq3ThW6iYYCycvoxbLaw2rrxKK7RGNqJwUzRvIpgttBrkcC5UAB+/D/cSx9O8yefc+4mm7pnD/sVX/32IdOGMMWo7hT//zYVx//6L/nKZp+45mMoMgP7BmoF9RJ6MMLRkDb9qot2ycrpl9YeBAkMjc2UMnZxqkmas5U8kjx4ATHgPvptKBXkcWJAIvHA3T5bx8ZJ5QuUFOjKLU4lYZtAeSXduCG2pUfx0kKgUdNY8R1kyrhzmy7eWdgFg26X428ubpdqCHEfHb8d/HDsayRW2N6X1k3z91wi7XzDav72gAX6mbmTTgEaKTf1oxu5FqQcd6pFJF9rzNQNb81Gls28gH8IlisJ2kGt2iaA3rnSR/9NUH/cealuNXQUwWdWg51sbADY311OkYRfTOLCJwX2NByWPLwtEVd0J9vxg4lRLu6tPr+9u9kD9y2OdCyzHMVApYIgbeZQCnOYTRagfxRjBdNmKTmMTS6Aa+HPn+ZTuBqVKQ8M2y0qFblPIiA3e6SqjKGLjfwu59Zpp1+tCiKxd1U4UCtM9dJYjH3R183e5GKZsHWdBzoRZ8EdEAznl2rBdor0KJq4mP2g9EewmygKx2vlMfwMgH8II3lYcc0wC5Idb5O4K5kaLWxhjzLnRBA03pfZwGMstL/33sYGtaFkoeqS69XwyZKlF2butPACcNUqx2kFX2zFXzWFpzA2cvEgrQXu0QSCgapiv52JmntO2kChhxnF2cqZZYjTJMCUXslKy3rO4kFM9bW0SUge+bq7gJ22NuAKfvJq3Vr67Jp7S3QhJKex141JefwBjzq5aiv48GcHrtrGBoORga81vpA4IQkVAiFrz9YOAy2cmtQhljCaWoay4Tc3hw15MEAfGCa5jhaofpctjKtZt65E6oFjSsN9uDCBBcOIbGQjPvnjjpVtV0U3vdDfotofjVDiEG3v7duOY97s1KlD7SIM62VLQTjpVQhG0nBeXTEQlNzsCDc6ibifRZwzXUcu1t612UEQLeKLsYDVxsc98/X8UDx4iBp+/EpL+XOXC2bO6zfFkVSiOGgQOBrCMb9gAAs8JouizdCAE35+Az8JjdSFQqjfN12QyieR/q5E4qVRz5AF7wa8FtaZD4pRe6Rk3hutawzDIdSXZlaYhTKbj13TJGIm5d6QZzaqOFJ05twNBY3wLsOQtVXHX2DJ5zzlxfXh/wtuoC02sKNyvCvtkKHl3acAMRdZ6mDIxxE9ZF5kP1zFHbWbH9uKBrqBZ0nBKYetwNPDq5aFgoeQy8aTlwOLpKREsZuCThdtGuSdz2xGmcXG8mEiMZ4gzc2twIo0lMK76ihnTw6BoYYzjwP1+GP37tZcL7Zxu26IYJxOcDKoVwI163eYM0iB6zNGPbRj6Aiw5rQaIs+EC/9oPnY890CQ2hjjNarjRdNkIde52mXHSDwFCrXUYRt67bJwuYnyjg9idP48mTNeyd7m7cVjcoGhr+/q3PwiV7t/Xl9QEqdZNk5YUL8PwdE1hrWjiy0vDZS1rvl7j5jk2ByRtaDpyjbXJP9AY9XTFwaiNcRir7/mXb9WGgktdgOdwvq+uGgcvKCH15S/hu3v78/ai3bHzixse6TjDrGmub0E7vQzdOWX9EkpUCHXvZEOiSZ8dMyD6AB5JVrIQSGe+WpSEeIR85ZmnGto1+ABdM6uOmWke9HRqRE2Wmkg9poG6ZUMYBXGprGnhQMMZw5b4Z/OsdR/Af9xzDGd6wiXFFJWZLKZ7QlJd48NiaH+zTjhmL84Zo+Bp4Lrb9OBrAZ8p5nKpFyghlEkrM5KJBg5KWNNC7Gw28aMjKCL0Es3BMzt0+4ftTtyynq5F6cc1r4vCBgqwOPImBewF8d0xllugOmbX9RLWo+0ZacbuR/fMVnNxo4UlP/mxa2RVCEApRBp6iY3zkA7josBZnIFMy2luDxRNlvlrAqY2WH3Balp2phAIk+1LTyfDccwNJY9uIsL1eUYkkb2UM/LztbgC/7+iq4H/epQYelVDMYG5iMNIuzAYtJ+wfER1nFxfAt5W7n4DUD9AxogDelYSit5cRxrsAupa/ceV9cTBy7UnM6NAIWUIuiYETEdo9LQ/g4i4kyyQm4FaDHV12K8PIUCt6nr70oh0AgOvuPQqAZoxmmydpk1Cczs1Cox/ABQYeV7pTjATwaLLkOefOw3Y4vnTPMQDd+VJ3gszohhDUgbsn3E9csRdf/7UX4L0/dAF+8YXyIQvjgmpBC+06ZFUoUyUDT98zhX+/84gwgag7CUXW2AC4J3siAxcSP9EcSHwZ4WjcVClgn/Rkn+4klHYGHmcd4U68sjvOXYzC0FlbJ2Yw4CAI4I4gb3HOExk4nT9xvRHiTSzLOnAA2L2tjMPLdXDOcffhFTAWrmoDgDNmy9g7U8Jdh9ymwqZlZ55MjSYx/Xb9cW7kEQ2t4ibplPPhbshGpFzpGWdOY7aSx7s/dye+fO+xjh673YDqhWUSSpT55HLuHM+3PX+/z07HFdGBs3Flgq95xh7cf2zN92appqxpLvgSSpRdBzdFP9Ep614TLEdnItUqcTmQYVaeiCC54EQPDFzWyBNnHVEwNJeBd2HzC5AHvvw96HX8qU3ezaRlO+A8fiYu2QLPxOyCQgE8Ywll17Yiai0byzUTdx5cxjnzVWkZ6WTRCDX8ZCXDEqKNPGnGto18AKdA3LRsoXQnIqFE/Y3NsJuYlmP489dfDgD42oHFTBl44MeSPNprqyE6rzBum37ZGdMAgLsPu8wlbTCKS2KKCblAQpF0r0UYeK1l+zf5uIuPKk+edfZsqjX2C4GE0r03eSnfPsrOtB3kWHsgKOo5b2crr8+Og6FJGHjEc3yayje93EOnRCntZOP868VdSNY7JWp8O3S6jjsOLscm/8v5YMhyt7uWNIgOcY/u4GUYaTtZIGDgTVMwi5dsBaMjkaJ3+qvOnsWLL1jAdx8/hcmSgYlNDK0VQSdedPgqkK3r4aihGimrinZiEqjb9OHFdeS1XFelaoB8QgmA0Gu1D1cOd69RZcPpWgs7JouJfQB3/vZLY2uVB4VSVAPv4lyt5F0fbjGRK86qFFEwNKzUWmjZ3bFJacNJhKyQF87SWhO7t5WC+v0YBv7+H7kIF++ZwjPPmpH+XqzYOmehmnqtabB7m1tQ8MV7juLkRgtXnyO/gZfyOla8nVy3u5Y0KBfCRNRyOhPAkY8s4lxMmsEYZXmliKFUtN2ecMW+GTx6YgOLq43MDj6VN3WqQtlqIAsBqsGmtunoZ52p5H2L00oX04eMBH2b3icu0WnZ4e418o8/tdHyfcvjKhmmSkbmyaluQYlxXwPvioGHXS8BT/OXfN6i971Ed6ydoEsaeaIyDblR+l44NGQl5rrbVs7jZ68+K1X9/Zkz2VZwkQfOJ258DIbG8KILtkufJ/q0Z9kM6L9+xKc9mLs5xhp4MKjVkSbKAFkZodx3mr6oo6uNzIKqPxQ1ojsC2drWjhqqnqc0bY3jGDhjzGfh3QwKzsfII6btgHle37FTTBwekgt8Br5h+h4jaZOpwwDJBSd6KCOMWsUC8Un7okd8uu2LyEsaedrcKMlOeJ3MzJIZeDfIysKVMFNxPfRbloOLd0/FSjThevHuZKc0EBuKgHQSbMcjwRjbyxi7njF2gDF2L2PsncLvfpkx9oD3+Ic2tfoYhBm4PEhQGSHnHJbtwHK4lIFTtxfn2ckaYp16FGSaNcyuvn4hWv+epNdRx2k3DDy+wiSQR+KCvNhQAgAzFa8LttbyHeWqGc8izRLlSBVKN37gsgkzcWO5ikYODdPpOhi5zUIxlS6+hOLeNImBNzow8LTIegg44JIMqj/fN1uJfV65EDDkuGawzaDkJaCpcifN2LY0R8MC8G7O+e2MsQkAtzHGvgJgO4BXAng657zJGFtIfJUeITJwLSdPhJC9bNMKPrxMxyS/BSA7WSPnzbWM+k8A2ZpmjRqCMVM2ZqvJnWlkqtUNA49LYkbbtQEZA4+UEZIn/EbL76aLTjwfJfgSSk8M3BtQENJSudRPo+D5pjQtB5VKt46HUcOssFxY0DVMFnXfDz4LBn7L+16cCYOXYbZawCNLG4kNduGW++6OWRr4zoim7e5ws2jk4Zwf5Zzf7v28BuAAgN0A3g7gg5zzpve7xfhX6R3iYOO4LQWNPBIrDWQat1galKV+JfOfAMKdaVsN1ciACjNht3HRzkkAkA5fiIPfiWnJ2uSDdm16LPyccBnhVMkAYwg1c/WDyWWFgu7Otqy13Cnu3ZCAwDQt2IrbMZPti955W291Z5hVMCTt+pSfEs73uYnATjgLBr4wWexfrb53mp2ZEMBFhtyPMsKo/GVm3UrPGNsH4DIANwM4D8BzGWM3M8a+wRj7/pi/eStj7FbG2K1LS0vdvB2A8ADduFb6knDnEu1Go5go9qcdN5pEJUSrIbYSqgX3Qgq6W+O3lNTF9uSpmvT3MhixNd5Om4Qiq4gQGaeuucONT9dafmAb5QDOGPPLU7udqOTPeDTDDFzmu1M0XAZe6zaAe+WHIlpWe8J+rlrACc9OmJ7fjRw0SFAj0vaJeAvmciTOyIaCbAbR3RN1u2biRsgYqwK4BsC7OOercOWXaQBXAfh1AP/IJPSLc/4xzvkVnPMr5ufn076dD13LQc+xCAMPv404VSPpRJnsEwMvxgXwPuhkowJqYCIrXVOYhxjFGbNlXLBjAr/y4nNTv35ccG4Jg3Np+kt08osladSareRxYr3p33BGWUIBgkDcTWAFgiBQE2wObIdLKxmKhgbO3SaaYhc3ioIhkVAiczeBcANVP/yzs8SvvOhcMOa6NMZBZMj9ZeDud2fa2WjgYIwZcIP3Zzjn13oPHwJwLXfryG5hjDkA5gB0T7M7oOht2eKMZkqCzJJjZCPafnBFLXFbhsZFlAyKwrSTzdjHGdFZk3GlaoTr3vW8rl7ft1CQJMvomNIMR1mlSnTns32yiOOrzbGQUIDgXO12uLKsCsVl4DIN3H1stdHl2DZdQ8tywDn3JTOZvDldMXD6Cff88InVkEs04/DCCxbw2O+/IvE5JYEh96OVvtQWwLOpQmEAPgHgAOf8I8Kv/gXAi7znnAcgD+BED+vuiKI3lSdulqU48V2cSB+FuEGgqTXZrK/dRB/I1nd81OAHcK/TTmTGWaBouDpwtKvQcsSGrnaZhXPeVkYIuAH82EpjLCQUIDinuxmn5v5dexVKHAMXE4LdNC+JBnMEmbw5VcpjudYC53zkGXgaVIRj25dGnqiEkqKRJ83ZcTWANwK4mzF2h/fY+wB8EsAnGWP3AGgBeBOPOutnhILulu8Q+4paOJby7gesmzZsx8uCdzhR9sS4nvWCoi6XUKK+5FsJlE9YqQdlhFme0Iwxdzp7q11rbSsjlHgo5yM7n+2TRSyuNfyO2VGXUKa8iqlSlwGPPlctUoUisz0VE4rdeo4DNOPS/bklY+BlA5bDsSFKmyPKwNNAZMjNPjXyAPA7nM0UjTwdz2LO+Y0A4l7hDd0tsTdMFF3fjZmynNGKGrhjuB+6U13r3gy7uQpGzvcTFpE0QmrcYWg5VPKaL6Gs1E2UM66tjnamAWGt3e/WlE4xiTLwAkyb49DpWlct/cMClT52U3oJBBUsdUFCcRI0cNnPneDbW1g2AHcnZko8x8XyTb8KZYwJDX0XB46u9sVO1i/G8JOYnTu5R/ss9jBVMrBSN2PL8vyth2kFLbsdAuesZPJHryBbzij60a01SqDvBXCHNpy7kK3DYpwxU97XwNvrwONYy45Jt7rgkaWNoU6cT4tp7/zsNuAxxlA2tNCEKMtxpFUo4o6pW89xICyhyHx/KM+0XDNjp72PE4gh/9a/3INyXsPzBH//LF8/qoGP9Ug1wA0Uq3XT62xsX3LJZ+BOogYOABPeFjPL7si4KpStzMABd4rKSt3ESs3EsdVGm4fyZlE2wq3FQDivIPNCiTMQW/AD+HpXHaHDAtmq9nL+lAt6Kg1cvEa6LSMEwt3HMpuLacFErGG6Se4sJ9gMGqJT4hd+5bm4Yt9Mpq8f5PLcc56GS0wkEI7RpyIImF7L4tJKBz+Amzbo13F3+hv+2wul46A2A9eWs/01nwoMfLVu4oHjawCA8zP2OI/aBAMuwy57OQ8tx6DlWFgD9xl4+Pvf4fmxLNdMn42PMoi9Rm1b06Cc10ISiuVwFI3sArg4p5YgK/ENLGVbXU/9GUXsnCrhy7/6PJwxU+6LFFSOSCgnN1qYKOqJMWS8AnhMooy2fw3T9plG3AGezlA6IcRVoTS6dHkbN0yVDDxxsoaHF9cBAOduz9bmsxwjoYhBIq/l8NiJDTheoi6uV2DeszcFgvmLowwy4JKdV51QjIxVi2PgYoliNwEpaK5r966OVqEAbn7EvRbGn8z0cxCL67DJ/CaskxutjlLvWESXqZKBWstGrWlJJRRDc5lYrWV1lFD6ASpzjELmS76VMFUysNowcWS5jhxD5sw26jIJtJdm1k0bX7z7GD78lQf83wPtiZ+8nvMNlvbEjO0aJRDRkJ1XnVA0wt48li2vA58Tbmo9BXCzvYww7EFjwNAYjiw30DTtLS0nZoWSoaHmlbqe2mj6N/I4jMURJcZ0Yr0pTWJSyVm95fjMY5DbNfJIiFZR9qNWdJQwVTJwdKWBbz9yAtsni5nbfJbyelsAM2PsCT590xMAkh3c6GLYk7GfdD8w6emeMmmuE6KTXeIYuKjpdju2DQjvDlz7gnCJr67lsG+2gocX19HsQ+fiVoRrmOUx8PUWZoWbrAxjcUSn/ADeiu1spMHGaw0TBWHc1iBQkGiCABKHuG4FvPzpO5FjwO1PLvue31miZOQkdeDyRPZaw4Jpx3vGA8GA3Sx7APqFQoJNcce/jXQGW44DTXLdiMeoOzOrdgYed2M9Z6GKR5bWt3RPRJYo57WtKaEAwOHlOvbEdFBS4ubUhplpiWAa+EmdiO5o2nxLs47Lz5jG6595JoAgSZglynkdx1YbuOHBwJ3BcpyQ34aI46sNn4HLbvRUYphlF26/cO72Kq48awb/60cv7vpvo1VRcQxcRE+NPJFOTNnu+JyFKp44uYG1hrWlr4WsQKWzjsNxeqMVOyOUMBZHVEw6/fgz9kifQ0MdTm00MdPhQ2cN0vbELeUwtPhh4FJvAGyUKWcB2tb/9Cdv8R+LY3qAKzdYCf4RFEBoMtMoo6Br+Me3PQvPOHO6678l7yBCnBth+G/Sh4JwI4+LuBLfcxaqcLg71HqrXwtZoOJ5jq82TFgOx0xlC0gobtlODs89dw7POUdePF/Ma6ibDk7VTL8DbFCg9mCxYiKrCSSjDnJvS7Lh7BVlyQVvWmGr2A/+2MV4tXdTb5i2Xw0hs+D8yzdcjrc97+yxYOCbAU2bJ6Rh4F25EfryjiChWE6bfQEAXOkNKa4rCSUViIHfd2QVAPxJQXEYizLC+YkC7v/ADyU+p2y4EsrpjRb2JZiy9wPkP7EumOhnOQNwlHHhzkl8/KevwFVnZ9vUAITb4UlDbdlOaFjDa688A7u2lfBPtx1Cw7SF9uP2YHLOwgTe+/ILM1/nqCEqocS5EQLAwkQBi2vNrjxKZGWEcV3SO6dKOHehiocW15WEkgLlvIYjyzb+6bZDmCjqeMH5yRbcYxHA06CU17C4ZuLURqtj6U3WoIqBNcEPpZGypX8r4Acukk/x3iyOrzb8n1frJoqGFhqpRhAHeqSx4NzqiNobJzHwa3/x2bj50VNdecPIygiTpK2XXLQdDy2uY9Gbj6kQD2peu/mxU3jh+Qsddy1b5iwvGa6x0nrT8tuQBwUa1bbWMP3HAu+Hrc3A+wnRs325bsJ2OBzeHpyLwpY+jQn+Voergdt+Watly71QAGDPdDk2rxQHGrIiGo01E+a//syz9wEAxriLfmAo5zVstCwsrjWwO0W11JZh4EVDw9Fll7ENOok58RRn4P3C21+wH+sNC39942M4vdGCOSNn134S2bRBFjdbdRJSGhQNDQ53WXFeZ6k08G4RbbJKmsi0fbKIa3/x2X0pNd1qKOd1LHse+9snkhOYwBZi4OW85peQDZ6BuwH83Z+7E1+46yiA0Z9AMg4o6BpeddluAC4D7zhST5BQsm4qGif4ZlMWDQbg0jrwzaCc1yNJezsxYX/5GdPYOTX69ffDhmhvsD1FZ/OWOcvFTrJBe12I0+7f8dnbAYz+DMBxAckoKzXTl0faGTjV4dupTPC3OvxOSY9EOLw/DHxDMMxqWI6qMskAYgBfeCoF8JCzWpdzBDcLWQKILh6lgW8O27zd1HK9JQys7pzEHPWBDf1ENMmYVIXSK8qFsNGY8jrJBuIIve2TTzEJRfbzoEFdo8TAFSvZHCp5DXqO4XTN9JNm0WNa9P2pHcFOVjHwhul29HGe/fEoG3qYgas670wg9j7MP5U0cLEVuNLlGKosMRNxkVO1r5sDYwwzlTxOrDV9xhdt+xarInyd/Cl83IMA7vh5oU6dmN0iysDrpt1VO76CHCL5TLN73zJneWmIEooI0mwpkKgAvnns2lbCkZV6oj1ByWte8XXyjCWDcYJo7UAGXv2uQmmYSgPPApR8/9mr96V7fh/XMlCIQXuYDHzSS2iaCa54Ct1h93QJ9x1ZRb3lHlPZDbrgBXArxRzBrQ5RQrEc93hkzcBLhh4J4LZK2GeAF5w/jz/6yUvxiqfvTPX8LXPERQY+zGSK4zVP+ExQMfBNY/e2Eg4v1/1ZgbLSzFI+5zXykBfKUziAC41Ndp8klEpB878Px+FoWo4qmc0AhpbDqy7bnZr4bZnoIrKyLAcWp8X/ffOVAALppBVTs6zQPXZvK6FlOTh0ug7ADdZRFL0hBqbDYWhsKOfAqICOT61lBQMusmbgeQ00+Z4S9sOULp+q2DIBfNj623PPncfV58z6zFs2YkqhN5Aj2yNL7uxNqQaed+2ELduROhE+lTBfdeuHF1ebAgPP9phU8jpalmvfGzStPbWP+zCwZY74MEsHCXkt5zNw2Ygphd6w4NXDHvQYuCyAEwPf6oOk02CypKNa0HF4ud43Bk7XW820/Y7PYZOopyK2zJk+CiVMhpbzmXecvaZC9yC73pPrrpud7LsuGDnUTcdr6R7+uTBMMMb8vIFt90cD95unWrZfTqgC+OCxZSLMKOhvhi4y8Hh7TYXuUPUDeAuAPFBU8jpqTctr6VbHfde2Ig6frvtVKFlX5VClV61lC8Ztw78Gn2rYMmf6KARwV0LxNPCYEVMK3YO26yc3mshrOSmbnK4YOF1rqY5AD7un3dr5flWh0PX2lfuO4e7DywCU8+Yw0LFgmjG2F8CnAewA4AD4GOf8jxljvwPgLQBo4uz7OOdf7NdCO2E0JBQWMPCYEVMK3YPYnmlzTBbl3/NMJe+227dUAAdcn+/lmjvgBMheAyenvN/74v3+Y+q4Dx5pOl4sAO/mnN/OGJsAcBtj7Cve7/4P5/x/92956TEKbNcQkpitBH9khe6QyzG/8y8uSMxUCrAdjsW1xsAnMo0iLtrpziq989AygOyrUC7ePdX2mArgg0fHb5VzfpRzfrv38xqAAwB293th44hoEnMUbipbBWWPhcdJZbNe0D6y3FCBBMAle7YBAG59/DSA7Bm4lmNto/RGYRf8VENXEYYxtg/AZQBu9h76JcbYXYyxTzLGpmP+5q2MsVsZY7cuLS3JnpIZ/vi1l+K6dz23r++RhLwuaOCWSmJmiWrBDQ5xQYJY93rTespXoQDAVNnA2XMV3P6kG8Cz1sAB4E9fdxne/8MX+f9WGvjgkfqIM8aqAK4B8C7O+SqAvwSwH8ClAI4C+LDs7zjnH+OcX8E5v2J+PnnC8mbxykt344Idk319jySENHBbaeBZghh4oUMAB1QgIZw1V8GJ9f5o4IArmTxr/2zo3wqDRaoznTFmwA3en+GcXwsAnPPjnHObc+4A+DiAK/u3zPGAoeVgORyOw1UdeMagUsJSTHCerYoBXAUSIBiGAfSHgQPABTsmcMkeVw+n0YIKg0OaKhQG4BMADnDOPyI8vpNzftT7548CuKc/SxwfkGRiOo7SwDNGxZNQyjFOk2EGrgI4AEyXg1F//XJnZIzhX95xNU5utGK/G4X+Ic0RvxrAGwHczRi7w3vsfQBexxi7FAAH8DiAt/VhfWMFmoTeshy0bI6yxHRJoTdQUD5rriL9fUHXUC3oWG9aT/lWesJ0RWTg/TsmjDHMVTtPj1HIHh0DOOf8RgCy2/fQar5HFeQ8aNocLUsx8Cxx0qtnPn/7ROxzZip5lcQUsE1k4MqTZ0tCRZgMQXXfpu14Gri6aLLCYc/I6vwd8QGcGKeSUFxMCxo45RAUthZUAM8QhiChKA08W5yzUAUAnLu9GvucWT+Aq+MOhBn43pnyEFei0C+o23KGIA3ctB2YSkLJFH/yusvw+ImNxEQZJTJVQ4mLbaX+V6EoDBcqwmQIvwrF5mjZXJURZoipkoFL9m5LfM6sklBCmK4YnZ+kMNZQESZDBElMTwNXDHygmFESSgikgT/33Lkhr0ShX1ASSoYgxt2ySQNX29ZBggJ4XLfmUw1FQ8Pnf/k5OHteXnqpMP5QATxD+Bq45agywiGAapGVBh7gaRLXQIWtAxVhMgSVETYtB5ajzKwGjWefM4v3vfwCPONMqa+agsKWg2LgGYKY32rDBACVxBwwCrqGtz5v/7CXoaAwMKgIkyGoWeK01zWoNHAFBYV+QgXwDFH13NhObbgMXEkoCgoK/YSKMBmCGPjxtQYAlUxTUFDoL1QAzxAFPQdDY3hsaQMAMD+hHNoUFBT6BxXAMwRjDNWCjsdOuAF8YaI45BUpKChsZagAnjGqRR3HVl0JRTFwBQWFfkIF8IxRLbj+E4wBc8KYLwUFBYWsoQJ4xpjwEpmzlTx0VYWioKDQR6gIkzGolFCNmFJQUOg3VADPGFRKuDCpEpgKCgr9hQrgGWOjaQEAnnnWzJBXoqCgsNWhAnjGoAqUH/y+HUNeiYKCwlaHMrPKGH/46ktw/QOL/gxHBQUFhX5BBfCMcdGuSVy0a3LYy1BQUHgKQEkoCgoKCmMKFcAVFBQUxhQqgCsoKCiMKVQAV1BQUBhTqACuoKCgMKZQAVxBQUFhTKECuIKCgsKYQgVwBQUFhTEF45wP7s0YWwHwUMJTpgCsdHiZOQAnOjyn0+ukeZ8sXqPTWge1jk7PUce0++eMylrV9z+cdQx6rWdyzufbfss5H9h/AD62md97z7l1QO/T97UOcB2dXkMd0zFdq/r+R/OYDmqtg5ZQ/n2Tvx/k+wxirYNaxyDWupWOaZrnjMpa1fc/nHWMxFoHKqFkAcbYrZzzK4a9jjQYl7WOyzoBtdZ+YFzWCai1RjGOScyPDXsBXWBc1jou6wTUWvuBcVknoNYawtgxcAUFBQUFF+PIwBUUFBQUoAK4goKCwthi6AGcMfZJxtgiY+we4bFLGGM3McbuZoz9O2Ns0nvcYIz9rff4AcbYeyWv92/ia43iWhljP8kYu4sxdi9j7EMjsNY8Y+xT3uN3MsZeIHm9vhzXrNY5oGO6lzF2vfd93ssYe6f3+Axj7CuMsYe8/08Lf/NextjDjLEHGGM/KHnNzI9rluvs93Htdq2MsVnv+euMsT+Lec1+nauZrTWz49qpDrHf/wF4HoDLAdwjPPZdAM/3fv45AB/wfv4pAH/v/VwG8DiAfcLf/RiAz4qvNWprBTAL4EkA897v/hbAi4e81ncA+JT38wKA2wDkBnFcs1jnAI/pTgCXez9PAHgQwEUAPgTgPd7j7wHwB97PFwG4E0ABwFkAHgGg9fu4ZrXOQRzXHtZaAfAcAL8A4M8kr9fPczWTtWZ5XIfOwDnnNwA4FXn4fAA3eD9/BcCP09MBVBhjOoASgBaAVQBgjFUB/FcAvzviaz0bwIOc8yXveV8V/mZYa70IwNe8v1sEsAzgCqD/xzWjdQ7qmB7lnN/u/bwG4ACA3QBeCfcihPf/V3k/vxLuTbzJOX8MwMMArgT6e1wzXGffj2u3a+Wcb3DObwTQiL7WAM7VrNaa2XEdegCPwT0A/ov382sA7PV+/icAGwCOwr2D/W/OOV38HwDwYQC1Aa4T6H6tDwO4gDG2zwvurxL+ZlhrvRPAKxljOmPsLADPEH43jOPa7ToHfkwZY/sAXAbgZgDbOedHAfcih7s7ANyL+6DwZ4e8x4ABHddNrnOgxzXlWpMwsHN1k2vN7LiOagD/OQDvYIzdBner0vIevxKADWAX3K3euxljZzPGLgVwDuf8n0d9rZzz0wDeDuAfAHwTrrRiDXmtn4R70d4K4I8AfBuANcTj2tU6B31MPaZ3DYB3cc5Xk54qeYwP6rhudp2DPK5drDXu7y/FgM7Vza41y+M6klPpOef3A3gpADDGzgPwCu9XPwXgOs65CWCRMfYtuFvoWQDPYIw9DvczLTDGvs45f8EIrvVRzvm/w2uRZYy9FW6g7zvi1so5twD8Kj2PMfZtuKZjz8cQjmsP68SgjiljzIB78X6Gc36t9/BxxthOzvlRxthOAIve44cQZlZ7ABwB8Cz0+bhmtM6BHNcu1xqHvh/TDNea2XEdSQbOGFvw/p8D8FsAPur96kkAL2IuKgCuAnA/5/wvOee7OOf74CYNHhxE8O5lrZG/mQbwiwD+ephrZYyVvTWCMfYDcFntfcM6rt2uM/I3fTumjDEG4BMADnDOPyL86t8AvMn7+U0A/lV4/LWMsYIn+ZwL4JZ+H9es1um9Vl+Paw9rlWIQ52pWa/VeK5vj2kvmM8v/APwdXJ3YhMsE3gzgnXAzvA8C+CCCjtEqgM8BuBfAfQB+XfJ6+9C/KpRM1uq9zn3ef68dgbXuA/AA3KTMV+FaVw7kuGa1zgEd0+fATU7fBeAO77+Xw90Bfg3ubuBrAGaEv/lNuFUdDwD4oUEc1yzX2e/j2uNaH4eb+F73zpmLBnSuZrbWrI6raqVXUFBQGFOMpISioKCgoNAZKoArKCgojClUAFdQUFAYU6gArqCgoDCmUAFcQUFBYUyhArjCWIMx9juMsV9L+P2rGGMXpXid0PMYY/+TMfaSrNapoNAPqACusNXxKrgmWF09j3P+fs75V/u0JgWFTKACuMLYgTH2m8z1rf4qXOdCMMbewhj7LnN9wq/xujafDdcU6w8ZY3cwxvZ7/13HGLuNMfZNxtgFMc/7G8bYq73Xfpwx9nvM9Si/lTF2OWPsS4yxRxhjvyCs69e9NdzFGPsfQzg0Ck8xjKQXioJCHBhjzwDwWrhOcDqA2+H6gl/LOf+495zfBfBmzvmfMsb+DcDnOef/5P3uawB+gXP+EGPsmQD+gnP+Isnzom99kHP+LMbY/wHwNwCuBlCE22n7UcbYS+G2oF8J1xzq3xhjz+OuXa6CQl+gArjCuOG5AP6Zc14D3Okr3uNP8wL3Nrg2Bl+K/iFzXeSeDeBzQoAupHxfep+7AVS56we9xhhrMMa2wTXfeimA73nPq8IN6CqAK/QNKoArjCNk/g9/A+BVnPM7GWM/A+AFkufkACxzzi/t4T2b3v8d4Wf6tw6Xdf8+5/yvenhtBYWeoDRwhXHDDQB+lDFWYoxNAPgR7/EJAEc9u8/XC89f834H7no3P8YYew3gussxxi6JPq9HfAnAz3ksH4yx3eQ4p6DQL6gArjBW4O5Iq3+A6wR3DVxDfAD473Cno3wFnm2vh78H8OuMse8xxvbDDe5vZozdCVe/fmXM87pd15fhzmK8iTF2N9yJTJu5ISgodIRyI1RQUFAYUygGrqCgoDCmUAFcQUFBYUyhAriCgoLCmEIFcAUFBYUxhQrgCgoKCmMKFcAVFBQUxhQqgCsoKCiMKf4/EK9k9g5nACMAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "df.Nino34.plot();" ] }, { "cell_type": "code", - "execution_count": 48, - "id": "376714eb", + "execution_count": null, + "id": "9e3ee506", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "df.Nino34.resample('1Y').mean().plot();" ] }, { "cell_type": "markdown", - "id": "f000116f", + "id": "16c80788", "metadata": {}, "source": [ "### Applying operations to a dataframe\n", @@ -4224,8 +964,8 @@ }, { "cell_type": "code", - "execution_count": 49, - "id": "dcee58a6", + "execution_count": null, + "id": "c8afa857", "metadata": {}, "outputs": [], "source": [ @@ -4239,7 +979,7 @@ }, { "cell_type": "markdown", - "id": "9c38ec17", + "id": "4fbef115", "metadata": {}, "source": [ "Now, this function accepts and returns a single value" @@ -4247,21 +987,10 @@ }, { "cell_type": "code", - "execution_count": 50, - "id": "735d982b", + "execution_count": null, + "id": "34892381", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "273.15" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Convert a single value\n", "convert_degc_to_kelvin(0)" @@ -4269,7 +998,7 @@ }, { "cell_type": "markdown", - "id": "434e497a", + "id": "384a0bdb", "metadata": {}, "source": [ "But what if we want to apply this to our dataframe? We can subset for Nino34, which is in degrees Celsius" @@ -4277,40 +1006,17 @@ }, { "cell_type": "code", - "execution_count": 51, - "id": "e406e427", + "execution_count": null, + "id": "f09ee7c6", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "1982-01-01 26.72\n", - "1982-02-01 26.70\n", - "1982-03-01 27.20\n", - "1982-04-01 28.02\n", - "1982-05-01 28.54\n", - " ... \n", - "2020-12-01 25.53\n", - "2021-01-01 25.58\n", - "2021-02-01 25.81\n", - "2021-03-01 26.75\n", - "2021-04-01 27.40\n", - "Name: Nino34, Length: 472, dtype: float64" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nino34_series" ] }, { "cell_type": "markdown", - "id": "f42069a5", + "id": "28ac04e8", "metadata": {}, "source": [ "Notice how the object type is a pandas series" @@ -4318,28 +1024,17 @@ }, { "cell_type": "code", - "execution_count": 52, - "id": "7b000088", + "execution_count": null, + "id": "8718a43f", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "pandas.core.series.Series" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "type(df.Nino12[0:10])" ] }, { "cell_type": "markdown", - "id": "68a8f033", + "id": "ff1f569f", "metadata": {}, "source": [ "If you call `.values`, the object type is now a numpy array. Pandas `Series` values include numpy arrays, and calling `.values` returns the series as a numpy array!" @@ -4347,28 +1042,17 @@ }, { "cell_type": "code", - "execution_count": 53, - "id": "1b6f337d", + "execution_count": null, + "id": "61a8255f", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "numpy.ndarray" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "type(df.Nino12.values[0:10])" ] }, { "cell_type": "markdown", - "id": "fc00faa7", + "id": "2a5693fe", "metadata": {}, "source": [ "Let's apply this calculation to this `Series`; this returns another `Series` object." @@ -4376,40 +1060,17 @@ }, { "cell_type": "code", - "execution_count": 54, - "id": "c721039d", + "execution_count": null, + "id": "ae197a92", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "1982-01-01 299.87\n", - "1982-02-01 299.85\n", - "1982-03-01 300.35\n", - "1982-04-01 301.17\n", - "1982-05-01 301.69\n", - " ... \n", - "2020-12-01 298.68\n", - "2021-01-01 298.73\n", - "2021-02-01 298.96\n", - "2021-03-01 299.90\n", - "2021-04-01 300.55\n", - "Name: Nino34, Length: 472, dtype: float64" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "convert_degc_to_kelvin(nino34_series)" ] }, { "cell_type": "markdown", - "id": "4435c540", + "id": "87871b82", "metadata": {}, "source": [ "If we include `.values`, it returns a `numpy array`" @@ -4417,7 +1078,7 @@ }, { "cell_type": "markdown", - "id": "7c7ea806-7efe-4798-bb9b-f8a395797e24", + "id": "a256f852", "metadata": {}, "source": [ "
\n", @@ -4426,86 +1087,17 @@ }, { "cell_type": "code", - "execution_count": 55, - "id": "9120d05e", + "execution_count": null, + "id": "52ae68ee", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([299.87, 299.85, 300.35, 301.17, 301.69, 301.9 , 301.25, 301.08,\n", - " 301.26, 301.79, 301.96, 302.36, 302.51, 302.28, 302.18, 302.06,\n", - " 302.04, 301.39, 300.22, 299.68, 299.59, 299.02, 298.73, 298.74,\n", - " 298.79, 299.54, 300.01, 300.54, 300.54, 300.01, 299.89, 299.49,\n", - " 299.58, 299.08, 298.56, 298.15, 298.58, 298.82, 299.38, 299.95,\n", - " 300.26, 300.01, 299.84, 299.65, 299.4 , 299.34, 299.34, 299.26,\n", - " 298.94, 299.09, 299.8 , 300.59, 300.65, 300.84, 300.52, 300.3 ,\n", - " 300.48, 300.72, 300.88, 300.85, 301.06, 301.17, 301.62, 301.95,\n", - " 301.9 , 302.18, 301.95, 301.73, 301.54, 301.22, 301.14, 300.75,\n", - " 300.47, 300.37, 300.46, 300.47, 299.63, 299.26, 298.72, 298.39,\n", - " 298.58, 297.77, 297.42, 297.48, 297.68, 298.48, 299.05, 299.84,\n", - " 300.24, 300.13, 299.89, 299.48, 299.4 , 299.41, 299.39, 299.53,\n", - " 299.7 , 300.1 , 300.61, 301.17, 301.21, 300.73, 300.4 , 300.2 ,\n", - " 299.9 , 300.13, 299.87, 300.06, 300.16, 300.08, 300.4 , 301.13,\n", - " 301.5 , 301.51, 301.07, 300.59, 300.22, 300.78, 301.01, 301.52,\n", - " 301.56, 301.78, 301.98, 302.29, 302.14, 301.17, 300.68, 299.79,\n", - " 299.63, 299.49, 299.66, 299.88, 299.84, 300.12, 300.81, 301.74,\n", - " 301.97, 301.43, 300.7 , 299.99, 300.07, 300.08, 300.06, 299.91,\n", - " 299.75, 299.74, 300.42, 301.05, 301.19, 301.14, 300.5 , 300.5 ,\n", - " 300.15, 300.64, 301.02, 301.02, 300.7 , 300.6 , 300.78, 301.08,\n", - " 300.88, 300.74, 300.16, 299.48, 299.11, 298.82, 298.81, 298.72,\n", - " 298.89, 299. , 299.77, 300.51, 300.52, 300.47, 300.24, 299.71,\n", - " 299.5 , 299.39, 299.34, 299.17, 299.11, 299.51, 300.18, 301.18,\n", - " 301.75, 302.09, 302.07, 301.99, 302.08, 302.38, 302.47, 302.41,\n", - " 302.25, 302.01, 301.82, 301.71, 301.62, 299.87, 299.09, 298.64,\n", - " 298.76, 298.49, 298.33, 297.94, 298.05, 298.56, 299.4 , 299.99,\n", - " 300.12, 299.75, 299.5 , 298.74, 298.86, 298.79, 298.27, 298.05,\n", - " 297.8 , 298.34, 299.23, 300.16, 300.27, 300.18, 299.87, 299.6 ,\n", - " 299.36, 299.11, 298.93, 298.74, 298.89, 299.26, 299.99, 300.67,\n", - " 300.75, 300.83, 300.47, 300.02, 299.7 , 299.74, 299.6 , 299.32,\n", - " 299.65, 300.1 , 300.47, 301.09, 301.3 , 301.58, 301.13, 300.94,\n", - " 300.98, 301.2 , 301.42, 301.24, 300.91, 300.64, 300.96, 300.96,\n", - " 300.52, 300.63, 300.58, 300. , 300.11, 300.34, 300.2 , 300.04,\n", - " 299.89, 300.01, 300.25, 300.99, 301.21, 300.91, 300.84, 300.69,\n", - " 300.62, 300.53, 300.46, 300.46, 300.25, 300.11, 300.7 , 301.22,\n", - " 301.35, 301.2 , 300.62, 300.03, 299.78, 299.9 , 299.49, 299.04,\n", - " 298.79, 299.23, 299.72, 300.74, 301.06, 301. , 300.5 , 300.37,\n", - " 300.49, 300.62, 300.88, 300.91, 300.41, 299.96, 300.33, 300.93,\n", - " 300.72, 300.7 , 299.94, 299.35, 298.92, 298.37, 298.21, 298.12,\n", - " 297.86, 297.98, 299.22, 299.98, 300.33, 300.32, 300.34, 300. ,\n", - " 299.59, 299.48, 299.45, 298.89, 298.69, 299.19, 299.82, 300.65,\n", - " 301.18, 301.26, 301.09, 300.68, 300.62, 300.78, 301.34, 301.45,\n", - " 301.22, 301.09, 301.44, 301.51, 300.83, 300.15, 299.24, 298.65,\n", - " 298.22, 298.16, 298.22, 298.1 , 298.08, 298.61, 299.38, 300.17,\n", - " 300.57, 300.61, 300.11, 299.34, 299.13, 298.87, 298.75, 298.68,\n", - " 298.64, 299.18, 299.78, 300.53, 300.95, 301.1 , 300.9 , 300.7 ,\n", - " 300.39, 300.13, 300.16, 299.61, 299.31, 299.47, 300.15, 300.83,\n", - " 300.72, 300.58, 300.06, 299.69, 299.8 , 299.51, 299.8 , 299.68,\n", - " 299.21, 299.33, 300.14, 301.16, 301.46, 301.26, 300.55, 300.17,\n", - " 300.32, 300.32, 300.65, 300.5 , 300.25, 300.44, 300.94, 301.71,\n", - " 302.03, 302.11, 301.97, 302.04, 302.15, 302.3 , 302.75, 302.54,\n", - " 302.32, 302.27, 302.05, 302.02, 301.3 , 300.68, 299.88, 299.43,\n", - " 299.26, 299.11, 299.25, 299.31, 299.4 , 300.02, 300.49, 301.25,\n", - " 301.45, 301.34, 300.76, 299.82, 299.44, 299.38, 298.94, 298.95,\n", - " 298.97, 298.98, 299.63, 300.57, 300.87, 301. , 300.67, 300.26,\n", - " 300.25, 300.7 , 300.79, 300.68, 300.23, 300.56, 301.37, 301.75,\n", - " 301.72, 301.39, 300.78, 300.12, 299.85, 300.46, 300.41, 300.22,\n", - " 300.24, 300.29, 300.97, 301.47, 300.74, 300.45, 300.04, 299.33,\n", - " 298.92, 298.45, 298.49, 298.68, 298.73, 298.96, 299.9 , 300.55])" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "convert_degc_to_kelvin(nino34_series.values)" ] }, { "cell_type": "markdown", - "id": "de2e5b57", + "id": "65b3cd56", "metadata": {}, "source": [ "We can now assign our pandas `Series` with the converted temperatures to a new column in our dataframe!" @@ -4513,8 +1105,8 @@ }, { "cell_type": "code", - "execution_count": 56, - "id": "1ca04877", + "execution_count": null, + "id": "2d84dfe1", "metadata": {}, "outputs": [], "source": [ @@ -4523,40 +1115,17 @@ }, { "cell_type": "code", - "execution_count": 57, - "id": "1d997829", + "execution_count": null, + "id": "dd9a0811", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "1982-01-01 299.87\n", - "1982-02-01 299.85\n", - "1982-03-01 300.35\n", - "1982-04-01 301.17\n", - "1982-05-01 301.69\n", - " ... \n", - "2020-12-01 298.68\n", - "2021-01-01 298.73\n", - "2021-02-01 298.96\n", - "2021-03-01 299.90\n", - "2021-04-01 300.55\n", - "Name: Nino34_degK, Length: 472, dtype: float64" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df.Nino34_degK" ] }, { "cell_type": "markdown", - "id": "1bcaf1cd", + "id": "a8c6dba3", "metadata": {}, "source": [ "Now that our analysis is done, we can save our data to a `csv` for later - or share with others!" @@ -4564,8 +1133,8 @@ }, { "cell_type": "code", - "execution_count": 58, - "id": "81b8d46b", + "execution_count": null, + "id": "054428db", "metadata": {}, "outputs": [], "source": [ @@ -4574,249 +1143,17 @@ }, { "cell_type": "code", - "execution_count": 59, - "id": "cd87abc5", + "execution_count": null, + "id": "3f7d378f", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nino12Nino12anomNino3Nino3anomNino4Nino4anomNino34Nino34anommonthNino34_degK
datetime
1982-01-0124.29-0.1725.870.2428.300.0026.720.151299.87
1982-02-0125.49-0.5826.380.0128.210.1126.70-0.022299.85
1982-03-0125.21-1.3126.98-0.1628.410.2227.20-0.023300.35
1982-04-0124.50-0.9727.680.1828.920.4228.020.244301.17
1982-05-0123.97-0.2327.790.7129.490.7028.540.695301.69
.................................
2020-12-0122.16-0.6024.38-0.8327.65-0.9525.53-1.1212298.68
2021-01-0123.89-0.6425.06-0.5527.10-1.2525.58-0.991298.73
2021-02-0125.55-0.6625.80-0.5727.20-1.0025.81-0.922298.96
2021-03-0126.48-0.2626.80-0.3927.79-0.5526.75-0.513299.90
2021-04-0124.89-0.8026.96-0.6528.47-0.2127.40-0.494300.55
\n", - "

472 rows × 10 columns

\n", - "
" - ], - "text/plain": [ - " Nino12 Nino12anom Nino3 Nino3anom Nino4 Nino4anom Nino34 \\\n", - "datetime \n", - "1982-01-01 24.29 -0.17 25.87 0.24 28.30 0.00 26.72 \n", - "1982-02-01 25.49 -0.58 26.38 0.01 28.21 0.11 26.70 \n", - "1982-03-01 25.21 -1.31 26.98 -0.16 28.41 0.22 27.20 \n", - "1982-04-01 24.50 -0.97 27.68 0.18 28.92 0.42 28.02 \n", - "1982-05-01 23.97 -0.23 27.79 0.71 29.49 0.70 28.54 \n", - "... ... ... ... ... ... ... ... \n", - "2020-12-01 22.16 -0.60 24.38 -0.83 27.65 -0.95 25.53 \n", - "2021-01-01 23.89 -0.64 25.06 -0.55 27.10 -1.25 25.58 \n", - "2021-02-01 25.55 -0.66 25.80 -0.57 27.20 -1.00 25.81 \n", - "2021-03-01 26.48 -0.26 26.80 -0.39 27.79 -0.55 26.75 \n", - "2021-04-01 24.89 -0.80 26.96 -0.65 28.47 -0.21 27.40 \n", - "\n", - " Nino34anom month Nino34_degK \n", - "datetime \n", - "1982-01-01 0.15 1 299.87 \n", - "1982-02-01 -0.02 2 299.85 \n", - "1982-03-01 -0.02 3 300.35 \n", - "1982-04-01 0.24 4 301.17 \n", - "1982-05-01 0.69 5 301.69 \n", - "... ... ... ... \n", - "2020-12-01 -1.12 12 298.68 \n", - "2021-01-01 -0.99 1 298.73 \n", - "2021-02-01 -0.92 2 298.96 \n", - "2021-03-01 -0.51 3 299.90 \n", - "2021-04-01 -0.49 4 300.55 \n", - "\n", - "[472 rows x 10 columns]" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pd.read_csv('nino_analyzed_output.csv', index_col=0, parse_dates=True)" ] }, { "cell_type": "markdown", - "id": "33f433ed", + "id": "9327e958", "metadata": {}, "source": [ "---\n", diff --git a/environment.yml b/environment.yml index e632eff59..dd2831ec2 100644 --- a/environment.yml +++ b/environment.yml @@ -10,3 +10,7 @@ dependencies: - sqlalchemy<1.4 - cartopy - xarray + - pip + - pip: + # works for regular pip packages + - pythia-datasets From 6e89dd57ac6310e66aeae7f410e43f59693b82fa Mon Sep 17 00:00:00 2001 From: Brian Rose Date: Mon, 14 Jun 2021 19:07:40 -0400 Subject: [PATCH 15/17] Respond to comments from @dopplershift --- core/datetime/datetime.ipynb | 40 +++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/core/datetime/datetime.ipynb b/core/datetime/datetime.ipynb index 9b6254a20..f686854c9 100644 --- a/core/datetime/datetime.ipynb +++ b/core/datetime/datetime.ipynb @@ -101,7 +101,7 @@ "import time as tm\n", "```\n", "\n", - "We can now reference the `datetime` module (alaised to `dt`) and `datetime` object unambiguously" + "We can now reference the `datetime` module (aliased to `dt`) and `datetime` object unambiguously." ] }, { @@ -464,8 +464,8 @@ "print(f\"The time between high and low tide is {tide_duration}.\")\n", "print(f\"The current high tide is {high_tide}.\")\n", "print(f\"The next low tide is {next_low_tide}.\")\n", - "print(f\"The next high tide {next_high_tide}.\")\n", - "print(f\"The tide length is {tide_length}.\")\n", + "print(f\"The next high tide {next_high_tide}.\")\n", + "print(f\"The tide length is {tide_length}.\")\n", "print(\"The type of the 'tide_length' variable is {}.\".format(type(tide_length)))" ] }, @@ -493,9 +493,39 @@ "When you create `datetime` objects in Python, they are so-called \"naive\" which means they are time zone unaware. In many situations, you can happily go forward without this detail getting in the way of your work. As the [Python documentation states](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects):\n", ">Naive objects are easy to understand and to work with, at the cost of ignoring some aspects of reality. \n", "\n", - "However, if you wish to convey time zone information, you will have to make your `datetime` objects time zone aware. In order to handle time zones in Python, you will need the third-party [pytz](https://pypi.org/project/pytz/) module whose classes build upon, or \"inherit\" in OO terminology, from the `tzinfo` class. You cannot solely rely on the Python Standard Library unfortunately. \n", + "However, if you wish to convey time zone information, you will have to make your `datetime` objects time zone aware. The `datetime` library is able to handle conversions to UTC:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "naive = dt.datetime.now()\n", + "aware = dt.datetime.now(dt.timezone.utc)\n", + "print(f\"I am time zone naive {naive}.\")\n", + "print(f\"I am time zone aware {aware}.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The time difference between `naive` and `aware` will depend on what time you're in when you run this code!\n", + "\n", + "In the code above, we used `dt.timezone.utc` to initialize the UTC timezone for our `aware` object. Unfortunately at this time the Python Standard Library does not fully support initializing `datetime` objects with arbitrary time zones, or conversions between different time zones. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Full time zone support with the `pytz` module\n", + "\n", + "For improved handling of time zones in Python, you will need the third-party [pytz](https://pypi.org/project/pytz/) module whose classes build upon, or \"inherit\" in OO terminology, from `datetime` classes. \n", "\n", - "Here, we create time zone naive and time zone aware `datetime` objects:" + "Here, we repeat the above exercise but initialize our `aware` object in a different time zone:" ] }, { From 87beda32d81cf32fd221423a86c98c16a71dca9b Mon Sep 17 00:00:00 2001 From: Brian Rose Date: Mon, 14 Jun 2021 22:42:27 -0400 Subject: [PATCH 16/17] Tweak UTC example --- core/datetime/datetime.ipynb | 210 +++++++++++++++++++++++++++-------- 1 file changed, 165 insertions(+), 45 deletions(-) diff --git a/core/datetime/datetime.ipynb b/core/datetime/datetime.ipynb index f686854c9..6c6594234 100644 --- a/core/datetime/datetime.ipynb +++ b/core/datetime/datetime.ipynb @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -106,9 +106,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2021-03-14 15:09:26\n" + ] + } + ], "source": [ "pisecond = dt.datetime(2021, 3, 14, 15, 9, 26)\n", "print(pisecond)" @@ -123,9 +131,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1623724342.5584798\n" + ] + } + ], "source": [ "now = tm.time()\n", "print(now)" @@ -149,9 +165,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The benchmark took 1.0014047622680664 seconds\n" + ] + } + ], "source": [ "start = tm.time()\n", "tm.sleep(1) # The sleep function will stop the program for n seconds\n", @@ -211,9 +235,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pi day occurred on: 03/14/2021\n" + ] + } + ], "source": [ "print('Pi day occurred on:', pisecond.strftime(format='%m/%d/%Y'))" ] @@ -237,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -274,7 +306,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -292,9 +324,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The distance from New York to Paris is 5517.0 kilometers.\n" + ] + } + ], "source": [ "ny = Coord(\n", " 40.71, 74.01\n", @@ -336,9 +376,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2007-06-27 16:18:21.898000\n" + ] + } + ], "source": [ "strike_time = dt.datetime.strptime('06/27/07 16:18:21.898', '%m/%d/%y %H:%M:%S.%f')\n", "# print strike_time to see if we have properly parsed our time\n", @@ -374,9 +422,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "16h 18m 21s\n" + ] + } + ], "source": [ "print(strike_time.strftime(format='%Hh %Mm %Ss'))" ] @@ -392,9 +448,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2007" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "strike_time.year" ] @@ -416,9 +483,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5101" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "(dt.datetime.now() - strike_time).days" ] @@ -449,9 +527,22 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The time between high and low tide is 6:12:30.\n", + "The current high tide is 2016-06-01 04:38:00.\n", + "The next low tide is 2016-06-01 10:50:30.\n", + "The next high tide 2016-06-01 17:03:00.\n", + "The tide length is 12:25:00.\n", + "The type of the 'tide_length' variable is .\n" + ] + } + ], "source": [ "high_tide = dt.datetime(2016, 6, 1, 4, 38, 0)\n", "lunar_day = dt.timedelta(hours=24, minutes=50)\n", @@ -498,9 +589,18 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I am time zone naive 2021-06-14 22:32:32.504745.\n", + "I am time zone aware 2021-06-15 02:32:32.504776+00:00.\n" + ] + } + ], "source": [ "naive = dt.datetime.now()\n", "aware = dt.datetime.now(dt.timezone.utc)\n", @@ -512,7 +612,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The time difference between `naive` and `aware` will depend on what time you're in when you run this code!\n", + "Notice that `aware` has `+00:00` appended at the end, indicating zero hours offset from UTC.\n", + "\n", + "Our `naive` object shows the local time on whatever computer was used to run this code. If you're reading this online, then chances are it was executed on a cloud server that already uses UTC, so `naive` and `aware` will differ only at the microsecond level!\n", "\n", "In the code above, we used `dt.timezone.utc` to initialize the UTC timezone for our `aware` object. Unfortunately at this time the Python Standard Library does not fully support initializing `datetime` objects with arbitrary time zones, or conversions between different time zones. " ] @@ -530,14 +632,23 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I am time zone naive: 2021-06-14 22:40:21.398019.\n", + "I am time zone aware: 2021-06-14 20:40:21.398058-06:00.\n" + ] + } + ], "source": [ "naive = dt.datetime.now()\n", "aware = dt.datetime.now(pytz.timezone('US/Mountain'))\n", - "print(f\"I am time zone naive {naive}.\")\n", - "print(f\"I am time zone aware {aware}.\")" + "print(f\"I am time zone naive: {naive}.\")\n", + "print(f\"I am time zone aware: {aware}.\")" ] }, { @@ -555,9 +666,18 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The UTC time is June 15, 2021, 2:33AM.\n", + "The 'US/Mountain' time is June 14, 2021, 8:33PM.\n" + ] + } + ], "source": [ "utc = dt.datetime.utcnow().replace(tzinfo=pytz.utc)\n", "print(\"The UTC time is {}.\".format(utc.strftime('%B %d, %Y, %-I:%M%p')))\n", From 0c70084c879342a950bc9f881f4ada8cddd0c81b Mon Sep 17 00:00:00 2001 From: Brian Rose Date: Mon, 14 Jun 2021 22:44:25 -0400 Subject: [PATCH 17/17] Strip output from notebook --- core/datetime/datetime.ipynb | 202 ++++++++--------------------------- 1 file changed, 42 insertions(+), 160 deletions(-) diff --git a/core/datetime/datetime.ipynb b/core/datetime/datetime.ipynb index 6c6594234..be7c45f90 100644 --- a/core/datetime/datetime.ipynb +++ b/core/datetime/datetime.ipynb @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -106,17 +106,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2021-03-14 15:09:26\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pisecond = dt.datetime(2021, 3, 14, 15, 9, 26)\n", "print(pisecond)" @@ -131,17 +123,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1623724342.5584798\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "now = tm.time()\n", "print(now)" @@ -165,17 +149,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The benchmark took 1.0014047622680664 seconds\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "start = tm.time()\n", "tm.sleep(1) # The sleep function will stop the program for n seconds\n", @@ -235,17 +211,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pi day occurred on: 03/14/2021\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print('Pi day occurred on:', pisecond.strftime(format='%m/%d/%Y'))" ] @@ -269,7 +237,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -306,7 +274,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -324,17 +292,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The distance from New York to Paris is 5517.0 kilometers.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "ny = Coord(\n", " 40.71, 74.01\n", @@ -376,17 +336,9 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2007-06-27 16:18:21.898000\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "strike_time = dt.datetime.strptime('06/27/07 16:18:21.898', '%m/%d/%y %H:%M:%S.%f')\n", "# print strike_time to see if we have properly parsed our time\n", @@ -422,17 +374,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "16h 18m 21s\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(strike_time.strftime(format='%Hh %Mm %Ss'))" ] @@ -448,20 +392,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2007" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "strike_time.year" ] @@ -483,20 +416,9 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5101" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "(dt.datetime.now() - strike_time).days" ] @@ -527,22 +449,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The time between high and low tide is 6:12:30.\n", - "The current high tide is 2016-06-01 04:38:00.\n", - "The next low tide is 2016-06-01 10:50:30.\n", - "The next high tide 2016-06-01 17:03:00.\n", - "The tide length is 12:25:00.\n", - "The type of the 'tide_length' variable is .\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "high_tide = dt.datetime(2016, 6, 1, 4, 38, 0)\n", "lunar_day = dt.timedelta(hours=24, minutes=50)\n", @@ -589,18 +498,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "I am time zone naive 2021-06-14 22:32:32.504745.\n", - "I am time zone aware 2021-06-15 02:32:32.504776+00:00.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "naive = dt.datetime.now()\n", "aware = dt.datetime.now(dt.timezone.utc)\n", @@ -632,18 +532,9 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "I am time zone naive: 2021-06-14 22:40:21.398019.\n", - "I am time zone aware: 2021-06-14 20:40:21.398058-06:00.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "naive = dt.datetime.now()\n", "aware = dt.datetime.now(pytz.timezone('US/Mountain'))\n", @@ -666,18 +557,9 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The UTC time is June 15, 2021, 2:33AM.\n", - "The 'US/Mountain' time is June 14, 2021, 8:33PM.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "utc = dt.datetime.utcnow().replace(tzinfo=pytz.utc)\n", "print(\"The UTC time is {}.\".format(utc.strftime('%B %d, %Y, %-I:%M%p')))\n",