{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# Clearsky Limits for Daily Insolation\n\nChecking the clearsky limits for daily insolation data.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Identifying and filtering out invalid irradiance data is a\nuseful way to reduce noise during analysis. In this example,\nwe use :py:func:`pvanalytics.quality.irradiance.daily_insolation_limits`\nto determine when the daily insolation lies between a minimum\nand a maximum value. Irradiance measurements and clear-sky\nirradiance on each day are integrated with the trapezoid rule\nto calculate daily insolation. For this example we will use data\nfrom the RMIS weather system located on the NREL campus\nin Colorado, USA.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import pvanalytics\nfrom pvanalytics.quality.irradiance import daily_insolation_limits\nimport pvlib\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport pathlib"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "First, read in data from the RMIS NREL system. This data set contains\n5-minute right-aligned data. It includes POA, GHI,\nDNI, DHI, and GNI measurements.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "pvanalytics_dir = pathlib.Path(pvanalytics.__file__).parent\nrmis_file = pvanalytics_dir / 'data' / 'irradiance_RMIS_NREL.csv'\ndata = pd.read_csv(rmis_file, index_col=0, parse_dates=True)\n# Make the datetime index tz-aware.\ndata.index = data.index.tz_localize(\"Etc/GMT+7\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Now model clear-sky irradiance for the location and times of the\nmeasured data:\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "location = pvlib.location.Location(39.7407, -105.1686)\nclearsky = location.get_clearsky(data.index)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Use :py:func:`pvanalytics.quality.irradiance.daily_insolation_limits`\nto identify if the daily insolation lies between a minimum\nand a maximum value. Here, we check GHI irradiance field\n'irradiance_ghi__7981'.\n:py:func:`pvanalytics.quality.irradiance.daily_insolation_limits`\nreturns a mask that identifies data that falls between\nlower and upper limits. The defaults (used here)\nare upper bound of 125% of clear-sky daily insolation,\nand lower bound of 40% of clear-sky daily insolation.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "daily_insolation_mask = daily_insolation_limits(data['irradiance_ghi__7981'],\n                                                clearsky['ghi'])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Plot the 'irradiance_ghi__7981' data stream and its associated clearsky GHI\ndata stream. Mask the GHI time series by its daily_insolation_mask.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "data['irradiance_ghi__7981'].plot()\nclearsky['ghi'].plot()\ndata.loc[daily_insolation_mask, 'irradiance_ghi__7981'].plot(ls='', marker='.')\nplt.legend(labels=[\"RMIS GHI\", \"Clearsky GHI\",\n                   \"Within Daily Insolation Limit\"],\n           loc=\"upper left\")\nplt.xlabel(\"Date\")\nplt.ylabel(\"GHI (W/m^2)\")\nplt.tight_layout()\nplt.show()"
      ]
    }
  ],
  "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.7.9"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}