{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Brief Overview - How to use the MVG library" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction\n", "\n", "The MultiViz Analytics Engine (MVG) Library is a Python library that enables the use of\n", "Viking Analytics's MVG Analytics Service.\n", "To access this service, Viking Analytics (VA) provides a REST API towards its analytics server.\n", "The simplification of access to this service is enabled by the VA-MVG Python package,\n", "which allows interaction with the service via regular python calls.\n", "\n", "This interactive document shall show the whole flow working with the service from\n", "Python, from data upload to retrieval of analysis results for the analysis of vibration signals.\n", "\n", "### Signing up for the service\n", "\n", "For commercial use of the service, you will need to acquire a token from Viking Analytics.\n", "For the example here, we use a built-in token for demo.\n", "Please contact us for a free trial and provide you with your token.\n", "\n", "\n", "### Python Pre-requisites\n", "\n", "1. Make sure you have Python 3.6 or higher installed.\n", "\n", "In the following section we will walk through the code needed for the API interaction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Imports" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we begin with the general imports of Python libraries that are needed as part of this project." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:20:48.441851Z", "start_time": "2021-03-18T10:20:48.257468Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "import json\n", "import os\n", "import sys\n", "from pathlib import Path\n", "\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We proceed by installing the MVG library in our project." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:20:49.156431Z", "start_time": "2021-03-18T10:20:48.443076Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "!{sys.executable} -m pip install va-mvg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We follow by importing the MVG library.\n", "\n", "The library documentation is available at [https://vikinganalytics.github.io/mvg/index.html](https://vikinganalytics.github.io/mvg/index.html)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:20:49.162159Z", "start_time": "2021-03-18T10:20:49.157902Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "from mvg import MVG\n", "from mvg.exceptions import MVGAPIError" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We begin by instantiating a \"session\" object with the MVG library.\n", "A session object basically caches the endpoint and the token, to simplify the calls to the MVG library.\n", "\n", ".. note:: Each TOKEN is used for Authorization AND Authentication.\n", "Thus, each unique token represents a unique user, each user has it own, unique database on the VA-MVG' service.\n", "\n", "**You need to insert your token received from Viking Analytics here:**\n", "Just replace `\"os.environ['TEST_TOKEN']\"` by your token as a string." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:20:49.166821Z", "start_time": "2021-03-18T10:20:49.163443Z" }, "pycharm": { "name": "#%%\n" }, "tags": [ "parameters" ] }, "outputs": [], "source": [ "ENDPOINT = \"https://api.beta.multiviz.com\"\n", "# Replace by your own Token\n", "VALID_TOKEN = os.environ['TEST_TOKEN']" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:20:49.308364Z", "start_time": "2021-03-18T10:20:49.167982Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "session = MVG(ENDPOINT, VALID_TOKEN)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now check if the server is alive.\n", "The hello message contains the API version:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:20:49.437898Z", "start_time": "2021-03-18T10:20:49.309506Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ "{'name': 'MultiViz Engine API',\n", " 'version': 'v0.3.2',\n", " 'swagger': 'http://api.beta.multiviz.com/docs'}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "session.say_hello()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sources and Measurements\n", "\n", "Before we begin, we will ensure there are no previously existing sources and if there are, we will delete them." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:20:49.715201Z", "start_time": "2021-03-18T10:20:49.439018Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Deleting iris\n", "Deleting u0001\n", "Deleting u0002\n", "Deleting u0003\n", "Deleting u0004\n", "Deleting u0005\n", "Deleting u0006\n" ] } ], "source": [ "sources = session.list_sources()\n", "\n", "for src in sources:\n", " print(f\"Deleting {src['source_id']}\")\n", " session.delete_source(src['source_id'])" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "The example below revolves around a source with source_id \"u0001\".\n", "\n", "For convenience, this source and its measurements are available with the package distribution.\n", "\n", "You can retrieve the data from our public charlie repo https://github.com/vikinganalytics/va-data-charlie.git" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:20:49.825082Z", "start_time": "2021-03-18T10:20:49.717137Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "!git clone --depth=1 https://github.com/vikinganalytics/va-data-charlie.git" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:20:49.830068Z", "start_time": "2021-03-18T10:20:49.826632Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "# Path to the source folder\n", "REF_DB_PATH = Path.cwd() / \"va-data-charlie\" / \"charlieDb\" / \"acc\"\n", "# Definition of the source_id\n", "SOURCE_ID = \"u0001\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Creating a Source\n", "\n", "A source represents a vibration data source, typically a vibration sensor.\n", "Internally, in the analytics engine and data storage, all vibration data is stored under its source. \n", "In essence, a source is an identifier formed by\n", "\n", "* the source ID\n", "\n", "* metadata with required fields\n", "\n", "* optional arbitrary customer specific 'free form' data belonging to the source\n", "\n", "* channel definition as a list\n", " \n", "The vibration service will only rely on the required fields.\n", "The free form data is a possibility for the client side to keep together source information, measurements and metadata which may be interesting for the analytics built-in features in the service.\n", "Examples of the free form data include location of sensor or the name of the asset which is mounted on.\n", "As we will see later, timestamps are internally represented as milliseconds since EPOCH (Jan 1st 1970), for that reason it is good practice to include the timezone where the measurement originated in the metadata. In addition, we provide the channel definition that contains the waveform data. Each channel represents a waveform. Thus, if the sensor only have one channel, we need to provide only the name given to the raw waveform for that channel. If the sensor has two or more channels, like ina tri-axial sensor, one needs to provide the name of the channels corresponding to the different waveforms that will be available in the measurements." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:20:50.251327Z", "start_time": "2021-03-18T10:20:49.831109Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ "{'source_id': 'u0001',\n", " 'meta': {'assetId': 'assetJ',\n", " 'measPoint': 'mloc01',\n", " 'location': 'cancun',\n", " 'timezone': 'Europe/Stockholm'},\n", " 'properties': {'data_class': 'waveform', 'channels': ['acc']}}" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "meta_information = {'assetId': 'assetJ', 'measPoint': 'mloc01', 'location': 'cancun', 'timezone': 'Europe/Stockholm'}\n", "session.create_source(SOURCE_ID, meta=meta_information, channels=[\"acc\"])\n", "session.get_source(SOURCE_ID)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### List sources\n", "\n", "We can now check if our source actually has been created, by listing all the sources in the database.\n", "This function provides all the existing information about the source. Notice how in the source properties, one can see that the type of data to be uploaded for the source will be a waveform given that when one passes a channel definition to the source. The server interprets this as expecting for each measurement to be waveform data with the names of channels listed by the channel variable." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:20:50.666517Z", "start_time": "2021-03-18T10:20:50.538383Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ "[{'source_id': 'u0001',\n", " 'meta': {'assetId': 'assetJ',\n", " 'measPoint': 'mloc01',\n", " 'location': 'cancun',\n", " 'timezone': 'Europe/Stockholm'},\n", " 'properties': {'data_class': 'waveform', 'channels': ['acc']}}]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "session.list_sources()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Uploading Measurements\n", "\n", "Now that we have created a source, we can upload vibration measurements related to the source. \n", "The information needed to create a measurement consists of\n", "\n", "* sid: name of the source ID to associate the measurement with a source.\n", "\n", "* duration: float value that represent the duration, in seconds, of the measurement to estimate the sampling frequency.\n", "\n", "* timestamp: integer representing the milliseconds since EPOCH of when the measurement was taken.\n", "\n", "* data: list of floating point values representing the raw data of the vibration measurement.\n", "\n", "* meta: additional meta information for later use by the client but not to be processed by the analytics engine.\n", "\n", "In this example, all the measurement data is stored as csv and json files, where the timestamp is the name of each of these files. On the csv file, the header of the colum of data corresponds to the channel name." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:20:50.670011Z", "start_time": "2021-03-18T10:20:50.667593Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "# meas is a list of timestamps representing the measurements in our repo\n", "src_path = REF_DB_PATH / SOURCE_ID\n", "meas = [f.stem for f in Path(src_path).glob(\"*.csv\")]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:21:50.347959Z", "start_time": "2021-03-18T10:20:50.671104Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1570186860.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1570273260.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1570359660.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1570446060.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1570532460.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1570618860.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1570705260.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1570791660.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1570878060.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1570964460.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1571050860.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1571137260.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1571223660.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1571310060.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1571396460.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1571482860.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1571569260.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1571655660.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1571742060.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1571828460.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1571914860.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1572001260.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1572087660.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1572177660.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1572264060.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1572350460.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1572436860.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1572523260.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1572609660.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1572696060.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1572782460.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1572868860.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1572955260.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1573041660.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1573128060.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1573214460.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1573300860.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1573387260.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1573473660.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1573560060.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1573646460.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1573732860.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1573819260.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1573905660.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1573992060.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1574078460.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1574164860.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1574251260.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1574337660.csv\n", "Read 40000 samples\n", "Read meta:{'duration': 2.8672073400507907, 'meta': {}}\n", "Uploading 1574424060.csv\n" ] } ], "source": [ "# We iterate over all of elements in this list\n", "for m in meas:\n", "\n", " # raw data per measurement\n", " TS_MEAS_FILE = str(m) + \".csv\" # filename\n", " TS_MEAS = REF_DB_PATH / SOURCE_ID / TS_MEAS_FILE # path to file\n", " ts_df = pd.read_csv(TS_MEAS) # read csv into df\n", " accs = ts_df.iloc[:, 0].tolist() # convert to list\n", " print(f\"Read {len(ts_df)} samples\")\n", "\n", " # meta information file per measurement\n", " TS_META_FILE = str(m) + \".json\" # filename\n", " TS_META = REF_DB_PATH / SOURCE_ID / TS_META_FILE # path\n", " with open(TS_META, \"r\") as json_file: # read json\n", " meas_info = json.load(json_file) # into dict\n", " print(f\"Read meta:{meas_info}\")\n", "\n", " # get duration and other meta info\n", " duration = meas_info['duration']\n", " meta_info = meas_info['meta']\n", "\n", " # Upload measurements\n", " print(f\"Uploading {TS_MEAS_FILE}\")\n", " try:\n", " session.create_measurement(sid=SOURCE_ID, \n", " duration=duration, \n", " timestamp=int(m), \n", " data={\"acc\": accs}, \n", " meta=meta_info)\n", " except MVGAPIError as exc:\n", " print(str(exc))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check if we actually created the measurements by reading them." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:22:16.187529Z", "start_time": "2021-03-18T10:21:50.349197Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Read 50 stored measurements\n" ] } ], "source": [ "measurements = session.list_measurements(SOURCE_ID)\n", "print(f\"Read {len(measurements)} stored measurements\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analysis\n", "\n", "We begin by listing all the features available in the service." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:22:16.319506Z", "start_time": "2021-03-18T10:22:16.188820Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ "{'RMS': '1.0.0',\n", " 'ModeId': '0.1.1',\n", " 'BlackSheep': '1.0.0',\n", " 'KPIDemo': '1.0.0',\n", " 'ApplyModel': '0.1.0',\n", " 'LabelPropagation': '0.1.0'}" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "available_features = session.supported_features()\n", "available_features" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, we will show how to request the KPIDemo and ModeId features to be applied to the previously defined SOURCE_ID.\n", "The BlackSheep feature is aimed to population analytics.\n", "You can read about how to use it in the [\"Analysis and Results Visualization\"](6-analysis_visual.ipynb) example.\n", "\n", "We will begin with the **KPIDemo** feature, which provides KPIs, such as RMS, for each vibration measurement.\n", "We proceed to request the analysis to the MVG service." ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:22:16.439918Z", "start_time": "2021-03-18T10:22:16.320611Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ "{'request_id': '9fa506fd651f10b05401840edf9f33cb', 'request_status': 'queued'}" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "KPI_u0001 = session.request_analysis(SOURCE_ID, 'KPIDemo')\n", "KPI_u0001" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "The requested analysis will return a dictionary object with two elements.\n", "The first element is a `\"request_id\"` that can be used to retrieve the results after.\n", "The second element is `\"request_status\"` that provides the status right after placing the analysis request. \n", "\n", "Before we are able to get the analysis results, we need to wait until those results are successfully completed.\n", "\n", "We can query for the status of our requested analysis.\n", "The possible status are:\n", "\n", "* Queued: The analysis has not started in the remote server and it is in the queue to begin.\n", "\n", "* Ongoing: The analysis is been processed at this time.\n", "\n", "* Failed: The analysis is complete and failed to produce a result.\n", "\n", "* Successful: The analysis is complete and it produced a successful result." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:22:16.571418Z", "start_time": "2021-03-18T10:22:16.440996Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "KPI Analysis: successful\n" ] } ], "source": [ "REQUEST_ID_KPI_u0001 = KPI_u0001['request_id']\n", "status = session.get_analysis_status(REQUEST_ID_KPI_u0001)\n", "print(f\"KPI Analysis: {status}\")" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "The next feature is **ModeId**.\n", "The 'ModeId' feature displays all the operating modes over time of an individual asset. \n", "The similar procedure is repeated to request the analysis of the \"ModeId\" feature for our source \"u0001\"." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:22:16.716298Z", "start_time": "2021-03-18T10:22:16.572585Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ "{'request_id': 'c2d48d6d59c317c39469d3eaade7de96', 'request_status': 'queued'}" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ModeId_u0001 = session.request_analysis(SOURCE_ID, 'ModeId')\n", "ModeId_u0001" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also check the status for our second feature." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:22:16.881788Z", "start_time": "2021-03-18T10:22:16.717429Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ModeId Analysis: successful\n" ] } ], "source": [ "REQUEST_ID_ModeId_u0001 = ModeId_u0001['request_id']\n", "status = session.get_analysis_status(REQUEST_ID_ModeId_u0001)\n", "print(f\"ModeId Analysis: {status}\")" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "We can proceed to get the results by calling the corresponding requestIds for the feature of each source.\n", "\n", "The output of the `\"get_analysis_results\"` function is a dictionary and we show the keys of one those dictionaries.\n", "The keys are the same for all features and contains seven elements.\n", "These elements are:\n", "\n", "* `\"status\"` indicates if the analysis was successful.\n", "\n", "* `\"request_id\"` is the identifier of the requested analysis.\n", "\n", "* `\"feature\"` is the name of the requested feature.\n", "\n", "* `\"results\"` includes the numeric results.\n", "\n", "* `\"inputs\"` includes the input information for the request analysis.\n", "\n", "* `\"error_info\"` includes the error information in case the analysis fails and it is empty if the analysis is successful.\n", "\n", "* `\"debug_info\"` includes debuging (log) information related to the failed analysis." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:22:17.505749Z", "start_time": "2021-03-18T10:22:16.882964Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ "dict_keys(['status', 'request_id', 'feature', 'results', 'inputs', 'error_info', 'debug_info'])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "session.wait_for_analyses([REQUEST_ID_ModeId_u0001, REQUEST_ID_KPI_u0001])\n", "kpi_results = session.get_analysis_results(request_id=REQUEST_ID_KPI_u0001)\n", "mode_results = session.get_analysis_results(request_id=REQUEST_ID_ModeId_u0001)\n", "\n", "kpi_results.keys()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualization\n", "\n", "The MVG Library incorporates a module that facilitates the handling of the results and its visualization.\n", "Using this module, it becomes easier to convert the results into a Pandas dataframe for ease of manipulation.\n", "In addition, it enables to quickly evaluate the results by getting a summary of them or visualize them.\n", "\n", "The name of this module is `\"analysis_classes\"` and we begin by calling it." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "from mvg import analysis_classes" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "The first step requires parsing the results available from the analysis.\n", "We begin by showing how to do this with the KPIDemo feature." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "kpi_results_parsed = analysis_classes.parse_results(kpi_results)" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "From here, we can call these results into a Pandas dataframe." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "pycharm": { "name": "#%%\n" } }, "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", "
timestampsrms_accpeak_accpeak2peak_accvariance_acccrest_factor_accutilization_accdc_component_accdatetime
015701868600.6470862.6865635.3132930.4187204.1517861-0.1402372019-10-04 11:01:00+00:00
115702732600.6471232.6917505.3670040.4187694.1595631-0.1404202019-10-05 11:01:00+00:00
215703596600.6466192.7152515.4148560.4181164.1991521-0.1402392019-10-06 11:01:00+00:00
315704460600.6468732.6851475.3515620.4184454.1509661-0.1403472019-10-07 11:01:00+00:00
415705324600.6466432.7266055.3953250.4181474.2165561-0.1404232019-10-08 11:01:00+00:00
\n", "
" ], "text/plain": [ " timestamps rms_acc peak_acc peak2peak_acc variance_acc \\\n", "0 1570186860 0.647086 2.686563 5.313293 0.418720 \n", "1 1570273260 0.647123 2.691750 5.367004 0.418769 \n", "2 1570359660 0.646619 2.715251 5.414856 0.418116 \n", "3 1570446060 0.646873 2.685147 5.351562 0.418445 \n", "4 1570532460 0.646643 2.726605 5.395325 0.418147 \n", "\n", " crest_factor_acc utilization_acc dc_component_acc \\\n", "0 4.151786 1 -0.140237 \n", "1 4.159563 1 -0.140420 \n", "2 4.199152 1 -0.140239 \n", "3 4.150966 1 -0.140347 \n", "4 4.216556 1 -0.140423 \n", "\n", " datetime \n", "0 2019-10-04 11:01:00+00:00 \n", "1 2019-10-05 11:01:00+00:00 \n", "2 2019-10-06 11:01:00+00:00 \n", "3 2019-10-07 11:01:00+00:00 \n", "4 2019-10-08 11:01:00+00:00 " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_kpi = kpi_results_parsed.to_df()\n", "df_kpi.head()" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "From the results, we can see that the KPIDemo feature provides some KPIs, e.g. rms and peak-to-peak.\n", "All this is available for each measurement.\n", "\n", "We can request to display a summary of the results." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== KPIDemo ===\n", "request_id 9fa506fd651f10b05401840edf9f33cb\n", "from 20191004-11:01.00 to 20191122-12:01.00\n", "\n", "+-------+--------------+------------+------------+-----------------+----------------+--------------------+-------------------+--------------------+\n", "| | timestamps | rms_acc | peak_acc | peak2peak_acc | variance_acc | crest_factor_acc | utilization_acc | dc_component_acc |\n", "|-------+--------------+------------+------------+-----------------+----------------+--------------------+-------------------+--------------------|\n", "| count | 50 | 50 | 50 | 50 | 50 | 50 | 50 | 50 |\n", "| mean | 1.57231e+09 | 0.611691 | 2.81764 | 5.40059 | 0.377299 | 4.62976 | 1 | -0.120874 |\n", "| std | 1.26105e+06 | 0.0565414 | 0.278079 | 0.378225 | 0.0636172 | 0.333367 | 0 | 0.0141936 |\n", "| min | 1.57019e+09 | 0.484564 | 2.26056 | 4.55438 | 0.234802 | 4.12339 | 1 | -0.140524 |\n", "| 25% | 1.57125e+09 | 0.627912 | 2.68338 | 5.31364 | 0.394273 | 4.20402 | 1 | -0.140196 |\n", "| 50% | 1.57231e+09 | 0.628307 | 2.84999 | 5.52634 | 0.39477 | 4.80641 | 1 | -0.112316 |\n", "| 75% | 1.57337e+09 | 0.64684 | 3.06661 | 5.69377 | 0.418402 | 4.89065 | 1 | -0.10966 |\n", "| max | 1.57442e+09 | 0.647694 | 3.13609 | 5.79639 | 0.419507 | 4.99256 | 1 | -0.109065 |\n", "+-------+--------------+------------+------------+-----------------+----------------+--------------------+-------------------+--------------------+\n" ] }, { "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", "
timestampsrms_accpeak_accpeak2peak_accvariance_acccrest_factor_accutilization_accdc_component_acc
count5.000000e+0150.00000050.00000050.00000050.00000050.00000050.050.000000
mean1.572306e+090.6116912.8176415.4005910.3772994.6297631.0-0.120874
std1.261051e+060.0565410.2780790.3782250.0636170.3333670.00.014194
min1.570187e+090.4845642.2605604.5543820.2348024.1233871.0-0.140524
25%1.571245e+090.6279122.6833755.3136440.3942734.2040211.0-0.140196
50%1.572307e+090.6283072.8499905.5263370.3947704.8064081.0-0.112316
75%1.573366e+090.6468403.0666125.6937710.4184024.8906531.0-0.109660
max1.574424e+090.6476943.1360875.7963870.4195074.9925591.0-0.109065
\n", "
" ], "text/plain": [ " timestamps rms_acc peak_acc peak2peak_acc variance_acc \\\n", "count 5.000000e+01 50.000000 50.000000 50.000000 50.000000 \n", "mean 1.572306e+09 0.611691 2.817641 5.400591 0.377299 \n", "std 1.261051e+06 0.056541 0.278079 0.378225 0.063617 \n", "min 1.570187e+09 0.484564 2.260560 4.554382 0.234802 \n", "25% 1.571245e+09 0.627912 2.683375 5.313644 0.394273 \n", "50% 1.572307e+09 0.628307 2.849990 5.526337 0.394770 \n", "75% 1.573366e+09 0.646840 3.066612 5.693771 0.418402 \n", "max 1.574424e+09 0.647694 3.136087 5.796387 0.419507 \n", "\n", " crest_factor_acc utilization_acc dc_component_acc \n", "count 50.000000 50.0 50.000000 \n", "mean 4.629763 1.0 -0.120874 \n", "std 0.333367 0.0 0.014194 \n", "min 4.123387 1.0 -0.140524 \n", "25% 4.204021 1.0 -0.140196 \n", "50% 4.806408 1.0 -0.112316 \n", "75% 4.890653 1.0 -0.109660 \n", "max 4.992559 1.0 -0.109065 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kpi_results_parsed.summary()" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "Finally, we can generate a plot that displays these results.\n", "When plotting the results for the KPIDemo feature, one selects the KPI to be displayed by passing the parameter `\"kpi\"`.\n", "If this parameter is not included, the plot function will display the results of the first column in the summary dataframe after the timestamps, which is the RMS value." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcMAAAEcCAYAAAC77t8kAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABC2ElEQVR4nO2deZgcVbn/P99eZjrLJIEkIFkgUYILJKAERBFBNnED3BBENCricrl4fyhXEEVErtt1v+KCXARUREXBoCigcEVBMIkimCAQFiVBIGSfzNbT/f7+OKcnlc5MMoGZqa6e9/M89XQtp6q+p/pUvXXe8546MjMcx3EcZzSTS1uA4ziO46SNG0PHcRxn1OPG0HEcxxn1uDF0HMdxRj1uDB3HcZxRjxtDx3EcZ9TjxtDpQ9Ijko4comONkXSdpPWSfjIUxxwNSHqupLskbZR0Roo6JOm7ktZK+tMAaUzSniOgZciuiaTzJX1/qLSNNpLPiMGUkbp9R+SZIOkySRfu6H6j0hhKmiHpp5Kein/M3yQtSFtXVpB0mKQV20n2JmBXYLKZvXkEZKWOpFnRQBS2kaZV0pclPRYfIt+QVEwk+U/gFjNrM7OvDeKcJmmTpPY4XZLYJkmfk7Q6Tp+TpMT2vKQLo5aNkv4iaVLc/DLgKGCGmR04yPy/SNKtUccTkj6Y2PaIpM6EzhsT2/aRdEO8H/vr+LzFNZH0Ckm3xHv3kX50zIrbOyT9fUde8CTtLOmaeE3/IemtiW2HSaom8tAu6R39HGOOpK56oyvprfGYmyRdK2nnxLbTJS2W1C3psn6OeYKke+P/tEzS8QPo/219GXwm12M7bFVGJJ0qaXm8Nr+WNC2RfotnQvwf75G0LpbPayRNT+j+vKRHJW2I1+2jQ6S7X3bIGG7rJs8Y3wMeBfYAJgOnAE+kquhp0OD/xx7A/WbWu6M7DiZfDZ73bXE2MB/YB9gLeBHwscT2PYClO3jMfc1sfJxOTaw/DTge2BeYB7wOeG9i+yeBlwIvASYQ7oOuhI5HzGzTYARImgL8Gvg24Z7aE7ixLtnrEjqPTqwvAz8G3j3A4euvySbgUuCsAdL/EPhL1HEucLWkqYPJB3AR0EN4aJ8MfFPS3ontjyXyMN7MLh/gGIuSK+Ixvk24xrsCHcA3kscFLoz5om7f6cD3gTMJ/9NZwJWSdqlLdzJQrN+fZ3Y9tsUWZUTSYcCngeOAnYGH47mT6ZPPhGXAK81sEjANeAD4ZiL9/wLPM7MJhHJ6sqQ3DIHu/jGzbU7AI8BHgLuBbkIhN+CdBIOyFngfcEBMsw74emL/PYHfAeuBp4AfDeKcX43H3gAsAQ5JbMsDHwUeBDbG7TPjtr2Bm4A1BOP20QGO3w7sN8C2w4AV/VyDI+P8+cBPCIVzI3AP4aF2DvBk1H10Yt//IxTy2+N5ryMUyh/E/C0CZg0y7+cDV8dzbyA8RDsIb1q1NC8CVgHFfvJW2/9HUfufCQ/S/vLZCnyFcJM+FudbgXFAJ1CN+WkHptWd55OEB0o5bn834cXrY8A/4nW6ApgY088ilKl3A/8Ebh3ofyGUxccJLzQ5gnF5EFhNeKDunNjnlHi+1YSHQDJ/lwEXDvS/E27On8Zr+TBwRmLbgcDi+B88AXwprv9nzEfturykn3wsBt6cWH4r8GicvxmoEAxSO6FcvYbwINsQy8X5dcczYM8ByvLtwGmJ5XcDd8T5neI5ntPPfu+OGioxzSfj+rOAf8Xy8K7kuQkPwe9t5zly5Hbu+z0Bq1u31TVJbDuS8DBOpt+L8JxqS6z7PfC+7d0DhLLdU3eO7wGfHejZ0E8eTozl8Hzg+4n1nwauTCw/J56rrW7/C4HL6ta9GHiybt2qZPkCJgL3AwfF/6UwyOvxtO6h/soI8AXgorp7yGJet3om1OWnFfgMsGyA6zqd8Kz9z8S6lxHK+DrCvbEgcW9/i2ALNhLszx7b+t/MbNDG8C5gJjCGzQ+ubwEl4Oh4Ua4FdominwQOjfv/MF7EXEz/skGc820Eg1EAPkR4+JUSN+Q9wHMBEd56JwNthBv1Q/E8bcCLBzj+b4DbCAV397pth7F9Y9gFvDLqu4LwsDyX8Fb2HuDhxL7/ByyPBWIi4W3o/ligavt/d5B5Pz8WpuPj9RwDXA+8P7H/l4H/GSDftf3fFLV+OGov9pPPC4A74n86lVDoPrUDD4Xz2fJh8K54HZ4NjAd+Rnx4srlMXUF4II3p53iHAb3A5wg3zhjgg1HjjLju28APY/oXEG66l8dtX4r7b9cYxmu7BDgPaImaHyK8xQL8ETglzo8HDqrLR2Eb12UxcEJi+eS4z8REeTm1TtfcqGkewfgen9huBOP0eLymsxLb1pO4Bwg10o1x/uWEh0jt5eJ+4N8SaRcAf0gsHxPPvU/8j65kS2N4M+FF7nbC/X8diXuLULaeIDzEbyTxEpZIs5Ux7O+aJNb3ZwxfD9xbt+7rxHuCbdwDwAuBjrp9Pwxcl/gvemI+Hibca+MSaSfE6ziDrcv/z4GP1B27Hdi/bl1/xjBPeKAfG+ePJ7wYJs99EfD/qCuDg7gez+Qeqi8jXwC+kVieHrUc198zIa7bnVAOq/F/WVC3/eyowQj34Iy4fg+CoTsp/neTiRUcwr29MaH7q0mdA96b200QCvG7Esu1iz09sW418JbE8k+B/4jzVwAX1zLxdCZC7XPfOH9f7eLWpTkJ+Msgj7cT8FmC66VCMPYHJAr89ozhTYltr4t/Vj4ut8XrMylxI5+bSP9F4Fd1+981yLyfT12tCXgLcFvipnkcOHCAY51PrBnE5RzhBeKQfvL5IPDqRNpXEh88/V2jAc6VfBj8FvhAYvm5hMJfSJSpZ2/jeIcRHkSlxLp7gSMSy7sljnkecFViW+2tfzDG8MXAP+vOfw7xpQW4lfCmO6UuTS0f2zKGFxJexKYCzwLujPvsligvWz34E/t/BfhyYvnlBIM9ifCQ+xubH4QVgpuplnZOPJcINVIjuKLGEAztKuComHYBWz7oLiXWkOLyXmxpDO8nPNQOILyMfo1YLuP2g+N5xsZr+TjxHkmkGQpjeAqJMh7X/RfRwLCNeyBOj9ft+x7g/+L8swgGIgfMjuXg24m0XyUaPPov/++rO/ZK4LB+ysdl/eT13YTnTC/BG/SaxLb5hGdY8l4qDPJ6PJN7qL6MHEnw/s2L//W3CUbupP6uSZ2mnQkvZgf1s02EF5VPEmu4sQxdM8CxLqvTPZ5wL8wc6L4ys0G3GT7az7pkG1tnP8vj4/x/xsz8SdJSSe/a3skkfTg2Fq+XtI5Qo5oSN88kPKjrGWj9VpjZWjM728z2Jvjv7wKuTQYXbIf6vD5lZpXEMmzOf3/pB7pW28s7bP1f/Bx4gaTZhMbs9Wa2rciuvv3NrEp4w5zWT7ppBPdIjX8MkG6w9He8AuH6b6VtAFaZWVdieQ/gmtgAv45wY1fiMaexZV43EV7aBsMewLTaceOxP5rQ+m6CMfi7pEWSXjvI40J4EP2FUOZuJ3hUygzQZi3pxTH4YZWk9YQmib7yYGa3mlmPma0jvOXPBp4fN7cTais1JgDtFp4QtXJ6gZl1mtndwFXAqwfQvcX1ZMv/kni8a8xsUfyPPgm8VNLEqPO2eJ4OM/sMwXAeMsC5ngn1eSYub0wsD3QPbHNfM3vczJaZWdXMHiY8294IIGk/gjH48jPQ1S8x4OXzhBe2FuBQ4BJJ+0nKEdoeP2j9t89v77xDdg+Z2W+ATxAqQ4/EaSPh+m4TM1sDXA78vD4ewAJ/IZSxT8bV23veJ3W3E5rOtvn8GqwxtEGm23rHUIDeY2bTCI3339A2wrElHUIoZCcAO1loXF1PMKgQMvmcfnZ9lODO2lF9TxGq99MIbyebCG+vNT15wlv8sDOIvEPdfxEfPD8muFdPIbRxbIuZifPlCO6Rx/pJ9xjhRqmxeyLd0ykP/R2vly2NwPaOW7/9UeBVZjYpMZXMbCXhbT+Z17EEV0qNLf5nwlt/8rgP1x23zcxeDWBmD5jZSQQX8ucIAQnjBqGfaBBON7PpZvZswsNlSXwo98eVwELCW+1EQvPEtl7aLLF9KaEZoca+bA5EuTuRnn7m69niehL+vyR378Cx6nUOJUuBZ0tqS6xL5hsGvgfuBwqS5mxj3yTG5mfoYYRa2T8lPU5wr75R0p8Tuvr+C0nPJrjw7h9EnvYjeIQWR0O8iOBROJJg2OYDP4rnrQXurIjPk+1dj2dyD219QcwuMrM5ZrYrwSgWCN6KwVAg3FP1xju5vfbsH8gO1EjqHk94tvf3nOtj2LtWSHqzpBlxcS2hAA1040NwM/YSXDYFSeex5cW5BPhUDF+WpHmSJgO/AHaT9B8K4ettkl48gKbPKYRzF2IheT+w3MxWEwpnSdJrFELeP0YotCPB9vI+EFcQXBbHsn1juL+kN8S3r/8gNK7f0U+6HwIfkzQ1RgqeRwjcgWDAJtfe+gfJD4H/J2l2LJyfJgRT7XC0aYJvAf8laQ+AqPW4uO1q4LWSXiaphdAGmizvdwGvVgilfxbhWtT4E7BR0kcU+kblY3k5IJ7nbZKmRgO2Lu5TJfxvVbbxUiZpuqRpseweBHyc8DY9EG3AGjPrknQgwb1ZO9besXaQj9f0iwTX270xyRXAmbVzEtqgLwMwswcJgRTnxvvl+YQ29F8MoOPHwAJJL4gPxXrN3wVeH/UUY77+YGbrJe0u6WBJLZJKks4i1G5vi/mQpBKh1kNMM+A9JykX0xfj7qX4H2Nm9xP+20/E9a8nuO1+mjhEv/dArPn8DLhA0jhJBxMiI78Xz/sKSXtEvTMJTS0/j8e8mPBw3i9O3wJ+SWhegBAw9zpJh8QXpwuAn5nZxnjsQsxTHshH7bUa0iLgEIXaJ5JeSKhV3014WZ6WOG+tZr8/cOcgrsczuYfq/5dSvE8kafd4Tb5qZmsHSP8GhT6kOYXo1i8RmrrWxHXvlbRTPN6BwL8R3M2163mkQpeTgqTJtesTeXVC96cI/+82PU8j0c/wAOBOSe2EN9wPmtlD20h/AyFE+36CK6aLLd0zXyLcmDcSIuz+lxBwsZHgJnwdoT3iAeAVA5xjLHAN4UH2EKHGciyAma0HPkAwuisJNYjtVvOHiO3lvV/M7DbCQ/jPZlbvvqrn54R2xrWEmuQbzKzcT7oLCcEedxMClv4c12FmfycYt4cU3CuDcZ9eSnio3EoIPugC/n0Q+22LrxLK1I2SNhKM+oujxqWEm+dKwhvuWrb8H78H/JXgyrmREF1I3LcCvJbwcHmY0A5yCcFlDSGYZGks018FTqy5AAlu0NvidTmoH83PIbhHNxHcQmebWX0XhCQfIDycNxJeSH6c2LZr1L2BUI5nAa9N/J/fJgSy3EN4O/9lXFfjJELZXx23fdzMfks/mNmvCO2VNxMCoW6u234zwZX8S0IAzZ5sNtxthJD5tYR76hhCbaTmctuD4AKr1VY6CbEBA/HymOZ6Qg21ky27cZxIqC2tJRisN5nZqsT2bd0DHyC0dz1JKOPvj2UJQrtV7b+7nXBdz4j574hesMfN7HGCe7Krdt54jPcRHuJPxmvygYSmj8V8nE3w8nTGdZjZ74hRsLEc/BT4tJndGF2IyfPW8vmEmfUM4no8k3uonlJM2054ofwj4aVoIKYTnne1qPwqIeCnxuvZ3Gvg+8D/xAkz+yfB8H+I4AK9iy29IFcSXtjWEF4M3rYNHQAoNB84WUfSzYTQ7Uu2keZ8QsDDdgtGM6LQQfvU2LbhOI7TR1Y7LjsJovvuRQSXjuM4jrODpPI5tug3b+9vSkNPlpF0OaHf5H/U2h8cx3GcHcPdpI7jOM6oZ1R+qNtxHMdxkoyaNsMpU6bYrFmz0pbhOI6TKZYsWfKUmY1IX+s0GTXGcNasWSxevDhtGY7jOJlC0va6azUF7iZ1HMdxRj1uDB3HcZxRjxtDx3EcZ9QzatoMHccZXZTLZVasWEFXV9f2EzuUSiVmzJhBsVhMW0oquDF0HKcpWbFiBW1tbcyaNQsNenS20YmZsXr1alasWMHs2bPTlpMK7iZ1HKcp6erqYvLkyW4IB4EkJk+ePKpr0V4zzDCVqtHe3cvGrjIbu3rZ2NVLe3eZlnyeqW2tTG1rZdKYIrnc5oeBmbFmUw+PrN7EI0918I/Vm1jT0cMubSWeNbHEsyaU2G1iiV0nlmhrLfQ9SCpVo1ypUq5UqVSNsS0FWgrbf5fq6OnliQ3drOvooTceo7dSO5bRW63SVa7S3Vuhu1ylK/72VqtMHFNkyvjWzVNbCzuPbaGQ93c4Z3C4IRw8o/1auTHcDrfc9ySn/+DPVA0MC78WfgEmjikyeVxLfFi3MmV8mJegs6fCpu4KneVeNnVX6OipYGaUWvKMKeYZG39LxTwthRzVqlExo1o1euN8b8XY0FlmfWLa0FlmQ1cv7d3bHwqwkBNTxgfDaBj/eKqDjYn9coIJY4qs69h6FKdSMYcZlCvVvvwmaSsVmDyuhZ0TU7liPLGhiyc2dPHkhu4tzrUj5HOi0s9J8znxpRP25bj9pj+t4zqO4/SHG8PtMGPSGE46cHckyElIIieovUSt6yizur2Hp9q7uWfFOla39/QZgJxgbEuBsS35OBWQoKtcobOnQmc5TF3lLcc6liAvkc+JQk5MGFNk4pgiE0pFZuw0lonTwnJbqUBbqcCEUm2+yPhSge5yhVXt3azamJjauzGD/XffiT0mj2PWlLHMmjyOGTuNpaWQo7u3wpMbunl8Qxf/Wt/F4+s7eaq9BwmKuRzFfI5iQbTkc+RzYmNXL2s29fRNK9d1cc/K9RRyOZ41scRzn9XGy/eayq4TSuw6oZVJY1oo5nMU8qKYF4VcbT5HqZCntbj5tyWfQ4L27l6eitf2qY3dPNXezfnXLePef23kuP1GuCA4jtPUuDHcDnN2beNjr33BDu3TVa4A0FrIDcr1UK0aPZUq+ZzIS1u4NUeK1kKemTuPZebOY0f83APRVirSVioye8q4vnWf//V9fdfXcbKEmWFm5HLu5m9E/F8ZBkrR9TlYH3wuJ0rFPMV8LhVDmCVai3m6e90YOtngkUce4bnPfS5vf/vbGT9+PM95znNYsGABe+21FyeffDK/+c1vOPjgg5kzZw5/+tOfAPjd737Hfvvtx3777ccLX/hCNm7sf2S29vZ2jjjiCF70ohcxd+5cfv7zn/dtu+KKK5g3bx777rsvp5xyCgBPPPEEr3/969l3333Zd999uf3224f/AmQIrxk6maJUzG3lVnac7fHJ65ay7LENQ3rMF0ybwCdet/d20z3wwANcfvnlXHDBBey555586EMf4tJLL+WAAw7gyiuv5A9/+AMLFy7k05/+NNdeey1f+MIXuOiiizj44INpb2+nVCr1e9xSqcQ111zDhAkTeOqppzjooIM49thjWbZsGRdeeCG33347U6ZMYc2aNQCcccYZHHrooVxzzTVUKhXa23342CSp1gwlHSPpPknLJZ09QJoTJC2TtFTSlXXbJkhaIenrI6PYSZtSMe9uUidT7LHHHhx00EEAzJ49m7lz55LL5dh777054ogjkMTcuXN55JFHADj44IM588wz+drXvsa6desoFPqvs5gZH/3oR5k3bx5HHnkkK1eu5IknnuDmm2/mzW9+M1OmTAFg5513BuDmm2/m/e9/PwD5fJ6JEycOc86zRWo1Q0l54CLgKGAFsEjSQjNblkgzBzgHONjM1krape4wnwJuHSnNTvqEmqEbQ2fHGEwNbrgYN25zm3dra2vffC6X61vO5XL09obAu7PPPpvXvOY1XH/99Rx88MHccMMNPO95z9vquD/4wQ9YtWoVS5YsoVgsMmvWrFHdT/CZkmbN8EBguZk9ZGY9wFXAcXVp3gNcZGZrAczsydoGSfsDuwI3jpBepwEoFfLuJnWamgcffJC5c+fykY98hAMOOIC///3v/aZbv349u+yyC8VikVtuuYV//COMtHT44Yfzk5/8hNWrVwP0uUmPOOIIvvnNbwJQqVRYv379COQmO6RpDKcDjyaWV8R1SfYC9pJ0m6Q7JB0DICkHfBH48IgodRqGUjFPlwfQOE3MV77yFfbZZx/mzZtHsVjkVa96Vb/pTj75ZBYvXszcuXO54oor+mqPe++9N+eeey6HHnoo++67L2eeeSYAX/3qV7nllluYO3cu+++/P8uWLev3uKMVmfXTm3okTiy9CTjGzE6Ny6cALzaz0xNpfgGUgROAGQSX6FzgbcBYM/u8pAXA/OR+if1PA04D2H333fevvTk52eXUyxexcl0Xv/rgIWlLcRqce++9l+c///lpy8gU/V0zSUvMbH5KkkaMNKNJVwIzE8sz4rokK4A7zawMPCzpfmAO8BLgEEkfAMYDLZLazWyLIBwz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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "''" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kpi_results_parsed.plot()" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "All these functions are available for the ModeId feature as well.\n", "We proceed to repeat the same procedure for this other feature.\n", "\n", "We begin by parsing the results.\n", "In this particular case, we need to define the unit of time to perform the epoch conversion to datetime.\n", "The default unit is milliseconds, but we use seconds here as the timestamps for this source is based on seconds.\n", "The timezone can also be defined, to increase the precision of these results." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "mode_results_parsed = analysis_classes.parse_results(mode_results, t_unit=\"s\")" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "First, we generate the pandas dataframe of ModeId results." ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "pycharm": { "name": "#%%\n" } }, "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", "
timestampslabelsuncertainmode_probabilitydatetime
015701868600False0.9127432019-10-04 11:01:00+00:00
115702732600False0.9728412019-10-05 11:01:00+00:00
215703596600False0.9297412019-10-06 11:01:00+00:00
315704460600False0.9996202019-10-07 11:01:00+00:00
415705324600False0.9789402019-10-08 11:01:00+00:00
\n", "
" ], "text/plain": [ " timestamps labels uncertain mode_probability datetime\n", "0 1570186860 0 False 0.912743 2019-10-04 11:01:00+00:00\n", "1 1570273260 0 False 0.972841 2019-10-05 11:01:00+00:00\n", "2 1570359660 0 False 0.929741 2019-10-06 11:01:00+00:00\n", "3 1570446060 0 False 0.999620 2019-10-07 11:01:00+00:00\n", "4 1570532460 0 False 0.978940 2019-10-08 11:01:00+00:00" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_mode = mode_results_parsed.to_df()\n", "df_mode.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the results, we can see that the ModeId feature provides a mode label for each timestamp, together with a boolean\n", "describing the certainty around this mode label and its probability.\n", "\n", "\n", "We can also request to display a summary of the results." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== ModeId ===\n", "request_id c2d48d6d59c317c39469d3eaade7de96\n", "from 20191004-11:01.00 to 20191122-12:01.00\n", "\n", "Labels\n", "+----------+----------+-----------+--------------------+------------+\n", "| labels | counts | portion | mode_probability | datetime |\n", "|----------+----------+-----------+--------------------+------------|\n", "| 0 | 17 | 34 | 17 | 17 |\n", "| 1 | 8 | 16 | 8 | 8 |\n", "| 2 | 25 | 50 | 25 | 25 |\n", "+----------+----------+-----------+--------------------+------------+\n", "\n", "Labels & uncertain labels\n", "+------------+-----------+--------------------+------------+----------+\n", "| | portion | mode_probability | datetime | counts |\n", "|------------+-----------+--------------------+------------+----------|\n", "| (0, False) | 34 | 17 | 17 | 17 |\n", "| (1, False) | 16 | 8 | 8 | 8 |\n", "| (2, False) | 50 | 25 | 25 | 25 |\n", "+------------+-----------+--------------------+------------+----------+\n", "\n", "Emerging Modes\n", "+----+---------+-----------------+-----------------+-------------------+---------------------------+\n", "| | modes | emerging_time | max_prob_time | max_probability | datetime |\n", "|----+---------+-----------------+-----------------+-------------------+---------------------------|\n", "| 0 | 0 | 1570186860 | 1570446060 | 0.99962 | 2019-10-04 11:01:00+00:00 |\n", "| 1 | 1 | 1571655660 | 1571742060 | 0.997126 | 2019-10-21 11:01:00+00:00 |\n", "| 2 | 2 | 1572350460 | 1573041660 | 0.999948 | 2019-10-29 12:01:00+00:00 |\n", "+----+---------+-----------------+-----------------+-------------------+---------------------------+\n" ] }, { "data": { "text/plain": [ "[ counts portion mode_probability datetime\n", " labels \n", " 0 17 34.0 17.0 17\n", " 1 8 16.0 8.0 8\n", " 2 25 50.0 25.0 25,\n", " portion mode_probability datetime counts\n", " labels uncertain \n", " 0 False 34.0 17.0 17 17\n", " 1 False 16.0 8.0 8 8\n", " 2 False 50.0 25.0 25 25,\n", " modes emerging_time max_prob_time max_probability \\\n", " 0 0 1570186860 1570446060 0.999620 \n", " 1 1 1571655660 1571742060 0.997126 \n", " 2 2 1572350460 1573041660 0.999948 \n", " \n", " datetime \n", " 0 2019-10-04 11:01:00+00:00 \n", " 1 2019-10-21 11:01:00+00:00 \n", " 2 2019-10-29 12:01:00+00:00 ]" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mode_results_parsed.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The summary of the results describes the number of timestamps for each mode and how many of these timestamps are uncertain.\n", "Uncertain areas appear as a gray rectangle above the corresponding periods in the modes plot.\n", "\n", "In addition, it provides information on the emerging modes.\n", "Emerging modes describes the time (timestamp) each one of the modes first appeared.\n", "This information can be useful to identify if a new mode is affecting or appearing in the asset.\n", "\n", "Finally, we can generate a plot that displays display the different modes over time." ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "image/png": "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HlJVVTUik8kMe+GFFyoAtmzZ0m7ixIlnDR06dOS0adMGuh/tDL799tt7jBo1aviwYcNGXHLJJQNra4/tZK6rq+MPf/hD10996lO7AWbOnLnzV7/61alNjVuJsoiIiIjk1WWXXbZr/vz5lQcPHrQVK1Z0njBhwoFs2axZs/plMpmDq1evfvmGG27YOGPGjMEA11xzTb8JEybsX7NmzUsXXXRRzebNmzsALF68uNODDz7YY+HChStXrlz5cllZmd9xxx09k8vbunVredeuXd9s3749AIMGDTq8devWDk2NW4myiIiIiOTVuHHjXt+wYUPHu+66q0d1dfWeZNmLL77Y9fLLL98JMGXKlH01NTXlu3btKnv++ee7zpw5cyfA9OnT93Tr1u1NgMcee6zr8uXLO2cymeHDhg0b8eyzz3Zbu3Ztx3zErZP5RERERCTvJk+eXHPddded8cQTT6zatm1bs3NQd7eLL75452233bbxeO/p06dP7b59+9odOXKE9u3bs27dug59+vQ53NRlqUdZRERERPLuiiuu2HHVVVdtOuecc15Pvj5u3Lh9c+bM6QmwYMGCrpWVlbU9evSoGz9+/L65c+f2BLj//vu77d27tx3A5MmT9y5YsKBy48aN5RDGOK9evfqYYRVlZWWMHz9+35w5cyoBfvKTn/S88MILa5oasxJlERERkTaiZ08adWm1fMxvyJAhR2bPnr0t9/Wbb75505IlSzpXVVWNuPbaa/vPnTv3FYCbbrpp03PPPddl6NChIx966KHKvn37HgYYM2bModmzZ2+cNGlSVVVV1Yjzzz+/av369e1z5/ud73xnww9/+MPTBwwYcPbu3bvLv/jFL+5o6uez5BmETTV27FhfuHBhs6cXERERKUVmtsjdxxY7jqVLl67LZDJNThDbkqVLl/bKZDKD0srUoywiIiIikkKJsoiIiIhICiXKIiIiIiIplCiLiIiIiKQ4oUT5SN7v0i0iIiIiUhwndMORZcvArKVCESldzb+2jLSIe7WhEhGRptPQCxEREZG2ohcZjDEt9uhFpqFFmtmYj3zkI4Oz/x85coTKysrM+9///qFNCb1///6jNm/e3OhO3m9+85u9BwwYcLaZjWnKdElKlEVERETaip0nNpqgOfOrqKioW7VqVcX+/fsN4OGHH+7Wp0+fvA/gPffcc/c/+eSTq/v169fkW1dnKVEWERERkbyqrq7e88ADD5wKMG/evB5Tp07dlS3bunVru+rq6iFVVVUjMpnMsBdeeKECYMuWLe0mTpx41tChQ0dOmzZtYPImebfffnuPUaNGDR82bNiISy65ZGBt7VtvEDhx4sTX3/72tzc7SQYlyiIiIiKSZ5dddtmu+fPnVx48eNBWrFjRecKECQeyZbNmzeqXyWQOrl69+uUbbrhh44wZMwYDXHPNNf0mTJiwf82aNS9ddNFFNZs3b+4AsHjx4k4PPvhgj4ULF65cuXLly2VlZX7HHXf0zEfcSpRFREREJK/GjRv3+oYNGzreddddPaqrq/cky1588cWul19++U6AKVOm7KupqSnftWtX2fPPP9915syZOwGmT5++p1u3bm8CPPbYY12XL1/eOZPJDB82bNiIZ599ttvatWs75iPulh2nIiIiIiKSYvLkyTXXXXfdGU888cSqbdu2NTsHdXe7+OKLd952220bWzK+NOpRFhEREZG8u+KKK3ZcddVVm84555zXk6+PGzdu35w5c3oCLFiwoGtlZWVtjx496saPH79v7ty5PQHuv//+bnv37m0HMHny5L0LFiyo3LhxYzmEMc6rV6/ukI+YlSiLiIiItBU9eetZbwWa35AhQ47Mnj17W+7rN99886YlS5Z0rqqqGnHttdf2nzt37isAN91006bnnnuuy9ChQ0c+9NBDlX379j0MMGbMmEOzZ8/eOGnSpKqqqqoR559/ftX69evb5873xhtvPK1Pnz7v2Lp1a4dMJjNi2rRpA5v68Sx5BmGTJ7axDgubPb1IW6EbjhSZbjgiIgVml7LI3ccWO46lS5euy2QyO4odx8ls6dKlvTKZzKC0MvUoi4iIiIikUKIsIiIiIpJCibKIiIiISAolyiIiIiIiKZQoi4iIiIikUKIsIiIiIpJCd+YTERERaSse7JXh8M6Wy/869Kzl73Ysre8tZjZmypQpux599NFXAI4cOcJpp52WGT169IGnnnpqTWMX1b9//1ELFy5c0bdv30Zdu3nKlCmDly1bdkr79u199OjRB+65555XO3bs2KQrtqpHWURERKStaMkkuZHzq6ioqFu1alXF/v37DeDhhx/u1qdPnyMtGkeKSy+9dNfatWuXr1q16qVDhw7Z97///V5NnYcSZRERERHJq+rq6j0PPPDAqQDz5s3rMXXq1F3Z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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "''" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mode_results_parsed.plot()" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "Lastly, we can combine the information from the KPIDemo and ModeId features to display a boxplot of the \"RMS\" for each one of the operating modes.\n", "\n", "First, we merge the \"KPI\" and \"ModeId\" dataframes." ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "pycharm": { "name": "#%%\n" } }, "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", "
timestampsrms_accpeak_accpeak2peak_accvariance_acccrest_factor_accutilization_accdc_component_accdatetime_xlabelsuncertainmode_probabilitydatetime_y
015701868600.6470862.6865635.3132930.4187204.1517861-0.1402372019-10-04 11:01:00+00:000False0.9127432019-10-04 11:01:00+00:00
115702732600.6471232.6917505.3670040.4187694.1595631-0.1404202019-10-05 11:01:00+00:000False0.9728412019-10-05 11:01:00+00:00
215703596600.6466192.7152515.4148560.4181164.1991521-0.1402392019-10-06 11:01:00+00:000False0.9297412019-10-06 11:01:00+00:00
315704460600.6468732.6851475.3515620.4184454.1509661-0.1403472019-10-07 11:01:00+00:000False0.9996202019-10-07 11:01:00+00:00
415705324600.6466432.7266055.3953250.4181474.2165561-0.1404232019-10-08 11:01:00+00:000False0.9789402019-10-08 11:01:00+00:00
\n", "
" ], "text/plain": [ " timestamps rms_acc peak_acc peak2peak_acc variance_acc \\\n", "0 1570186860 0.647086 2.686563 5.313293 0.418720 \n", "1 1570273260 0.647123 2.691750 5.367004 0.418769 \n", "2 1570359660 0.646619 2.715251 5.414856 0.418116 \n", "3 1570446060 0.646873 2.685147 5.351562 0.418445 \n", "4 1570532460 0.646643 2.726605 5.395325 0.418147 \n", "\n", " crest_factor_acc utilization_acc dc_component_acc \\\n", "0 4.151786 1 -0.140237 \n", "1 4.159563 1 -0.140420 \n", "2 4.199152 1 -0.140239 \n", "3 4.150966 1 -0.140347 \n", "4 4.216556 1 -0.140423 \n", "\n", " datetime_x labels uncertain mode_probability \\\n", "0 2019-10-04 11:01:00+00:00 0 False 0.912743 \n", "1 2019-10-05 11:01:00+00:00 0 False 0.972841 \n", "2 2019-10-06 11:01:00+00:00 0 False 0.929741 \n", "3 2019-10-07 11:01:00+00:00 0 False 0.999620 \n", "4 2019-10-08 11:01:00+00:00 0 False 0.978940 \n", "\n", " datetime_y \n", "0 2019-10-04 11:01:00+00:00 \n", "1 2019-10-05 11:01:00+00:00 \n", "2 2019-10-06 11:01:00+00:00 \n", "3 2019-10-07 11:01:00+00:00 \n", "4 2019-10-08 11:01:00+00:00 " ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_u0001 = pd.merge_asof(df_kpi, df_mode, on=\"timestamps\")\n", "df_u0001.head()" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "The MVG library provides additional visualization functions that can help towards this goal.\n", "Thus, we import the visualization module." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:22:17.670019Z", "start_time": "2021-03-18T10:22:17.530333Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "from mvg import plotting" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "Now, we can proceed to plot the boxplot for the requested kpi." ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "ExecuteTime": { "end_time": "2021-03-18T10:22:17.902871Z", "start_time": "2021-03-18T10:22:17.815292Z" }, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plotting.modes_boxplot(df_u0001, \"rms_acc\", SOURCE_ID)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we conclude our brief overview to begin using the MultiViz Analytics Engine (MVG) Library." ] } ], "metadata": { "celltoolbar": "Tags", "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.11" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": true }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }