{ "metadata": { "celltoolbar": "Slideshow", "name": "", "signature": "sha256:0073a018dfe14cff3d3437503896a432904fd1cdf818f9b9dc4ba5b53887be92" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": { "internals": { "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "SharkFest 2014\n", "==============\n", "\n", "Packet Analysis with SteelScript for Python \n", "-------------------------------------------\n", "\n", "**Christopher J. White**
\n", "cwhite@riverbed.com
\n", "Riverbed Technology" ] }, { "cell_type": "markdown", "metadata": { "internals": { "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "Overview\n", "========\n", "\n", "* Visualizing with SteelScript Application Framework\n", "* Tools in my toolbox\n", "* Python Pandas\n", "* PCAP Analysis with SteelScript\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "SteelScript Application Framework\n", "=================================\n", "\n", "PCAP File: `/ws/sharkfest2014/oneday.pcap`\n", "\n", "* `ip.len` field over time\n", "* 95th and 80th percential\n", "* Exponential Weighted Moving Average (EWMA)\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "internals": { "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "Tools: IPython\n", "==============\n", "\n", "* Powerful interactive shells (terminal and Qt-based).\n", "* A browser-based notebook with support for code, text, mathematical expressions, inline plots and other rich media.\n", "* Support for interactive data visualization and use of GUI toolkits.\n", "* Flexible, embeddable interpreters to load into your own projects.\n", "* Easy to use, high performance tools for parallel computing.\n", "\n", "Installation\n", "------------\n", "\n", " > pip install ipython" ] }, { "cell_type": "markdown", "metadata": { "internals": { "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "subslide" } }, "source": [ "Tools: pandas - Python Data Analysis Library\n", "=====================================\n", "\n", "pandas is an open source, BSD-licensed library providing high-performance, easy-to-use data structures and data analysis tools for the Python programming language \n", "\n", " * **Series** - array of data with an optional index\n", " * **DataFrame** - 2D array of data hierarchical row and column indexing\n", " \n", "Installation\n", "------------\n", "\n", "Linux / Mac with dev tools?\n", "\n", " > pip install pandas\n", "\n", "Otherwise see [pandas.pydata.org](http://pandas.pydata.org/)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Tools: matlibplot - Python Plotting\n", "===================================\n", "matlibplot hooks in with IPython notebook to provide in browser graphs." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "x = np.linspace(0, 2)\n", "y = np.sin(4 * np.pi * x) * np.exp(-5 * x)\n", "\n", "plt.fill(x, y, 'r')\n", "plt.grid(True)\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Tools: SteelScript Application Framework\n", "========================================\n", "\n", "* Web front end for simple user interface\n", "* Design custom reports\n", " * mix and match widgets and data\n", " * define custom criteria\n", "* Custom analysis via Python hooks and Python Pandas\n", " * compute statistics, pivot tables, merge, sort, resample timeseries\n", "* Plugin architecture makes it easy to share modules\n", " \n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "pandas\n", "======\n", "\n", "Primary object types:\n", "\n", "* **Series** - 1 dimensional array of element\n", "* **DataFrames** - 2 dimensional array of elements\n", "\n", "Data is stored is compact binary form for efficiency of operation.\n", "\n", "Supports both row and column indexing by name." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "pandas: Series\n", "==============\n", "\n", "A **Series** is similar to a standard Python **list**, however much more efficient in memory and computation." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pandas, numpy\n", "s = pandas.Series([10, 23, 19, 15, 56, 15, 41])\n", "print type(s)" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "s" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "0 10\n", "1 23\n", "2 19\n", "3 15\n", "4 56\n", "5 15\n", "6 41\n", "dtype: int64" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "s.sum(), s.min(), s.max(), s.mean()" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "(179, 10, 56, 25.571428571428573)" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Consider processing **1,000,000** random entries in a standard list:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%time\n", "s = list(numpy.random.randn(1000000))" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 147 ms, sys: 19.1 ms, total: 166 ms\n", "Wall time: 166 ms\n" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "%%time\n", "print min(s), max(s), sum(s)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "-5.15466016548 4.83339730438 " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "1070.4119682\n", "CPU times: user 384 ms, sys: 966 \u00b5s, total: 385 ms\n", "Wall time: 384 ms\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Now, consider processing **1,000,000** random entries in a pandas **Series**:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%time\n", "s = pandas.Series(numpy.random.randn(1000000))\n", "len(s)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 153 ms, sys: 12.6 ms, total: 166 ms\n", "Wall time: 166 ms\n" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "%%time\n", "print s.min(), s.max(), s.sum()" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "-4.88164961037 4.76370359345 1151.10605833\n", "CPU times: user 19.6 ms, sys: 5.19 ms, total: 24.8 ms\n", "Wall time: 24.1 ms\n" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "del s" ], "language": "python", "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": { "internals": { "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "pandas: DataFrame\n", "=================\n", "\n", "A DataFrame is typically loaded from a file, but my be created from a list of lists:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pandas\n", "df = pandas.DataFrame(\n", " [['Boston', '10.1.1.1', 10, 2356, 0.100],\n", " ['Boston', '10.1.1.2', 23, 16600, 0.112],\n", " ['Boston', '10.1.1.15', 19, 22600, 0.085],\n", " ['SanFran', '10.38.5.1', 15, 10550, 0.030],\n", " ['SanFran', '10.38.8.2', 56, 35000, 0.020],\n", " ['London', '192.168.4.6', 15, 3400, 0.130],\n", " ['London', '192.168.5.72', 41, 55000, 0.120]],\n", " columns = ['location', 'ip', 'pkts', 'bytes', 'rtt'])" ], "language": "python", "metadata": { "internals": {}, "slideshow": { "slide_type": "-" } }, "outputs": [], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "Each column's data type is automatically detected based on contents." ] }, { "cell_type": "code", "collapsed": false, "input": [ "df.dtypes" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "location object\n", "ip object\n", "pkts int64\n", "bytes int64\n", "rtt float64\n", "dtype: object" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "IPython has special support for displaying **DataFrames**" ] }, { "cell_type": "code", "collapsed": false, "input": [ "df" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
locationippktsbytesrtt
0 Boston 10.1.1.1 10 2356 0.100
1 Boston 10.1.1.2 23 16600 0.112
2 Boston 10.1.1.15 19 22600 0.085
3 SanFran 10.38.5.1 15 10550 0.030
4 SanFran 10.38.8.2 56 35000 0.020
5 London 192.168.4.6 15 3400 0.130
6 London 192.168.5.72 41 55000 0.120
\n", "

7 rows \u00d7 5 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ " location ip pkts bytes rtt\n", "0 Boston 10.1.1.1 10 2356 0.100\n", "1 Boston 10.1.1.2 23 16600 0.112\n", "2 Boston 10.1.1.15 19 22600 0.085\n", "3 SanFran 10.38.5.1 15 10550 0.030\n", "4 SanFran 10.38.8.2 56 35000 0.020\n", "5 London 192.168.4.6 15 3400 0.130\n", "6 London 192.168.5.72 41 55000 0.120\n", "\n", "[7 rows x 5 columns]" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "pandas: DataFrame operations\n", "============================\n", "The DataFrame supports a number of operations directly" ] }, { "cell_type": "code", "collapsed": false, "input": [ "df.mean()" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "pkts 25.571429\n", "bytes 20786.571429\n", "rtt 0.085286\n", "dtype: float64" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "source": [ "Notice that `location` and `ip` are string columns, thus there is no operation 'mean' for such columns." ] }, { "cell_type": "code", "collapsed": false, "input": [ "df.sum()" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "location BostonBostonBostonSanFranSanFranLondonLondon\n", "ip 10.1.1.110.1.1.210.1.1.1510.38.5.110.38.8.2192...\n", "pkts 179\n", "bytes 145506\n", "rtt 0.597\n", "dtype: object" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "source": [ "In the case of sum(), it is possible to add strings, so `location` and `ip` are included in the results.\n", "*(Be careful, on large data sets this can backfire!)*" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "pandas: Selecting a Column\n", "==========================\n", "Each column of data in a **DataFrame** can be extracted by the standard indexing operator:\n", "\n", " df[_colname_]\n", " \n", "The result is a **Series**." ] }, { "cell_type": "code", "collapsed": false, "input": [ "df['location']" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "0 Boston\n", "1 Boston\n", "2 Boston\n", "3 SanFran\n", "4 SanFran\n", "5 London\n", "6 London\n", "Name: location, dtype: object" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "df['pkts']" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "0 10\n", "1 23\n", "2 19\n", "3 15\n", "4 56\n", "5 15\n", "6 41\n", "Name: pkts, dtype: int64" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "pandas: Selecting Rows\n", "======================\n", "Selecting a subset of rows based by index works just like array slicing:\n", "\n", " df[_start_:_end_]\n", " \n", "Note that the `:` is always required, but `` and `` are optional. This will return all rows with an index greater than or equal to ``, up to but not including ``" ] }, { "cell_type": "code", "collapsed": false, "input": [ "df[:2]" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "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", "
locationippktsbytesrtt
0 Boston 10.1.1.1 10 2356 0.100
1 Boston 10.1.1.2 23 16600 0.112
\n", "

2 rows \u00d7 5 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ " location ip pkts bytes rtt\n", "0 Boston 10.1.1.1 10 2356 0.100\n", "1 Boston 10.1.1.2 23 16600 0.112\n", "\n", "[2 rows x 5 columns]" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "df[2:4]" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "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", "
locationippktsbytesrtt
2 Boston 10.1.1.15 19 22600 0.085
3 SanFran 10.38.5.1 15 10550 0.030
\n", "

2 rows \u00d7 5 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ " location ip pkts bytes rtt\n", "2 Boston 10.1.1.15 19 22600 0.085\n", "3 SanFran 10.38.5.1 15 10550 0.030\n", "\n", "[2 rows x 5 columns]" ] } ], "prompt_number": 18 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "pandas: Filtering Rows\n", "======================\n", "\n", "DataFrame rows can be filtered using boolean expressions\n", "\n", " df[_boolean_expression_]" ] }, { "cell_type": "code", "collapsed": false, "input": [ "df[df['location'] == 'Boston']" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "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", "
locationippktsbytesrtt
0 Boston 10.1.1.1 10 2356 0.100
1 Boston 10.1.1.2 23 16600 0.112
2 Boston 10.1.1.15 19 22600 0.085
\n", "

3 rows \u00d7 5 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ " location ip pkts bytes rtt\n", "0 Boston 10.1.1.1 10 2356 0.100\n", "1 Boston 10.1.1.2 23 16600 0.112\n", "2 Boston 10.1.1.15 19 22600 0.085\n", "\n", "[3 rows x 5 columns]" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "df[df['pkts'] < 20]" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "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", "
locationippktsbytesrtt
0 Boston 10.1.1.1 10 2356 0.100
2 Boston 10.1.1.15 19 22600 0.085
3 SanFran 10.38.5.1 15 10550 0.030
5 London 192.168.4.6 15 3400 0.130
\n", "

4 rows \u00d7 5 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ " location ip pkts bytes rtt\n", "0 Boston 10.1.1.1 10 2356 0.100\n", "2 Boston 10.1.1.15 19 22600 0.085\n", "3 SanFran 10.38.5.1 15 10550 0.030\n", "5 London 192.168.4.6 15 3400 0.130\n", "\n", "[4 rows x 5 columns]" ] } ], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Expressions can be combined to provide more complex filtering:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "df[(df['location'] == 'Boston') & (df['pkts'] < 20)]" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
locationippktsbytesrtt
0 Boston 10.1.1.1 10 2356 0.100
2 Boston 10.1.1.15 19 22600 0.085
\n", "

2 rows \u00d7 5 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ " location ip pkts bytes rtt\n", "0 Boston 10.1.1.1 10 2356 0.100\n", "2 Boston 10.1.1.15 19 22600 0.085\n", "\n", "[2 rows x 5 columns]" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "The boolean expression is actually a **Series** of True/False values of the same length as the number of rows, thus can actually be assigned as a series:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "bos = df['location'] == 'Boston'\n", "print type(bos)\n", "bos" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "0 True\n", "1 True\n", "2 True\n", "3 False\n", "4 False\n", "5 False\n", "6 False\n", "Name: location, dtype: bool" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "pkts_lt_20 = (df['pkts'] < 20)\n", "df[bos & pkts_lt_20]" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
locationippktsbytesrtt
0 Boston 10.1.1.1 10 2356 0.100
2 Boston 10.1.1.15 19 22600 0.085
\n", "

2 rows \u00d7 5 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 23, "text": [ " location ip pkts bytes rtt\n", "0 Boston 10.1.1.1 10 2356 0.100\n", "2 Boston 10.1.1.15 19 22600 0.085\n", "\n", "[2 rows x 5 columns]" ] } ], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Use single \"`&`\" and \"`|`\" and parenthesis for constructing arbitrary boolean expressions. Use \"`~`\" for negation.\n", "\n", "The result of a filtering operation is a new **DataFrame** object" ] }, { "cell_type": "code", "collapsed": false, "input": [ "df2 = df[bos & pkts_lt_20]\n", "print 'Length:', len(df2)\n", "df2" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Length: 2\n" ] }, { "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", "
locationippktsbytesrtt
0 Boston 10.1.1.1 10 2356 0.100
2 Boston 10.1.1.15 19 22600 0.085
\n", "

2 rows \u00d7 5 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ " location ip pkts bytes rtt\n", "0 Boston 10.1.1.1 10 2356 0.100\n", "2 Boston 10.1.1.15 19 22600 0.085\n", "\n", "[2 rows x 5 columns]" ] } ], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "pandas: Selecting Multiple Columns\n", "==================================\n", "\n", "A new **DataFrame** can be constructed from a subset of another DataFrame using the ``ix[]`` operator.\n", "\n", " DataFrame.ix[_row_expr_,_column_lise_]" ] }, { "cell_type": "code", "collapsed": false, "input": [ "locrtt = df.ix[:,['location', 'rtt']]\n", "locrtt" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
locationrtt
0 Boston 0.100
1 Boston 0.112
2 Boston 0.085
3 SanFran 0.030
4 SanFran 0.020
5 London 0.130
6 London 0.120
\n", "

7 rows \u00d7 2 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ " location rtt\n", "0 Boston 0.100\n", "1 Boston 0.112\n", "2 Boston 0.085\n", "3 SanFran 0.030\n", "4 SanFran 0.020\n", "5 London 0.130\n", "6 London 0.120\n", "\n", "[7 rows x 2 columns]" ] } ], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "The first argument to the `ix[]` indexer is actually expected to be a boolean Series. This makes it possible to select rows and columns in a single operation. The use of \":\" above is short-hand for *all* rows." ] }, { "cell_type": "code", "collapsed": false, "input": [ "boslocrtt = df.ix[bos,['location', 'rtt']]\n", "boslocrtt" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
locationrtt
0 Boston 0.100
1 Boston 0.112
2 Boston 0.085
\n", "

3 rows \u00d7 2 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 26, "text": [ " location rtt\n", "0 Boston 0.100\n", "1 Boston 0.112\n", "2 Boston 0.085\n", "\n", "[3 rows x 2 columns]" ] } ], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "pandas: Adding Columns\n", "======================\n", "\n", "New columns (**Series**) be added to a **DataFrame** in one of three ways:\n", "\n", "* A constant value for all rows\n", "* Supplying a `list` matching the number of rows\n", "* Expression based on constants and **Series** objects of the same size" ] }, { "cell_type": "code", "collapsed": false, "input": [ "df['co'] = 'RVBD'\n", "df['proto'] = ['tcp', 'tcp', 'udp', 'udp', 'tcp', 'tcp', 'udp']\n", "df['Bpp'] = df['bytes'] / df['pkts'] # Bytes per packet\n", "df['bpp'] = 8 * df['bytes'] / df['pkts']\n", "df['slow'] = df['rtt'] >= 0.1\n", "df.ix[:,['ip', 'proto', 'Bpp', 'bpp', 'slow', 'delay', 'co']]" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "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", "
ipprotoBppbppslowdelayco
0 10.1.1.1 tcp 235.600000 1884.800000 TrueNaN RVBD
1 10.1.1.2 tcp 721.739130 5773.913043 TrueNaN RVBD
2 10.1.1.15 udp 1189.473684 9515.789474 FalseNaN RVBD
3 10.38.5.1 udp 703.333333 5626.666667 FalseNaN RVBD
4 10.38.8.2 tcp 625.000000 5000.000000 FalseNaN RVBD
5 192.168.4.6 tcp 226.666667 1813.333333 TrueNaN RVBD
6 192.168.5.72 udp 1341.463415 10731.707317 TrueNaN RVBD
\n", "

7 rows \u00d7 7 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ " ip proto Bpp bpp slow delay co\n", "0 10.1.1.1 tcp 235.600000 1884.800000 True NaN RVBD\n", "1 10.1.1.2 tcp 721.739130 5773.913043 True NaN RVBD\n", "2 10.1.1.15 udp 1189.473684 9515.789474 False NaN RVBD\n", "3 10.38.5.1 udp 703.333333 5626.666667 False NaN RVBD\n", "4 10.38.8.2 tcp 625.000000 5000.000000 False NaN RVBD\n", "5 192.168.4.6 tcp 226.666667 1813.333333 True NaN RVBD\n", "6 192.168.5.72 udp 1341.463415 10731.707317 True NaN RVBD\n", "\n", "[7 rows x 7 columns]" ] } ], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "pandas: Grouping and Aggregating\n", "================================\n", "\n", "A common operation is to group data by a key column or set of of key columns. The groups rows that share the same value for all key columns producing one row per unique key pair:\n", "\n", " df.groupby(_key_columns_]\n", " \n", "For example, to group by the `location` column:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "gb = df.groupby('location')\n", "print type(gb)\n", "gb.indices" ], "language": "python", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 28, "text": [ "{'Boston': array([0, 1, 2]), 'London': array([5, 6]), 'SanFran': array([3, 4])}" ] } ], "prompt_number": 28 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "The result of a grouping operation is a **GroupBy** object. The above ``indices`` shows you the row numbers for the grouped data. The data of a **GroupBy** object cannot be inspected directly until aggregated." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The ``groupby()`` operation is usually followed by an ``aggregate()`` call to combine the values of all related rows in each column.\n", "\n", "In one form, the ``aggregate()`` call takes a dictionary indicating the operation to perform on each column to comine values:\n", "\n", " GroupBy.aggregate({: ,\n", " : ,\n", " ... })\n", " \n", "Only columns listed in the dictionary will be returned in the resulting DataFrame." ] }, { "cell_type": "code", "collapsed": false, "input": [ "gb.aggregate({'pkts': 'sum',\n", " 'rtt': 'mean'})" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "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", "
pktsrtt
location
Boston 52 0.099
London 56 0.125
SanFran 71 0.025
\n", "

3 rows \u00d7 2 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ " pkts rtt\n", "location \n", "Boston 52 0.099\n", "London 56 0.125\n", "SanFran 71 0.025\n", "\n", "[3 rows x 2 columns]" ] } ], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "By copying columns, it is possible to compute alternate operations on the same data, producing different aggregated results:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "df2 = df.ix[:,['location', 'pkts', 'rtt']]\n", "df2['peak_rtt'] = df['rtt']\n", "df2['min_rtt'] = df['rtt']\n", "df2" ], "language": "python", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
locationpktsrttpeak_rttmin_rtt
0 Boston 10 0.100 0.100 0.100
1 Boston 23 0.112 0.112 0.112
2 Boston 19 0.085 0.085 0.085
3 SanFran 15 0.030 0.030 0.030
4 SanFran 56 0.020 0.020 0.020
5 London 15 0.130 0.130 0.130
6 London 41 0.120 0.120 0.120
\n", "

7 rows \u00d7 5 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ " location pkts rtt peak_rtt min_rtt\n", "0 Boston 10 0.100 0.100 0.100\n", "1 Boston 23 0.112 0.112 0.112\n", "2 Boston 19 0.085 0.085 0.085\n", "3 SanFran 15 0.030 0.030 0.030\n", "4 SanFran 56 0.020 0.020 0.020\n", "5 London 15 0.130 0.130 0.130\n", "6 London 41 0.120 0.120 0.120\n", "\n", "[7 rows x 5 columns]" ] } ], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "agg = (df2.groupby('location')\n", " .aggregate({'pkts': 'sum',\n", " 'rtt': 'mean',\n", " 'peak_rtt': 'max',\n", " 'min_rtt': 'min'}))\n", "agg" ], "language": "python", "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "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", "
pktsrttmin_rttpeak_rtt
location
Boston 52 0.099 0.085 0.112
London 56 0.125 0.120 0.130
SanFran 71 0.025 0.020 0.030
\n", "

3 rows \u00d7 4 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 31, "text": [ " pkts rtt min_rtt peak_rtt\n", "location \n", "Boston 52 0.099 0.085 0.112\n", "London 56 0.125 0.120 0.130\n", "SanFran 71 0.025 0.020 0.030\n", "\n", "[3 rows x 4 columns]" ] } ], "prompt_number": 31 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "pandas: Indexing\n", "================\n", "\n", "Notice that the output of the preview groupby/aggregate operation looked a bit different from previous data frames, the first column is in bold:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "agg" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
pktsrttmin_rttpeak_rtt
location
Boston 52 0.099 0.085 0.112
London 56 0.125 0.120 0.130
SanFran 71 0.025 0.020 0.030
\n", "

3 rows \u00d7 4 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 32, "text": [ " pkts rtt min_rtt peak_rtt\n", "location \n", "Boston 52 0.099 0.085 0.112\n", "London 56 0.125 0.120 0.130\n", "SanFran 71 0.025 0.020 0.030\n", "\n", "[3 rows x 4 columns]" ] } ], "prompt_number": 32 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "The bold rows/columns indicate that the **DataFrame** is *indexed*. " ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Let's look at the DataFrame without the index -- by calling `reset_index()`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "agg.reset_index()" ], "language": "python", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
locationpktsrttmin_rttpeak_rtt
0 Boston 52 0.099 0.085 0.112
1 London 56 0.125 0.120 0.130
2 SanFran 71 0.025 0.020 0.030
\n", "

3 rows \u00d7 5 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 33, "text": [ " location pkts rtt min_rtt peak_rtt\n", "0 Boston 52 0.099 0.085 0.112\n", "1 London 56 0.125 0.120 0.130\n", "2 SanFran 71 0.025 0.020 0.030\n", "\n", "[3 rows x 5 columns]" ] } ], "prompt_number": 33 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Indexing a **DataFrame** makes the data in the indexed column to meta-data associated with the object. This index is carried on to **Series** objects:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "agg['pkts']" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 34, "text": [ "location\n", "Boston 52\n", "London 56\n", "SanFran 71\n", "Name: pkts, dtype: int64" ] } ], "prompt_number": 34 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "source": [ "The resulting series still acts like an array, but may be indexed by either a numeric row value or a location name:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print \"Boston:\", agg['pkts']['Boston']\n", "print \"Item 0:\", agg['pkts'][0]" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Boston: 52\n", "Item 0: 52\n" ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "df = df.ix[:,['location', 'ip', 'pkts', 'bytes', 'rtt', 'slow']]" ], "language": "python", "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "prompt_number": 36 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "pandas: Modifying a Subset of Rows\n", "==================================\n", "\n", "Often it is useful to assign a subset of rows in a column. This is possible by assigning a value to the result of the `ix[]` indexer: \n", "\n", " DataFrame.ix[_row_expr_, _column_list_>] = \n", " \n", "When used in this form, the **DataFrame** object indexed is modified in place.\n", "\n", "Let's use this method to assign a value of 'slow', 'normal', or 'fast' to a new 'delay' column based on rtt:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "df['delay'] = ''\n", "df" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
locationippktsbytesrttslowdelay
0 Boston 10.1.1.1 10 2356 0.100 True
1 Boston 10.1.1.2 23 16600 0.112 True
2 Boston 10.1.1.15 19 22600 0.085 False
3 SanFran 10.38.5.1 15 10550 0.030 False
4 SanFran 10.38.8.2 56 35000 0.020 False
5 London 192.168.4.6 15 3400 0.130 True
6 London 192.168.5.72 41 55000 0.120 True
\n", "

7 rows \u00d7 7 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 37, "text": [ " location ip pkts bytes rtt slow delay\n", "0 Boston 10.1.1.1 10 2356 0.100 True \n", "1 Boston 10.1.1.2 23 16600 0.112 True \n", "2 Boston 10.1.1.15 19 22600 0.085 False \n", "3 SanFran 10.38.5.1 15 10550 0.030 False \n", "4 SanFran 10.38.8.2 56 35000 0.020 False \n", "5 London 192.168.4.6 15 3400 0.130 True \n", "6 London 192.168.5.72 41 55000 0.120 True \n", "\n", "[7 rows x 7 columns]" ] } ], "prompt_number": 37 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Compute boolean **Series** for each range of rtt:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "slow_rows = (df['rtt'] > 0.110)\n", "normal_rows = ((df['rtt'] > 0.050) & (~slow_rows))\n", "fast_rows = ((~slow_rows) & (~normal_rows))" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "df.ix[slow_rows,'delay'] = 'slow'\n", "df.ix[normal_rows, 'delay'] = 'normal'\n", "df.ix[fast_rows, 'delay'] = 'fast'\n", "df" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
locationippktsbytesrttslowdelay
0 Boston 10.1.1.1 10 2356 0.100 True normal
1 Boston 10.1.1.2 23 16600 0.112 True slow
2 Boston 10.1.1.15 19 22600 0.085 False normal
3 SanFran 10.38.5.1 15 10550 0.030 False fast
4 SanFran 10.38.8.2 56 35000 0.020 False fast
5 London 192.168.4.6 15 3400 0.130 True slow
6 London 192.168.5.72 41 55000 0.120 True slow
\n", "

7 rows \u00d7 7 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ " location ip pkts bytes rtt slow delay\n", "0 Boston 10.1.1.1 10 2356 0.100 True normal\n", "1 Boston 10.1.1.2 23 16600 0.112 True slow\n", "2 Boston 10.1.1.15 19 22600 0.085 False normal\n", "3 SanFran 10.38.5.1 15 10550 0.030 False fast\n", "4 SanFran 10.38.8.2 56 35000 0.020 False fast\n", "5 London 192.168.4.6 15 3400 0.130 True slow\n", "6 London 192.168.5.72 41 55000 0.120 True slow\n", "\n", "[7 rows x 7 columns]" ] } ], "prompt_number": 39 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "pandas: Unstacking Data\n", "=======================\n", "\n", "Unstacking data is about pivoting data based on row values. For example, let's say we want to compute the total bytes for each delay category by location:\n", "\n", " slow normal fast\n", " Boston ? ? ?\n", " SanFran ? ? ?\n", " London ? ? ?\n", "\n", "Where the `?` in each cell is the total bytes for that combination.\n", "\n", "First we groupby both `location` and `delay`, aggregating the `bytes` column:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "loc_delay_bytes = (df.groupby(['location', 'delay'])\n", " .aggregate({'bytes': 'sum'}))\n", "loc_delay_bytes" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
bytes
locationdelay
Bostonnormal 24956
slow 16600
Londonslow 58400
SanFranfast 45550
\n", "

4 rows \u00d7 1 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 40, "text": [ " bytes\n", "location delay \n", "Boston normal 24956\n", " slow 16600\n", "London slow 58400\n", "SanFran fast 45550\n", "\n", "[4 rows x 1 columns]" ] } ], "prompt_number": 40 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "subslide_end", "slideshow": { "slide_type": "-" } }, "source": [ "The resulting **DataFrame** has two index columns, `location` and `delay`. " ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Now the `unstack()` function is used to create a column for each unique value of `delay`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "loc_delay_bytes = loc_delay_bytes.unstack('delay')" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "prompt_number": 41 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "source": [ "Let's fill in zeros for the combinations that were not present:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "loc_delay_bytes = loc_delay_bytes.fillna(0)\n", "loc_delay_bytes" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
bytes
delayfastnormalslow
location
Boston 0 24956 16600
London 0 0 58400
SanFran 45550 0 0
\n", "

3 rows \u00d7 3 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 42, "text": [ " bytes \n", "delay fast normal slow\n", "location \n", "Boston 0 24956 16600\n", "London 0 0 58400\n", "SanFran 45550 0 0\n", "\n", "[3 rows x 3 columns]" ] } ], "prompt_number": 42 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "SteelScript for Python\n", "======================\n", "\n", "SteelScript is a collection of **Python packages** that provide libraries for collecting, processing, and visualizing data from a variety of sources. Most packages focus on network performance.\n", "\n", "Getting SteelScript and the Wireshark extension\n", "-----------------------------------------------\n", "\n", "Core SteelScript is available on PyPI:\n", "\n", " > pip install steelscript\n", " > pip install steelscript.wireshark\n", " \n", "The bleeding edge is available on github:\n", "\n", "* http://github.com/riverbed/steelscript/steelscript\n", "* http://github.com/riverbed/steelscript/steelscript.wireshark\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "slide" } }, "source": [ "SteelScript: Reading Packet Capture Files\n", "=========================================" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from steelscript.wireshark.core.pcap import PcapFile\n", "\n", "pcap = PcapFile('/ws/traces/net-2009-11-18-17_35.pcap')\n", "pcap.info()\n", "print pcap.starttime\n", "print pcap.endtime\n", "print pcap.numpackets" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "2009-11-18 17:35:54-08:00\n", "2009-11-19 09:47:05-08:00\n", "302030\n" ] } ], "prompt_number": 43 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Perform a query on the PCAP file" ] }, { "cell_type": "code", "collapsed": false, "input": [ "pdf = pcap.query(['frame.time_epoch', 'ip.src', 'ip.dst', 'ip.len', 'ip.proto'], \n", " starttime = pcap.starttime, \n", " duration='1min',\n", " as_dataframe=True)\n", "pdf = pdf[~(pdf['ip.len'].isnull())]\n", "print len(pdf), \"packets loaded\"" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "5529 packets loaded\n" ] } ], "prompt_number": 44 }, { "cell_type": "code", "collapsed": false, "input": [ "pdf[:10]" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "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", "
frame.time_epochip.srcip.dstip.lenip.proto
0 2009-11-18 17:35:54.369201-08:00 137.226.34.227 192.168.1.105 1420 6
1 2009-11-18 17:35:54.369434-08:00 137.226.34.227 192.168.1.105 1420 6
2 2009-11-18 17:35:54.369655-08:00 192.168.1.105 137.226.34.227 40 6
3 2009-11-18 17:35:54.369702-08:00 137.226.34.227 192.168.1.105 1420 6
4 2009-11-18 17:35:54.369713-08:00 137.226.34.227 192.168.1.105 1420 6
5 2009-11-18 17:35:54.369723-08:00 137.226.34.227 192.168.1.105 1332 6
6 2009-11-18 17:35:54.369733-08:00 137.226.34.227 192.168.1.105 1420 6
7 2009-11-18 17:35:54.369896-08:00 192.168.1.105 137.226.34.227 40 6
8 2009-11-18 17:35:54.369947-08:00 137.226.34.227 192.168.1.105 1420 6
9 2009-11-18 17:35:54.369986-08:00 137.226.34.227 192.168.1.105 1420 6
\n", "

10 rows \u00d7 5 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 45, "text": [ " frame.time_epoch ip.src ip.dst ip.len \\\n", "0 2009-11-18 17:35:54.369201-08:00 137.226.34.227 192.168.1.105 1420 \n", "1 2009-11-18 17:35:54.369434-08:00 137.226.34.227 192.168.1.105 1420 \n", "2 2009-11-18 17:35:54.369655-08:00 192.168.1.105 137.226.34.227 40 \n", "3 2009-11-18 17:35:54.369702-08:00 137.226.34.227 192.168.1.105 1420 \n", "4 2009-11-18 17:35:54.369713-08:00 137.226.34.227 192.168.1.105 1420 \n", "5 2009-11-18 17:35:54.369723-08:00 137.226.34.227 192.168.1.105 1332 \n", "6 2009-11-18 17:35:54.369733-08:00 137.226.34.227 192.168.1.105 1420 \n", "7 2009-11-18 17:35:54.369896-08:00 192.168.1.105 137.226.34.227 40 \n", "8 2009-11-18 17:35:54.369947-08:00 137.226.34.227 192.168.1.105 1420 \n", "9 2009-11-18 17:35:54.369986-08:00 137.226.34.227 192.168.1.105 1420 \n", "\n", " ip.proto \n", "0 6 \n", "1 6 \n", "2 6 \n", "3 6 \n", "4 6 \n", "5 6 \n", "6 6 \n", "7 6 \n", "8 6 \n", "9 6 \n", "\n", "[10 rows x 5 columns]" ] } ], "prompt_number": 45 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Examine some characteristics of the data:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "pdf['ip.proto'].unique()" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 46, "text": [ "array([ 6., 17.])" ] } ], "prompt_number": 46 }, { "cell_type": "code", "collapsed": false, "input": [ "tcpdf = pdf[pdf['ip.proto'] == 6]\n", "len(tcpdf)" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 47, "text": [ "5527" ] } ], "prompt_number": 47 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "Unique source IPs, or dest IPs:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "pdf['ip.src'].unique()" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 48, "text": [ "array(['137.226.34.227', '192.168.1.105', '192.168.1.1'], dtype=object)" ] } ], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [ "pdf['ip.dst'].unique()" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 49, "text": [ "array(['192.168.1.105', '137.226.34.227', '224.0.0.1'], dtype=object)" ] } ], "prompt_number": 49 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Examine the `frame.time_epoch` column:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "s = pdf['frame.time_epoch']" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "prompt_number": 50 }, { "cell_type": "code", "collapsed": false, "input": [ "s.describe()" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 51, "text": [ "count 5529\n", "unique 5529\n", "top 2009-11-18 17:36:49.131404-08:00\n", "freq 1\n", "Name: frame.time_epoch, dtype: object" ] } ], "prompt_number": 51 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "slide" } }, "source": [ "SteelScript: Resampling\n", "=======================\n", "\n", "Pandas supports a number of functions specifically designed for time-series data. Resampling is particularly useful. \n", "\n", "The current data set `pdf` contains one row per packet received over one minute. Let's compute the data rate in bits/sec at 1 second granularity.\n", "\n", "Step 1 - Time Index\n", "-------------------\n", "Resampling requires that **DataFrame** object have a datetime column as an index. The return value of the above ``pcap.query()`` autmatically converts the `frame.time_epoch` column into a datetime, now set it as the index:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print \"frame.time_epoch:\", pdf['frame.time_epoch'].dtype\n", "pdf_indexed = pdf.set_index('frame.time_epoch')" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "frame.time_epoch: object\n" ] } ], "prompt_number": 52 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Step 2 - Resample\n", "-----------------\n", "Resample at 1second granularity, summing all ip.len values." ] }, { "cell_type": "code", "collapsed": false, "input": [ "pdf_1sec = pdf_indexed.resample('1s', {'ip.len': 'sum'})" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "prompt_number": 53 }, { "cell_type": "code", "collapsed": false, "input": [ "pdf_1sec.plot()" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 54, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\niqLkN/8PXzD/2e70tLYAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 54 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Step 3 - Compute bps\n", "--------------------" ] }, { "cell_type": "code", "collapsed": false, "input": [ "pdf_1sec['bps'] = pdf_1sec['ip.len'] * 8" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "prompt_number": 55 }, { "cell_type": "code", "collapsed": false, "input": [ "pdf_1sec.plot(y='bps')" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 56, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 56 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Defining Helper Functions\n", "-------------------------" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from steelscript.common.timeutils import parse_timedelta, timedelta_total_seconds\n", "\n", "def query(pcap, starttime, duration):\n", " \"\"\"Run a query to collect frame time and ip.len, filter for IP.\"\"\"\n", " _df = pcap.query(['frame.time_epoch', 'ip.len'], \\\n", " starttime=pcap.starttime, duration=duration, \\\n", " as_dataframe=True)\n", " _df = _df[~(_df['ip.len'].isnull())]\n", " return _df" ], "language": "python", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [], "prompt_number": 57 }, { "cell_type": "code", "collapsed": false, "input": [ "def plot_bps(_df, start, duration, resolution):\n", " \"\"\"Plot bps for a dataframe over the given range and resolution.\"\"\"\n", " # Filter the df to the requested time range\n", " end = start + parse_timedelta(duration) \n", " _df = _df[((_df['frame.time_epoch'] >= start) &\n", " (_df['frame.time_epoch'] < end))]\n", "\n", " # set the index\n", " _df = _df.set_index('frame.time_epoch')\n", " \n", " # convert a string resolution like '10s' into numeric seconds \n", " resolution = (timedelta_total_seconds(parse_timedelta(resolution)))\n", "\n", " # Resample\n", " _df = _df.resample('%ds' % resolution, {'ip.len': 'sum'})\n", "\n", " # Compute BPS\n", " _df['bps'] = _df['ip.len'] * 8 / float(resolution)\n", " \n", " # Plot the result\n", " _df.plot(y='bps')" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "prompt_number": 58 }, { "cell_type": "code", "collapsed": false, "input": [ "%time pdf = query(pcap, starttime=pcap.starttime, duration='6h')\n", "print len(pdf), \"packets\"" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 8.7 s, sys: 3.06 s, total: 11.8 s\n", "Wall time: 31.6 s\n", "272901 packets\n" ] } ], "prompt_number": 59 }, { "cell_type": "code", "collapsed": false, "input": [ "%time plot_bps(pdf, pcap.starttime, '6h', '15m')" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 796 ms, sys: 9.4 ms, total: 805 ms\n", "Wall time: 804 ms\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 60 }, { "cell_type": "code", "collapsed": false, "input": [ "%time plot_bps(pdf, pcap.starttime, '6h', '1m')" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 815 ms, sys: 4.82 ms, total: 820 ms\n", "Wall time: 818 ms\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 61 }, { "cell_type": "code", "collapsed": false, "input": [ "%time plot_bps(pdf, pcap.starttime, '1h', '1m')" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 776 ms, sys: 4.8 ms, total: 781 ms\n", "Wall time: 779 ms\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 62 }, { "cell_type": "code", "collapsed": false, "input": [ "%time plot_bps(pdf, pcap.starttime, '1h', '1s')" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 955 ms, sys: 5.42 ms, total: 961 ms\n", "Wall time: 959 ms\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nIiKe+//G+LJq+xcpAQAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 63 }, { "cell_type": "code", "collapsed": false, "input": [ "import datetime\n", "from dateutil.parser import parse\n", "import steelscript.wireshark.core.pcap\n", "reload(steelscript.wireshark.core.pcap)\n", "from steelscript.wireshark.core.pcap import *" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "prompt_number": 64 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "slide" } }, "source": [ "SteelScript: Computing Client/Server Metrics\n", "============================================\n", "\n", "Now let's take a more complex example of rearranging the data.\n", "\n", "* Incoming data is unidirectional data based on ``src/dst``\n", "* Determine ``cli/srv`` based on lower port number\n", "* Compute server-to-client (s2c) and client-to-server (c2s) bytes\n", "* Rollup aggregate metrics\n", "* Graph top 3 conversations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, let's find the right field for port number. The **TSharkFields** class supports a `find()` method to look for fields by protocol, name, or description. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "from steelscript.wireshark.core.pcap import TSharkFields, PcapFile\n", "\n", "pcap = PcapFile('/ws/traces/net-2009-11-18-17_35.pcap')\n", "\n", "tf = TSharkFields.instance()\n", "tf.find(protocol='tcp', name_re='port')" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 65, "text": [ "[,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ]" ] } ], "prompt_number": 65 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Query the PCAP file for the necessary raw data, compute cli/srv/c2s/s2c:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%time\n", "pdf = pcap.query(['frame.time_epoch', 'ip.src', 'ip.dst', 'ip.len',\n", " 'tcp.srcport', 'tcp.dstport'],\n", " starttime=pcap.starttime, duration='1m',\n", " as_dataframe=True)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 14.2 s, sys: 7.88 s, total: 22.1 s\n", "Wall time: 37.4 s\n" ] } ], "prompt_number": 66 }, { "cell_type": "code", "collapsed": false, "input": [ "%%time\n", "# Limit to TCP Traffic\n", "istcp = ~(pdf['tcp.srcport'].isnull())\n", "pdf = pdf[istcp]\n", "\n", "# Assume lower port is the client\n", "srccli = pdf['tcp.srcport'] > pdf['tcp.dstport']" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 48.7 ms, sys: 11.2 ms, total: 59.8 ms\n", "Wall time: 58.6 ms\n" ] } ], "prompt_number": 67 }, { "cell_type": "code", "collapsed": false, "input": [ "%%time\n", "# Initialize columns assuming server->client \n", "pdf['ip.cli'] = pdf['ip.dst']\n", "pdf['ip.srv'] = pdf['ip.src']\n", "pdf['tcp.srvport'] = pdf['tcp.srcport']\n", "pdf['c2s'] = 0\n", "pdf['s2c'] = pdf['ip.len']" ], "language": "python", "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 29.3 ms, sys: 4.29 ms, total: 33.5 ms\n", "Wall time: 32.2 ms\n" ] } ], "prompt_number": 68 }, { "cell_type": "code", "collapsed": false, "input": [ "%%time\n", "# Then override for client->server\n", "pdf.ix[srccli, 'ip.cli'] = pdf.ix[srccli, 'ip.src']\n", "pdf.ix[srccli, 'ip.srv'] = pdf.ix[srccli, 'ip.dst']\n", "pdf.ix[srccli, 'tcp.srvport'] = pdf['tcp.dstport']\n", "pdf.ix[srccli, 'c2s'] = pdf.ix[srccli, 'ip.len']\n", "pdf.ix[srccli, 's2c'] = 0" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 282 ms, sys: 31.3 ms, total: 314 ms\n", "Wall time: 312 ms\n" ] } ], "prompt_number": 69 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Strip away the src/dst columns in favor of the cli/srv columns" ] }, { "cell_type": "code", "collapsed": false, "input": [ "pdf = pdf.ix[:, ['frame.time_epoch', 'ip.cli', 'ip.srv', 'tcp.srvport', \n", " 'ip.len', 'c2s', 's2c']]\n", "pdf[:5]" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
frame.time_epochip.cliip.srvtcp.srvportip.lenc2ss2c
0 2009-11-18 17:35:54.369201-08:00 192.168.1.105 137.226.34.227 80 1420 0 1420
1 2009-11-18 17:35:54.369434-08:00 192.168.1.105 137.226.34.227 80 1420 0 1420
2 2009-11-18 17:35:54.369655-08:00 192.168.1.105 137.226.34.227 80 40 40 0
3 2009-11-18 17:35:54.369702-08:00 192.168.1.105 137.226.34.227 80 1420 0 1420
4 2009-11-18 17:35:54.369713-08:00 192.168.1.105 137.226.34.227 80 1420 0 1420
\n", "

5 rows \u00d7 7 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 70, "text": [ " frame.time_epoch ip.cli ip.srv \\\n", "0 2009-11-18 17:35:54.369201-08:00 192.168.1.105 137.226.34.227 \n", "1 2009-11-18 17:35:54.369434-08:00 192.168.1.105 137.226.34.227 \n", "2 2009-11-18 17:35:54.369655-08:00 192.168.1.105 137.226.34.227 \n", "3 2009-11-18 17:35:54.369702-08:00 192.168.1.105 137.226.34.227 \n", "4 2009-11-18 17:35:54.369713-08:00 192.168.1.105 137.226.34.227 \n", "\n", " tcp.srvport ip.len c2s s2c \n", "0 80 1420 0 1420 \n", "1 80 1420 0 1420 \n", "2 80 40 40 0 \n", "3 80 1420 0 1420 \n", "4 80 1420 0 1420 \n", "\n", "[5 rows x 7 columns]" ] } ], "prompt_number": 70 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Now, we can compute metrics for each unique host-pair:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "cs = (pdf.groupby(['ip.cli', 'ip.srv', 'tcp.srvport'])\n", " .aggregate({'c2s': 'sum',\n", " 's2c': 'sum', \n", " 'ip.len': 'sum'}))" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "prompt_number": 71 }, { "cell_type": "code", "collapsed": false, "input": [ "cs.sort('ip.len', ascending=False)[:10]" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "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", "
c2sip.lens2c
ip.cliip.srvtcp.srvport
192.168.1.105137.226.34.22780 1888380 127030608 125142228
65.54.95.780 647104 79579509 78932405
65.54.95.20180 194283 27386115 27191832
68.142.123.2180 165452 14803514 14638062
65.54.95.20980 73449 9929531 9856082
208.111.129.6280 72190 5422145 5349955
68.142.123.3180 64617 5085691 5021074
192.168.1.102207.171.185.12980 25447 3322205 3296758
192.168.1.10487.106.1.4780 30364 1468823 1438459
192.168.1.10565.54.95.18580 12475 948700 936225
\n", "

10 rows \u00d7 3 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 72, "text": [ " c2s ip.len s2c\n", "ip.cli ip.srv tcp.srvport \n", "192.168.1.105 137.226.34.227 80 1888380 127030608 125142228\n", " 65.54.95.7 80 647104 79579509 78932405\n", " 65.54.95.201 80 194283 27386115 27191832\n", " 68.142.123.21 80 165452 14803514 14638062\n", " 65.54.95.209 80 73449 9929531 9856082\n", " 208.111.129.62 80 72190 5422145 5349955\n", " 68.142.123.31 80 64617 5085691 5021074\n", "192.168.1.102 207.171.185.129 80 25447 3322205 3296758\n", "192.168.1.104 87.106.1.47 80 30364 1468823 1438459\n", "192.168.1.105 65.54.95.185 80 12475 948700 936225\n", "\n", "[10 rows x 3 columns]" ] } ], "prompt_number": 72 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Pick the top 10 conversations, this will be used later for filtering:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "top = cs.sort('ip.len', ascending=False)[:3]\n", "top" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
c2sip.lens2c
ip.cliip.srvtcp.srvport
192.168.1.105137.226.34.22780 1888380 127030608 125142228
65.54.95.780 647104 79579509 78932405
65.54.95.20180 194283 27386115 27191832
\n", "

3 rows \u00d7 3 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 73, "text": [ " c2s ip.len s2c\n", "ip.cli ip.srv tcp.srvport \n", "192.168.1.105 137.226.34.227 80 1888380 127030608 125142228\n", " 65.54.95.7 80 647104 79579509 78932405\n", " 65.54.95.201 80 194283 27386115 27191832\n", "\n", "[3 rows x 3 columns]" ] } ], "prompt_number": 73 }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "subslide" } }, "source": [ "Now, filter the original choosing only rows in the top 3:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "cst = pdf.set_index(['ip.cli', 'ip.srv', 'tcp.srvport'])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 74 }, { "cell_type": "code", "collapsed": false, "input": [ "cst_top = (cst[cst.index.isin(top.index)]\n", " .ix[:,['frame.time_epoch', 'ip.len']])\n", "cst_top[:10]" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "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", "
frame.time_epochip.len
ip.cliip.srvtcp.srvport
192.168.1.105137.226.34.22780 2009-11-18 17:35:54.369201-08:00 1420
80 2009-11-18 17:35:54.369434-08:00 1420
80 2009-11-18 17:35:54.369655-08:00 40
80 2009-11-18 17:35:54.369702-08:00 1420
80 2009-11-18 17:35:54.369713-08:00 1420
80 2009-11-18 17:35:54.369723-08:00 1332
80 2009-11-18 17:35:54.369733-08:00 1420
80 2009-11-18 17:35:54.369896-08:00 40
80 2009-11-18 17:35:54.369947-08:00 1420
80 2009-11-18 17:35:54.369986-08:00 1420
\n", "

10 rows \u00d7 2 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 75, "text": [ " frame.time_epoch \\\n", "ip.cli ip.srv tcp.srvport \n", "192.168.1.105 137.226.34.227 80 2009-11-18 17:35:54.369201-08:00 \n", " 80 2009-11-18 17:35:54.369434-08:00 \n", " 80 2009-11-18 17:35:54.369655-08:00 \n", " 80 2009-11-18 17:35:54.369702-08:00 \n", " 80 2009-11-18 17:35:54.369713-08:00 \n", " 80 2009-11-18 17:35:54.369723-08:00 \n", " 80 2009-11-18 17:35:54.369733-08:00 \n", " 80 2009-11-18 17:35:54.369896-08:00 \n", " 80 2009-11-18 17:35:54.369947-08:00 \n", " 80 2009-11-18 17:35:54.369986-08:00 \n", "\n", " ip.len \n", "ip.cli ip.srv tcp.srvport \n", "192.168.1.105 137.226.34.227 80 1420 \n", " 80 1420 \n", " 80 40 \n", " 80 1420 \n", " 80 1420 \n", " 80 1332 \n", " 80 1420 \n", " 80 40 \n", " 80 1420 \n", " 80 1420 \n", "\n", "[10 rows x 2 columns]" ] } ], "prompt_number": 75 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Rollup the results into 1 second intervals" ] }, { "cell_type": "code", "collapsed": false, "input": [ "cst_top_time = (cst_top.reset_index()\n", " .set_index(['frame.time_epoch', 'ip.cli', 'ip.srv', 'tcp.srvport'])\n", " .unstack(['ip.cli', 'ip.srv', 'tcp.srvport'])\n", " .resample('1s','sum')\n", " .fillna(0))" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [], "prompt_number": 76 }, { "cell_type": "code", "collapsed": false, "input": [ "cst_top_time.plot()" ], "language": "python", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6 }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 77, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEQCAYAAACjnUNyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd8FVX2wL8vIUAggRRYDAQJChJCC4vyAwEJKKGIVGmK\nEHCXVRRxVYoFEqzYQNQF3JUSFNvSFBQBJaEaUaR3WEASOgQIkISU+/vjzpu8l7yX91JJ9Hz5zGdu\nv3dehjlz7rlzDwiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiC4CaewDZguRGPARKNtG1A\nd5uyzwOHgP1ApE16K2CXkTfDJr0S8KWRngDUs8kbDhw0jmE26fWBn406XwBehb0wQRAEoXh5BlgI\nfGPEo4203IQB29EP8BDgMGAx8rYArY3wd0A3IzwamGmEB6EFAEAAcATwM44jQHUj7ytgoBGeBTxW\nqKsSBEEQ3MbDjTLBQA/gY3Ie/habsC29gc+BDOAYWmD8HxAE+KKFBsACoI8R7gXEGuHFwL1GuCuw\nGrhkHGvQmowF6AQsMsrF2rQlCIIglBDuCIzpwDgg2yZNAWOAHcActAYAUBs9VWUlEajjID3JSMc4\nnzDCmcBlIDCftgLQAsQ6Htu2BEEQhBLClcDoCZxF2ylsNYpZaDtCOHAKeLdERpcXVUr9CIIgCLmo\n4CL/bvSUUQ+gMlANPZ1ka4D+mBxjeBJQ1yYvGK0ZJBnh3OnWOrcCJ43xVAcuGOkRNnXqAmuBi2iN\nxgOtZQQbZfNQu3ZtdfLkSReXKAiCINhwBGhQ1EY6kiMYgmzS/wl8ZoStRu+KaA3kCDmayc9oe4aF\nvEbvWUZ4MPZG7/+hhYO/TRi00XuQEZ6Nc6O3+iMSHR19s4dw05HfQCO/g0Z+B03Hjh2L3Ab5zOS4\n0jBssdg09BbQwogfBf5hpO81HuZ70faI0TZ1RgPzAW+0wPjeSJ8DfIJeInsBLTRAaxKvAL8Y8Slo\n2wXABLRgeRX4zWjjT0NERMTNHsJNR34DjfwOGvkdNJUrVy7R9h2tdPojYQhMQRCEPz5RUVHMnz+/\nSG1YLBZwIhvcWSUlCIIglAOioqJKtH3RMARBEAST/DSMgtgw/vAEBASQnJx8s4chCIJQ4vj7+3Px\n4sUC1RENwwaLxYJoJIIg/Blw9rwTG4YgCIJQZERgCIIgCG4hAkMQBEFwCxEYQqnh4eHBc889Z8bf\neecdpkyZUqJ93n///Vy5cqXI7fj4+ABw8uRJBgwYkCffWXppsG7dOn766aeb0ndx8/rrr9/sIQj5\nIAJDKDUqVqzI0qVLuXDhAmAa10qUb7/9lmrVqhW5HetYa9euzX//+988+c7Si0JWVpZb5eLi4ti8\neXOx9u2MzMzMEms7OzubN954o8TaF4qOCAyh1PDy8mLUqFFMnz49T96xY8fo3LkzLVq04L777uPE\nCb3jfVRUFGPHjqVdu3bcfvvtLF682Kzz9ttv07p1a1q0aEFMTIzDPkNCQrh48SLHjh0jNDSUoUOH\nEhYWxoABA0hNTc1T/syZM/Tt25fw8HDCw8NJSEjIM85mzZo5HL81ff78+fTu3ZtOnTpxxx138PLL\nLzsc28SJE2nSpAktWrRg/Pjx5vU+9thjtGnThvHjx1O/fn0uX75s1mnYsCHnzp2z6/ejjz5i+vTp\ntGzZkk2bNjm8Bnev/7///S/NmjUjPDzc3G5j/vz59OrVi3vvvZf77ruPIUOG8N1335l1oqKiWLx4\nMbGxsU6ve9q0aTRr1oxmzZoxY8YMc+yNGjVi+PDhNG3alL/97W+kpqbSsmVLHnnkEYe/mSCUJAXe\ndEsoOXx8fNSVK1dUSEiIunz5snrnnXdUTEyMUkqpnj17qgULFiillJo7d67q06ePUkqp4cOHq4ED\nByqllNq7d69q0KCBUkqpVatWqVGjRimllMrKylI9e/ZU69evz9NnSEiIunDhgjp69KiyWCxq8+bN\nSimlRo4cqd5555085QcOHKhmzJhhtnv58mVz7EopdfToUdW0adM89WzT582bp4KCgtTFixdVamqq\natq0qfr111/typ8/f141atTIjFv7iYqKUg888IDKzs5WSik1duxYNW/ePKWUUgkJCapLly55+o6J\niVHvvvtuvtfg7vU3a9ZMnTx50m5M8+bNU8HBwSo5OVkppdTSpUvV8OHDlVJKpaenq7p166q0tDSn\n1/3rr7+qZs2aqevXr6urV6+qJk2aqG3btqmjR48qDw8P9fPPP5v9W39noeRx9rwjn80HRcMQShVf\nX1+GDRvG+++/b5eekJDAQw89BMDQoUPZuHEjoKeC+vTRDhUbN27MmTNnAFi9ejWrV6+mZcuWtGrV\nigMHDnD48OF8+65bty5t27bN04ctcXFxPP7444C2uRR2OisyMhJ/f38qV65Mv3798vTl5+dH5cqV\n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\np+rWrat8fX1VnTp11D//+U+VkZGhlFJq/fr1Zp/Ww2KxqCVLljjs69lnn1UNGzZUvr6+KjQ01Nx1\nWCmlDhw4oHr16qVq1qypAgICVNeuXdWBAwfs6h85ckTdf//9ytfXV9WoUUONHz/eYT/nz59Xd999\ntwoMDFTVqlVT4eHhdveMLZ07d1YWi0VlZWU5zHc1rvnz56tWrVqpatWqqeDgYDV+/HiVmZlp5let\nWtXu9/H09FRjxoxx2FduXN1vR48eVREREapKlSoqNDRU/fDDD/m2N378eBUYGKgCAwPVhAkT7PLe\neusthx+yKlW4D/f+6Lj1B3T1A5YF3nrrLXM776ISHR1dKgLjwIEDau7cuerrr7/OIzAyMjJUw4YN\n1fTp01V2drZau3atqlq1qjp48KBSSqmVK1eqRYsWqZSUFHX9+nU1cuRI1a1bN6d9LVmyRC1btkw9\n/vjjDh/MDz/8sBoyZIg6f/68ys7OVr/99puZN2PGDNWiRQt19uxZlZaWpoYNG6b69evnsJ8bN26o\nGTNmqI0bN6qgoCC1bt26fH+D/MZ17tw5Vb16dbVo0SKVnp6uxo0bp9q0aWPmx8TEqEceeSTf9p1x\n5swZNWvWLPXTTz85FBj79+9XKSkpSimlkpKSVJMmTdSsWbMcthUfH698fX3V9evXHeZHR0ebD9uf\nf/5Z+fv7m9uob9myRc2dO1clJyerjIwMNWnSJBUaGmrWTU9PV7fddpuaPn26un79ukpPT1c7d+50\n2E9aWprav3+/KQSWLVumvLy8zOuw8umnn6p77rlHeXh4OBUYrsY1a9YstXHjRpWRkaGSkpJUq1at\n1NSpUx22dfXqVeXj46M2bNjgMD83ru63Nm3aqGeffValpaWpxYsXKz8/P3Xu3DmHbc2ePVs1atRI\nJSUlqaSkJBUWFqZmz55t5p84cULVqFFD3bhxI09dZ887RGC4R0HLlyadO3dWCxcuNONxcXEqODjY\njNerV0+98cYbKiwsTPn7+6sRI0Y41UZyC4yffvpJtW3bVvn5+akWLVrYvTV37NhRTZo0SbVr1075\n+vqqyMjIAm1JoZRShw4dyiMwdu3alcf3QWRkpJo0aZLDNrZu3ap8fX1d9vXSSy/leTDv27dPVatW\nLc+DxcqoUaPs3mpXrFhh56vCGcHBwS4FRn7j+uijj1S7du3M+LVr15S3t7f58C0OwZ6RkeFQYNiS\n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\n", "text": [ "" ] } ], "prompt_number": 77 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Questons?\n", "=========\n", "\n", "Presentation available online:\n", "\n", "* https://support.riverbed.com/apis/steelscript/SharkFest2014.slides.html\n", "\n", "SteelScript for Python:\n", "\n", "* https://support.riverbed.com/apis/steelscript/index.html\n" ] } ], "metadata": {} } ] }