{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# illustrate using Pandas and json IO" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib.dates as mdates\n", "#access a function from the urllib module\n", "from urllib.request import urlretrieve\n", "#also let's use a linux command to see the file size\n", "import os\n" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [], "source": [ "# needed to handle dates. See Chapter 15\n", "from datetime import datetime,timezone\n", "#adding a new module Pandas. See Chapter 16\n", "import pandas as pd\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will be accessing public data from a commercial site for which I need to disclose that I am involved with the company, Synoptic Data:\n", "- I am on the Board of Directors\n", "- I am a shareholder\n", "- I have a grant from that company to help with their customer support and research and development\n" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [], "source": [ "# we are using an api (application programming interface) service\n", "# see https://developers.synopticdata.com/mesonet/\n", "# get all temperature observations at the Salt Lake City airport during 2022\n", "# station_id = KSLC\n", "# the variable is defined as \"air_temp\"\n", "# local times from Midnight New Year's Eve to Midnight last night\n", "# output = csv\n", "# you are using a \"token\" to obtain access. This token may expire at some future date" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saved slc_temp.csv 2876.563 KB\n" ] } ], "source": [ "url = \"https://api.synopticdata.com/v2/stations/timeseries?&token=bace3f05279d4de1bb2f03011843709e&start=202201010700&end=202209220600&obtimezone=local&output=csv&stid=kslc&vars=air_temp\"\n", "# define the file to write the data into\n", "filename = \"slc_temp.csv\"\n", "#let's try to get the file from the web\n", "try:\n", " #get the file over the web\n", " urlretrieve(url, filename)\n", " print(\"Saved\", filename, os.path.getsize(filename)/1000., 'KB')\n", "except:\n", " print(\"something wrong grabbing the file\")\n", " print(\"but the program continues, so may be in error\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# STOP!\n", "Launch a terminal window and look at the file uaing more \n", "\n", "How many header lines are there?\n", "\n", "Are there any footer lines that need to be removed? How do you check for those?\n", "\n", "How many columns in each row of data?" ] }, { "cell_type": "code", "execution_count": 109, "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", "
TMPC
Date
2022-01-01 07:00:00+00:00-9.4
2022-01-01 07:05:00+00:00-9.4
2022-01-01 07:10:00+00:00-8.9
2022-01-01 07:15:00+00:00-7.2
2022-01-01 07:20:00+00:00-8.3
......
2022-09-22 05:45:00+00:0020.0
2022-09-22 05:50:00+00:0020.0
2022-09-22 05:54:00+00:0020.0
2022-09-22 05:55:00+00:0020.0
2022-09-22 06:00:00+00:0020.6
\n", "

82747 rows × 1 columns

\n", "
" ], "text/plain": [ " TMPC\n", "Date \n", "2022-01-01 07:00:00+00:00 -9.4\n", "2022-01-01 07:05:00+00:00 -9.4\n", "2022-01-01 07:10:00+00:00 -8.9\n", "2022-01-01 07:15:00+00:00 -7.2\n", "2022-01-01 07:20:00+00:00 -8.3\n", "... ...\n", "2022-09-22 05:45:00+00:00 20.0\n", "2022-09-22 05:50:00+00:00 20.0\n", "2022-09-22 05:54:00+00:00 20.0\n", "2022-09-22 05:55:00+00:00 20.0\n", "2022-09-22 06:00:00+00:00 20.6\n", "\n", "[82747 rows x 1 columns]" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#define the headers\n", "headers = ['STID','Date','TMPC']\n", "#define the data types\n", "dtypes = { 'STID': 'str','Date': 'str', 'TMPC': 'float'}\n", "#what kind of variable is dtypes?\n", "\n", "#there may be times with no actual values \n", "#those will get changed to NaN by the pandas read_csv function by the option na_filter\n", "#Create a pandas dataframe. More about those later. \n", "#For now, just think about it as an upgrade to a numpy array with an \"index\" in this case the Date\n", "#handling date strings is always a bit of a hassle, so just accept this for now\n", "#the date will be an index and processing only the temp column\n", "df_kslc = pd.read_csv('slc_temp.csv', parse_dates=['Date'], \\\n", " date_parser=lambda col: pd.to_datetime(col, utc=True), \\\n", " names=headers,dtype = dtypes,na_filter=True,skiprows=8,index_col=['Date'],usecols=['Date','TMPC'])\n", "\n", "#and finally keep the data with the precision that it has\n", "pd.set_option('display.float_format', lambda x: '%.1f' % x)\n", "\n", "#display the pandas dataframe \n", "df_kslc" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "index: datetime64[ns, UTC] \n", " data: TMPC float64\n", "dtype: object\n" ] } ], "source": [ "#what are the types in the dataframe\n", "print('index: ',df_kslc.index.dtype,'\\n data: ',df_kslc.dtypes)" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "text/plain": [ "[Text(0.5, 0, 'Temperature C)'), Text(0, 0.5, 'Count')]" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#histogram of KSLC temperature \n", "#again details about plotting will come later. Chapters 10-14\n", "#use this like a recipe- it works, use it! Experiment by changing values\n", "fig,ax = plt.subplots(1,1,figsize=(10,5))\n", "x1 = np.arange(-15.,45.,1)\n", "# use the actual temperature values\n", "print(type(df_kslc['TMPC'].values))\n", "hist_val1,bins1 = np.histogram(df_kslc['TMPC'].values,bins=x1,range=(x1.min(),x1.max()))\n", "width1 = 0.6 * (bins1[1] - bins1[0])\n", "center1 = (bins1[:-1] + bins1[1:]) / 2\n", "\n", "ax.bar(center1,hist_val1,align='center',width=width1,color='cyan')\n", "ax.set(xlim=(-15,45),ylim=(0,3000))\n", "ax.set(xlabel=\"Temperature C)\",ylabel='Count')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Repeat using json format\n", "json is a file format that uses human-readable text to store and transmit data objects consisting of attribute-value pairs \n", "\n", "Think of it like having the ability to transmit many python values, lists, and dictionaries where each value is defined in terms of an attribute" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [], "source": [ "#get the json module \n", "import json" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saved slc_temp.json 15357.902 KB\n" ] } ], "source": [ "#the Synoptic api service only permits getting 1 station in csv format\n", "#change the output from csv to json and add another station mtmet\n", "url = \"https://api.synopticdata.com/v2/stations/timeseries?&token=bace3f05279d4de1bb2f03011843709e&start=202201010700&end=202209220600&obtimezone=local&output=json&stid=kslc,mtmet&vars=air_temp\"\n", "# define the file to write the data into\n", "filename = \"slc_temp.json\"\n", "#let's try if we can get the file from the web\n", "try:\n", " #get the file over the web\n", " urlretrieve(url, filename)\n", " print(\"Saved\", filename, os.path.getsize(filename)/1000., 'KB')\n", "except:\n", " print(\"something wrong grabbing the file\")\n", " print(\"but the program continues, so may be in error\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# STOP\n", "\n", "Look first at the file slc_temp.json using the linux terminal window\n", "\n", "Now click on the file to the left with that name that has a \"dictionary\" type icon {:}\n", "\n", "Click on one right pointing arrow so it points down\n", "\n", "What do you see?\n", "\n", "Click on other ones\n", "\n", "Lots of info here! Check it out!" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [], "source": [ "#read the data by opening the file and reading all of it\n", "in_file = open('slc_temp.json').read()\n", "data = json.loads(in_file)\n", "#print(data)" ] }, { "cell_type": "code", "execution_count": 115, "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", "
STATUSMNET_IDELEVATIONNAMESTIDELEV_DEMLONGITUDESTATERESTRICTEDQC_FLAGGEDLATITUDETIMEZONEIDPERIOD_OF_RECORD.startPERIOD_OF_RECORD.endSENSOR_VARIABLES.air_temp.air_temp_set_1.positionUNITS.positionUNITS.elevationOBSERVATIONS.date_timeOBSERVATIONS.air_temp_set_1
0ACTIVE14226Salt Lake City, Salt Lake City International A...KSLC4235.6-111.96503UTFalseTrue40.77069America/Denver531997-01-01T00:00:00Z2022-09-22T19:35:00Z2.0mft[2022-01-01T00:00:00-0700, 2022-01-01T00:05:00...[-9.4, -9.4, -8.9, -7.2, -8.3, -9.4, -10.0, -1...
1ACTIVE1534996U of U Mountain Met LabMTMET4993.4-111.828211UTFalseFalse40.766573America/Denver338982012-04-26T00:00:00Z2022-09-22T19:40:00Z2.5mft[2022-01-01T00:00:00-0700, 2022-01-01T00:01:00...[-10.35, -10.411, -10.439, -10.539, -10.6, -10...
\n", "
" ], "text/plain": [ " STATUS MNET_ID ELEVATION \\\n", "0 ACTIVE 1 4226 \n", "1 ACTIVE 153 4996 \n", "\n", " NAME STID ELEV_DEM \\\n", "0 Salt Lake City, Salt Lake City International A... KSLC 4235.6 \n", "1 U of U Mountain Met Lab MTMET 4993.4 \n", "\n", " LONGITUDE STATE RESTRICTED QC_FLAGGED LATITUDE TIMEZONE \\\n", "0 -111.96503 UT False True 40.77069 America/Denver \n", "1 -111.828211 UT False False 40.766573 America/Denver \n", "\n", " ID PERIOD_OF_RECORD.start PERIOD_OF_RECORD.end \\\n", "0 53 1997-01-01T00:00:00Z 2022-09-22T19:35:00Z \n", "1 33898 2012-04-26T00:00:00Z 2022-09-22T19:40:00Z \n", "\n", " SENSOR_VARIABLES.air_temp.air_temp_set_1.position UNITS.position \\\n", "0 2.0 m \n", "1 2.5 m \n", "\n", " UNITS.elevation OBSERVATIONS.date_time \\\n", "0 ft [2022-01-01T00:00:00-0700, 2022-01-01T00:05:00... \n", "1 ft [2022-01-01T00:00:00-0700, 2022-01-01T00:01:00... \n", "\n", " OBSERVATIONS.air_temp_set_1 \n", "0 [-9.4, -9.4, -8.9, -7.2, -8.3, -9.4, -10.0, -1... \n", "1 [-10.35, -10.411, -10.439, -10.539, -10.6, -10... " ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#now lets try to make sense of all the info available by putting it into a pandas dataframe\n", "# the json_normalize function in Pandas flattens the json structure to make it easier to handle\n", "df_json = pd.json_normalize(data,record_path=['STATION'])\n", "#STOP! \n", "#look at all the columns. Note the row index are the two stations\n", "df_json" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 STATUS\n", "1 MNET_ID\n", "2 ELEVATION\n", "3 NAME\n", "4 STID\n", "5 ELEV_DEM\n", "6 LONGITUDE\n", "7 STATE\n", "8 RESTRICTED\n", "9 QC_FLAGGED\n", "10 LATITUDE\n", "11 TIMEZONE\n", "12 ID\n", "13 PERIOD_OF_RECORD.start\n", "14 PERIOD_OF_RECORD.end\n", "15 SENSOR_VARIABLES.air_temp.air_temp_set_1.position\n", "16 UNITS.position\n", "17 UNITS.elevation\n", "18 OBSERVATIONS.date_time\n", "19 OBSERVATIONS.air_temp_set_1\n" ] } ], "source": [ "#print out all the columns\n", "for col in range(len(df_json.columns)):\n", " print(col,df_json.columns[col]) " ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [], "source": [ "#the column of interest is the last one for now" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 [-9.4, -9.4, -8.9, -7.2, -8.3, -9.4, -10.0, -1...\n", "1 [-10.35, -10.411, -10.439, -10.539, -10.6, -10...\n", "Name: OBSERVATIONS.air_temp_set_1, dtype: object" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#create a pandas data frame of just the temps\n", "df_temp = df_json['OBSERVATIONS.air_temp_set_1']\n", "#note that we have two rows for the two stations\n", "df_temp" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " 82747\n" ] } ], "source": [ "#0 is the index for kslc (0th station)\n", "print(type(df_temp[0]))\n", "temp = np.array(df_temp[0])\n", "print(type(temp),np.size(temp))" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "#there's a problem. some values are None's. And that messes up the histogram. Let's get rid of those\n", "#check to see if we really have None's\n", "print((temp == None).any())\n", "#yep we do\n", "# define a new variable and only use the values that are not None\n", "temp_nonone = temp[temp != None]\n", "print((temp_nonone == None).any())\n", "#no more None's" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Text(0.5, 0, 'Temperature C)'), Text(0, 0.5, 'Count')]" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#histogram of KSLC temperature from json file\n", "#again details about plotting will come later\n", "#use this like a recipe- it works, try it!\n", "fig,ax = plt.subplots(1,1,figsize=(10,5))\n", "x1 = np.arange(-15.,45.,1)\n", "hist_val1,bins1 = np.histogram(temp_nonone,bins=x1,range=(x1.min(),x1.max()))\n", "width1 = 0.6 * (bins1[1] - bins1[0])\n", "center1 = (bins1[:-1] + bins1[1:]) / 2\n", "\n", "ax.bar(center1,hist_val1,align='center',width=width1,color='cyan')\n", "ax.set(xlim=(-15,45),ylim=(0,3000))\n", "ax.set(xlabel=\"Temperature C)\",ylabel='Count')" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [], "source": [ "#we are getting the same data whether reading from csv or json" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.5" } }, "nbformat": 4, "nbformat_minor": 4 }