summaryrefslogtreecommitdiff
path: root/opendc-experiments/opendc-experiments-greenifier/src/main/Python_scripts/.ipynb_checkpoints/OpenDCdemo-checkpoint.ipynb
blob: 15fc32f659e1719e24041d32099c68c51d8350ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "18170001",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['build.gradle.kts',\n",
       " '.github',\n",
       " 'opendc-web',\n",
       " 'gradle.properties',\n",
       " 'gradlew.bat',\n",
       " 'docker-compose.yml',\n",
       " '.gitignore',\n",
       " 'resources',\n",
       " '.dockerignore',\n",
       " 'opendc-simulator',\n",
       " '.gitattributes',\n",
       " 'traces',\n",
       " 'codecov.yml',\n",
       " 'opendc-experiments',\n",
       " '.editorconfig',\n",
       " 'gradlew',\n",
       " '.gradle',\n",
       " 'site',\n",
       " 'opendc-compute',\n",
       " 'opendc-workflow',\n",
       " 'output',\n",
       " 'CONTRIBUTING.md',\n",
       " 'opendc-trace',\n",
       " 'LICENSE.txt',\n",
       " 'docker-compose.prod.yml',\n",
       " 'CITATION.cff',\n",
       " '.git',\n",
       " 'buildSrc',\n",
       " 'build',\n",
       " 'README.md',\n",
       " 'opendc-common',\n",
       " 'opendc-faas',\n",
       " 'docker-compose.override.yml',\n",
       " '.idea',\n",
       " 'gradle',\n",
       " 'settings.gradle.kts']"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from IPython.display import display, HTML\n",
    "\n",
    "base_folder = \"../../../..\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "422f4d05",
   "metadata": {},
   "source": [
    "## Topologies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a2d05361",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Topology name: multi\n"
     ]
    },
    {
     "ename": "FileNotFoundError",
     "evalue": "[Errno 2] No such file or directory: '../resources/env/multi.txt'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[2], line 6\u001b[0m\n\u001b[1;32m      3\u001b[0m     df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mread_csv(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m../resources/env/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtopology_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.txt\u001b[39m\u001b[38;5;124m\"\u001b[39m, delimiter\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m;\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m      4\u001b[0m     display(HTML(df\u001b[38;5;241m.\u001b[39mto_html()))\n\u001b[0;32m----> 6\u001b[0m \u001b[43mread_topology\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmulti\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m      7\u001b[0m read_topology(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msingle\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
      "Cell \u001b[0;32mIn[2], line 3\u001b[0m, in \u001b[0;36mread_topology\u001b[0;34m(topology_name)\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mread_topology\u001b[39m(topology_name):\n\u001b[1;32m      2\u001b[0m     \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTopology name: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtopology_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m----> 3\u001b[0m     df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_csv\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m../resources/env/\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mtopology_name\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m.txt\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdelimiter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m;\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m      4\u001b[0m     display(HTML(df\u001b[38;5;241m.\u001b[39mto_html()))\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/util/_decorators.py:211\u001b[0m, in \u001b[0;36mdeprecate_kwarg.<locals>._deprecate_kwarg.<locals>.wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    209\u001b[0m     \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m    210\u001b[0m         kwargs[new_arg_name] \u001b[38;5;241m=\u001b[39m new_arg_value\n\u001b[0;32m--> 211\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/util/_decorators.py:317\u001b[0m, in \u001b[0;36mdeprecate_nonkeyword_arguments.<locals>.decorate.<locals>.wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    311\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(args) \u001b[38;5;241m>\u001b[39m num_allow_args:\n\u001b[1;32m    312\u001b[0m     warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m    313\u001b[0m         msg\u001b[38;5;241m.\u001b[39mformat(arguments\u001b[38;5;241m=\u001b[39marguments),\n\u001b[1;32m    314\u001b[0m         \u001b[38;5;167;01mFutureWarning\u001b[39;00m,\n\u001b[1;32m    315\u001b[0m         stacklevel\u001b[38;5;241m=\u001b[39mfind_stack_level(inspect\u001b[38;5;241m.\u001b[39mcurrentframe()),\n\u001b[1;32m    316\u001b[0m     )\n\u001b[0;32m--> 317\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/parsers/readers.py:950\u001b[0m, in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, error_bad_lines, warn_bad_lines, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)\u001b[0m\n\u001b[1;32m    935\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[1;32m    936\u001b[0m     dialect,\n\u001b[1;32m    937\u001b[0m     delimiter,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    946\u001b[0m     defaults\u001b[38;5;241m=\u001b[39m{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelimiter\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m,\u001b[39m\u001b[38;5;124m\"\u001b[39m},\n\u001b[1;32m    947\u001b[0m )\n\u001b[1;32m    948\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[0;32m--> 950\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/parsers/readers.py:605\u001b[0m, in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m    602\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[1;32m    604\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[0;32m--> 605\u001b[0m parser \u001b[38;5;241m=\u001b[39m \u001b[43mTextFileReader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    607\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[1;32m    608\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m parser\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/parsers/readers.py:1442\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m   1439\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m   1441\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m-> 1442\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_engine\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/parsers/readers.py:1729\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[0;34m(self, f, engine)\u001b[0m\n\u001b[1;32m   1727\u001b[0m     is_text \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m   1728\u001b[0m     mode \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrb\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m-> 1729\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;241m=\u001b[39m \u001b[43mget_handle\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m   1730\u001b[0m \u001b[43m    \u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1731\u001b[0m \u001b[43m    \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1732\u001b[0m \u001b[43m    \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1733\u001b[0m \u001b[43m    \u001b[49m\u001b[43mcompression\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcompression\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1734\u001b[0m \u001b[43m    \u001b[49m\u001b[43mmemory_map\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmemory_map\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1735\u001b[0m \u001b[43m    \u001b[49m\u001b[43mis_text\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mis_text\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1736\u001b[0m \u001b[43m    \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding_errors\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstrict\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1737\u001b[0m \u001b[43m    \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstorage_options\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1738\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1739\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m   1740\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles\u001b[38;5;241m.\u001b[39mhandle\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/common.py:857\u001b[0m, in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m    852\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(handle, \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m    853\u001b[0m     \u001b[38;5;66;03m# Check whether the filename is to be opened in binary mode.\u001b[39;00m\n\u001b[1;32m    854\u001b[0m     \u001b[38;5;66;03m# Binary mode does not support 'encoding' and 'newline'.\u001b[39;00m\n\u001b[1;32m    855\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mencoding \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mmode:\n\u001b[1;32m    856\u001b[0m         \u001b[38;5;66;03m# Encoding\u001b[39;00m\n\u001b[0;32m--> 857\u001b[0m         handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m    858\u001b[0m \u001b[43m            \u001b[49m\u001b[43mhandle\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    859\u001b[0m \u001b[43m            \u001b[49m\u001b[43mioargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    860\u001b[0m \u001b[43m            \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mioargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    861\u001b[0m \u001b[43m            \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    862\u001b[0m \u001b[43m            \u001b[49m\u001b[43mnewline\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m    863\u001b[0m \u001b[43m        \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    864\u001b[0m     \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m    865\u001b[0m         \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[1;32m    866\u001b[0m         handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(handle, ioargs\u001b[38;5;241m.\u001b[39mmode)\n",
      "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '../resources/env/multi.txt'"
     ]
    }
   ],
   "source": [
    "def read_topology(topology_name):\n",
    "    print(f\"Topology name: {topology_name}\")\n",
    "    df = pd.read_csv(f\"../resources/env/{topology_name}.txt\", delimiter=\";\")\n",
    "    display(HTML(df.to_html()))\n",
    "        \n",
    "read_topology(\"multi\")\n",
    "read_topology(\"single\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f4fe54d",
   "metadata": {},
   "source": [
    "## Traces"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "fd17d88a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "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>id</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>duration</th>\n",
       "      <th>cpu_count</th>\n",
       "      <th>cpu_usage</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1019</td>\n",
       "      <td>2013-08-12 13:40:46+00:00</td>\n",
       "      <td>300000</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1019</td>\n",
       "      <td>2013-08-12 13:45:46+00:00</td>\n",
       "      <td>300000</td>\n",
       "      <td>1</td>\n",
       "      <td>11.703998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1019</td>\n",
       "      <td>2013-08-12 13:55:46+00:00</td>\n",
       "      <td>600000</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1019</td>\n",
       "      <td>2013-08-12 14:00:46+00:00</td>\n",
       "      <td>300000</td>\n",
       "      <td>1</td>\n",
       "      <td>11.703998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1019</td>\n",
       "      <td>2013-08-12 14:15:46+00:00</td>\n",
       "      <td>900000</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     id                 timestamp  duration  cpu_count  cpu_usage\n",
       "0  1019 2013-08-12 13:40:46+00:00    300000          1   0.000000\n",
       "1  1019 2013-08-12 13:45:46+00:00    300000          1  11.703998\n",
       "2  1019 2013-08-12 13:55:46+00:00    600000          1   0.000000\n",
       "3  1019 2013-08-12 14:00:46+00:00    300000          1  11.703998\n",
       "4  1019 2013-08-12 14:15:46+00:00    900000          1   0.000000"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trace = pd.read_parquet(f\"resources/bitbrains-small/trace/trace.parquet\")\n",
    "trace.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "346f097f",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "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>id</th>\n",
       "      <th>start_time</th>\n",
       "      <th>stop_time</th>\n",
       "      <th>cpu_count</th>\n",
       "      <th>cpu_capacity</th>\n",
       "      <th>mem_capacity</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1019</td>\n",
       "      <td>2013-08-12 13:35:46+00:00</td>\n",
       "      <td>2013-09-11 13:39:58+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>2926.000135</td>\n",
       "      <td>181352</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1023</td>\n",
       "      <td>2013-08-12 13:35:46+00:00</td>\n",
       "      <td>2013-09-11 13:39:58+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>2925.999560</td>\n",
       "      <td>260096</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1026</td>\n",
       "      <td>2013-08-12 13:35:46+00:00</td>\n",
       "      <td>2013-09-11 13:39:58+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>2925.999717</td>\n",
       "      <td>249972</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1052</td>\n",
       "      <td>2013-08-29 14:38:12+00:00</td>\n",
       "      <td>2013-09-05 07:09:07+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>2926.000107</td>\n",
       "      <td>131245</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1073</td>\n",
       "      <td>2013-08-21 11:07:12+00:00</td>\n",
       "      <td>2013-09-11 13:39:58+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>2599.999649</td>\n",
       "      <td>179306</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     id                start_time                 stop_time  cpu_count  \\\n",
       "0  1019 2013-08-12 13:35:46+00:00 2013-09-11 13:39:58+00:00          1   \n",
       "1  1023 2013-08-12 13:35:46+00:00 2013-09-11 13:39:58+00:00          1   \n",
       "2  1026 2013-08-12 13:35:46+00:00 2013-09-11 13:39:58+00:00          1   \n",
       "3  1052 2013-08-29 14:38:12+00:00 2013-09-05 07:09:07+00:00          1   \n",
       "4  1073 2013-08-21 11:07:12+00:00 2013-09-11 13:39:58+00:00          1   \n",
       "\n",
       "   cpu_capacity  mem_capacity  \n",
       "0   2926.000135        181352  \n",
       "1   2925.999560        260096  \n",
       "2   2925.999717        249972  \n",
       "3   2926.000107        131245  \n",
       "4   2599.999649        179306  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "meta = pd.read_parquet(f\"resources/bitbrains-small/trace/meta.parquet\")\n",
    "meta.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "13bf9fdb",
   "metadata": {},
   "source": [
    "# Lets run this in OpenDC!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c9766446",
   "metadata": {},
   "source": [
    "## Resulting Files"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "0d400ffd",
   "metadata": {},
   "outputs": [],
   "source": [
    "output_folder = \"output\"\n",
    "workload = \"workload=bitbrains-small\"\n",
    "seed = \"seed=0\"\n",
    "\n",
    "df_host_multi = pd.read_parquet(f\"{output_folder}/host/topology=multi/{workload}/{seed}/data.parquet\")\n",
    "df_host_single = pd.read_parquet(f\"{output_folder}/host/topology=single/{workload}/{seed}/data.parquet\")\n",
    "\n",
    "df_server_multi = pd.read_parquet(f\"{output_folder}/server/topology=multi/{workload}/{seed}/data.parquet\")\n",
    "df_server_single = pd.read_parquet(f\"{output_folder}/server/topology=single/{workload}/{seed}/data.parquet\")\n",
    "\n",
    "df_service_multi = pd.read_parquet(f\"{output_folder}/service/topology=multi/{workload}/{seed}/data.parquet\")\n",
    "df_service_single = pd.read_parquet(f\"{output_folder}/service/topology=single/{workload}/{seed}/data.parquet\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d494d6e",
   "metadata": {},
   "source": [
    "### Host"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "48a1e1a6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['timestamp',\n",
       " 'host_id',\n",
       " 'cpu_count',\n",
       " 'mem_capacity',\n",
       " 'guests_terminated',\n",
       " 'guests_running',\n",
       " 'guests_error',\n",
       " 'guests_invalid',\n",
       " 'cpu_limit',\n",
       " 'cpu_usage',\n",
       " 'cpu_demand',\n",
       " 'cpu_utilization',\n",
       " 'cpu_time_active',\n",
       " 'cpu_time_idle',\n",
       " 'cpu_time_steal',\n",
       " 'cpu_time_lost',\n",
       " 'power_total',\n",
       " 'uptime',\n",
       " 'downtime',\n",
       " 'boot_time']"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "number of measurements: 77778\n"
     ]
    }
   ],
   "source": [
    "display(list(df_host_multi.columns))\n",
    "print(f\"number of measurements: {len(df_host_multi)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9eb9be2c",
   "metadata": {},
   "source": [
    "### Server"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "57a2b148",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['timestamp',\n",
       " 'server_id',\n",
       " 'host_id',\n",
       " 'uptime',\n",
       " 'downtime',\n",
       " 'provision_time',\n",
       " 'boot_time',\n",
       " 'cpu_count',\n",
       " 'cpu_limit',\n",
       " 'cpu_time_active',\n",
       " 'cpu_time_idle',\n",
       " 'cpu_time_steal',\n",
       " 'cpu_time_lost',\n",
       " 'mem_limit']"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "number of measurements: 408040\n"
     ]
    }
   ],
   "source": [
    "display(list(df_server_multi.columns))\n",
    "print(f\"number of measurements: {len(df_server_multi)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fbe5f439",
   "metadata": {},
   "source": [
    "### Service"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "9ef468ed",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['timestamp',\n",
       " 'hosts_up',\n",
       " 'hosts_down',\n",
       " 'servers_pending',\n",
       " 'servers_active',\n",
       " 'attempts_success',\n",
       " 'attempts_failure',\n",
       " 'attempts_error']"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "number of measurements: 8642\n"
     ]
    }
   ],
   "source": [
    "display(list(df_service_single.columns))\n",
    "print(f\"number of measurements: {len(df_host_single)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09d31c91",
   "metadata": {},
   "source": [
    "## Power Usage"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "82f0a24a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "big topology:   3400876.9739568997\n",
      "small topology: 60000.000858306885\n"
     ]
    }
   ],
   "source": [
    "print(f\"big topology:   {df_host_multi.power_total.sum()}\")\n",
    "print(f\"small topology: {df_host_single.power_total.sum()}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ab3357d",
   "metadata": {},
   "source": [
    "## CPU usage"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "e94db3a6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "big topology:   2.352397194967523e-05\n",
      "small topology: 0.00011571395510298542\n"
     ]
    }
   ],
   "source": [
    "print(f\"big topology:   {df_host_multi.cpu_utilization.mean()}\")\n",
    "print(f\"small topology: {df_host_single.cpu_utilization.mean()}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e000a260",
   "metadata": {},
   "source": [
    "## CPU utilization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "8d7daa45",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "big topology:   2.352397194967523e-05\n",
      "small topology: 0.00011571395510298542\n"
     ]
    }
   ],
   "source": [
    "print(f\"big topology:   {df_host_multi.cpu_utilization.mean()}\")\n",
    "print(f\"small topology: {df_host_single.cpu_utilization.mean()}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad97741c",
   "metadata": {},
   "source": [
    "## Plotting Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5df8f9aa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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OnjwoL3N39/fHmwkKTw83H4KDIBrWLkBIElq27atLBaLDh06VKn+Tz/9tEaOHKl69eopNDRUFovF/llgYKC+++67cmN++eUXeXt7V3jaS5K8vC79/9Zvg9ZvT+G4U1ZWlu6991498sgjGj16tL29oKBAsbGxio2N1TvvvKPGjRsrIyNDsbGx1XLazcfHx+G9xWJxOmgCcMTKDQBJl+70iY2NVVJSkgoKCsp9/vvbnoODg9WmTRuFhYU5BBtJat++vb755hsVFhY6tO/fv18tW7Ys94V+WePGjSXJ4YLa3z+bxmq1qrS0tLKHVaGLFy9q0KBB6tChgxYtWuTw2aFDh/Tjjz9q7ty56tu3rzp06FBuJcVqtUrSVevo2LGjSkpKtHv3bnvbjz/+qMOHD6tTp05Vqh/A1RFuANglJSWptLRUPXv21IcffqijR4/q4MGDWrJkiaKjoyu9nWHDhslisSguLk779u3TsWPHtGLFCi1evFhPPvnkFce1adNGNptNzz33nI4ePaqNGzdq4cKFDn0iIiJ0/vx5JScn69y5c7pw4YLTx/noo4/q9OnTWrJkiXJycpSVlaWsrCwVFRWpefPmslqtevXVV3XixAlt2LCh3LNrWrRoIYvFoo8//lg5OTk6f/58uX20bdtWgwYN0pgxY7Rjxw599dVXeuihh9S0aVMNGjTI6ZoBVB7hBoBdq1attH//fvXr109PPvmkOnfurP79+ys5OVmvv/56pbdTv359ff755youLta9996ryMhILVmyRIsWLdKjjz56xXE+Pj567733dOjQId10002aN2+eXnjhBYc+vXr10mOPPaYhQ4aocePGmj9/vtPH+b//+7/KzMxUp06dFB4ebn/t2rVLjRs31qpVq7R27Vp16tRJc+fO1UsvveQwvmnTppo1a5amTJmi0NBQTZgwocL9rFy5Ut26ddO//du/KTo6WoZhaNOmTVdcuQLgHhaDk7sAAMBEWLkBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACm8v8BjCGIOvW4gUwAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "data = df_host_multi.cpu_utilization\n",
    "plt.hist(data, weights=np.ones_like(data) / len(data),\n",
    "         alpha=0.7, label=\"big\", bins=30)\n",
    "\n",
    "\n",
    "data = df_host_single.cpu_utilization\n",
    "plt.hist(data, weights=np.ones_like(data) / len(data),\n",
    "         alpha=0.7, label=\"small\", bins=30)\n",
    "\n",
    "plt.xlabel(\"CPU utilization\")\n",
    "plt.ylabel(\"Frequency\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "520e42a4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0    8641\n",
       "1.0       1\n",
       "Name: cpu_utilization, dtype: int64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_host_single.cpu_utilization.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a8c35267",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([b'\\xf8\\x8b\\xb8\\xa8rL\\x81\\xec\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02',\n",
       "       b'\\x1b9\\x89jQ\\xa8t\\x9b\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03',\n",
       "       b'\\xc5\\x84\\x13:\\xc9\\x16\\xab<\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00',\n",
       "       b'S\\xcb\\x9f\\x0ct~\\xa2\\xea\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04',\n",
       "       b'\\xe2 \\xa89{\\x1d\\xcd\\xaf\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00',\n",
       "       b'\\x06\\xc4]\\x18\\x80\\tEO\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01',\n",
       "       b',\\x82\\x9a\\xbe\\x1fE2\\xe1\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x05',\n",
       "       b'>\\xe5x\\x90A\\xc9\\x8a\\xc3\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01',\n",
       "       b'nx\\x9ej\\xa1\\xb9e\\xf4\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_host_multi.host_id.unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "68546b09",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "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>timestamp</th>\n",
       "      <th>hosts_up</th>\n",
       "      <th>hosts_down</th>\n",
       "      <th>servers_pending</th>\n",
       "      <th>servers_active</th>\n",
       "      <th>attempts_success</th>\n",
       "      <th>attempts_failure</th>\n",
       "      <th>attempts_error</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1970-01-01 00:05:00+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>44</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1970-01-01 00:10:00+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>29</td>\n",
       "      <td>15</td>\n",
       "      <td>15</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1970-01-01 00:15:00+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>29</td>\n",
       "      <td>15</td>\n",
       "      <td>15</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1970-01-01 00:20:00+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>29</td>\n",
       "      <td>15</td>\n",
       "      <td>15</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1970-01-01 00:25:00+00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>29</td>\n",
       "      <td>15</td>\n",
       "      <td>15</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8637</th>\n",
       "      <td>1970-01-30 23:50:00+00:00</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>49</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8638</th>\n",
       "      <td>1970-01-30 23:55:00+00:00</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>49</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8639</th>\n",
       "      <td>1970-01-31 00:00:00+00:00</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>49</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8640</th>\n",
       "      <td>1970-01-31 00:05:00+00:00</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>49</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8641</th>\n",
       "      <td>1970-01-31 00:10:00+00:00</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>49</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8642 rows × 8 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                     timestamp  hosts_up  hosts_down  servers_pending  \\\n",
       "0    1970-01-01 00:05:00+00:00         1           0               44   \n",
       "1    1970-01-01 00:10:00+00:00         1           0               29   \n",
       "2    1970-01-01 00:15:00+00:00         1           0               29   \n",
       "3    1970-01-01 00:20:00+00:00         1           0               29   \n",
       "4    1970-01-01 00:25:00+00:00         1           0               29   \n",
       "...                        ...       ...         ...              ...   \n",
       "8637 1970-01-30 23:50:00+00:00         0           1                0   \n",
       "8638 1970-01-30 23:55:00+00:00         0           1                0   \n",
       "8639 1970-01-31 00:00:00+00:00         0           1                0   \n",
       "8640 1970-01-31 00:05:00+00:00         0           1                0   \n",
       "8641 1970-01-31 00:10:00+00:00         0           1                0   \n",
       "\n",
       "      servers_active  attempts_success  attempts_failure  attempts_error  \n",
       "0                  0                 0                 0               0  \n",
       "1                 15                15                 0               0  \n",
       "2                 15                15                 0               0  \n",
       "3                 15                15                 0               0  \n",
       "4                 15                15                 0               0  \n",
       "...              ...               ...               ...             ...  \n",
       "8637               0                49                 1               0  \n",
       "8638               0                49                 1               0  \n",
       "8639               0                49                 1               0  \n",
       "8640               0                49                 1               0  \n",
       "8641               0                49                 1               0  \n",
       "\n",
       "[8642 rows x 8 columns]"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_service_single"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "5b9ccf81",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     6189\n",
       "1     1828\n",
       "2      612\n",
       "44      13\n",
       "Name: servers_active, dtype: int64"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_service_multi.servers_active.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9e9bd9b9",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}