{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# QCrad Limits for Irradiance Data\n\nTest for physical limits on GHI, DHI or DNI using the QCRad criteria.\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\n:py:func:`pvanalytics.quality.irradiance.check_irradiance_limits_qcrad`\nto test for physical limits on GHI, DHI or DNI using the QCRad criteria.\nFor this example we will use data from the RMIS weather system located\non the NREL campus in Colorado, USA.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import pvanalytics\nfrom pvanalytics.quality.irradiance import check_irradiance_limits_qcrad\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)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Now generate solar zenith estimates for the location,\nbased on the data's time zone and site latitude-longitude\ncoordinates. This is done using the\n:py:func:`pvlib.solarposition.get_solarposition` function.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "latitude = 39.742\nlongitude = -105.18\ntime_zone = \"Etc/GMT+7\"\ndata = data.tz_localize(time_zone)\nsolar_position = pvlib.solarposition.get_solarposition(data.index,\n                                                       latitude,\n                                                       longitude)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Generate the estimated extraterrestrial radiation for the time series,\nreferred to as dni_extra. This is done using the\n:py:func:`pvlib.irradiance.get_extra_radiation` function.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "dni_extra = pvlib.irradiance.get_extra_radiation(data.index)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Use :py:func:`pvanalytics.quality.irradiance.check_irradiance_limits_qcrad`\nto generate the QCRAD irradiance limit mask\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "qcrad_limit_mask = check_irradiance_limits_qcrad(\n    solar_zenith=solar_position['zenith'],\n    dni_extra=dni_extra,\n    ghi=data['irradiance_ghi__7981'],\n    dhi=data['irradiance_dhi__7983'],\n    dni=data['irradiance_dni__7982'])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Plot the 'irradiance_ghi__7981' data stream with its associated QCRAD limit\nmask.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "data['irradiance_ghi__7981'].plot()\ndata.loc[qcrad_limit_mask[0], 'irradiance_ghi__7981'].plot(ls='', marker='.')\nplt.legend(labels=[\"RMIS GHI\", \"Within QCRAD Limits\"],\n           loc=\"upper left\")\nplt.xlabel(\"Date\")\nplt.ylabel(\"GHI (W/m^2)\")\nplt.tight_layout()\nplt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Plot the 'irradiance_dhi__7983 data stream with its associated QCRAD limit\nmask.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "data['irradiance_dhi__7983'].plot()\ndata.loc[qcrad_limit_mask[1], 'irradiance_dhi__7983'].plot(ls='', marker='.')\nplt.legend(labels=[\"RMIS DHI\", \"Within QCRAD Limits\"],\n           loc=\"upper left\")\nplt.xlabel(\"Date\")\nplt.ylabel(\"DHI (W/m^2)\")\nplt.tight_layout()\nplt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Plot the 'irradiance_dni__7982' data stream with its associated QCRAD limit\nmask.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "data['irradiance_dni__7982'].plot()\ndata.loc[qcrad_limit_mask[2], 'irradiance_dni__7982'].plot(ls='', marker='.')\nplt.legend(labels=[\"RMIS DNI\", \"Within QCRAD Limits\"],\n           loc=\"upper left\")\nplt.xlabel(\"Date\")\nplt.ylabel(\"DNI (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
}