{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Quality Control CTD data with PySeabird\n", "### Author: Guilherme Castelão" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a minimalist example on how to use the Python Seabird package to read and apply a quality control in a CTD output file. For more details, please check the [documentation](https://seabird.readthedocs.io/en/latest/).\n", "\n", "### Requirements\n", "\n", "This notebook requires the packages seabird, supportdata, and cotede. You can install those using pip as following:\n", "\n", "```shell\n", "pip install seabird[QC]\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "#%matplotlib inline\n", "\n", "from seabird.cnv import fCNV\n", "from seabird.qc import fProfileQC" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's first download an example file with some CTD data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--2019-08-29 21:17:27-- https://raw.githubusercontent.com/castelao/seabird/master/sampledata/CTD/dPIRX003.cnv\n", "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.196.133\n", "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.196.133|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 47291 (46K) [text/plain]\n", "Saving to: ‘dPIRX003.cnv’\n", "\n", "dPIRX003.cnv 100%[===================>] 46.18K --.-KB/s in 0.03s \n", "\n", "2019-08-29 21:17:27 (1.59 MB/s) - ‘dPIRX003.cnv’ saved [47291/47291]\n", "\n" ] } ], "source": [ "!wget https://raw.githubusercontent.com/castelao/seabird/master/sampledata/CTD/dPIRX003.cnv" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "profile = fCNV('dPIRX003.cnv')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Header: dict_keys(['sbe_model', 'seasave', 'instrument_type', 'nquan', 'nvalues', 'start_time', 'bad_flag', 'file_type', 'md5', 'datetime', 'LATITUDE', 'LONGITUDE', 'filename'])\n" ] } ], "source": [ "print(\"Header: %s\" % profile.attributes.keys())" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Data: ['timeS', 'PRES', 'TEMP', 'TEMP2', 'CNDC', 'CNDC2', 'potemperature', 'potemperature2', 'PSAL', 'PSAL2', 'flag']\n" ] } ], "source": [ "print(\"Data: %s\" % profile.keys())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's apply the quality control procedure recommended by GTSPP" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "profile = fProfileQC('dPIRX003.cnv', cfg='gtspp')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The QC flags are groupped for each variable. On this example there are temperature, salinity and the respective secondary sensors." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['common', 'TEMP', 'TEMP2', 'PSAL', 'PSAL2'])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.flags.keys()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check which tests were performed, hence which flags are available, on the the primary temperature sensor" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['valid_datetime', 'location_at_sea', 'global_range', 'profile_envelop', 'gradient', 'spike', 'woa_normbias', 'overall'])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.flags['TEMP'].keys()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The flagging standard is described in [CoTeDe's manual](https://cotede.readthedocs.io/en/latest/) . The one used here is 0 for no QC performed, 1 for approved data, and 9 for missing data.\n", "\n", "Note that the overall flag is the combined result from all tested flags. In the example above it considers the other 7 flags and takes the highest value, therefore, if the overall is equal to 1 means that all possible tests approved that measurement, while a value of 4 means that at least one tests suggests its a bad measurement." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 9, 0, 9, 9, 0, 9, 9,\n", " 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9],\n", " dtype=int8)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile.flags['TEMP']['spike']" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "idx = profile.flags['TEMP']['overall'] <= 2" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'dPIRX003.cnv')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from matplotlib import pyplot as plt\n", "\n", "plt.figure(figsize=(12,8))\n", "plt.plot(profile['TEMP'][idx], profile['PRES'][idx],'b')\n", "plt.plot(profile['TEMP'][~idx], profile['PRES'][~idx],'ro')\n", "plt.gca().invert_yaxis()\n", "# plt.plot(profile['TEMP2'], profile['PRES'],'g')\n", "plt.xlabel('Temperature')\n", "plt.ylabel('Pressure')\n", "plt.title(profile.attributes['filename'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Other pre defined quality control procedures are available, please check [CoTeDe's manual](https://cotede.readthedocs.io/en/latest/) to learn the details of the tests and what is available. For instance, to apply the EuroGOOS recommendations change the cfg argument" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['valid_datetime', 'location_at_sea', 'global_range', 'gradient_depthconditional', 'spike_depthconditional', 'digit_roll_over', 'woa_normbias', 'overall'])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile = fProfileQC('dPIRX003.cnv', cfg='eurogoos')\n", "profile.flags['TEMP'].keys()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If not defined, the default configuration is a collection of tests resulted for our work on [IQuOD](http://www.iquod.org/), and is equivalent to define `cfg='cotede'`." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Deprecated cfg format. It should contain a threshold item.\n", "Deprecated cfg format. It should contain a threshold item.\n" ] }, { "data": { "text/plain": [ "dict_keys(['valid_datetime', 'location_at_sea', 'global_range', 'profile_envelop', 'gradient', 'gradient_depthconditional', 'spike', 'spike_depthconditional', 'stuck_value', 'tukey53H_norm', 'digit_roll_over', 'woa_normbias', 'cars_normbias', 'rate_of_change', 'cum_rate_of_change', 'anomaly_detection', 'overall'])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profile = fProfileQC('dPIRX003.cnv')\n", "profile.flags['TEMP'].keys()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.3" } }, "nbformat": 4, "nbformat_minor": 2 }