{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "output_type": "error",
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'pandas'",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-3-c01ef916f33f>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mglob\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mpathlib\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mPath\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mpandas\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      6\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mplotly\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph_objects\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mgo\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      7\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mplotly\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpress\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mpx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'pandas'"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import time\n",
    "import glob\n",
    "from pathlib import Path\n",
    "import pandas as pd\n",
    "import plotly.graph_objects as go\n",
    "import plotly.express as px\n",
    "pd.options.plotting.backend = \"plotly\" \n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "from scipy import stats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "if not os.path.exists('output'):\n",
    "    os.makedirs('output')\n",
    "if not os.path.exists('plots'):\n",
    "    os.makedirs('plots')\n",
    "if not os.path.exists('plots/CPU'):\n",
    "    os.makedirs('plots/CPU')\n",
    "if not os.path.exists('plots/Disc'):\n",
    "    os.makedirs('plots/Disc')\n",
    "if not os.path.exists('plots/Energy'):\n",
    "    os.makedirs('plots/Energy')\n",
    "if not os.path.exists('plots/MEM'):\n",
    "    os.makedirs('plots/MEM')\n",
    "if not os.path.exists('plots/Network'):\n",
    "    os.makedirs('plots/Network')\n",
    "if not os.path.exists('plots/Network/received'):\n",
    "    os.makedirs('plots/Network/received')\n",
    "if not os.path.exists('plots/Network/transmitted'):\n",
    "    os.makedirs('plots/Network/transmitted')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plotFigure(dataToUse, colNamesArray, unit, titleText, filePath):\n",
    "    if len(colNamesArray) > 3:\n",
    "        print(\"Too much cols\")\n",
    "        return\n",
    "    data = dataToUse[colNamesArray]\n",
    "    data.columns =['L1','L2','L3']\n",
    "    iteration_plot = data.plot.line(line_shape='hv') # other options: spline / vhv\n",
    "    iteration_plot.update_xaxes(\n",
    "        title_text=\"Time (s)\",\n",
    "        ticktext=[\"30\", \"60\", \"90\", \"120\"],\n",
    "        tickvals=[data.index[29], data.index[59], data.index[89], data.index.max()]\n",
    "    )\n",
    "    iteration_plot.update_yaxes(title_text=unit)\n",
    "    iteration_plot.update_layout(\n",
    "        title_text=titleText,\n",
    "        legend=dict(\n",
    "            title=\"Server\"\n",
    "        )\n",
    "    )\n",
    "    iteration_plot.write_image(filePath)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plotBoxplotFigure(data, colNamesArray, title, fileName):\n",
    "    if len(colNamesArray) > 3:\n",
    "        print(\"Too much cols\")\n",
    "        return\n",
    "    fig = go.Figure()\n",
    "    fig.add_trace(go.Box(\n",
    "        x=data[colNamesArray[0]],\n",
    "        name='L1'\n",
    "    ))\n",
    "    fig.add_trace(go.Box(\n",
    "        x=data[colNamesArray[1]],\n",
    "        name='L2'\n",
    "    ))\n",
    "    fig.add_trace(go.Box(\n",
    "        x=data[colNamesArray[2]],\n",
    "        name='L3'\n",
    "    ))\n",
    "\n",
    "    fig.update_layout(\n",
    "        title_text=title,\n",
    "        xaxis=dict(title='W', zeroline=False),\n",
    "        boxmode='group',\n",
    "        legend=dict(\n",
    "            title=\"Server\"\n",
    "        )\n",
    "    )\n",
    "    fig.update_traces(orientation='h')\n",
    "    fig.write_image(fileName)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cleanDataIQR(data):\n",
    "    Q1=data.quantile(0.25)\n",
    "    Q3=data.quantile(0.75)\n",
    "    IQR=Q3-Q1\n",
    "    lowqe_bound=Q1 - 10 * IQR\n",
    "    upper_bound=Q3 + 10 * IQR\n",
    "    return data[~((data < lowqe_bound) |(data > upper_bound))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "(123251, 9)\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "                   AVG[W] L1  Min[W] L1  Max[W] L1  AVG[W] L2  Min[W] L2  \\\n",
       "Time                                                                       \n",
       "14.10.20 00:00:01      0.076      0.009      0.148     -0.117     -0.196   \n",
       "14.10.20 00:00:02      0.100      0.021      0.178     -0.068     -0.209   \n",
       "14.10.20 00:00:03      0.090      0.002      0.186      0.457     -0.222   \n",
       "14.10.20 00:00:04      0.073     -0.018      0.131     -0.085     -0.169   \n",
       "14.10.20 00:00:05      0.106      0.029      0.169     -0.100     -0.223   \n",
       "\n",
       "                   Max[W] L2  AVG[W] L3  Min[W] L3  Max[W] L3  \n",
       "Time                                                           \n",
       "14.10.20 00:00:01      0.037      0.052     -0.075      0.207  \n",
       "14.10.20 00:00:02      0.007      0.030     -0.132      0.176  \n",
       "14.10.20 00:00:03      2.782      0.027     -0.130      0.182  \n",
       "14.10.20 00:00:04      0.019      0.055     -0.066      0.186  \n",
       "14.10.20 00:00:05      0.027      0.005     -0.139      0.176  "
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>AVG[W] L1</th>\n      <th>Min[W] L1</th>\n      <th>Max[W] L1</th>\n      <th>AVG[W] L2</th>\n      <th>Min[W] L2</th>\n      <th>Max[W] L2</th>\n      <th>AVG[W] L3</th>\n      <th>Min[W] L3</th>\n      <th>Max[W] L3</th>\n    </tr>\n    <tr>\n      <th>Time</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>14.10.20 00:00:01</th>\n      <td>0.076</td>\n      <td>0.009</td>\n      <td>0.148</td>\n      <td>-0.117</td>\n      <td>-0.196</td>\n      <td>0.037</td>\n      <td>0.052</td>\n      <td>-0.075</td>\n      <td>0.207</td>\n    </tr>\n    <tr>\n      <th>14.10.20 00:00:02</th>\n      <td>0.100</td>\n      <td>0.021</td>\n      <td>0.178</td>\n      <td>-0.068</td>\n      <td>-0.209</td>\n      <td>0.007</td>\n      <td>0.030</td>\n      <td>-0.132</td>\n      <td>0.176</td>\n    </tr>\n    <tr>\n      <th>14.10.20 00:00:03</th>\n      <td>0.090</td>\n      <td>0.002</td>\n      <td>0.186</td>\n      <td>0.457</td>\n      <td>-0.222</td>\n      <td>2.782</td>\n      <td>0.027</td>\n      <td>-0.130</td>\n      <td>0.182</td>\n    </tr>\n    <tr>\n      <th>14.10.20 00:00:04</th>\n      <td>0.073</td>\n      <td>-0.018</td>\n      <td>0.131</td>\n      <td>-0.085</td>\n      <td>-0.169</td>\n      <td>0.019</td>\n      <td>0.055</td>\n      <td>-0.066</td>\n      <td>0.186</td>\n    </tr>\n    <tr>\n      <th>14.10.20 00:00:05</th>\n      <td>0.106</td>\n      <td>0.029</td>\n      <td>0.169</td>\n      <td>-0.100</td>\n      <td>-0.223</td>\n      <td>0.027</td>\n      <td>0.005</td>\n      <td>-0.139</td>\n      <td>0.176</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "execution_count": 5
    }
   ],
   "source": [
    "l1_matrix = pd.read_csv(\"./MeasurementFiles/Matrix/Messung_1_L1.csv\", sep=\";\", decimal=\",\").dropna(axis=1).drop('Nummer', axis=1)\n",
    "l1_matrix.columns =['Time', 'AVG[W] L1', 'Min[W] L1', 'Max[W] L1']\n",
    "l1_matrix.index = l1_matrix['Time']\n",
    "l1_matrix = l1_matrix.drop(\"Time\", axis=1)\n",
    "l2_matrix = pd.read_csv(\"./MeasurementFiles/Matrix/Messung_1_L2.csv\", sep=\";\", decimal=\",\").dropna(axis=1).drop('Nummer', axis=1)\n",
    "l2_matrix.columns =['Time', 'AVG[W] L2', 'Min[W] L2', 'Max[W] L2']\n",
    "l2_matrix.index = l2_matrix['Time']\n",
    "l2_matrix = l2_matrix.drop(\"Time\", axis=1)\n",
    "l3_matrix = pd.read_csv(\"./MeasurementFiles/Matrix/Messung_1_L3.csv\", sep=\";\", decimal=\",\").dropna(axis=1).drop('Nummer', axis=1)\n",
    "l3_matrix.columns =['Time', 'AVG[W] L3', 'Min[W] L3', 'Max[W] L3']\n",
    "l3_matrix.index = l3_matrix['Time']\n",
    "l3_matrix = l3_matrix.drop(\"Time\", axis=1)\n",
    "matrix = l1_matrix.merge(l2_matrix, on='Time').merge(l3_matrix, on='Time')\n",
    "print(matrix.shape)\n",
    "matrix.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "(123251, 27)\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "                   AVG[W] L1  Min[W] L1  Max[W] L1  AVG[W] L2  Min[W] L2  \\\n",
       "Time                                                                       \n",
       "14.10.20 00:00:01      0.076      0.009      0.148     -0.117     -0.196   \n",
       "14.10.20 00:00:02      0.100      0.021      0.178     -0.068     -0.209   \n",
       "14.10.20 00:00:03      0.090      0.002      0.186      0.457     -0.222   \n",
       "14.10.20 00:00:04      0.073     -0.018      0.131     -0.085     -0.169   \n",
       "14.10.20 00:00:05      0.106      0.029      0.169     -0.100     -0.223   \n",
       "\n",
       "                   Max[W] L2  AVG[W] L3  Min[W] L3  Max[W] L3  CPU% L1  ...  \\\n",
       "Time                                                                    ...   \n",
       "14.10.20 00:00:01      0.037      0.052     -0.075      0.207      0.0  ...   \n",
       "14.10.20 00:00:02      0.007      0.030     -0.132      0.176      0.0  ...   \n",
       "14.10.20 00:00:03      2.782      0.027     -0.130      0.182      0.0  ...   \n",
       "14.10.20 00:00:04      0.019      0.055     -0.066      0.186      0.0  ...   \n",
       "14.10.20 00:00:05      0.027      0.005     -0.139      0.176      0.0  ...   \n",
       "\n",
       "                   KB Transmitted L2  KB Received L2  KB Read L2  KB Write L2  \\\n",
       "Time                                                                            \n",
       "14.10.20 00:00:01                0.0             0.0         0.0          0.0   \n",
       "14.10.20 00:00:02                0.0             0.0         0.0          0.0   \n",
       "14.10.20 00:00:03                0.0             0.0         0.0          0.0   \n",
       "14.10.20 00:00:04                0.0             0.0         0.0          0.0   \n",
       "14.10.20 00:00:05                0.0             0.0         0.0          0.0   \n",
       "\n",
       "                   CPU% L3  MEM Used L3  KB Transmitted L3  KB Received L3  \\\n",
       "Time                                                                         \n",
       "14.10.20 00:00:01      0.0          0.0                0.0             0.0   \n",
       "14.10.20 00:00:02      0.0          0.0                0.0             0.0   \n",
       "14.10.20 00:00:03      0.0          0.0                0.0             0.0   \n",
       "14.10.20 00:00:04      0.0          0.0                0.0             0.0   \n",
       "14.10.20 00:00:05      0.0          0.0                0.0             0.0   \n",
       "\n",
       "                   KB Read L3  KB Write L3  \n",
       "Time                                        \n",
       "14.10.20 00:00:01         0.0          0.0  \n",
       "14.10.20 00:00:02         0.0          0.0  \n",
       "14.10.20 00:00:03         0.0          0.0  \n",
       "14.10.20 00:00:04         0.0          0.0  \n",
       "14.10.20 00:00:05         0.0          0.0  \n",
       "\n",
       "[5 rows x 27 columns]"
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>AVG[W] L1</th>\n      <th>Min[W] L1</th>\n      <th>Max[W] L1</th>\n      <th>AVG[W] L2</th>\n      <th>Min[W] L2</th>\n      <th>Max[W] L2</th>\n      <th>AVG[W] L3</th>\n      <th>Min[W] L3</th>\n      <th>Max[W] L3</th>\n      <th>CPU% L1</th>\n      <th>...</th>\n      <th>KB Transmitted L2</th>\n      <th>KB Received L2</th>\n      <th>KB Read L2</th>\n      <th>KB Write L2</th>\n      <th>CPU% L3</th>\n      <th>MEM Used L3</th>\n      <th>KB Transmitted L3</th>\n      <th>KB Received L3</th>\n      <th>KB Read L3</th>\n      <th>KB Write L3</th>\n    </tr>\n    <tr>\n      <th>Time</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>14.10.20 00:00:01</th>\n      <td>0.076</td>\n      <td>0.009</td>\n      <td>0.148</td>\n      <td>-0.117</td>\n      <td>-0.196</td>\n      <td>0.037</td>\n      <td>0.052</td>\n      <td>-0.075</td>\n      <td>0.207</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>14.10.20 00:00:02</th>\n      <td>0.100</td>\n      <td>0.021</td>\n      <td>0.178</td>\n      <td>-0.068</td>\n      <td>-0.209</td>\n      <td>0.007</td>\n      <td>0.030</td>\n      <td>-0.132</td>\n      <td>0.176</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>14.10.20 00:00:03</th>\n      <td>0.090</td>\n      <td>0.002</td>\n      <td>0.186</td>\n      <td>0.457</td>\n      <td>-0.222</td>\n      <td>2.782</td>\n      <td>0.027</td>\n      <td>-0.130</td>\n      <td>0.182</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>14.10.20 00:00:04</th>\n      <td>0.073</td>\n      <td>-0.018</td>\n      <td>0.131</td>\n      <td>-0.085</td>\n      <td>-0.169</td>\n      <td>0.019</td>\n      <td>0.055</td>\n      <td>-0.066</td>\n      <td>0.186</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>14.10.20 00:00:05</th>\n      <td>0.106</td>\n      <td>0.029</td>\n      <td>0.169</td>\n      <td>-0.100</td>\n      <td>-0.223</td>\n      <td>0.027</td>\n      <td>0.005</td>\n      <td>-0.139</td>\n      <td>0.176</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n  </tbody>\n</table>\n<p>5 rows × 27 columns</p>\n</div>"
     },
     "metadata": {},
     "execution_count": 6
    }
   ],
   "source": [
    "cols = ['Date Time','[CPU]Totl%','[MEM]Used','[NET]TxKBTot','[NET]RxKBTot','[DSK]ReadKBTot','[DSK]WriteKBTot']\n",
    "f1_matrix = pd.read_csv(\"./MeasurementFiles/Matrix/Network-server-207-F1.csv\", sep=\";\", usecols=cols).dropna(axis=1)#.drop('Nummer', axis=1)\n",
    "f1_matrix.columns =['Time','CPU% L1','MEM Used L1','KB Transmitted L1','KB Received L1','KB Read L1','KB Write L1']\n",
    "f1_matrix['Time'] = [time.strftime('%d.%m.%y %H:%M:%S', time.strptime(time_string, '%Y%m%d %H:%M:%S')) for time_string in f1_matrix['Time']]\n",
    "f1_matrix.index = f1_matrix['Time']\n",
    "f1_matrix = f1_matrix.drop(\"Time\", axis=1)\n",
    "f2_matrix = pd.read_csv(\"./MeasurementFiles/Matrix/Network-server-209-F2.csv\", sep=\";\", usecols=cols).dropna(axis=1)#.drop('Nummer', axis=1)\n",
    "f2_matrix.columns =['Time','CPU% L2','MEM Used L2','KB Transmitted L2','KB Received L2','KB Read L2','KB Write L2']\n",
    "f2_matrix['Time'] = [time.strftime('%d.%m.%y %H:%M:%S', time.strptime(time_string, '%Y%m%d %H:%M:%S')) for time_string in f2_matrix['Time']]\n",
    "f2_matrix.index = f2_matrix['Time']\n",
    "f2_matrix = f2_matrix.drop(\"Time\", axis=1)\n",
    "f3_matrix = pd.read_csv(\"./MeasurementFiles/Matrix/Network-server-208-F3.csv\", sep=\";\", usecols=cols).dropna(axis=1)#.drop('Nummer', axis=1)\n",
    "f3_matrix.columns =['Time','CPU% L3','MEM Used L3','KB Transmitted L3','KB Received L3','KB Read L3','KB Write L3']\n",
    "f3_matrix['Time'] = [time.strftime('%d.%m.%y %H:%M:%S', time.strptime(time_string, '%Y%m%d %H:%M:%S')) for time_string in f3_matrix['Time']]\n",
    "f3_matrix.index = f3_matrix['Time']\n",
    "f3_matrix = f3_matrix.drop(\"Time\", axis=1)\n",
    "matrix = matrix.merge(f1_matrix, on='Time', how='outer').merge(f2_matrix, on='Time', how='outer').merge(f3_matrix, on='Time', how='outer').fillna(0)\n",
    "print(matrix.shape)\n",
    "matrix.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "                   AVG[W] L1  Min[W] L1  Max[W] L1  AVG[W] L2  Min[W] L2  \\\n",
       "Time                                                                       \n",
       "15.10.20 00:00:01      9.157      7.878     13.265      6.515      6.004   \n",
       "15.10.20 00:00:02      8.819      7.424     12.104      6.643      5.986   \n",
       "15.10.20 00:00:03      8.238      7.494      8.660      6.199      5.304   \n",
       "15.10.20 00:00:04      8.269      7.554      8.916      6.522      6.175   \n",
       "15.10.20 00:00:05      8.378      7.808      8.852      6.450      6.222   \n",
       "\n",
       "                   Max[W] L2  AVG[W] L3  Min[W] L3  Max[W] L3  \n",
       "Time                                                           \n",
       "15.10.20 00:00:01      6.963      7.210      6.939      7.701  \n",
       "15.10.20 00:00:02      8.129      9.163      7.199     13.603  \n",
       "15.10.20 00:00:03      6.595      7.501      7.057      8.369  \n",
       "15.10.20 00:00:04      6.811      7.221      6.728      7.801  \n",
       "15.10.20 00:00:05      6.800      7.229      6.982      7.485  "
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>AVG[W] L1</th>\n      <th>Min[W] L1</th>\n      <th>Max[W] L1</th>\n      <th>AVG[W] L2</th>\n      <th>Min[W] L2</th>\n      <th>Max[W] L2</th>\n      <th>AVG[W] L3</th>\n      <th>Min[W] L3</th>\n      <th>Max[W] L3</th>\n    </tr>\n    <tr>\n      <th>Time</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>15.10.20 00:00:01</th>\n      <td>9.157</td>\n      <td>7.878</td>\n      <td>13.265</td>\n      <td>6.515</td>\n      <td>6.004</td>\n      <td>6.963</td>\n      <td>7.210</td>\n      <td>6.939</td>\n      <td>7.701</td>\n    </tr>\n    <tr>\n      <th>15.10.20 00:00:02</th>\n      <td>8.819</td>\n      <td>7.424</td>\n      <td>12.104</td>\n      <td>6.643</td>\n      <td>5.986</td>\n      <td>8.129</td>\n      <td>9.163</td>\n      <td>7.199</td>\n      <td>13.603</td>\n    </tr>\n    <tr>\n      <th>15.10.20 00:00:03</th>\n      <td>8.238</td>\n      <td>7.494</td>\n      <td>8.660</td>\n      <td>6.199</td>\n      <td>5.304</td>\n      <td>6.595</td>\n      <td>7.501</td>\n      <td>7.057</td>\n      <td>8.369</td>\n    </tr>\n    <tr>\n      <th>15.10.20 00:00:04</th>\n      <td>8.269</td>\n      <td>7.554</td>\n      <td>8.916</td>\n      <td>6.522</td>\n      <td>6.175</td>\n      <td>6.811</td>\n      <td>7.221</td>\n      <td>6.728</td>\n      <td>7.801</td>\n    </tr>\n    <tr>\n      <th>15.10.20 00:00:05</th>\n      <td>8.378</td>\n      <td>7.808</td>\n      <td>8.852</td>\n      <td>6.450</td>\n      <td>6.222</td>\n      <td>6.800</td>\n      <td>7.229</td>\n      <td>6.982</td>\n      <td>7.485</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "execution_count": 7
    }
   ],
   "source": [
    "l1_activitypub = pd.read_csv(\"./MeasurementFiles/ActivityPub/Messung_2_L1.csv\", sep=\";\", decimal=\",\").dropna(axis=1).drop('Nummer', axis=1)\n",
    "l1_activitypub.columns =['Time', 'AVG[W] L1', 'Min[W] L1', 'Max[W] L1']\n",
    "l1_activitypub.index = l1_activitypub['Time']\n",
    "l1_activitypub = l1_activitypub.drop(\"Time\", axis=1)\n",
    "l2_activitypub = pd.read_csv(\"./MeasurementFiles/ActivityPub/Messung_2_L2.csv\", sep=\";\", decimal=\",\").dropna(axis=1).drop('Nummer', axis=1)\n",
    "l2_activitypub.columns =['Time', 'AVG[W] L2', 'Min[W] L2', 'Max[W] L2']\n",
    "l2_activitypub.index = l2_activitypub['Time']\n",
    "l2_activitypub = l2_activitypub.drop(\"Time\", axis=1)\n",
    "l3_activitypub = pd.read_csv(\"./MeasurementFiles/ActivityPub/Messung_2_L3.csv\", sep=\";\", decimal=\",\").dropna(axis=1).drop('Nummer', axis=1)\n",
    "l3_activitypub.columns =['Time', 'AVG[W] L3', 'Min[W] L3', 'Max[W] L3']\n",
    "l3_activitypub.index = l3_activitypub['Time']\n",
    "l3_activitypub = l3_activitypub.drop(\"Time\", axis=1)\n",
    "activitypub = l1_activitypub.merge(l2_activitypub, on='Time').merge(l3_activitypub, on='Time')\n",
    "activitypub.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "(142191, 27)\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "                   AVG[W] L1  Min[W] L1  Max[W] L1  AVG[W] L2  Min[W] L2  \\\n",
       "Time                                                                       \n",
       "15.10.20 00:00:01      9.157      7.878     13.265      6.515      6.004   \n",
       "15.10.20 00:00:02      8.819      7.424     12.104      6.643      5.986   \n",
       "15.10.20 00:00:03      8.238      7.494      8.660      6.199      5.304   \n",
       "15.10.20 00:00:04      8.269      7.554      8.916      6.522      6.175   \n",
       "15.10.20 00:00:05      8.378      7.808      8.852      6.450      6.222   \n",
       "\n",
       "                   Max[W] L2  AVG[W] L3  Min[W] L3  Max[W] L3  CPU% L1  ...  \\\n",
       "Time                                                                    ...   \n",
       "15.10.20 00:00:01      6.963      7.210      6.939      7.701      0.0  ...   \n",
       "15.10.20 00:00:02      8.129      9.163      7.199     13.603      0.0  ...   \n",
       "15.10.20 00:00:03      6.595      7.501      7.057      8.369      0.0  ...   \n",
       "15.10.20 00:00:04      6.811      7.221      6.728      7.801      0.0  ...   \n",
       "15.10.20 00:00:05      6.800      7.229      6.982      7.485      0.0  ...   \n",
       "\n",
       "                   KB Transmitted L2  KB Received L2  KB Read L2  KB Write L2  \\\n",
       "Time                                                                            \n",
       "15.10.20 00:00:01                0.0             0.0         0.0          0.0   \n",
       "15.10.20 00:00:02                0.0             0.0         0.0          0.0   \n",
       "15.10.20 00:00:03                0.0             0.0         0.0          0.0   \n",
       "15.10.20 00:00:04                0.0             0.0         0.0          0.0   \n",
       "15.10.20 00:00:05                0.0             0.0         0.0          0.0   \n",
       "\n",
       "                   CPU% L3  MEM Used L3  KB Transmitted L3  KB Received L3  \\\n",
       "Time                                                                         \n",
       "15.10.20 00:00:01      0.0          0.0                0.0             0.0   \n",
       "15.10.20 00:00:02      0.0          0.0                0.0             0.0   \n",
       "15.10.20 00:00:03      0.0          0.0                0.0             0.0   \n",
       "15.10.20 00:00:04      0.0          0.0                0.0             0.0   \n",
       "15.10.20 00:00:05      0.0          0.0                0.0             0.0   \n",
       "\n",
       "                   KB Read L3  KB Write L3  \n",
       "Time                                        \n",
       "15.10.20 00:00:01         0.0          0.0  \n",
       "15.10.20 00:00:02         0.0          0.0  \n",
       "15.10.20 00:00:03         0.0          0.0  \n",
       "15.10.20 00:00:04         0.0          0.0  \n",
       "15.10.20 00:00:05         0.0          0.0  \n",
       "\n",
       "[5 rows x 27 columns]"
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>AVG[W] L1</th>\n      <th>Min[W] L1</th>\n      <th>Max[W] L1</th>\n      <th>AVG[W] L2</th>\n      <th>Min[W] L2</th>\n      <th>Max[W] L2</th>\n      <th>AVG[W] L3</th>\n      <th>Min[W] L3</th>\n      <th>Max[W] L3</th>\n      <th>CPU% L1</th>\n      <th>...</th>\n      <th>KB Transmitted L2</th>\n      <th>KB Received L2</th>\n      <th>KB Read L2</th>\n      <th>KB Write L2</th>\n      <th>CPU% L3</th>\n      <th>MEM Used L3</th>\n      <th>KB Transmitted L3</th>\n      <th>KB Received L3</th>\n      <th>KB Read L3</th>\n      <th>KB Write L3</th>\n    </tr>\n    <tr>\n      <th>Time</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>15.10.20 00:00:01</th>\n      <td>9.157</td>\n      <td>7.878</td>\n      <td>13.265</td>\n      <td>6.515</td>\n      <td>6.004</td>\n      <td>6.963</td>\n      <td>7.210</td>\n      <td>6.939</td>\n      <td>7.701</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>15.10.20 00:00:02</th>\n      <td>8.819</td>\n      <td>7.424</td>\n      <td>12.104</td>\n      <td>6.643</td>\n      <td>5.986</td>\n      <td>8.129</td>\n      <td>9.163</td>\n      <td>7.199</td>\n      <td>13.603</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>15.10.20 00:00:03</th>\n      <td>8.238</td>\n      <td>7.494</td>\n      <td>8.660</td>\n      <td>6.199</td>\n      <td>5.304</td>\n      <td>6.595</td>\n      <td>7.501</td>\n      <td>7.057</td>\n      <td>8.369</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>15.10.20 00:00:04</th>\n      <td>8.269</td>\n      <td>7.554</td>\n      <td>8.916</td>\n      <td>6.522</td>\n      <td>6.175</td>\n      <td>6.811</td>\n      <td>7.221</td>\n      <td>6.728</td>\n      <td>7.801</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>15.10.20 00:00:05</th>\n      <td>8.378</td>\n      <td>7.808</td>\n      <td>8.852</td>\n      <td>6.450</td>\n      <td>6.222</td>\n      <td>6.800</td>\n      <td>7.229</td>\n      <td>6.982</td>\n      <td>7.485</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n  </tbody>\n</table>\n<p>5 rows × 27 columns</p>\n</div>"
     },
     "metadata": {},
     "execution_count": 8
    }
   ],
   "source": [
    "cols = ['Date Time','[CPU]Totl%','[MEM]Used','[NET]TxKBTot','[NET]RxKBTot','[DSK]ReadKBTot','[DSK]WriteKBTot']\n",
    "f1_activitypub = pd.read_csv(\"./MeasurementFiles/ActivityPub/Network-server-207-F1.csv\", sep=\";\", usecols=cols).dropna(axis=1)\n",
    "f1_activitypub.columns =['Time','CPU% L1','MEM Used L1','KB Transmitted L1','KB Received L1','KB Read L1','KB Write L1']\n",
    "f1_activitypub['Time'] = [time.strftime('%d.%m.%y %H:%M:%S', time.strptime(time_string, '%Y%m%d %H:%M:%S')) for time_string in f1_activitypub['Time']]\n",
    "f1_activitypub.index = f1_activitypub['Time']\n",
    "f1_activitypub = f1_activitypub.drop(\"Time\", axis=1)\n",
    "f2_activitypub = pd.read_csv(\"./MeasurementFiles/ActivityPub/Network-server-209-F2.csv\", sep=\";\", usecols=cols).dropna(axis=1)\n",
    "f2_activitypub.columns =['Time','CPU% L2','MEM Used L2','KB Transmitted L2','KB Received L2','KB Read L2','KB Write L2']\n",
    "f2_activitypub['Time'] = [time.strftime('%d.%m.%y %H:%M:%S', time.strptime(time_string, '%Y%m%d %H:%M:%S')) for time_string in f2_activitypub['Time']]\n",
    "f2_activitypub.index = f2_activitypub['Time']\n",
    "f2_activitypub = f2_activitypub.drop(\"Time\", axis=1)\n",
    "f3_activitypub = pd.read_csv(\"./MeasurementFiles/ActivityPub/Network-server-208-F3.csv\", sep=\";\", usecols=cols).dropna(axis=1)\n",
    "f3_activitypub.columns =['Time','CPU% L3','MEM Used L3','KB Transmitted L3','KB Received L3','KB Read L3','KB Write L3']\n",
    "f3_activitypub['Time'] = [time.strftime('%d.%m.%y %H:%M:%S', time.strptime(time_string, '%Y%m%d %H:%M:%S')) for time_string in f3_activitypub['Time']]\n",
    "f3_activitypub.index = f3_activitypub['Time']\n",
    "f3_activitypub = f3_activitypub.drop(\"Time\", axis=1)\n",
    "activitypub = activitypub.merge(f1_activitypub, on='Time', how='outer').merge(f2_activitypub, on='Time', how='outer').merge(f3_activitypub, on='Time', how='outer').fillna(0)\n",
    "print(activitypub.shape)\n",
    "activitypub.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "(228591, 27)\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "                   AVG[W] L1  Min[W] L1  Max[W] L1  AVG[W] L2  Min[W] L2  \\\n",
       "Time                                                                       \n",
       "14.10.20 00:00:01      0.076      0.009      0.148     -0.117     -0.196   \n",
       "14.10.20 00:00:02      0.100      0.021      0.178     -0.068     -0.209   \n",
       "14.10.20 00:00:03      0.090      0.002      0.186      0.457     -0.222   \n",
       "14.10.20 00:00:04      0.073     -0.018      0.131     -0.085     -0.169   \n",
       "14.10.20 00:00:05      0.106      0.029      0.169     -0.100     -0.223   \n",
       "\n",
       "                   Max[W] L2  AVG[W] L3  Min[W] L3  Max[W] L3  CPU% L1  ...  \\\n",
       "Time                                                                    ...   \n",
       "14.10.20 00:00:01      0.037      0.052     -0.075      0.207      0.0  ...   \n",
       "14.10.20 00:00:02      0.007      0.030     -0.132      0.176      0.0  ...   \n",
       "14.10.20 00:00:03      2.782      0.027     -0.130      0.182      0.0  ...   \n",
       "14.10.20 00:00:04      0.019      0.055     -0.066      0.186      0.0  ...   \n",
       "14.10.20 00:00:05      0.027      0.005     -0.139      0.176      0.0  ...   \n",
       "\n",
       "                   KB Transmitted L2  KB Received L2  KB Read L2  KB Write L2  \\\n",
       "Time                                                                            \n",
       "14.10.20 00:00:01                0.0             0.0         0.0          0.0   \n",
       "14.10.20 00:00:02                0.0             0.0         0.0          0.0   \n",
       "14.10.20 00:00:03                0.0             0.0         0.0          0.0   \n",
       "14.10.20 00:00:04                0.0             0.0         0.0          0.0   \n",
       "14.10.20 00:00:05                0.0             0.0         0.0          0.0   \n",
       "\n",
       "                   CPU% L3  MEM Used L3  KB Transmitted L3  KB Received L3  \\\n",
       "Time                                                                         \n",
       "14.10.20 00:00:01      0.0          0.0                0.0             0.0   \n",
       "14.10.20 00:00:02      0.0          0.0                0.0             0.0   \n",
       "14.10.20 00:00:03      0.0          0.0                0.0             0.0   \n",
       "14.10.20 00:00:04      0.0          0.0                0.0             0.0   \n",
       "14.10.20 00:00:05      0.0          0.0                0.0             0.0   \n",
       "\n",
       "                   KB Read L3  KB Write L3  \n",
       "Time                                        \n",
       "14.10.20 00:00:01         0.0          0.0  \n",
       "14.10.20 00:00:02         0.0          0.0  \n",
       "14.10.20 00:00:03         0.0          0.0  \n",
       "14.10.20 00:00:04         0.0          0.0  \n",
       "14.10.20 00:00:05         0.0          0.0  \n",
       "\n",
       "[5 rows x 27 columns]"
      ],
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>AVG[W] L1</th>\n      <th>Min[W] L1</th>\n      <th>Max[W] L1</th>\n      <th>AVG[W] L2</th>\n      <th>Min[W] L2</th>\n      <th>Max[W] L2</th>\n      <th>AVG[W] L3</th>\n      <th>Min[W] L3</th>\n      <th>Max[W] L3</th>\n      <th>CPU% L1</th>\n      <th>...</th>\n      <th>KB Transmitted L2</th>\n      <th>KB Received L2</th>\n      <th>KB Read L2</th>\n      <th>KB Write L2</th>\n      <th>CPU% L3</th>\n      <th>MEM Used L3</th>\n      <th>KB Transmitted L3</th>\n      <th>KB Received L3</th>\n      <th>KB Read L3</th>\n      <th>KB Write L3</th>\n    </tr>\n    <tr>\n      <th>Time</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>14.10.20 00:00:01</th>\n      <td>0.076</td>\n      <td>0.009</td>\n      <td>0.148</td>\n      <td>-0.117</td>\n      <td>-0.196</td>\n      <td>0.037</td>\n      <td>0.052</td>\n      <td>-0.075</td>\n      <td>0.207</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>14.10.20 00:00:02</th>\n      <td>0.100</td>\n      <td>0.021</td>\n      <td>0.178</td>\n      <td>-0.068</td>\n      <td>-0.209</td>\n      <td>0.007</td>\n      <td>0.030</td>\n      <td>-0.132</td>\n      <td>0.176</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>14.10.20 00:00:03</th>\n      <td>0.090</td>\n      <td>0.002</td>\n      <td>0.186</td>\n      <td>0.457</td>\n      <td>-0.222</td>\n      <td>2.782</td>\n      <td>0.027</td>\n      <td>-0.130</td>\n      <td>0.182</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>14.10.20 00:00:04</th>\n      <td>0.073</td>\n      <td>-0.018</td>\n      <td>0.131</td>\n      <td>-0.085</td>\n      <td>-0.169</td>\n      <td>0.019</td>\n      <td>0.055</td>\n      <td>-0.066</td>\n      <td>0.186</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>14.10.20 00:00:05</th>\n      <td>0.106</td>\n      <td>0.029</td>\n      <td>0.169</td>\n      <td>-0.100</td>\n      <td>-0.223</td>\n      <td>0.027</td>\n      <td>0.005</td>\n      <td>-0.139</td>\n      <td>0.176</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n  </tbody>\n</table>\n<p>5 rows × 27 columns</p>\n</div>"
     },
     "metadata": {},
     "execution_count": 9
    }
   ],
   "source": [
    "frames = [matrix, activitypub]\n",
    "result = pd.concat(frames)\n",
    "result = result[~result.index.duplicated(keep='first')]\n",
    "result.to_csv(\"output/MeasurementData.csv\")\n",
    "print(result.shape)\n",
    "result.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "111111111 Windows\n",
      "Baseline Windows\n",
      "Baseline\n",
      "121110101 ActivityPub\n",
      "112110101 ActivityPub\n",
      "211110101 ActivityPub\n",
      "111110101 ActivityPub\n",
      "111010101 ActivityPub\n",
      "111210101 ActivityPub\n",
      "110110101 ActivityPub\n",
      "011110101 ActivityPub\n",
      "101110101 ActivityPub\n",
      "211111111 Matrix\n",
      "121111111 Matrix\n",
      "111111011 Matrix\n",
      "011111111 Matrix\n",
      "111011111 Matrix\n",
      "112111111 Matrix\n",
      "111111101 Matrix\n",
      "101111111 Matrix\n",
      "111110111 Matrix\n",
      "111211111 Matrix\n",
      "111111111 Matrix\n",
      "110111111 Matrix\n",
      "baseline\n",
      "Iteration            5.500000e+00\n",
      "Start                1.602788e+09\n",
      "End                  1.602788e+09\n",
      "AVG[W] L1            5.950951e+00\n",
      "AVG[W] L2            4.132172e+00\n",
      "AVG[W] L3            5.818045e+00\n",
      "CPU% L1              5.080473e-02\n",
      "CPU% L2              2.116508e-02\n",
      "CPU% L3              4.742914e-02\n",
      "Energy L1            5.950951e+00\n",
      "Energy L2            4.132172e+00\n",
      "Energy L3            5.818045e+00\n",
      "KB Read L1           0.000000e+00\n",
      "KB Read L2           0.000000e+00\n",
      "KB Read L3           0.000000e+00\n",
      "KB Received L1       0.000000e+00\n",
      "KB Received L2       0.000000e+00\n",
      "KB Received L3       0.000000e+00\n",
      "KB Transmitted L1    0.000000e+00\n",
      "KB Transmitted L2    0.000000e+00\n",
      "KB Transmitted L3    0.000000e+00\n",
      "KB Write L1          3.793847e+00\n",
      "KB Write L2          5.399402e+00\n",
      "KB Write L3          5.540977e+00\n",
      "MEM Used L1          4.075354e+06\n",
      "MEM Used L2          3.891142e+06\n",
      "MEM Used L3          3.822240e+06\n",
      "Max[W] L1            6.101333e+00\n",
      "Max[W] L2            4.379694e+00\n",
      "Max[W] L3            5.993006e+00\n",
      "Min[W] L1            5.836322e+00\n",
      "Min[W] L2            3.933443e+00\n",
      "Min[W] L3            5.669529e+00\n",
      "dtype: float64\n",
      "min\n",
      "AVG[W] L1            5.857771e+00\n",
      "Min[W] L1            5.741483e+00\n",
      "Max[W] L1            5.994246e+00\n",
      "AVG[W] L2            3.889144e+00\n",
      "Min[W] L2            3.698576e+00\n",
      "Max[W] L2            4.119449e+00\n",
      "AVG[W] L3            6.164653e+00\n",
      "Min[W] L3            5.650754e+00\n",
      "Max[W] L3            7.187424e+00\n",
      "CPU% L1              5.932203e-02\n",
      "MEM Used L1          4.503744e+06\n",
      "KB Transmitted L1    0.000000e+00\n",
      "KB Received L1       0.000000e+00\n",
      "KB Read L1           0.000000e+00\n",
      "KB Write L1          1.220339e+01\n",
      "CPU% L2              5.932203e-02\n",
      "MEM Used L2          4.335635e+06\n",
      "KB Transmitted L2    1.694915e-02\n",
      "KB Received L2       0.000000e+00\n",
      "KB Read L2           0.000000e+00\n",
      "KB Write L2          1.664407e+01\n",
      "CPU% L3              3.127119e+00\n",
      "MEM Used L3          4.310587e+06\n",
      "KB Transmitted L3    9.661017e-01\n",
      "KB Received L3       8.728814e-01\n",
      "KB Read L3           0.000000e+00\n",
      "KB Write L3          6.154237e+02\n",
      "Energy L1            5.857771e+00\n",
      "Energy L2            3.889144e+00\n",
      "Energy L3            1.257979e+01\n",
      "Iteration            1.800000e+01\n",
      "Energy total         6.425539e+00\n",
      "Actions Send         1.150000e+02\n",
      "dtype: float64\n",
      "6.704910347268386\n",
      "max\n",
      "AVG[W] L1            6.501847e+00\n",
      "Min[W] L1            6.013449e+00\n",
      "Max[W] L1            7.691280e+00\n",
      "AVG[W] L2            4.705025e+00\n",
      "Min[W] L2            3.876602e+00\n",
      "Max[W] L2            6.766508e+00\n",
      "AVG[W] L3            6.201432e+00\n",
      "Min[W] L3            5.670492e+00\n",
      "Max[W] L3            7.394390e+00\n",
      "CPU% L1              3.728814e+00\n",
      "MEM Used L1          4.571048e+06\n",
      "KB Transmitted L1    8.279661e+00\n",
      "KB Received L1       1.099153e+01\n",
      "KB Read L1           0.000000e+00\n",
      "KB Write L1          4.452542e+02\n",
      "CPU% L2              1.957627e+00\n",
      "MEM Used L2          4.403195e+06\n",
      "KB Transmitted L2    5.525424e+00\n",
      "KB Received L2       3.675214e+00\n",
      "KB Read L2           0.000000e+00\n",
      "KB Write L2          4.514915e+02\n",
      "CPU% L3              3.084746e+00\n",
      "MEM Used L3          4.377153e+06\n",
      "KB Transmitted L3    5.516949e+00\n",
      "KB Received L3       3.686441e+00\n",
      "KB Read L3           0.000000e+00\n",
      "KB Write L3          4.467458e+02\n",
      "Energy L1            8.728277e+01\n",
      "Energy L2            3.171558e+01\n",
      "Energy L3            3.329450e+01\n",
      "Iteration            2.600000e+01\n",
      "Energy total         1.363917e+02\n",
      "Actions Send         1.090000e+02\n",
      "dtype: float64\n",
      "150.1559780437906\n"
     ]
    }
   ],
   "source": [
    "measurement_files = Path(\"MeasurementFiles\").rglob('*.csv')\n",
    "summary = pd.DataFrame()\n",
    "baseline = None\n",
    "maxW = None\n",
    "minW = None\n",
    "for measurement_file in measurement_files:\n",
    "    measurement_avg = None\n",
    "    if \"Messung\" in measurement_file.name or \"Network\" in measurement_file.name:\n",
    "        continue\n",
    "    measurement_name = measurement_file.name.split(\" \")[1]\n",
    "    if \"Windows\" in measurement_file.name:\n",
    "        measurement_name = measurement_name + \" Windows\"\n",
    "    elif \"Matrix\" in measurement_file.name:\n",
    "        measurement_name = measurement_name + \" Matrix\"\n",
    "    elif \"ActivityPub\" in measurement_file.name:\n",
    "        measurement_name = measurement_name + \" ActivityPub\"\n",
    "    print(measurement_name)\n",
    "    csv_data = pd.read_csv(measurement_file.absolute()).dropna(axis=1)\n",
    "    start_measurement_string = time.strftime('%d.%m.%y %H:%M:%S', time.localtime(int(csv_data[\"Start\"][0])))\n",
    "    end_measurement_string = time.strftime('%d.%m.%y %H:%M:%S', time.localtime(int(csv_data[\"End\"][len(csv_data[\"End\"]) - 1])))\n",
    "    measurement_data = result.loc[start_measurement_string:end_measurement_string]\n",
    "\n",
    "    plotBoxplotFigure(measurement_data, [\"AVG[W] L1\", \"AVG[W] L2\", \"AVG[W] L3\"], measurement_name + \" Energy before cleaning\", \"plots/Energy/\" + measurement_name + \" Boxplot.png\")\n",
    "    measurement_data[\"AVG[W] L1\"] = cleanDataIQR(measurement_data[\"AVG[W] L1\"])\n",
    "    measurement_data[\"AVG[W] L2\"] = cleanDataIQR(measurement_data[\"AVG[W] L2\"])\n",
    "    measurement_data[\"AVG[W] L3\"] = cleanDataIQR(measurement_data[\"AVG[W] L3\"])\n",
    "    plotBoxplotFigure(measurement_data, [\"AVG[W] L1\", \"AVG[W] L2\", \"AVG[W] L3\"], measurement_name + \" Energy after cleaning\", \"plots/Energy/\" + measurement_name + \" Boxplot cleaned.png\")\n",
    "    \n",
    "    plotBoxplotFigure(measurement_data, [\"KB Received L1\", \"KB Received L2\", \"KB Received L3\"], measurement_name + \" Network before cleaning\", \"plots/Network/received/\" + measurement_name + \" Boxplot.png\")\n",
    "    if \"Baseline\" not in measurement_name and \"Windows\" not in measurement_name:\n",
    "        measurement_data[\"KB Received L1\"] = measurement_data.loc[stats.zscore(measurement_data[\"KB Received L1\"]) <= 3][\"KB Received L1\"]\n",
    "        measurement_data[\"KB Received L2\"] = measurement_data.loc[stats.zscore(measurement_data[\"KB Received L2\"]) <= 3][\"KB Received L2\"]\n",
    "        measurement_data[\"KB Received L3\"] = measurement_data.loc[stats.zscore(measurement_data[\"KB Received L3\"]) <= 3][\"KB Received L3\"]\n",
    "    plotBoxplotFigure(measurement_data, [\"KB Received L1\", \"KB Received L2\", \"KB Received L3\"], measurement_name + \" Network after cleaning\", \"plots/Network/received/\" + measurement_name + \" Boxplot cleaned.png\")\n",
    "\n",
    "    measurement_results = pd.DataFrame()\n",
    "    iteration_count = 0\n",
    "    for measurement_row in csv_data.to_numpy():\n",
    "        title = measurement_name + \" \" + str(measurement_row[0])\n",
    "        start_string = time.strftime('%d.%m.%y %H:%M:%S', time.localtime(int(measurement_row[1]) + 2))\n",
    "        end_string = time.strftime('%d.%m.%y %H:%M:%S', time.localtime(int(measurement_row[2]) - 1))\n",
    "        iteration_data = measurement_data.loc[start_string:end_string]\n",
    "\n",
    "        plotFigure(iteration_data, [\"AVG[W] L1\",\"AVG[W] L2\",\"AVG[W] L3\"], \"Energy (W)\", \"Energy \" + title, \"plots/Energy/\" + title + \".png\")\n",
    "        plotFigure(iteration_data, [\"CPU% L1\",\"CPU% L2\",\"CPU% L3\"], \"Workload (%)\", \"CPU \" + title, \"plots/CPU/\" + title + \".png\")\n",
    "        plotFigure(iteration_data, [\"MEM Used L1\",\"MEM Used L2\",\"MEM Used L3\"], \"Usage (MByte)\", \"Memory \" + title, \"plots/MEM/\" + title + \".png\")\n",
    "        plotFigure(iteration_data, [\"KB Transmitted L1\",\"KB Transmitted L2\",\"KB Transmitted L3\"], \"Transmitted (KB)\", \"Network Send \" + title, \"plots/Network/transmitted/\" + title + \" transmitted.png\")\n",
    "        plotFigure(iteration_data, [\"KB Received L1\",\"KB Received L2\",\"KB Received L3\"], \"Received (KB)\", \"Network Received \" + title, \"plots/Network/received/\" + title + \" received.png\")\n",
    "        plotFigure(iteration_data, [\"KB Read L1\",\"KB Read L2\",\"KB Read L3\"], \"Read (KB)\", \"Disc Read \" + title, \"plots/Disc/\" + title + \" read.png\")\n",
    "        plotFigure(iteration_data, [\"KB Write L1\",\"KB Write L2\",\"KB Write L3\"], \"Write (KB)\", \"Disc Write \" + title, \"plots/Disc/\" + title + \" write.png\")\n",
    "        iteration = iteration_data.mean()\n",
    "\n",
    "        iteration[\"Energy L1\"] = iteration[\"AVG[W] L1\"] + (((iteration[\"KB Received L1\"] / 1000000) / 0.025634766) * 52 * 3600) + ((iteration[\"KB Received L1\"] / 1000000) * 0.052 * 0.25 * 3600000)\n",
    "        iteration[\"Energy L2\"] = iteration[\"AVG[W] L2\"] + (((iteration[\"KB Received L2\"] / 1000000) / 0.025634766) * 52 * 3600) + ((iteration[\"KB Received L2\"] / 1000000) * 0.052 * 0.25 * 3600000)\n",
    "        iteration[\"Energy L3\"] = iteration[\"AVG[W] L3\"] + (((iteration[\"KB Received L3\"] / 1000000) / 0.025634766) * 52 * 3600) + ((iteration[\"KB Received L3\"] / 1000000) * 0.052 * 0.25 * 3600000)\n",
    "\n",
    "        iteration['Iteration'] = int(measurement_row[0])\n",
    "        measurement_results = measurement_results.append(iteration, ignore_index=True)\n",
    "\n",
    "        if baseline is not None:\n",
    "            baselineTotal = baseline[\"Energy L1\"] + baseline[\"Energy L2\"] + baseline[\"Energy L3\"]\n",
    "            iteration[\"Energy total\"] = iteration[\"Energy L1\"] + iteration[\"Energy L2\"] + iteration[\"Energy L3\"] - baselineTotal\n",
    "            if \"Baseline\" not in measurement_name and \"Windows\" not in measurement_name:\n",
    "                iteration[\"Actions Send\"] = int(measurement_row[3])\n",
    "                energyEfficiency = iteration[\"Energy total\"] / (iteration[\"Actions Send\"] / 120)\n",
    "                if maxW is None or energyEfficiency > (maxW[\"Energy total\"] / (maxW[\"Actions Send\"] / 120)):\n",
    "                    maxW = iteration\n",
    "\n",
    "                if minW is None or energyEfficiency < (minW[\"Energy total\"] / (minW[\"Actions Send\"] / 120)):\n",
    "                    minW = iteration\n",
    "\n",
    "        iteration_data = iteration_data.reset_index()\n",
    "        del iteration_data[\"Time\"]\n",
    "        if measurement_avg is None:\n",
    "            measurement_avg = iteration_data\n",
    "        else:\n",
    "            measurement_avg = measurement_avg + iteration_data.fillna(0)\n",
    "        iteration_count = iteration_count + 1\n",
    "    measurement_avg = measurement_avg / iteration_count\n",
    "    plotFigure(measurement_avg, [\"AVG[W] L1\",\"AVG[W] L2\",\"AVG[W] L3\"], \"Energy (W)\", \"Energy \" + measurement_name, \"plots/Energy/\" + measurement_name + \".png\")\n",
    "    plotFigure(measurement_avg, [\"CPU% L1\",\"CPU% L2\",\"CPU% L3\"], \"Workload (%)\", \"CPU \" + measurement_name, \"plots/CPU/\" + measurement_name + \".png\")\n",
    "    plotFigure(measurement_avg, [\"MEM Used L1\",\"MEM Used L2\",\"MEM Used L3\"], \"Usage (MByte)\", \"Memory \" + measurement_name, \"plots/MEM/\" + measurement_name + \".png\")\n",
    "    plotFigure(measurement_avg, [\"KB Transmitted L1\",\"KB Transmitted L2\",\"KB Transmitted L3\"], \"Transmitted (KB)\", \"Network Send \" + measurement_name, \"plots/Network/transmitted/\" + measurement_name + \" transmitted.png\")\n",
    "    plotFigure(measurement_avg, [\"KB Received L1\",\"KB Received L2\",\"KB Received L3\"], \"Received (KB)\", \"Network Received \" + measurement_name, \"plots/Network/received/\" + measurement_name + \" received.png\")\n",
    "    plotFigure(measurement_avg, [\"KB Read L1\",\"KB Read L2\",\"KB Read L3\"], \"Read (KB)\", \"Disc Read \" + measurement_name, \"plots/Disc/\" + measurement_name + \" read.png\")\n",
    "    plotFigure(measurement_avg, [\"KB Write L1\",\"KB Write L2\",\"KB Write L3\"], \"Write (KB)\", \"Disc Write \" + measurement_name, \"plots/Disc/\" + measurement_name + \" write.png\")\n",
    "    csv_data = csv_data.merge(measurement_results)\n",
    "    csv_data_mean = csv_data.mean()\n",
    "    csv_data = csv_data.append(csv_data_mean, ignore_index=True)\n",
    "    csv_data.to_csv(measurement_file.name)\n",
    "    if \"Windows\" not in measurement_name:\n",
    "        if \"Baseline\" in measurement_name:\n",
    "            baseline = csv_data_mean\n",
    "        else:\n",
    "            csv_data_mean[\"Measurement\"] = measurement_name\n",
    "            cols_name = [\"Measurement\",\"Actions Send\",\"AVG[W] L1\",\"AVG[W] L2\",\"AVG[W] L3\",\"Energy L1\",\"Energy L2\",\"Energy L3\",\"CPU% L1\",\"CPU% L2\",\"CPU% L3\",\"MEM Used L1\",\"MEM Used L2\",\"MEM Used L3\",\"KB Received L1\",\"KB Received L2\",\"KB Received L3\",\"KB Write L1\",\"KB Write L2\",\"KB Write L3\"]\n",
    "            summary = summary.append(csv_data_mean[cols_name], ignore_index=True)\n",
    "if baseline is not None:\n",
    "    print(\"baseline\")\n",
    "    print(baseline)\n",
    "    print(\"min\")\n",
    "    print(minW)\n",
    "    minW[\"Energy Efficiency\"] = minW[\"Energy total\"] / (minW[\"Actions Send\"] / 120)\n",
    "    print(minW[\"Energy Efficiency\"])\n",
    "    print(\"max\")\n",
    "    print(maxW)\n",
    "    maxW[\"Energy Efficiency\"] = maxW[\"Energy total\"] / (maxW[\"Actions Send\"] / 120)\n",
    "    print(maxW[\"Energy Efficiency\"])\n",
    "    for key in summary:\n",
    "        if key != \"Measurement\" and key != \"Actions Send\":\n",
    "            baseline_values = []\n",
    "            for value in summary[key]:\n",
    "                baseline_values.append(baseline[key])\n",
    "            summary[key + \" without Baseline\"] = summary[key] - baseline_values\n",
    "    summary[\"Energy total\"] = summary[\"Energy L1 without Baseline\"] + summary[\"Energy L2 without Baseline\"] + summary[\"Energy L3 without Baseline\"]\n",
    "    summary[\"Energy Efficiency\"] = summary[\"Energy total\"] / (summary[\"Actions Send\"] / 120)\n",
    "    summary[\"Energy Efficiency normalized\"] = (summary[\"Energy Efficiency\"] - minW[\"Energy Efficiency\"])/(maxW[\"Energy Efficiency\"] - minW[\"Energy Efficiency\"])\n",
    "    summary[\"CPU% total\"] = summary[\"CPU% L1 without Baseline\"] + summary[\"CPU% L2 without Baseline\"] + summary[\"CPU% L3 without Baseline\"]\n",
    "    summary[\"MEM Used total\"] = summary[\"MEM Used L1 without Baseline\"] + summary[\"MEM Used L2 without Baseline\"] + summary[\"MEM Used L3 without Baseline\"]\n",
    "    summary[\"KB Received total\"] = summary[\"KB Received L1 without Baseline\"] + summary[\"KB Received L2 without Baseline\"] + summary[\"KB Received L3 without Baseline\"]\n",
    "    summary[\"KB Write total\"] = summary[\"KB Write L1 without Baseline\"] + summary[\"KB Write L2 without Baseline\"] + summary[\"KB Write L3 without Baseline\"]\n",
    "summary.to_csv(\"summary.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "categories = ['Q1.1','Q1.2','Q1.3', 'Q2.1', 'Q2.2', 'Q3.1', 'Q4.1', 'Q4.2', 'Q4.3']\n",
    "\n",
    "fig = go.Figure()\n",
    "\n",
    "fig.add_trace(go.Scatterpolar(\n",
    "      r=[0.3313,0.3313,0.3313,0.3313,0.3313,0.3313,0.3313,0.3313,0.3313],\n",
    "      theta=categories,\n",
    "      fill='toself',\n",
    "      name='Average'\n",
    "))\n",
    "fig.add_trace(go.Scatterpolar(\n",
    "      r=[0.3478,0.3651,0.3333,0.3738,0.3313,0.3313,0.3313,0.3313,0.3313],\n",
    "      theta=categories,\n",
    "      fill='toself',\n",
    "      name='Worst'\n",
    "))\n",
    "fig.add_trace(go.Scatterpolar(\n",
    "      r=[0.2806,0.2578,0.0110,0.3291,0.3313,0.3310,0.2790,0.2782,0.3313],\n",
    "      theta=categories,\n",
    "      fill='toself',\n",
    "      name='Best'\n",
    "))\n",
    "\n",
    "fig.update_layout(\n",
    "  title_text=\"Matrix\",\n",
    "  polar=dict(\n",
    "    angularaxis=dict(\n",
    "        direction=\"clockwise\"\n",
    "    ),\n",
    "    radialaxis=dict(\n",
    "      visible=True,\n",
    "      range=[0, 1],\n",
    "      tickmode=\"array\",\n",
    "      tickvals=[0, 1],\n",
    "      ticktext=[0, 1]\n",
    "    )),\n",
    "  showlegend=True\n",
    ")\n",
    "\n",
    "fig.write_image(\"Radar Matrix.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "categories = ['Q1.1','Q1.2','Q1.3', 'Q2.1', 'Q2.2', 'Q3.1', 'Q4.1', 'Q4.2', 'Q4.3']\n",
    "\n",
    "fig = go.Figure()\n",
    "\n",
    "fig.add_trace(go.Scatterpolar(\n",
    "      r=[0.2926,0.2926,0.2926,0.2926,0.2926,0.2926,0.2926,0.2926,0.2926],\n",
    "      theta=categories,\n",
    "      fill='toself',\n",
    "      name='Average'\n",
    "))\n",
    "fig.add_trace(go.Scatterpolar(\n",
    "      r=[0.2708,0.3015,0.9479,0.3451,0.2926,0.2926,0.2926,0.2926,0.2926],\n",
    "      theta=categories,\n",
    "      fill='toself',\n",
    "      name='Worst'\n",
    "))\n",
    "fig.add_trace(go.Scatterpolar(\n",
    "      r=[0.2930,0.2199,0.0013,0.2269,0.2926,0.2926,0.2926,0.2926,0.2926],\n",
    "      theta=categories,\n",
    "      fill='toself',\n",
    "      name='Best'\n",
    "))\n",
    "\n",
    "fig.update_layout(\n",
    "  title_text=\"ActivityPub\",\n",
    "  polar=dict(\n",
    "    angularaxis=dict(\n",
    "        direction=\"clockwise\"\n",
    "    ),\n",
    "    radialaxis=dict(\n",
    "      visible=True,\n",
    "      range=[0, 1],\n",
    "      tickmode=\"array\",\n",
    "      tickvals=[0, 1],\n",
    "      ticktext=[0, 1]\n",
    "    )),\n",
    "  showlegend=True\n",
    ")\n",
    "\n",
    "fig.write_image(\"Radar ActivityPub.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "End\n"
     ]
    }
   ],
   "source": [
    "print(\"End\")"
   ]
  }
 ],
 "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.8.6-final"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}