diff --git a/Auxiliary/logging/CSC exercises summary.ipynb b/Auxiliary/logging/CSC exercises summary.ipynb index 902b58a..bdcc3bf 100644 --- a/Auxiliary/logging/CSC exercises summary.ipynb +++ b/Auxiliary/logging/CSC exercises summary.ipynb @@ -2,9 +2,24 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "%%html \n", "\n", @@ -14,9 +29,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/javascript": [ + "IPython.OutputArea.prototype._should_scroll = function(lines) {\n", + " return false;\n", + "}" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "%%javascript # Prefer to display output instead of scrolling, so it can print\n", "IPython.OutputArea.prototype._should_scroll = function(lines) {\n", @@ -26,9 +56,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Standard definitions and options\n", "import pandas as pd\n", @@ -50,49 +93,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "exerciseName = {\n", - " \"exercise1.tar\": \" 1 Testing 1\",\n", - " \"exercise2.tar\": \" 2 Testing 2 JUnit\",\n", - " \"exerciseD.tar\": \" 3 Testing 3 CppUnit\",\n", - " \"exerciseP.tar\": \" 4 Testing 3 PyUnit\",\n", - " \"exercise3.tar\": \" 5 Profiling 1\",\n", - " \"exercise4.tar\": \" 6 Profiling 2\",\n", - " \"exercise5.tar\": \" 7 Memory\",\n", - " \"exerciseC.tar\": \" 8 SVN\",\n", - " \"exG2script.sh\": \" 9 Git 2\",\n", - " \"exG3script.sh\": \"10 Git 3\",\n", - " \"exerciseM1.tar\": \"11 CMake 1\",\n", - " \"exerciseM2.tar\": \"12 CMake 2\",\n", - " \"exercise7.tar\": \"13 CMT 1\",\n", - " \"exercise8.tar\": \"14 CMT 2\",\n", - " \"exercise9.tar\": \"15 CMT 3\",\n", - " \"exerciseF.tar\": \"16 Dist Git\",\n", - " \"cmt-dev-all.tgz\": \"17 CMT Build\"\n", - "}\n", - "\n", - "exerciseIndex = {\n", - " \"exercise1.tar\": 1,\n", - " \"exercise2.tar\": 2,\n", - " \"exerciseD.tar\": 3,\n", - " \"exerciseP.tar\": 4,\n", - " \"exercise3.tar\": 5,\n", - " \"exercise4.tar\": 6,\n", - " \"exercise5.tar\": 7,\n", - " \"exerciseC.tar\": 8,\n", - " \"exG2script.sh\": 9,\n", - " \"exG3script.sh\": 10,\n", - " \"exerciseM1.tar\": 11,\n", - " \"exerciseM2.tar\": 12,\n", - " \"exercise7.tar\": 13,\n", - " \"exercise8.tar\": 14,\n", - " \"exercise9.tar\": 15,\n", - " \"exercise9.tar\": 16,\n", - " \"cmt-dev-all.tgz\": 17\n", - "}" + "import json\n", + "# read log in JSON form, as processed by i.e. transfer.php\n", + "with open('log.json', 'r') as f:\n", + " samples_dict = json.load(f)" ] }, { @@ -100,16 +108,43 @@ "execution_count": null, "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], "source": [ - "import json\n", - "# read log in JSON form, as processed by i.e. transfer.php\n", - "with open('log.json', 'r') as f:\n", - " samples_dict = json.load(f)" + "exerciseName = {\n", + " \"exercise1.tar\": \" 1 Testing 1\",\n", + " \"exercise2.tar\": \" 2 Testing 2 JUnit\",\n", + " \"exerciseD.tar\": \" 3 Testing 3 CppUnit\",\n", + " \"exerciseP.tar\": \" 4 Testing 3 PyUnit\",\n", + " \"exercise3.tar\": \" 5 Profiling 1\",\n", + " \"exercise4.tar\": \" 6 Profiling 2\",\n", + " \"exercise5.tar\": \" 7 Memory\",\n", + " \"exerciseC.tar\": \" 8 SVN\",\n", + " \"exG2script.sh\": \" 9 Git 2\",\n", + " \"exG3script.sh\": \"10 Git 3\",\n", + " \"exG3MasterRepo.tar\": \"10 Git 3\",\n", + " \"exerciseM1.tar\": \"11 CMake 1\",\n", + " \"exerciseM1A.tar\": \"11 CMake 1\",\n", + " \"exerciseM2.tar\": \"12 CMake 2\",\n", + " \"exerciseM2A.tar\": \"12 CMake 2\",\n", + " \"exerciseM2B.tar\": \"12 CMake 2\",\n", + " \"exercise7.tar\": \"13 CMT 1\",\n", + " \"exercise7extras.tar\": \"13 CMT 1\",\n", + " \"exercise8.tar\": \"14 CMT 2\",\n", + " \"exercise9.tar\": \"15 CMT 3\",\n", + " \"exerciseF.tar\": \"16 Dist Git\",\n", + " \"cmt-dev-all.tgz\": \"17 CMT Build\"\n", + "}\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -117,51 +152,892 @@ "for sample in samples_dict : \n", " df = df.append(sample, ignore_index=True)\n", "df = df.replace(np.nan, '', regex=True)\n", - "# Add column\n", "\n", + "# Add column\n", "def lookUpCanFail(array, item, failValue) :\n", " try :\n", " return array[item]\n", " except:\n", " return failValue\n", "\n", - "df['FileIndex'] = df.apply(lambda row: \\\n", - " lookUpCanFail(exerciseIndex, row.file, 0), axis = 1)\n", "df['Exercise'] = df.apply(lambda row: \\\n", - " lookUpCanFail(exerciseName, row.file, \"\"), axis = 1)\n", - "\n", - "df.tail(20)" + " lookUpCanFail(exerciseName, row.file, \"\"), axis = 1)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "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", + " \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", + "
DATEIPREMOTE_HOSThostitem1item2item3item4userfileExercise
2812019-09-17 07:41:16193.231.20.94CSC2019setupcsc_armenuhi
2842019-09-17 07:42:08193.231.20.94CSC2019teamArmine AbramyanJubna Irakkathil Jabbarcsc_armenuhi
3402019-09-17 08:10:28193.231.20.94CSC2019csc_armenuhiexerciseP.tar4 Testing 3 PyUnit
3422019-09-17 08:10:57193.231.20.94CSC2019csc_armenuhiexerciseP.tar4 Testing 3 PyUnit
3442019-09-17 08:11:12193.231.20.94CSC2019csc_armenuhi./exerciseP.tar
3492019-09-17 08:13:14193.231.20.94CSC2019csc_armenuhiexerciseP.tar4 Testing 3 PyUnit
3782019-09-17 08:29:49193.231.20.94CSC2019csc_armenuhiexercise1.tar1 Testing 1
3852019-09-17 08:33:39193.231.20.94CSC2019csc_armenuhiexercise5.tar7 Memory
\n", + "
" + ], + "text/plain": [ + " DATE IP REMOTE_HOST host item1 \\\n", + "281 2019-09-17 07:41:16 193.231.20.94 CSC2019 setup \n", + "284 2019-09-17 07:42:08 193.231.20.94 CSC2019 team \n", + "340 2019-09-17 08:10:28 193.231.20.94 CSC2019 \n", + "342 2019-09-17 08:10:57 193.231.20.94 CSC2019 \n", + "344 2019-09-17 08:11:12 193.231.20.94 CSC2019 \n", + "349 2019-09-17 08:13:14 193.231.20.94 CSC2019 \n", + "378 2019-09-17 08:29:49 193.231.20.94 CSC2019 \n", + "385 2019-09-17 08:33:39 193.231.20.94 CSC2019 \n", + "\n", + " item2 item3 item4 user \\\n", + "281 csc_armenuhi \n", + "284 Armine Abramyan Jubna Irakkathil Jabbar csc_armenuhi \n", + "340 csc_armenuhi \n", + "342 csc_armenuhi \n", + "344 csc_armenuhi \n", + "349 csc_armenuhi \n", + "378 csc_armenuhi \n", + "385 csc_armenuhi \n", + "\n", + " file Exercise \n", + "281 \n", + "284 \n", + "340 exerciseP.tar 4 Testing 3 PyUnit \n", + "342 exerciseP.tar 4 Testing 3 PyUnit \n", + "344 ./exerciseP.tar \n", + "349 exerciseP.tar 4 Testing 3 PyUnit \n", + "378 exercise1.tar 1 Testing 1 \n", + "385 exercise5.tar 7 Memory " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df[df.user==\"csc_armenuhi\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "IP\n", + "157.131.108.177 2\n", + "157.193.98.99 17\n", + "193.231.20.94 597\n", + "212.95.5.108 5\n", + "80.12.39.167 7\n", + "82.78.32.255 8\n", + "Name: REMOTE_HOST, dtype: int64" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# show counts of IP addresses\n", + "display(df.groupby(\"IP\").count()[\"REMOTE_HOST\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['CSC2019', 'BobJacosensMBP2', 'Bob-Jacobsens-MBP-2.local',\n", + " 'inst-3a-138', 'Joshs-MacBook-Air.local', '',\n", + " ''], dtype=object)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# self-reported host names\n", + "display(df.host.unique())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['csc_student', 'jake', 'csc_willem', 'csc_ciprian', 'csc_de',\n", + " 'csc_maciej', 'csc_chloe', 'csc_andrew', 'csc_cosmingabriel',\n", + " 'csc_felix', 'csc_robbie', 'csc_brendan', 'csc_enrico', 'csc_sam',\n", + " 'csc_daniel', 'csc_hevjin', 'csc_matteo', 'csc_devin',\n", + " 'csc_cedric', 'csc_danielj', 'csc_pablo', 'csc_fabian', 'csc_emil',\n", + " 'csc_cornelis', 'csc_miguel', 'csc_janik', 'anovak', 'csc_asier',\n", + " 'csc_toby', 'csc_kimmo', 'csc_ioannis', 'csc_stefano', 'csc_artem',\n", + " 'csc_saad', 'csc_diogo', 'csc_oliver', 'csc_narine',\n", + " 'csc_sebastiant', 'csc_sorin', 'csc_lukas', 'csc_carlos',\n", + " 'csc_surya', 'csc_kilian', 'csc_carlosp', 'joshfenech', 'csc_rita',\n", + " 'csc_triet', 'csc_lukasg', 'csc_yuval', 'csc_vladimir',\n", + " 'csc_ruchi', 'csc_javad', 'csc_sharad', 'csc_stefanie',\n", + " 'csc_michael', 'csc_andrzej', 'csc_pedro', 'csc_david', 'csc_petr',\n", + " 'csc_caio', 'csc_jubna', 'csc_michele', 'csc_armenuhi',\n", + " 'csc_yunsheng', 'csc_julien', 'csc_nikolai', 'csc_natasha',\n", + " 'csc_pierre', 'csc_sitong', '', '',\n", + " '$'], dtype=object)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "# summarize columns\n", - "display(df.host.unique())\n", - "display(df.groupby(\"IP\").count())\n", "display(df.user.unique())" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "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", + " \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", + " \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", + " \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", + "
DATEIPhostuser
192019-09-14 17:36:5882.78.32.255Bob-Jacobsens-MBP-2.localjake
212019-09-16 19:35:2582.78.32.255CSC2019csc_ciprian
242019-09-16 21:07:5482.78.32.255CSC2019csc_de
282019-09-17 05:55:16193.231.20.94CSC2019csc_chloe
312019-09-17 05:55:49193.231.20.94CSC2019csc_cosmingabriel
322019-09-17 05:55:55193.231.20.94CSC2019csc_felix
332019-09-17 05:56:01193.231.20.94CSC2019csc_robbie
362019-09-17 05:57:22193.231.20.94CSC2019csc_enrico
382019-09-17 05:58:30193.231.20.94CSC2019csc_sam
412019-09-17 05:58:43193.231.20.94CSC2019csc_hevjin
432019-09-17 05:59:23193.231.20.94CSC2019csc_matteo
482019-09-17 06:00:12193.231.20.94CSC2019csc_devin
492019-09-17 06:00:32193.231.20.94CSC2019csc_cedric
542019-09-17 06:00:36193.231.20.94CSC2019csc_pablo
592019-09-17 06:01:00193.231.20.94CSC2019csc_willem
612019-09-17 06:01:08193.231.20.94CSC2019csc_andrew
652019-09-17 06:01:40193.231.20.94CSC2019csc_fabian
662019-09-17 06:01:41193.231.20.94CSC2019csc_emil
712019-09-17 06:02:14193.231.20.94CSC2019csc_miguel
732019-09-17 06:02:36193.231.20.94CSC2019csc_janik
742019-09-17 06:02:43193.231.20.94inst-3a-138anovak
772019-09-17 06:02:58193.231.20.94CSC2019csc_toby
802019-09-17 06:03:17193.231.20.94CSC2019csc_kimmo
812019-09-17 06:03:17193.231.20.94CSC2019csc_danielj
842019-09-17 06:03:26193.231.20.94CSC2019csc_ioannis
852019-09-17 06:03:30193.231.20.94CSC2019csc_stefano
892019-09-17 06:04:13193.231.20.94CSC2019csc_artem
902019-09-17 06:04:25193.231.20.94CSC2019csc_saad
912019-09-17 06:04:27193.231.20.94CSC2019csc_diogo
922019-09-17 06:04:29193.231.20.94CSC2019csc_oliver
972019-09-17 06:05:22193.231.20.94CSC2019csc_narine
992019-09-17 06:05:49193.231.20.94CSC2019csc_sorin
1022019-09-17 06:06:14193.231.20.94CSC2019csc_lukas
1092019-09-17 06:09:06193.231.20.94CSC2019csc_surya
1172019-09-17 06:13:46193.231.20.94Joshs-MacBook-Air.localjoshfenech
1232019-09-17 06:14:31193.231.20.94CSC2019csc_rita
1332019-09-17 06:16:10193.231.20.94CSC2019csc_lukasg
1352019-09-17 06:16:21193.231.20.94CSC2019csc_yuval
1362019-09-17 06:16:22193.231.20.94CSC2019csc_maciej
1382019-09-17 06:16:24193.231.20.94CSC2019csc_vladimir
1462019-09-17 06:18:09193.231.20.94CSC2019csc_ruchi
1492019-09-17 06:21:25193.231.20.94CSC2019csc_javad
1522019-09-17 06:22:01193.231.20.94CSC2019csc_stefanie
1612019-09-17 06:28:37193.231.20.94CSC2019csc_andrzej
1692019-09-17 06:31:2780.12.39.167CSC2019csc_pedro
2222019-09-17 07:01:43193.231.20.94CSC2019csc_jubna
2292019-09-17 07:06:36193.231.20.94CSC2019csc_michele
2812019-09-17 07:41:16193.231.20.94CSC2019csc_armenuhi
4112019-09-17 10:38:39193.231.20.94CSC2019csc_nikolai
4242019-09-18 11:27:50193.231.20.94CSC2019csc_sebastiant
4432019-09-18 14:41:39193.231.20.94CSC2019csc_sharad
4452019-09-18 14:41:50193.231.20.94CSC2019csc_cornelis
4522019-09-18 14:43:33193.231.20.94CSC2019csc_natasha
4592019-09-18 14:47:19193.231.20.94CSC2019csc_yunsheng
4942019-09-18 15:06:31193.231.20.94CSC2019csc_daniel
5492019-09-18 15:44:11193.231.20.94CSC2019csc_julien
5962019-09-18 16:09:14193.231.20.94CSC2019csc_sitong
\n", + "
" + ], + "text/plain": [ + " DATE IP host \\\n", + "19 2019-09-14 17:36:58 82.78.32.255 Bob-Jacobsens-MBP-2.local \n", + "21 2019-09-16 19:35:25 82.78.32.255 CSC2019 \n", + "24 2019-09-16 21:07:54 82.78.32.255 CSC2019 \n", + "28 2019-09-17 05:55:16 193.231.20.94 CSC2019 \n", + "31 2019-09-17 05:55:49 193.231.20.94 CSC2019 \n", + "32 2019-09-17 05:55:55 193.231.20.94 CSC2019 \n", + "33 2019-09-17 05:56:01 193.231.20.94 CSC2019 \n", + "36 2019-09-17 05:57:22 193.231.20.94 CSC2019 \n", + "38 2019-09-17 05:58:30 193.231.20.94 CSC2019 \n", + "41 2019-09-17 05:58:43 193.231.20.94 CSC2019 \n", + "43 2019-09-17 05:59:23 193.231.20.94 CSC2019 \n", + "48 2019-09-17 06:00:12 193.231.20.94 CSC2019 \n", + "49 2019-09-17 06:00:32 193.231.20.94 CSC2019 \n", + "54 2019-09-17 06:00:36 193.231.20.94 CSC2019 \n", + "59 2019-09-17 06:01:00 193.231.20.94 CSC2019 \n", + "61 2019-09-17 06:01:08 193.231.20.94 CSC2019 \n", + "65 2019-09-17 06:01:40 193.231.20.94 CSC2019 \n", + "66 2019-09-17 06:01:41 193.231.20.94 CSC2019 \n", + "71 2019-09-17 06:02:14 193.231.20.94 CSC2019 \n", + "73 2019-09-17 06:02:36 193.231.20.94 CSC2019 \n", + "74 2019-09-17 06:02:43 193.231.20.94 inst-3a-138 \n", + "77 2019-09-17 06:02:58 193.231.20.94 CSC2019 \n", + "80 2019-09-17 06:03:17 193.231.20.94 CSC2019 \n", + "81 2019-09-17 06:03:17 193.231.20.94 CSC2019 \n", + "84 2019-09-17 06:03:26 193.231.20.94 CSC2019 \n", + "85 2019-09-17 06:03:30 193.231.20.94 CSC2019 \n", + "89 2019-09-17 06:04:13 193.231.20.94 CSC2019 \n", + "90 2019-09-17 06:04:25 193.231.20.94 CSC2019 \n", + "91 2019-09-17 06:04:27 193.231.20.94 CSC2019 \n", + "92 2019-09-17 06:04:29 193.231.20.94 CSC2019 \n", + "97 2019-09-17 06:05:22 193.231.20.94 CSC2019 \n", + "99 2019-09-17 06:05:49 193.231.20.94 CSC2019 \n", + "102 2019-09-17 06:06:14 193.231.20.94 CSC2019 \n", + "109 2019-09-17 06:09:06 193.231.20.94 CSC2019 \n", + "117 2019-09-17 06:13:46 193.231.20.94 Joshs-MacBook-Air.local \n", + "123 2019-09-17 06:14:31 193.231.20.94 CSC2019 \n", + "133 2019-09-17 06:16:10 193.231.20.94 CSC2019 \n", + "135 2019-09-17 06:16:21 193.231.20.94 CSC2019 \n", + "136 2019-09-17 06:16:22 193.231.20.94 CSC2019 \n", + "138 2019-09-17 06:16:24 193.231.20.94 CSC2019 \n", + "146 2019-09-17 06:18:09 193.231.20.94 CSC2019 \n", + "149 2019-09-17 06:21:25 193.231.20.94 CSC2019 \n", + "152 2019-09-17 06:22:01 193.231.20.94 CSC2019 \n", + "161 2019-09-17 06:28:37 193.231.20.94 CSC2019 \n", + "169 2019-09-17 06:31:27 80.12.39.167 CSC2019 \n", + "222 2019-09-17 07:01:43 193.231.20.94 CSC2019 \n", + "229 2019-09-17 07:06:36 193.231.20.94 CSC2019 \n", + "281 2019-09-17 07:41:16 193.231.20.94 CSC2019 \n", + "411 2019-09-17 10:38:39 193.231.20.94 CSC2019 \n", + "424 2019-09-18 11:27:50 193.231.20.94 CSC2019 \n", + "443 2019-09-18 14:41:39 193.231.20.94 CSC2019 \n", + "445 2019-09-18 14:41:50 193.231.20.94 CSC2019 \n", + "452 2019-09-18 14:43:33 193.231.20.94 CSC2019 \n", + "459 2019-09-18 14:47:19 193.231.20.94 CSC2019 \n", + "494 2019-09-18 15:06:31 193.231.20.94 CSC2019 \n", + "549 2019-09-18 15:44:11 193.231.20.94 CSC2019 \n", + "596 2019-09-18 16:09:14 193.231.20.94 CSC2019 \n", + "\n", + " user \n", + "19 jake \n", + "21 csc_ciprian \n", + "24 csc_de \n", + "28 csc_chloe \n", + "31 csc_cosmingabriel \n", + "32 csc_felix \n", + "33 csc_robbie \n", + "36 csc_enrico \n", + "38 csc_sam \n", + "41 csc_hevjin \n", + "43 csc_matteo \n", + "48 csc_devin \n", + "49 csc_cedric \n", + "54 csc_pablo \n", + "59 csc_willem \n", + "61 csc_andrew \n", + "65 csc_fabian \n", + "66 csc_emil \n", + "71 csc_miguel \n", + "73 csc_janik \n", + "74 anovak \n", + "77 csc_toby \n", + "80 csc_kimmo \n", + "81 csc_danielj \n", + "84 csc_ioannis \n", + "85 csc_stefano \n", + "89 csc_artem \n", + "90 csc_saad \n", + "91 csc_diogo \n", + "92 csc_oliver \n", + "97 csc_narine \n", + "99 csc_sorin \n", + "102 csc_lukas \n", + "109 csc_surya \n", + "117 joshfenech \n", + "123 csc_rita \n", + "133 csc_lukasg \n", + "135 csc_yuval \n", + "136 csc_maciej \n", + "138 csc_vladimir \n", + "146 csc_ruchi \n", + "149 csc_javad \n", + "152 csc_stefanie \n", + "161 csc_andrzej \n", + "169 csc_pedro \n", + "222 csc_jubna \n", + "229 csc_michele \n", + "281 csc_armenuhi \n", + "411 csc_nikolai \n", + "424 csc_sebastiant \n", + "443 csc_sharad \n", + "445 csc_cornelis \n", + "452 csc_natasha \n", + "459 csc_yunsheng \n", + "494 csc_daniel \n", + "549 csc_julien \n", + "596 csc_sitong " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# most recent 'setup' time\n", "t1 = df[df.item1 == 'setup']\n", "# display(t1.user.unique())\n", - "t1.drop_duplicates(['user'], keep='last').sort_values(['DATE'])[[\"DATE\", \"IP\", \"host\", \"user\"]]" + "t1.drop_duplicates(['user'], keep='last')[[\"DATE\", \"IP\", \"host\", \"user\"]]" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# plot that start up time\n", "t1 = df[df.item1 == 'setup']\n", @@ -175,7 +1051,7 @@ "plt.gcf().autofmt_xdate()\n", "plt.show()\n", "\n", - "# and focus on startup\n", + "# and focus on first exercise period to see startup\n", "t1 = t1[t1.DATE < \"2019-09-17 07:30:00\"]\n", "\n", "times = pd.to_datetime(t1[\"DATE\"])\n", @@ -188,47 +1064,1027 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
DATEuserExercise
6052019-09-18 16:16:24
6172019-09-18 16:22:45$
6072019-09-18 16:17:57<script>alert(\"hello\")</script>
1682019-09-17 06:31:26anovak1 Testing 1
5082019-09-18 15:22:19csc_andrew5 Profiling 1
5712019-09-18 15:54:50csc_andrzej9 Git 2
3852019-09-17 08:33:39csc_armenuhi7 Memory
6222019-09-18 16:27:49csc_artem9 Git 2
3942019-09-17 08:45:19csc_asier12 CMake 2
6062019-09-18 16:16:27csc_brendan12 CMake 2
4702019-09-18 14:51:19csc_caio
6112019-09-18 16:19:52csc_carlos10 Git 3
6012019-09-18 16:15:34csc_carlosp9 Git 2
5542019-09-18 15:48:04csc_cedric9 Git 2
5252019-09-18 15:31:49csc_chloe12 CMake 2
5722019-09-18 15:55:11csc_ciprian10 Git 3
5592019-09-18 15:48:57csc_cornelis10 Git 3
6152019-09-18 16:22:27csc_cosmingabriel12 CMake 2
5922019-09-18 16:05:43csc_daniel12 CMake 2
5412019-09-18 15:38:02csc_danielj10 Git 3
6022019-09-18 16:15:49csc_david
6182019-09-18 16:24:23csc_de9 Git 2
5932019-09-18 16:08:14csc_devin11 CMake 1
5612019-09-18 15:49:33csc_diogo10 Git 3
6162019-09-18 16:22:31csc_emil10 Git 3
5042019-09-18 15:21:09csc_enrico9 Git 2
5802019-09-18 16:00:11csc_fabian12 CMake 2
6282019-09-18 21:26:01csc_felix12 CMake 2
5462019-09-18 15:42:44csc_hevjin
5222019-09-18 15:30:30csc_ioannis10 Git 3
5362019-09-18 15:36:33csc_janik10 Git 3
5832019-09-18 16:01:41csc_javad10 Git 3
5452019-09-18 15:42:25csc_jubna
6132019-09-18 16:22:10csc_julien11 CMake 1
4812019-09-18 14:55:34csc_kilian7 Memory
5972019-09-18 16:09:43csc_kimmo9 Git 2
5192019-09-18 15:28:28csc_lukas9 Git 2
5812019-09-18 16:01:23csc_lukasg9 Git 2
2212019-09-17 07:01:40csc_maciej7 Memory
5032019-09-18 15:19:52csc_matteo7 Memory
3652019-09-17 08:21:26csc_michael7 Memory
6232019-09-18 19:32:53csc_michele
5782019-09-18 15:59:18csc_miguel11 CMake 1
6332019-09-20 11:44:06csc_narine10 Git 3
4532019-09-18 14:44:02csc_natasha
5872019-09-18 16:04:23csc_nikolai12 CMake 2
4802019-09-18 14:55:01csc_oliver
5072019-09-18 15:22:13csc_pablo7 Memory
5702019-09-18 15:54:21csc_pedro11 CMake 1
4182019-09-17 12:11:28csc_petr
5242019-09-18 15:31:04csc_pierre10 Git 3
1292019-09-17 06:15:13csc_rita
352019-09-17 05:56:46csc_robbie
4002019-09-17 08:48:35csc_ruchi7 Memory
1302019-09-17 06:15:16csc_saad
5332019-09-18 15:36:00csc_sam12 CMake 2
5382019-09-18 15:37:10csc_sebastiant6 Profiling 2
4862019-09-18 14:59:35csc_sharad7 Memory
5992019-09-18 16:10:26csc_sitong9 Git 2
6202019-09-18 16:25:42csc_sorin11 CMake 1
4792019-09-18 14:54:07csc_stefanie
4932019-09-18 15:05:27csc_stefano10 Git 3
02019-09-02 00:41:26csc_student
5742019-09-18 15:57:06csc_surya11 CMake 1
6212019-09-18 16:26:17csc_toby9 Git 2
4742019-09-18 14:52:23csc_triet
4852019-09-18 14:59:20csc_vladimir
5022019-09-18 15:18:23csc_willem
5652019-09-18 15:50:33csc_yunsheng10 Git 3
6352019-09-20 12:04:58csc_yuval12 CMake 2
202019-09-14 17:37:06jake
5942019-09-18 16:09:03joshfenech9 Git 2
\n", + "
" + ], + "text/plain": [ + " DATE user Exercise\n", + "605 2019-09-18 16:16:24 \n", + "617 2019-09-18 16:22:45 $ \n", + "607 2019-09-18 16:17:57 \n", + "168 2019-09-17 06:31:26 anovak 1 Testing 1\n", + "508 2019-09-18 15:22:19 csc_andrew 5 Profiling 1\n", + "571 2019-09-18 15:54:50 csc_andrzej 9 Git 2\n", + "385 2019-09-17 08:33:39 csc_armenuhi 7 Memory\n", + "622 2019-09-18 16:27:49 csc_artem 9 Git 2\n", + "394 2019-09-17 08:45:19 csc_asier 12 CMake 2\n", + "606 2019-09-18 16:16:27 csc_brendan 12 CMake 2\n", + "470 2019-09-18 14:51:19 csc_caio \n", + "611 2019-09-18 16:19:52 csc_carlos 10 Git 3\n", + "601 2019-09-18 16:15:34 csc_carlosp 9 Git 2\n", + "554 2019-09-18 15:48:04 csc_cedric 9 Git 2\n", + "525 2019-09-18 15:31:49 csc_chloe 12 CMake 2\n", + "572 2019-09-18 15:55:11 csc_ciprian 10 Git 3\n", + "559 2019-09-18 15:48:57 csc_cornelis 10 Git 3\n", + "615 2019-09-18 16:22:27 csc_cosmingabriel 12 CMake 2\n", + "592 2019-09-18 16:05:43 csc_daniel 12 CMake 2\n", + "541 2019-09-18 15:38:02 csc_danielj 10 Git 3\n", + "602 2019-09-18 16:15:49 csc_david \n", + "618 2019-09-18 16:24:23 csc_de 9 Git 2\n", + "593 2019-09-18 16:08:14 csc_devin 11 CMake 1\n", + "561 2019-09-18 15:49:33 csc_diogo 10 Git 3\n", + "616 2019-09-18 16:22:31 csc_emil 10 Git 3\n", + "504 2019-09-18 15:21:09 csc_enrico 9 Git 2\n", + "580 2019-09-18 16:00:11 csc_fabian 12 CMake 2\n", + "628 2019-09-18 21:26:01 csc_felix 12 CMake 2\n", + "546 2019-09-18 15:42:44 csc_hevjin \n", + "522 2019-09-18 15:30:30 csc_ioannis 10 Git 3\n", + "536 2019-09-18 15:36:33 csc_janik 10 Git 3\n", + "583 2019-09-18 16:01:41 csc_javad 10 Git 3\n", + "545 2019-09-18 15:42:25 csc_jubna \n", + "613 2019-09-18 16:22:10 csc_julien 11 CMake 1\n", + "481 2019-09-18 14:55:34 csc_kilian 7 Memory\n", + "597 2019-09-18 16:09:43 csc_kimmo 9 Git 2\n", + "519 2019-09-18 15:28:28 csc_lukas 9 Git 2\n", + "581 2019-09-18 16:01:23 csc_lukasg 9 Git 2\n", + "221 2019-09-17 07:01:40 csc_maciej 7 Memory\n", + "503 2019-09-18 15:19:52 csc_matteo 7 Memory\n", + "365 2019-09-17 08:21:26 csc_michael 7 Memory\n", + "623 2019-09-18 19:32:53 csc_michele \n", + "578 2019-09-18 15:59:18 csc_miguel 11 CMake 1\n", + "633 2019-09-20 11:44:06 csc_narine 10 Git 3\n", + "453 2019-09-18 14:44:02 csc_natasha \n", + "587 2019-09-18 16:04:23 csc_nikolai 12 CMake 2\n", + "480 2019-09-18 14:55:01 csc_oliver \n", + "507 2019-09-18 15:22:13 csc_pablo 7 Memory\n", + "570 2019-09-18 15:54:21 csc_pedro 11 CMake 1\n", + "418 2019-09-17 12:11:28 csc_petr \n", + "524 2019-09-18 15:31:04 csc_pierre 10 Git 3\n", + "129 2019-09-17 06:15:13 csc_rita \n", + "35 2019-09-17 05:56:46 csc_robbie \n", + "400 2019-09-17 08:48:35 csc_ruchi 7 Memory\n", + "130 2019-09-17 06:15:16 csc_saad \n", + "533 2019-09-18 15:36:00 csc_sam 12 CMake 2\n", + "538 2019-09-18 15:37:10 csc_sebastiant 6 Profiling 2\n", + "486 2019-09-18 14:59:35 csc_sharad 7 Memory\n", + "599 2019-09-18 16:10:26 csc_sitong 9 Git 2\n", + "620 2019-09-18 16:25:42 csc_sorin 11 CMake 1\n", + "479 2019-09-18 14:54:07 csc_stefanie \n", + "493 2019-09-18 15:05:27 csc_stefano 10 Git 3\n", + "0 2019-09-02 00:41:26 csc_student \n", + "574 2019-09-18 15:57:06 csc_surya 11 CMake 1\n", + "621 2019-09-18 16:26:17 csc_toby 9 Git 2\n", + "474 2019-09-18 14:52:23 csc_triet \n", + "485 2019-09-18 14:59:20 csc_vladimir \n", + "502 2019-09-18 15:18:23 csc_willem \n", + "565 2019-09-18 15:50:33 csc_yunsheng 10 Git 3\n", + "635 2019-09-20 12:04:58 csc_yuval 12 CMake 2\n", + "20 2019-09-14 17:37:06 jake \n", + "594 2019-09-18 16:09:03 joshfenech 9 Git 2" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# most recent 'Exercise' by user\n", - "t1 = df[df.file.notnull()]\n", + "t1 = df[df.Exercise.notnull()]\n", "t2 = t1.drop_duplicates(['user'], keep='last').sort_values(['user'])\n", "t2[['DATE','user','Exercise']]" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "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", + " \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", + "
DATEIPREMOTE_HOSThostitem1item2item3item4userfile
Exercise
20202020202020202020
1 Testing 11111111111
5 Profiling 11111111111
6 Profiling 21111111111
7 Memory8888888888
9 Git 212121212121212121212
10 Git 313131313131313131313
11 CMake 16666666666
12 CMake 210101010101010101010
\n", + "
" + ], + "text/plain": [ + " DATE IP REMOTE_HOST host item1 item2 item3 item4 user \\\n", + "Exercise \n", + " 20 20 20 20 20 20 20 20 20 \n", + " 1 Testing 1 1 1 1 1 1 1 1 1 1 \n", + " 5 Profiling 1 1 1 1 1 1 1 1 1 1 \n", + " 6 Profiling 2 1 1 1 1 1 1 1 1 1 \n", + " 7 Memory 8 8 8 8 8 8 8 8 8 \n", + " 9 Git 2 12 12 12 12 12 12 12 12 12 \n", + "10 Git 3 13 13 13 13 13 13 13 13 13 \n", + "11 CMake 1 6 6 6 6 6 6 6 6 6 \n", + "12 CMake 2 10 10 10 10 10 10 10 10 10 \n", + "\n", + " file \n", + "Exercise \n", + " 20 \n", + " 1 Testing 1 1 \n", + " 5 Profiling 1 1 \n", + " 6 Profiling 2 1 \n", + " 7 Memory 8 \n", + " 9 Git 2 12 \n", + "10 Git 3 13 \n", + "11 CMake 1 6 \n", + "12 CMake 2 10 " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# most recent by Exercise\n", + "# count most recent by Exercise\n", "t1 = df[df.file.notnull()]\n", - "t2 = t1.drop_duplicates(['user'], keep='last').sort_values(['user'])\n", + "t2 = t1.drop_duplicates(['user'], keep='last')\n", "t2.sort_values(\"Exercise\")\n", "t2.groupby(\"Exercise\").count()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "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", + " \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", + "
DATEIPREMOTE_HOSThostitem1item2item3item4userfile
Exercise
199199199199199199199199199199
1 Testing 150505050505050505050
2 Testing 2 JUnit41414141414141414141
3 Testing 3 CppUnit34343434343434343434
4 Testing 3 PyUnit41414141414141414141
5 Profiling 142424242424242424242
6 Profiling 222222222222222222222
7 Memory50505050505050505050
9 Git 241414141414141414141
10 Git 347474747474747474747
11 CMake 139393939393939393939
12 CMake 230303030303030303030
\n", + "
" + ], + "text/plain": [ + " DATE IP REMOTE_HOST host item1 item2 item3 \\\n", + "Exercise \n", + " 199 199 199 199 199 199 199 \n", + " 1 Testing 1 50 50 50 50 50 50 50 \n", + " 2 Testing 2 JUnit 41 41 41 41 41 41 41 \n", + " 3 Testing 3 CppUnit 34 34 34 34 34 34 34 \n", + " 4 Testing 3 PyUnit 41 41 41 41 41 41 41 \n", + " 5 Profiling 1 42 42 42 42 42 42 42 \n", + " 6 Profiling 2 22 22 22 22 22 22 22 \n", + " 7 Memory 50 50 50 50 50 50 50 \n", + " 9 Git 2 41 41 41 41 41 41 41 \n", + "10 Git 3 47 47 47 47 47 47 47 \n", + "11 CMake 1 39 39 39 39 39 39 39 \n", + "12 CMake 2 30 30 30 30 30 30 30 \n", + "\n", + " item4 user file \n", + "Exercise \n", + " 199 199 199 \n", + " 1 Testing 1 50 50 50 \n", + " 2 Testing 2 JUnit 41 41 41 \n", + " 3 Testing 3 CppUnit 34 34 34 \n", + " 4 Testing 3 PyUnit 41 41 41 \n", + " 5 Profiling 1 42 42 42 \n", + " 6 Profiling 2 22 22 22 \n", + " 7 Memory 50 50 50 \n", + " 9 Git 2 41 41 41 \n", + "10 Git 3 47 47 47 \n", + "11 CMake 1 39 39 39 \n", + "12 CMake 2 30 30 30 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# how many total times for each Exercise\n", - "t1 = df[df.file.notnull()]\n", + "t1 = df[df.Exercise.notnull()]\n", "t1.groupby([\"Exercise\"]).count()" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": null,