Skip to content

Instantly share code, notes, and snippets.

@elyase
Last active December 24, 2015 10:39
Show Gist options
  • Save elyase/6785287 to your computer and use it in GitHub Desktop.
Save elyase/6785287 to your computer and use it in GitHub Desktop.
R vs Python comparison http://nbviewer.ipython.org/6785287
{
"metadata": {
"name": "Untitled0"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Import data"
},
{
"cell_type": "code",
"collapsed": false,
"input": "import pandas as pd\n\nfoo = pd.read_clipboard()\nfoo",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>g1</th>\n <th>v1</th>\n <th>v2</th>\n <th>y1</th>\n <th>y2</th>\n <th>y3</th>\n <th>y4</th>\n <th>y5</th>\n <th>y6</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>1</th>\n <td> 1</td>\n <td> 7</td>\n <td> a</td>\n <td> y</td>\n <td> y</td>\n <td> y</td>\n <td> y</td>\n <td> y</td>\n <td> y</td>\n </tr>\n <tr>\n <th>2</th>\n <td> 0</td>\n <td> 5</td>\n <td> b</td>\n <td> c</td>\n <td> y</td>\n <td> c</td>\n <td> y</td>\n <td> w</td>\n <td> c</td>\n </tr>\n <tr>\n <th>3</th>\n <td> 0</td>\n <td> 4</td>\n <td> x</td>\n <td> f</td>\n <td> y</td>\n <td> c</td>\n <td> f</td>\n <td> f</td>\n <td> f</td>\n </tr>\n <tr>\n <th>4</th>\n <td> 1</td>\n <td> 4</td>\n <td> x</td>\n <td> f</td>\n <td> f</td>\n <td> f</td>\n <td> f</td>\n <td> f</td>\n <td> f</td>\n </tr>\n <tr>\n <th>5</th>\n <td> 1</td>\n <td> 3</td>\n <td> e</td>\n <td> w</td>\n <td> c</td>\n <td> w</td>\n <td> c</td>\n <td> w</td>\n <td> w</td>\n </tr>\n </tbody>\n</table>\n</div>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 19,
"text": " g1 v1 v2 y1 y2 y3 y4 y5 y6\n1 1 7 a y y y y y y\n2 0 5 b c y c y w c\n3 0 4 x f y c f f f\n4 1 4 x f f f f f f\n5 1 3 e w c w c w w"
}
],
"prompt_number": 19
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Test filter"
},
{
"cell_type": "code",
"collapsed": false,
"input": "cols = ['y{}'.format(i) for i in range(1,7)]\nfoo[foo[cols].apply(lambda x: x.min() != x.max(), axis=1)]",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>g1</th>\n <th>v1</th>\n <th>v2</th>\n <th>y1</th>\n <th>y2</th>\n <th>y3</th>\n <th>y4</th>\n <th>y5</th>\n <th>y6</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2</th>\n <td> 0</td>\n <td> 5</td>\n <td> b</td>\n <td> c</td>\n <td> y</td>\n <td> c</td>\n <td> y</td>\n <td> w</td>\n <td> c</td>\n </tr>\n <tr>\n <th>3</th>\n <td> 0</td>\n <td> 4</td>\n <td> x</td>\n <td> f</td>\n <td> y</td>\n <td> c</td>\n <td> f</td>\n <td> f</td>\n <td> f</td>\n </tr>\n <tr>\n <th>5</th>\n <td> 1</td>\n <td> 3</td>\n <td> e</td>\n <td> w</td>\n <td> c</td>\n <td> w</td>\n <td> c</td>\n <td> w</td>\n <td> w</td>\n </tr>\n </tbody>\n</table>\n</div>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 70,
"text": " g1 v1 v2 y1 y2 y3 y4 y5 y6\n2 0 5 b c y c y w c\n3 0 4 x f y c f f f\n5 1 3 e w c w c w w"
}
],
"prompt_number": 70
},
{
"cell_type": "code",
"collapsed": false,
"input": "foo[foo[cols].apply(lambda x: x.unique().size != 1, axis=1)]",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>g1</th>\n <th>v1</th>\n <th>v2</th>\n <th>y1</th>\n <th>y2</th>\n <th>y3</th>\n <th>y4</th>\n <th>y5</th>\n <th>y6</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2</th>\n <td> 0</td>\n <td> 5</td>\n <td> b</td>\n <td> c</td>\n <td> y</td>\n <td> c</td>\n <td> y</td>\n <td> w</td>\n <td> c</td>\n </tr>\n <tr>\n <th>3</th>\n <td> 0</td>\n <td> 4</td>\n <td> x</td>\n <td> f</td>\n <td> y</td>\n <td> c</td>\n <td> f</td>\n <td> f</td>\n <td> f</td>\n </tr>\n <tr>\n <th>5</th>\n <td> 1</td>\n <td> 3</td>\n <td> e</td>\n <td> w</td>\n <td> c</td>\n <td> w</td>\n <td> c</td>\n <td> w</td>\n <td> w</td>\n </tr>\n </tbody>\n</table>\n</div>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 81,
"text": " g1 v1 v2 y1 y2 y3 y4 y5 y6\n2 0 5 b c y c y w c\n3 0 4 x f y c f f f\n5 1 3 e w c w c w w"
}
],
"prompt_number": 81
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Python benchmark 1"
},
{
"cell_type": "code",
"collapsed": false,
"input": "%%timeit\ncols = ['y{}'.format(i) for i in range(1,7)]\nfoo[foo[cols].apply(lambda x: x.min() != x.max(), axis=1)]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "1000 loops, best of 3: 1.27 ms per loop\n"
}
],
"prompt_number": 85
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Python benchmark 2"
},
{
"cell_type": "code",
"collapsed": false,
"input": "%%timeit\ncols = ['y{}'.format(i) for i in range(1,7)]\nfoo[foo[cols].apply(lambda x: x.unique().size != 1, axis=1)]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "1000 loops, best of 3: 788 \u00b5s per loop\n"
}
],
"prompt_number": 89
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Test R filter"
},
{
"cell_type": "code",
"collapsed": false,
"input": "%%R\nr_foo<- data.frame(g1 = c(\"1\",\"0\",\"0\",\"1\",\"1\"), v1 = c(\"7\",\"5\",\"4\",\"4\",\"3\"), v2 = c(\"a\",\"b\",\"x\",\"x\",\"e\"), y1 = c(\"y\",\"c\",\"f\",\"f\",\"w\"), y2= c(\"y\",\"y\",\"y\",\"f\",\"c\"), y3 = c(\"y\",\"c\",\"c\",\"f\",\"w\"), y4= c(\"y\",\"y\",\"f\",\"f\",\"c\"), y5=c(\"y\",\"w\",\"f\",\"f\",\"w\"), y6=c(\"y\",\"c\",\"f\",\"f\",\"w\"))\nprint(r_foo)\nnew_df<-r_foo[apply(foo[ , paste(\"y\", 1:6, sep = \"\")], 1,\n FUN = function(x) length(unique(x)) > 1 ), ]\nprint('----------------------')\nprint(new_df)",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": " g1 v1 v2 y1 y2 y3 y4 y5 y6\n1 1 7 a y y y y y y\n2 0 5 b c y c y w c\n3 0 4 x f y c f f f\n4 1 4 x f f f f f f\n5 1 3 e w c w c w w\n[1] \"----------------------\"\n g1 v1 v2 y1 y2 y3 y4 y5 y6\n2 0 5 b c y c y w c\n3 0 4 x f y c f f f\n5 1 3 e w c w c w w\n"
}
],
"prompt_number": 67
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Benchmark R"
},
{
"cell_type": "code",
"collapsed": false,
"input": "%%timeit\n%R r_foo[apply(foo[ , paste(\"y\", 1:6, sep = \"\")], 1, FUN = function(x) length(unique(x)) > 1 ), ]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "100 loops, best of 3: 4.95 ms per loop\n"
}
],
"prompt_number": 90
},
{
"cell_type": "markdown",
"metadata": {},
"source": "### Results\n\n$ratio = \\frac {4.95} {0.788} = 6.28$"
},
{
"cell_type": "code",
"collapsed": false,
"input": "pd.Series({'R': 4.95, 'Python': 0.788}, name='time').plot(kind='bar', fontsize=18, rot=1);\ngca().set_ylabel('t(s)', fontsize=18);",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n4DoHnkYAAAAASUVORK5CYII=\n",
"text": "<matplotlib.figure.Figure at 0x10cd02e50>"
}
],
"prompt_number": 116
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment