{ "cells": [ { "cell_type": "raw", "metadata": { "raw_mimetype": "text/html" }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Vaex introduction in 11 minutes \n", "\n", "[Because vaex goes up to 11](https://en.wikipedia.org/wiki/Up_to_eleven)\n", "\n", "If you want to try out this notebook with a live Python kernel, use mybinder:\n", "\n", "\n", "\n", "## DataFrame\n", "Central to Vaex is the DataFrame (similar, but more efficient than a Pandas DataFrame), and we often use the variable `df` to represent it. A DataFrame is an efficient representation for a large tabular dataset, and has:\n", "\n", " * A number of columns, say `x`, `y` and `z`, which are:\n", " * Backed by a Numpy array;\n", " * Wrapped by an expression system e.g. `df.x`, `df['x']` or `df.col.x` is an Expression;\n", " * Columns/expression can perform lazy computations, e.g. `df.x * np.sin(df.y)` does nothing, until the result is needed.\n", " * A set of virtual columns, columns that are backed by a (lazy) computation, e.g. `df['r'] = df.x/df.y` \n", " * A set of selections, that can be used to explore the dataset, e.g. `df.select(df.x < 0)`\n", " * Filtered DataFrames, that does not copy the data, `df_negative = df[df.x < 0]`\n", " \n", "Lets start with an example dataset, which is included in Vaex." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2020-04-15T18:56:49.933975Z", "start_time": "2020-04-15T18:56:48.859098Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
# id x y z vx vy vz E L Lz FeH
0 0 1.2318683862686157 -0.39692866802215576-0.598057746887207 301.1552734375 174.05947875976562 27.42754554748535 -149431.40625 407.38897705078125333.9555358886719 -1.0053852796554565
1 23 -0.163700610399246223.654221296310425 -0.25490644574165344-195.00022888183594170.47216796875 142.5302276611328 -124247.953125890.2411499023438 684.6676025390625 -1.7086670398712158
2 32 -2.120255947113037 3.326052665710449 1.7078403234481812 -48.63423156738281 171.6472930908203 -2.079437255859375 -138500.546875372.2410888671875 -202.17617797851562-1.8336141109466553
3 8 4.7155890464782715 4.5852508544921875 2.2515437602996826 -232.42083740234375-294.850830078125 62.85865020751953 -60037.03906251297.63037109375 -324.6875 -1.4786882400512695
4 16 7.21718692779541 11.99471664428711 -1.064562201499939 -1.6891745328903198181.329345703125 -11.333610534667969-83206.84375 1332.79895019531251328.948974609375 -1.8570483922958374
... ... ... ... ... ... ... ... ... ... ... ...
329,99521 1.9938701391220093 0.789276123046875 0.22205990552902222 -216.9299011230468816.124420166015625 -211.244384765625 -146457.4375 457.72247314453125203.36758422851562 -1.7451677322387695
329,99625 3.7180912494659424 0.721337616443634 1.6415337324142456 -185.92160034179688-117.25082397460938-105.4986572265625 -126627.109375335.0025634765625 -301.8370056152344 -0.9822322130203247
329,99714 0.3688507676124573 13.029608726501465 -3.633934736251831 -53.677146911621094-145.15771484375 76.70909881591797 -84912.2578125817.1375732421875 645.8507080078125 -1.7645612955093384
329,99818 -0.112592644989490511.4529125690460205 2.168952703475952 179.30865478515625 205.79710388183594 -68.75872802734375 -133498.46875 724.000244140625 -283.6910400390625 -1.8808952569961548
329,9994 20.796220779418945 -3.331387758255005 12.18841552734375 42.69000244140625 69.20479583740234 29.54275131225586 -65519.328125 1843.07470703125 1581.4151611328125 -1.1231083869934082
" ], "text/plain": [ "# id x y z vx vy vz E L Lz FeH\n", "0 0 1.2318683862686157 -0.39692866802215576 -0.598057746887207 301.1552734375 174.05947875976562 27.42754554748535 -149431.40625 407.38897705078125 333.9555358886719 -1.0053852796554565\n", "1 23 -0.16370061039924622 3.654221296310425 -0.25490644574165344 -195.00022888183594 170.47216796875 142.5302276611328 -124247.953125 890.2411499023438 684.6676025390625 -1.7086670398712158\n", "2 32 -2.120255947113037 3.326052665710449 1.7078403234481812 -48.63423156738281 171.6472930908203 -2.079437255859375 -138500.546875 372.2410888671875 -202.17617797851562 -1.8336141109466553\n", "3 8 4.7155890464782715 4.5852508544921875 2.2515437602996826 -232.42083740234375 -294.850830078125 62.85865020751953 -60037.0390625 1297.63037109375 -324.6875 -1.4786882400512695\n", "4 16 7.21718692779541 11.99471664428711 -1.064562201499939 -1.6891745328903198 181.329345703125 -11.333610534667969 -83206.84375 1332.7989501953125 1328.948974609375 -1.8570483922958374\n", "... ... ... ... ... ... ... ... ... ... ... ...\n", "329,995 21 1.9938701391220093 0.789276123046875 0.22205990552902222 -216.92990112304688 16.124420166015625 -211.244384765625 -146457.4375 457.72247314453125 203.36758422851562 -1.7451677322387695\n", "329,996 25 3.7180912494659424 0.721337616443634 1.6415337324142456 -185.92160034179688 -117.25082397460938 -105.4986572265625 -126627.109375 335.0025634765625 -301.8370056152344 -0.9822322130203247\n", "329,997 14 0.3688507676124573 13.029608726501465 -3.633934736251831 -53.677146911621094 -145.15771484375 76.70909881591797 -84912.2578125 817.1375732421875 645.8507080078125 -1.7645612955093384\n", "329,998 18 -0.11259264498949051 1.4529125690460205 2.168952703475952 179.30865478515625 205.79710388183594 -68.75872802734375 -133498.46875 724.000244140625 -283.6910400390625 -1.8808952569961548\n", "329,999 4 20.796220779418945 -3.331387758255005 12.18841552734375 42.69000244140625 69.20479583740234 29.54275131225586 -65519.328125 1843.07470703125 1581.4151611328125 -1.1231083869934082" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import vaex\n", "df = vaex.example()\n", "df # Since this is the last statement in a cell, it will print the DataFrame in a nice HTML format. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Columns\n", "The above preview shows that this dataset contains \$> 300,000\$ rows, and columns named x ,y, z (positions), vx, vy, vz (velocities), E (energy), L (angular momentum), and an id (subgroup of samples). When we print out a column, we can see that it is not a Numpy array, but an Expression." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2020-04-15T18:56:49.942305Z", "start_time": "2020-04-15T18:56:49.935689Z" } }, "outputs": [ { "data": { "text/plain": [ "Expression = x\n", "Length: 330,000 dtype: float32 (column)\n", "---------------------------------------\n", " 0 1.23187\n", " 1 -0.163701\n", " 2 -2.12026\n", " 3 4.71559\n", " 4 7.21719\n", " ... \n", "329995 1.99387\n", "329996 3.71809\n", "329997 0.368851\n", "329998 -0.112593\n", "329999 20.7962" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.x # df.col.x or df['x'] are equivalent, but df.x may be preferred because it is more tab completion friendly or programming friendly respectively" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One can use the `.values` method to get an in-memory representation of an expression. The same method can be applied to a DataFrame as well." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2020-04-15T18:56:49.949040Z", "start_time": "2020-04-15T18:56:49.944388Z" } }, "outputs": [ { "data": { "text/plain": [ "array([ 1.2318684 , -0.16370061, -2.120256 , ..., 0.36885077,\n", " -0.11259264, 20.79622 ], dtype=float32)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.x.values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Most Numpy functions (ufuncs) can be performed on expressions, and will not result in a direct result, but in a new expression." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2020-04-15T18:56:49.958000Z", "start_time": "2020-04-15T18:56:49.950537Z" } }, "outputs": [ { "data": { "text/plain": [ "Expression = sqrt((((x ** 2) + (y ** 2)) + (z ** 2)))\n", "Length: 330,000 dtype: float32 (expression)\n", "-------------------------------------------\n", " 0 1.42574\n", " 1 3.66676\n", " 2 4.29824\n", " 3 6.95203\n", " 4 14.039\n", " ... \n", "329995 2.15587\n", "329996 4.12785\n", "329997 13.5319\n", "329998 2.61304\n", "329999 24.3339" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "np.sqrt(df.x**2 + df.y**2 + df.z**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Virtual columns\n", "Sometimes it is convenient to store an expression as a column. We call this a virtual column since it does not take up any memory, and is computed on the fly when needed. A virtual column is treated just as a normal column." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2020-04-15T18:56:49.981786Z", "start_time": "2020-04-15T18:56:49.959056Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
# x y z r
0 1.2318683862686157 -0.39692866802215576-0.598057746887207 1.425736665725708
1 -0.163700610399246223.654221296310425 -0.254906445741653443.666757345199585
2 -2.120255947113037 3.326052665710449 1.7078403234481812 4.298235893249512
3 4.7155890464782715 4.5852508544921875 2.2515437602996826 6.952032566070557
4 7.21718692779541 11.99471664428711 -1.064562201499939 14.03902816772461
... ... ... ... ...
329,9951.9938701391220093 0.789276123046875 0.22205990552902222 2.155872344970703
329,9963.7180912494659424 0.721337616443634 1.6415337324142456 4.127851963043213
329,9970.3688507676124573 13.029608726501465 -3.633934736251831 13.531896591186523
329,998-0.112592644989490511.4529125690460205 2.168952703475952 2.613041877746582
329,99920.796220779418945 -3.331387758255005 12.18841552734375 24.333894729614258
" ], "text/plain": [ "# x y z r\n", "0 1.2318683862686157 -0.39692866802215576 -0.598057746887207 1.425736665725708\n", "1 -0.16370061039924622 3.654221296310425 -0.25490644574165344 3.666757345199585\n", "2 -2.120255947113037 3.326052665710449 1.7078403234481812 4.298235893249512\n", "3 4.7155890464782715 4.5852508544921875 2.2515437602996826 6.952032566070557\n", "4 7.21718692779541 11.99471664428711 -1.064562201499939 14.03902816772461\n", "... ... ... ... ...\n", "329,995 1.9938701391220093 0.789276123046875 0.22205990552902222 2.155872344970703\n", "329,996 3.7180912494659424 0.721337616443634 1.6415337324142456 4.127851963043213\n", "329,997 0.3688507676124573 13.029608726501465 -3.633934736251831 13.531896591186523\n", "329,998 -0.11259264498949051 1.4529125690460205 2.168952703475952 2.613041877746582\n", "329,999 20.796220779418945 -3.331387758255005 12.18841552734375 24.333894729614258" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['r'] = np.sqrt(df.x**2 + df.y**2 + df.z**2)\n", "df[['x', 'y', 'z', 'r']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Selections and filtering\n", "Vaex can be efficient when exploring subsets of the data, for instance to remove outliers or to inspect only a part of the data. Instead of making copies, Vaex internally keeps track which rows are selected." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2020-04-15T18:56:49.992283Z", "start_time": "2020-04-15T18:56:49.983254Z" } }, "outputs": [ { "data": { "text/plain": [ "array([-0.16370061, -2.120256 , -7.7843747 , ..., -8.126636 ,\n", " -3.9477386 , -0.11259264], dtype=float32)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.select(df.x < 0)\n", "df.evaluate(df.x, selection=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Selections are useful when you frequently modify the portion of the data you want to visualize, or when you want to efficiently compute statistics on several portions of the data effectively.\n", "\n", "Alternatively, you can also create filtered datasets. This is similar to using Pandas, except that Vaex does not copy the data." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2020-04-15T18:56:50.056954Z", "start_time": "2020-04-15T18:56:49.994132Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
# x y z r
0 -0.163700610399246223.654221296310425 -0.254906445741653443.666757345199585
1 -2.120255947113037 3.326052665710449 1.7078403234481812 4.298235893249512
2 -7.784374713897705 5.989774703979492 -0.682695209980011 9.845809936523438
3 -3.5571861267089844 5.413629055023193 0.09171556681394577 6.478376865386963
4 -20.813940048217773 -3.294677495956421 13.486607551574707 25.019264221191406
... ... ... ... ...
166,274-2.5926425457000732 -2.871671676635742 -0.180483341217041023.8730955123901367
166,275-0.7566012144088745 2.9830434322357178 -6.940553188323975 7.592250823974609
166,276-8.126635551452637 1.1619765758514404 -1.6459038257598877 8.372657775878906
166,277-3.9477386474609375 -3.0684902667999268-1.5822702646255493 5.244411468505859
166,278-0.112592644989490511.4529125690460205 2.168952703475952 2.613041877746582
" ], "text/plain": [ "# x y z r\n", "0 -0.16370061039924622 3.654221296310425 -0.25490644574165344 3.666757345199585\n", "1 -2.120255947113037 3.326052665710449 1.7078403234481812 4.298235893249512\n", "2 -7.784374713897705 5.989774703979492 -0.682695209980011 9.845809936523438\n", "3 -3.5571861267089844 5.413629055023193 0.09171556681394577 6.478376865386963\n", "4 -20.813940048217773 -3.294677495956421 13.486607551574707 25.019264221191406\n", "... ... ... ... ...\n", "166,274 -2.5926425457000732 -2.871671676635742 -0.18048334121704102 3.8730955123901367\n", "166,275 -0.7566012144088745 2.9830434322357178 -6.940553188323975 7.592250823974609\n", "166,276 -8.126635551452637 1.1619765758514404 -1.6459038257598877 8.372657775878906\n", "166,277 -3.9477386474609375 -3.0684902667999268 -1.5822702646255493 5.244411468505859\n", "166,278 -0.11259264498949051 1.4529125690460205 2.168952703475952 2.613041877746582" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_negative = df[df.x < 0]\n", "df_negative[['x', 'y', 'z', 'r']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Statistics on N-d grids\n", "\n", "A core feature of Vaex is the extremely efficient calculation of statistics on N-dimensional grids. This is rather useful for making visualisations of large datasets." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2020-04-15T18:56:50.088048Z", "start_time": "2020-04-15T18:56:50.059487Z" } }, "outputs": [ { "data": { "text/plain": [ "(array(330000), array(-0.0632868), array(-5.18457762))" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.count(), df.mean(df.x), df.mean(df.x, selection=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similar to SQL's groupby, Vaex uses the binby concept, which tells Vaex that a statistic should be calculated on a regular grid (for performance reasons)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2020-04-15T18:56:50.106014Z", "start_time": "2020-04-15T18:56:50.089858Z" } }, "outputs": [ { "data": { "text/plain": [ "array([1374, 1350, 1459, 1618, 1706, 1762, 1852, 2007, 2240, 2340, 2610,\n", " 2840, 3126, 3337, 3570, 3812, 4216, 4434, 4730, 4975, 5332, 5800,\n", " 6162, 6540, 6805, 7261, 7478, 7642, 7839, 8336, 8736, 8279, 8269,\n", " 8824, 8217, 7978, 7541, 7383, 7116, 6836, 6447, 6220, 5864, 5408,\n", " 4881, 4681, 4337, 4015, 3799, 3531, 3320, 3040, 2866, 2629, 2488,\n", " 2244, 1981, 1905, 1734, 1540, 1437, 1378, 1233, 1186])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "counts_x = df.count(binby=df.x, limits=[-10, 10], shape=64)\n", "counts_x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This results in a Numpy array with the number counts in 64 bins distributed between x = -10, and x = 10. We can quickly visualize this using Matplotlib." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2020-04-15T18:56:50.280131Z", "start_time": "2020-04-15T18:56:50.108151Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "