Created
July 14, 2018 04:05
-
-
Save maartenbreddels/b962f427a571f849481067ac4b117acb to your computer and use it in GitHub Desktop.
scipy2018 lightning talk on vaex
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib inline\n", | |
"import pylab as plt\n", | |
"import numpy as np\n", | |
"import warnings; warnings.simplefilter('ignore')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Vaex: out of core dataframes\n", | |
"### By Maarten Breddels (freelance/independent) @ ScipPy 2018\n", | |
" * conda install -c conda-forge vaex\n", | |
" * pip install --pre vaex\n", | |
" \n", | |
"# What it is?\n", | |
" * pandas like dataframe library for large datasets ($\\sim 10^9$ rows)\n", | |
" * mmap columnar data\n", | |
" * zero memory copy policy\n", | |
" * statistics on N-d grids ($+10^9$ rows/s)\n", | |
" * viz built in\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import vaex" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"-rw-r--r--@ 1 maartenbreddels staff 23G Mar 29 2017 /Users/maartenbreddels/datasets/nytaxi/nyc_taxi2015.hdf5\r\n" | |
] | |
} | |
], | |
"source": [ | |
"ls -lh /Users/maartenbreddels/datasets/nytaxi/nyc_taxi2015.hdf5" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<style>.vaex-description pre {\n", | |
" max-width : 450px;\n", | |
" white-space : nowrap;\n", | |
" overflow : hidden;\n", | |
" text-overflow: ellipsis;\n", | |
" }\n", | |
"\n", | |
" .vex-description pre:hover {\n", | |
" max-width : initial;\n", | |
" white-space: pre;\n", | |
" }</style>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"<table class='table-striped'><thead><tr><th>#</th><th>VendorID</th><th>dropoff_dayofweek</th><th>dropoff_hour</th><th>dropoff_latitude</th><th>dropoff_longitude</th><th>extra</th><th>fare_amount</th><th>improvement_surcharge</th><th>mta_tax</th><th>passenger_count</th><th>payment_type</th><th>pickup_dayofweek</th><th>pickup_hour</th><th>pickup_latitude</th><th>pickup_longitude</th><th>tip_amount</th><th>tolls_amount</th><th>total_amount</th><th>tpep_dropoff_datetime</th><th>tpep_pickup_datetime</th><th>trip_distance</th></tr></thead><tr><td><i style='opacity: 0.6'>0</i></td><td>2</td><td>3.0</td><td>19.0</td><td>40.750617980957031</td><td>-73.974784851074219</td><td>1.0</td><td>12.0</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>1</td><td>3.0</td><td>19.0</td><td>40.750110626220703</td><td>-73.993896484375</td><td>3.25</td><td>0.0</td><td>17.050000000000001</td><td>numpy.datetime64('2015-01-15T19:23:42.000000000')</td><td>numpy.datetime64('2015-01-15T19:05:39.000000000')</td><td>1.5900000000000001</td></tr><tr><td><i style='opacity: 0.6'>1</i></td><td>1</td><td>5.0</td><td>20.0</td><td>40.759109497070312</td><td>-73.994415283203125</td><td>0.5</td><td>14.5</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>1</td><td>5.0</td><td>20.0</td><td>40.7242431640625</td><td>-74.00164794921875</td><td>2.0</td><td>0.0</td><td>17.800000000000001</td><td>numpy.datetime64('2015-01-10T20:53:28.000000000')</td><td>numpy.datetime64('2015-01-10T20:33:38.000000000')</td><td>3.2999999999999998</td></tr><tr><td><i style='opacity: 0.6'>2</i></td><td>1</td><td>5.0</td><td>20.0</td><td>40.824413299560547</td><td>-73.951820373535156</td><td>0.5</td><td>9.5</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>2</td><td>5.0</td><td>20.0</td><td>40.802787780761719</td><td>-73.963340759277344</td><td>0.0</td><td>0.0</td><td>10.800000000000001</td><td>numpy.datetime64('2015-01-10T20:43:41.000000000')</td><td>numpy.datetime64('2015-01-10T20:33:38.000000000')</td><td>1.8</td></tr><tr><td><i style='opacity: 0.6'>3</i></td><td>1</td><td>5.0</td><td>20.0</td><td>40.719985961914062</td><td>-74.004325866699233</td><td>0.5</td><td>3.5</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>2</td><td>5.0</td><td>20.0</td><td>40.713817596435547</td><td>-74.009086608886719</td><td>0.0</td><td>0.0</td><td>4.7999999999999998</td><td>numpy.datetime64('2015-01-10T20:35:31.000000000')</td><td>numpy.datetime64('2015-01-10T20:33:39.000000000')</td><td>0.5</td></tr><tr><td><i style='opacity: 0.6'>4</i></td><td>1</td><td>5.0</td><td>20.0</td><td>40.742652893066406</td><td>-74.004180908203125</td><td>0.5</td><td>15.0</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>2</td><td>5.0</td><td>20.0</td><td>40.762428283691406</td><td>-73.971176147460938</td><td>0.0</td><td>0.0</td><td>16.300000000000001</td><td>numpy.datetime64('2015-01-10T20:52:58.000000000')</td><td>numpy.datetime64('2015-01-10T20:33:39.000000000')</td><td>3.0</td></tr><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><tr><td><i style='opacity: 0.6'>146,112,984</i></td><td>2</td><td>4.0</td><td>0.0</td><td>40.722469329833984</td><td>-73.986213684082031</td><td>0.5</td><td>7.5</td><td>0.29999999999999999</td><td>0.5</td><td>5</td><td>1</td><td>3.0</td><td>23.0</td><td>40.720870971679688</td><td>-73.993812561035156</td><td>1.76</td><td>0.0</td><td>10.56</td><td>numpy.datetime64('2016-01-01T00:08:18.000000000')</td><td>numpy.datetime64('2015-12-31T23:59:56.000000000')</td><td>1.2</td></tr><tr><td><i style='opacity: 0.6'>146,112,985</i></td><td>1</td><td>4.0</td><td>0.0</td><td>40.752388000488281</td><td>-73.93951416015625</td><td>0.5</td><td>7.5</td><td>0.29999999999999999</td><td>0.5</td><td>2</td><td>2</td><td>3.0</td><td>23.0</td><td>40.760280609130852</td><td>-73.96527099609375</td><td>0.0</td><td>0.0</td><td>8.8000000000000007</td><td>numpy.datetime64('2016-01-01T00:05:19.000000000')</td><td>numpy.datetime64('2015-12-31T23:59:58.000000000')</td><td>2.0</td></tr><tr><td><i style='opacity: 0.6'>146,112,986</i></td><td>1</td><td>4.0</td><td>0.0</td><td>40.69329833984375</td><td>-73.988670349121094</td><td>0.5</td><td>13.5</td><td>0.29999999999999999</td><td>0.5</td><td>2</td><td>2</td><td>3.0</td><td>23.0</td><td>40.739078521728523</td><td>-73.987297058105469</td><td>0.0</td><td>0.0</td><td>14.800000000000001</td><td>numpy.datetime64('2016-01-01T00:12:55.000000000')</td><td>numpy.datetime64('2015-12-31T23:59:59.000000000')</td><td>3.7999999999999998</td></tr><tr><td><i style='opacity: 0.6'>146,112,987</i></td><td>2</td><td>4.0</td><td>0.0</td><td>40.705322265625</td><td>-74.017120361328125</td><td>0.5</td><td>8.5</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>2</td><td>3.0</td><td>23.0</td><td>40.725692749023438</td><td>-73.99755859375</td><td>0.0</td><td>0.0</td><td>9.8000000000000007</td><td>numpy.datetime64('2016-01-01T00:10:26.000000000')</td><td>numpy.datetime64('2015-12-31T23:59:59.000000000')</td><td>1.96</td></tr><tr><td><i style='opacity: 0.6'>146,112,988</i></td><td>2</td><td>4.0</td><td>0.0</td><td>40.760570526123047</td><td>-73.990982055664062</td><td>0.5</td><td>13.5</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>1</td><td>3.0</td><td>23.0</td><td>40.767257690429688</td><td>-73.98439788818358</td><td>2.96</td><td>0.0</td><td>17.760000000000002</td><td>numpy.datetime64('2016-01-01T00:21:30.000000000')</td><td>numpy.datetime64('2015-12-31T23:59:59.000000000')</td><td>1.0600000000000001</td></tr></table>" | |
], | |
"text/plain": [ | |
"<vaex.hdf5.dataset.Hdf5MemoryMapped at 0x10c158da0>" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df = vaex.open('/Users/maartenbreddels/datasets/nytaxi/nyc_taxi2015.hdf5')\n", | |
"df" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Pandas like, but uses expressions" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([ 1.59, 3.3 , 1.8 , ..., 3.8 , 1.96, 1.06])" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.trip_distance.values" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<vaex.expression.Expression(expressions='trip_distance')> instance at 0x10d975710 values=[1.59, 3.3, 1.8, 0.5, 3.0 ... (total 146112989 values) ... 1.2, 2.0, 3.8, 1.96, 1.06] " | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.trip_distance" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<vaex.expression.Expression(expressions='(tip_amount / total_amount)')> instance at 0x10d975828 values=[0.190615835777, 0.112359550562, 0.0, 0.0, 0.0 ... (total 146112989 values) ... 0.166666666667, 0.0, 0.0, 0.0, 0.166666666667] " | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.tip_amount/df.total_amount" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'1,168,903,912'" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"bytes_per_column = df.trip_distance.values.dtype.itemsize * len(df)\n", | |
"f\"{bytes_per_column:,}\"" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Expression / Virtual columns\n", | |
"![expres](./meme-expressions.jpg)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df['tip_percentage'] = df.tip_amount/df.total_amount" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<vaex.expression.Expression(expressions='tip_percentage')> instance at 0x10d975ac8 values=[0.190615835777, 0.112359550562, 0.0, 0.0, 0.0 ... (total 146112989 values) ... 0.166666666667, 0.0, 0.0, 0.0, 0.166666666667] " | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.tip_percentage" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<style>.vaex-description pre {\n", | |
" max-width : 450px;\n", | |
" white-space : nowrap;\n", | |
" overflow : hidden;\n", | |
" text-overflow: ellipsis;\n", | |
" }\n", | |
"\n", | |
" .vex-description pre:hover {\n", | |
" max-width : initial;\n", | |
" white-space: pre;\n", | |
" }</style>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"<table class='table-striped'><thead><tr><th>#</th><th>VendorID</th><th>dropoff_dayofweek</th><th>dropoff_hour</th><th>dropoff_latitude</th><th>dropoff_longitude</th><th>extra</th><th>fare_amount</th><th>improvement_surcharge</th><th>mta_tax</th><th>passenger_count</th><th>payment_type</th><th>pickup_dayofweek</th><th>pickup_hour</th><th>pickup_latitude</th><th>pickup_longitude</th><th>tip_amount</th><th>tolls_amount</th><th>total_amount</th><th>tpep_dropoff_datetime</th><th>tpep_pickup_datetime</th><th>trip_distance</th><th>tip_percentage</th></tr></thead><tr><td><i style='opacity: 0.6'>0</i></td><td>2</td><td>3.0</td><td>19.0</td><td>40.750617980957031</td><td>-73.974784851074219</td><td>1.0</td><td>12.0</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>1</td><td>3.0</td><td>19.0</td><td>40.750110626220703</td><td>-73.993896484375</td><td>3.25</td><td>0.0</td><td>17.050000000000001</td><td>numpy.datetime64('2015-01-15T19:23:42.000000000')</td><td>numpy.datetime64('2015-01-15T19:05:39.000000000')</td><td>1.5900000000000001</td><td>0.1906158357771261</td></tr><tr><td><i style='opacity: 0.6'>1</i></td><td>1</td><td>5.0</td><td>20.0</td><td>40.759109497070312</td><td>-73.994415283203125</td><td>0.5</td><td>14.5</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>1</td><td>5.0</td><td>20.0</td><td>40.7242431640625</td><td>-74.00164794921875</td><td>2.0</td><td>0.0</td><td>17.800000000000001</td><td>numpy.datetime64('2015-01-10T20:53:28.000000000')</td><td>numpy.datetime64('2015-01-10T20:33:38.000000000')</td><td>3.2999999999999998</td><td>0.11235955056179775</td></tr><tr><td><i style='opacity: 0.6'>2</i></td><td>1</td><td>5.0</td><td>20.0</td><td>40.824413299560547</td><td>-73.951820373535156</td><td>0.5</td><td>9.5</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>2</td><td>5.0</td><td>20.0</td><td>40.802787780761719</td><td>-73.963340759277344</td><td>0.0</td><td>0.0</td><td>10.800000000000001</td><td>numpy.datetime64('2015-01-10T20:43:41.000000000')</td><td>numpy.datetime64('2015-01-10T20:33:38.000000000')</td><td>1.8</td><td>0.0</td></tr><tr><td><i style='opacity: 0.6'>3</i></td><td>1</td><td>5.0</td><td>20.0</td><td>40.719985961914062</td><td>-74.004325866699233</td><td>0.5</td><td>3.5</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>2</td><td>5.0</td><td>20.0</td><td>40.713817596435547</td><td>-74.009086608886719</td><td>0.0</td><td>0.0</td><td>4.7999999999999998</td><td>numpy.datetime64('2015-01-10T20:35:31.000000000')</td><td>numpy.datetime64('2015-01-10T20:33:39.000000000')</td><td>0.5</td><td>0.0</td></tr><tr><td><i style='opacity: 0.6'>4</i></td><td>1</td><td>5.0</td><td>20.0</td><td>40.742652893066406</td><td>-74.004180908203125</td><td>0.5</td><td>15.0</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>2</td><td>5.0</td><td>20.0</td><td>40.762428283691406</td><td>-73.971176147460938</td><td>0.0</td><td>0.0</td><td>16.300000000000001</td><td>numpy.datetime64('2015-01-10T20:52:58.000000000')</td><td>numpy.datetime64('2015-01-10T20:33:39.000000000')</td><td>3.0</td><td>0.0</td></tr><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><tr><td><i style='opacity: 0.6'>146,112,984</i></td><td>2</td><td>4.0</td><td>0.0</td><td>40.722469329833984</td><td>-73.986213684082031</td><td>0.5</td><td>7.5</td><td>0.29999999999999999</td><td>0.5</td><td>5</td><td>1</td><td>3.0</td><td>23.0</td><td>40.720870971679688</td><td>-73.993812561035156</td><td>1.76</td><td>0.0</td><td>10.56</td><td>numpy.datetime64('2016-01-01T00:08:18.000000000')</td><td>numpy.datetime64('2015-12-31T23:59:56.000000000')</td><td>1.2</td><td>0.16666666666666666</td></tr><tr><td><i style='opacity: 0.6'>146,112,985</i></td><td>1</td><td>4.0</td><td>0.0</td><td>40.752388000488281</td><td>-73.93951416015625</td><td>0.5</td><td>7.5</td><td>0.29999999999999999</td><td>0.5</td><td>2</td><td>2</td><td>3.0</td><td>23.0</td><td>40.760280609130852</td><td>-73.96527099609375</td><td>0.0</td><td>0.0</td><td>8.8000000000000007</td><td>numpy.datetime64('2016-01-01T00:05:19.000000000')</td><td>numpy.datetime64('2015-12-31T23:59:58.000000000')</td><td>2.0</td><td>0.0</td></tr><tr><td><i style='opacity: 0.6'>146,112,986</i></td><td>1</td><td>4.0</td><td>0.0</td><td>40.69329833984375</td><td>-73.988670349121094</td><td>0.5</td><td>13.5</td><td>0.29999999999999999</td><td>0.5</td><td>2</td><td>2</td><td>3.0</td><td>23.0</td><td>40.739078521728523</td><td>-73.987297058105469</td><td>0.0</td><td>0.0</td><td>14.800000000000001</td><td>numpy.datetime64('2016-01-01T00:12:55.000000000')</td><td>numpy.datetime64('2015-12-31T23:59:59.000000000')</td><td>3.7999999999999998</td><td>0.0</td></tr><tr><td><i style='opacity: 0.6'>146,112,987</i></td><td>2</td><td>4.0</td><td>0.0</td><td>40.705322265625</td><td>-74.017120361328125</td><td>0.5</td><td>8.5</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>2</td><td>3.0</td><td>23.0</td><td>40.725692749023438</td><td>-73.99755859375</td><td>0.0</td><td>0.0</td><td>9.8000000000000007</td><td>numpy.datetime64('2016-01-01T00:10:26.000000000')</td><td>numpy.datetime64('2015-12-31T23:59:59.000000000')</td><td>1.96</td><td>0.0</td></tr><tr><td><i style='opacity: 0.6'>146,112,988</i></td><td>2</td><td>4.0</td><td>0.0</td><td>40.760570526123047</td><td>-73.990982055664062</td><td>0.5</td><td>13.5</td><td>0.29999999999999999</td><td>0.5</td><td>1</td><td>1</td><td>3.0</td><td>23.0</td><td>40.767257690429688</td><td>-73.98439788818358</td><td>2.96</td><td>0.0</td><td>17.760000000000002</td><td>numpy.datetime64('2016-01-01T00:21:30.000000000')</td><td>numpy.datetime64('2015-12-31T23:59:59.000000000')</td><td>1.0600000000000001</td><td>0.16666666666666666</td></tr></table>" | |
], | |
"text/plain": [ | |
"<vaex.hdf5.dataset.Hdf5MemoryMapped at 0x10c158da0>" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0.096040300836903153" | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.mean(df.tip_percentage)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Lazy is good\n", | |
"See item 10/11 of [\"10 Things I Hate About pandas\"](http://wesmckinney.com/blog/apache-arrow-pandas-internals/) by Wes McKinney\n", | |
"> When you write df[df.c < 0].d.sum(), pandas creates a temporary DataFrame df[df.c < 0] then sums the d column of that temporary object. If df contains a lot of columns, this is ridiculously wasteful." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0.198073253803\n" | |
] | |
} | |
], | |
"source": [ | |
"# this would cost 46+GB RAM using Pandas\n", | |
"# and wouldn't be possible on this laptop\n", | |
"print(df[df.tip_amount > 10].tip_percentage.mean())" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# N-d statistic and viz" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[ 1., 4., 7., ..., 1., 1., 0.],\n", | |
" [ 8., 8., 14., ..., 0., 1., 0.],\n", | |
" [ 21., 8., 7., ..., 0., 1., 1.],\n", | |
" ..., \n", | |
" [ 1., 5., 0., ..., 0., 0., 0.],\n", | |
" [ 0., 0., 2., ..., 0., 0., 0.],\n", | |
" [ 0., 0., 1., ..., 0., 0., 0.]])" | |
] | |
}, | |
"execution_count": 14, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"counts2d = df.count(binby=[df.pickup_longitude, df.pickup_latitude], shape=(128,128))\n", | |
"counts2d" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<matplotlib.image.AxesImage at 0x10800a710>" | |
] | |
}, | |
"execution_count": 15, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x10c158940>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.imshow(np.log(counts2d.T+1), origin='lower')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df.plot_widget(df.pickup_longitude, df.pickup_latitude, f='log', controls_selection=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0.08200438789770971" | |
] | |
}, | |
"execution_count": 20, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.tip_percentage.mean(selection=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def arc_distance(theta_1, phi_1, theta_2, phi_2):\n", | |
" temp = (np.sin((theta_2-theta_1)/2*np.pi/180)**2\n", | |
" + np.cos(theta_1*np.pi/180)*np.cos(theta_2*np.pi/180) * np.sin((phi_2-phi_1)/2*np.pi/180)**2)\n", | |
" distance = 2 * np.arctan2(np.sqrt(temp), np.sqrt(1-temp))\n", | |
" return distance * 6400/1.6" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"5167.5802938043762" | |
] | |
}, | |
"execution_count": 20, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Distance between Groningen (NL) and Austin\n", | |
"arc_distance(53.1739086, 6.5990374, 30.2813584,-97.7558575)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df['arc_distance'] = arc_distance(df.pickup_longitude,\n", | |
" df.pickup_latitude,\n", | |
" df.dropoff_longitude,\n", | |
" df.dropoff_latitude)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<vaex.expression.Expression(expressions='(((2 * arctan2(sqrt(((sin(((((dropoff_longitude - pickup_longitude) / 2) * 3.141592653589793) / 180)) ** 2) + ((cos(((pickup_longitude * 3.141592653589793) / 180)) * cos(((dropoff_longitude * 3.141592653589793) / 180))) * (sin(((((dropoff_latitude - pickup_latitude) / 2) * 3.141592653589793) / 180)) ** 2)))), sqrt((1 - ((sin(((((dropoff_longitude - pickup_longitude) / 2) * 3.141592653589793) / 180)) ** 2) + ((cos(((pickup_longitude * 3.141592653589793) / 180)) * cos(((dropoff_longitude * 3.141592653589793) / 180))) * (sin(((((dropoff_latitude - pickup_latitude) / 2) * 3.141592653589793) / 180)) ** 2))))))) * 6400) / 1.6)')> instance at 0x6cecd90b8 values=[1.33427949357, 0.839776114764, 0.906050493444, 0.352906059984, 2.33542574256 ... (total 146112989 values) ... 0.531393648669, 1.80460610131, 0.886795523869, 1.42076456204, 0.477360075018] " | |
] | |
}, | |
"execution_count": 22, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.arc_distance.expand()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"CPU times: user 1.6 s, sys: 28 ms, total: 1.63 s\n", | |
"Wall time: 258 ms\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"0.096040300836910855" | |
] | |
}, | |
"execution_count": 23, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"%%time\n", | |
"df.mean(df.tip_percentage)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"CPU times: user 34.6 s, sys: 8.28 s, total: 42.8 s\n", | |
"Wall time: 9.14 s\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"1.8301208899585906" | |
] | |
}, | |
"execution_count": 24, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"%%time\n", | |
"df.mean(df.arc_distance)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df['arc_distance_jit'] = df.arc_distance.jit_numba()\n", | |
"# df['arc_distance_jit'] = df.arc_distance.jit_pythran()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"CPU times: user 15.2 s, sys: 48.9 ms, total: 15.2 s\n", | |
"Wall time: 2.22 s\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"1.8301208899586112" | |
] | |
}, | |
"execution_count": 26, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"%%time\n", | |
"df.mean(df.arc_distance_jit)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Vaex\n", | |
" * Known API (Pandas)\n", | |
" * Super fast\n", | |
" * Expressions, no direct computation\n", | |
" * does not waste RAM\n", | |
" * JIT-ing\n", | |
" * derivatives\n", | |
" * machine learning: no more pipelines\n", | |
" * Remote datasets\n", | |
" * expressions and statistics gets transported, not data\n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import vaex\n", | |
"ds = vaex.open('/Users/maartenbreddels/datasets/aquarius/Aq-A-2-999-shuffled.hdf5')\n", | |
"ds.set_active_fraction(0.2)\n", | |
"ds.plot_widget('x', 'y', 'z', f='log', extent=[[40, 60]]*3, backend='ipyvolume', shape=100)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.4" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment