From 3133540e458ad64d99bb1cdafcd1ba1314b0e40d Mon Sep 17 00:00:00 2001 From: Alexander Hess Date: Mon, 4 Oct 2021 10:17:48 +0200 Subject: [PATCH 1/5] Make Chapter 2 the new Chapter 3 - Classification is now Chapter 3 - New Chapter 2: Time Series Analysis --- .../00_content.ipynb | 0 .../static/3_types_of_machine_learning.png | Bin .../static/classification_vs_regression.png | Bin .../static/examples.png | Bin .../static/generalization.png | Bin .../static/iris.png | Bin .../static/iris_data.png | Bin .../static/knn.png | Bin .../static/python_ml_book.png | Bin .../static/r_ml_book.png | Bin .../static/spam.png | Bin .../static/what_is_machine_learning.png | Bin README.md | 5 +++-- 13 files changed, 3 insertions(+), 2 deletions(-) rename {02_classification => 03_classification}/00_content.ipynb (100%) rename {02_classification => 03_classification}/static/3_types_of_machine_learning.png (100%) rename {02_classification => 03_classification}/static/classification_vs_regression.png (100%) rename {02_classification => 03_classification}/static/examples.png (100%) rename {02_classification => 03_classification}/static/generalization.png (100%) rename {02_classification => 03_classification}/static/iris.png (100%) rename {02_classification => 03_classification}/static/iris_data.png (100%) rename {02_classification => 03_classification}/static/knn.png (100%) rename {02_classification => 03_classification}/static/python_ml_book.png (100%) rename {02_classification => 03_classification}/static/r_ml_book.png (100%) rename {02_classification => 03_classification}/static/spam.png (100%) rename {02_classification => 03_classification}/static/what_is_machine_learning.png (100%) diff --git a/02_classification/00_content.ipynb b/03_classification/00_content.ipynb similarity index 100% rename from 02_classification/00_content.ipynb rename to 03_classification/00_content.ipynb diff --git a/02_classification/static/3_types_of_machine_learning.png b/03_classification/static/3_types_of_machine_learning.png similarity index 100% rename from 02_classification/static/3_types_of_machine_learning.png rename to 03_classification/static/3_types_of_machine_learning.png diff --git a/02_classification/static/classification_vs_regression.png b/03_classification/static/classification_vs_regression.png similarity index 100% rename from 02_classification/static/classification_vs_regression.png rename to 03_classification/static/classification_vs_regression.png diff --git a/02_classification/static/examples.png b/03_classification/static/examples.png similarity index 100% rename from 02_classification/static/examples.png rename to 03_classification/static/examples.png diff --git a/02_classification/static/generalization.png b/03_classification/static/generalization.png similarity index 100% rename from 02_classification/static/generalization.png rename to 03_classification/static/generalization.png diff --git a/02_classification/static/iris.png b/03_classification/static/iris.png similarity index 100% rename from 02_classification/static/iris.png rename to 03_classification/static/iris.png diff --git a/02_classification/static/iris_data.png b/03_classification/static/iris_data.png similarity index 100% rename from 02_classification/static/iris_data.png rename to 03_classification/static/iris_data.png diff --git a/02_classification/static/knn.png b/03_classification/static/knn.png similarity index 100% rename from 02_classification/static/knn.png rename to 03_classification/static/knn.png diff --git a/02_classification/static/python_ml_book.png b/03_classification/static/python_ml_book.png similarity index 100% rename from 02_classification/static/python_ml_book.png rename to 03_classification/static/python_ml_book.png diff --git a/02_classification/static/r_ml_book.png b/03_classification/static/r_ml_book.png similarity index 100% rename from 02_classification/static/r_ml_book.png rename to 03_classification/static/r_ml_book.png diff --git a/02_classification/static/spam.png b/03_classification/static/spam.png similarity index 100% rename from 02_classification/static/spam.png rename to 03_classification/static/spam.png diff --git a/02_classification/static/what_is_machine_learning.png b/03_classification/static/what_is_machine_learning.png similarity index 100% rename from 02_classification/static/what_is_machine_learning.png rename to 03_classification/static/what_is_machine_learning.png diff --git a/README.md b/README.md index a6dd083..d8ff599 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,9 @@ To learn about Python and programming in detail, - *Exercises*: [Volume of a Sphere](00_python_in_a_nutshell/06_exercises_volume.ipynb) - *Content*: [Data Types](00_python_in_a_nutshell/07_content_data_types.ipynb) - *Chapter 1*: [Python's Scientific Stack](01_scientific_stack/00_content.ipynb) -- *Chapter 2*: [A first Example: Classifying Flowers](02_classification/00_content.ipynb) -- *Chapter 3*: [Case Study: House Prices in Ames, Iowa ](https://github.com/webartifex/ames-housing) +- *Chapter 2*: **Time Series Analyis** +- *Chapter 3*: [A first Example: Classifying Flowers](02_classification/00_content.ipynb) +- *Chapter 4*: [Case Study: House Prices in Ames, Iowa ](https://github.com/webartifex/ames-housing) ### Objective From 46e8b9e1749976cad863c36a7a1e0448d82b3b06 Mon Sep 17 00:00:00 2001 From: Alexander Hess Date: Mon, 4 Oct 2021 13:55:07 +0200 Subject: [PATCH 2/5] Rework the introduction on numpy - expand section on indexing and slicing in Chapter 1 on arrays - add section on dimensionality and shapes of arrays - streamline text in Chapter 1 - include thumbnails in links to scientific libraries - add explanation on slicing to core Python introduction and adjust the list example - streamline some text and titles in Chapter 0 --- .../02_content_logic.ipynb | 260 +++- .../05_content_functions.ipynb | 8 +- 01_scientific_stack/00_content.ipynb | 674 -------- 01_scientific_stack/00_content_numpy.ipynb | 1354 +++++++++++++++++ static/link/to_np.png | Bin 0 -> 1306 bytes static/link/to_pd.png | Bin 0 -> 862 bytes static/link/to_plt.png | Bin 0 -> 1148 bytes static/link/to_skl.png | Bin 0 -> 837 bytes 8 files changed, 1576 insertions(+), 720 deletions(-) delete mode 100644 01_scientific_stack/00_content.ipynb create mode 100644 01_scientific_stack/00_content_numpy.ipynb create mode 100644 static/link/to_np.png create mode 100644 static/link/to_pd.png create mode 100644 static/link/to_plt.png create mode 100644 static/link/to_skl.png diff --git a/00_python_in_a_nutshell/02_content_logic.ipynb b/00_python_in_a_nutshell/02_content_logic.ipynb index 43a5c5f..c40c754 100644 --- a/00_python_in_a_nutshell/02_content_logic.ipynb +++ b/00_python_in_a_nutshell/02_content_logic.ipynb @@ -36,7 +36,7 @@ "\n", "The syntax to create a `list` are brackets, `[` and `]`, another example of delimiters, listing the individual **elements** of the `list` in between them, separated by commas.\n", "\n", - "For example, the next code snippet creates a `list` named `numbers` with the numbers `1`, `2`, `3`, and `4` in it." + "For example, the next code snippet creates a `list` named `numbers` with the numbers `1`, `2`, `3`, `4`, and `5` in it." ] }, { @@ -47,7 +47,7 @@ { "data": { "text/plain": [ - "[1, 2, 3, 4]" + "[1, 2, 3, 4, 5]" ] }, "execution_count": 1, @@ -56,7 +56,7 @@ } ], "source": [ - "numbers = [1, 2, 3, 4]\n", + "numbers = [1, 2, 3, 4, 5]\n", "\n", "numbers" ] @@ -65,7 +65,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Whenever we use any kind of delimiter, we may break the lines in between them as we wish and add other so-called **whitespace** characters like spaces to format the way the code looks like. So, the following two code cells do *exactly* the same as the previous one, even the `,` after the `4` in the second cell is ignored." + "Whenever we use any kind of delimiter, we may break the lines in between them as we wish and add other so-called **whitespace** characters like spaces to format the way the code looks like. So, the following two code cells do *exactly* the same as the previous one, even the `,` after the `5` in the second cell is ignored." ] }, { @@ -76,7 +76,7 @@ { "data": { "text/plain": [ - "[1, 2, 3, 4]" + "[1, 2, 3, 4, 5]" ] }, "execution_count": 2, @@ -86,7 +86,7 @@ ], "source": [ "numbers = [\n", - " 1, 2, 3, 4\n", + " 1, 2, 3, 4, 5\n", "]\n", "\n", "numbers" @@ -100,7 +100,7 @@ { "data": { "text/plain": [ - "[1, 2, 3, 4]" + "[1, 2, 3, 4, 5]" ] }, "execution_count": 3, @@ -114,6 +114,7 @@ " 2,\n", " 3,\n", " 4,\n", + " 5,\n", "]\n", "\n", "numbers" @@ -135,6 +136,13 @@ "num" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Indexing & Slicing" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -183,7 +191,7 @@ { "data": { "text/plain": [ - "4" + "5" ] }, "execution_count": 5, @@ -210,7 +218,7 @@ "metadata": {}, "outputs": [], "source": [ - "numbers[0] = 4" + "numbers[0] = 5" ] }, { @@ -219,7 +227,7 @@ "metadata": {}, "outputs": [], "source": [ - "numbers[3] = 1" + "numbers[4] = 1" ] }, { @@ -230,7 +238,7 @@ { "data": { "text/plain": [ - "[4, 2, 3, 1]" + "[5, 2, 3, 4, 1]" ] }, "execution_count": 8, @@ -255,7 +263,7 @@ "metadata": {}, "outputs": [], "source": [ - "numbers[0], numbers[3] = numbers[3], numbers[0]" + "numbers[0], numbers[4] = numbers[4], numbers[0]" ] }, { @@ -266,7 +274,7 @@ { "data": { "text/plain": [ - "[1, 2, 3, 4]" + "[1, 2, 3, 4, 5]" ] }, "execution_count": 10, @@ -278,6 +286,174 @@ "numbers" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a generalization, we may also **slice** out some elements in the `list`. That is done with the `[...]` notation as well. Yet, instead of a single integer index, we now provide a *start* and a *stop* index separated by a `:`. While the element corresponding to the *start* index is included, this is not the case for *stop*.\n", + "\n", + "For example, to slice out the middle three elements, we write the following." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[2, 3, 4]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers[1:4]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We may combine positive and negative indexes.\n", + "\n", + "So, the following yields the same result." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[2, 3, 4]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers[1:-1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "While ommitting the *start* index makes a slice begin at the first element, ..." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 4]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers[:-1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "... leaving out the *stop* index makes a slice go to the last element." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[2, 3, 4, 5]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers[1:]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Providing a third integer as the *step* value after another `:` makes a slice skip some elements.\n", + "\n", + "For example, `[1:-1:2]` means \"go from the second element (including) to the last element (excluding) and take every second element\" ..." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[2, 4]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers[1:-1:2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "... while `[::2]` simply downsamples the `list` by taking every other element." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 3, 5]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numbers[::2]" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -333,21 +509,21 @@ "\n", "Many beginners struggle with the term \"loop.\" To visualize the looping behavior of this code, we use the online tool [PythonTutor ](http://pythontutor.com/visualize.html#code=numbers%20%3D%20%5B1,%202,%203,%204%5D%0A%0Atotal%20%3D%200%0A%0Afor%20number%20in%20numbers%3A%0A%20%20%20%20total%20%3D%20total%20%2B%20number%0A%0Atotal&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false). That tool is helpful for two reasons:\n", "1. It allows us to execute code in \"slow motion\" (i.e., by clicking the \"next\" button on the left side, only the next atomic step of the code snippet is executed).\n", - "2. It shows what happens inside the computer's memory on the right-hand side (cf., the \"*Thinking like a Computer*\" section further below)." + "2. It shows what happens inside the computer's memory on the right-hand side." ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "10" + "15" ] }, - "execution_count": 11, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -370,16 +546,16 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "10" + "15" ] }, - "execution_count": 12, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -395,16 +571,16 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "10" + "15" ] }, - "execution_count": 13, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -434,7 +610,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -443,7 +619,7 @@ "1" ] }, - "execution_count": 14, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -454,7 +630,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -463,7 +639,7 @@ "0" ] }, - "execution_count": 15, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -481,7 +657,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -490,7 +666,7 @@ "False" ] }, - "execution_count": 16, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -501,7 +677,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -510,7 +686,7 @@ "True" ] }, - "execution_count": 17, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -544,7 +720,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -553,7 +729,7 @@ "6" ] }, - "execution_count": 18, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -579,21 +755,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "`if` statements may have more than one header line: For example, the code in the `else`-clause's body is only executed if the condition in the `if`-clause is `False`. In the code cell below, we calculate the sum of all even numbers and subtract the sum of all odd numbers. The result is `(2 + 4) - (1 + 3)`, or `-1 + 2 - 3 + 4` resembling the order of the numbers in the `for`-loop." + "`if` statements may have more than one header line: For example, the code in the `else`-clause's body is only executed if the condition in the `if`-clause is `False`. In the code cell below, we calculate the sum of all even numbers and subtract the sum of all odd numbers. The result is `(2 + 4) - (1 + 3 + 5)`, or `-1 + 2 - 3 + 4 - 5` resembling the order of the numbers in the `for`-loop." ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "2" + "-3" ] }, - "execution_count": 19, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -621,7 +797,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -658,7 +834,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -706,7 +882,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -747,7 +923,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -788,7 +964,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 30, "metadata": {}, "outputs": [ { diff --git a/00_python_in_a_nutshell/05_content_functions.ipynb b/00_python_in_a_nutshell/05_content_functions.ipynb index 1b56e0e..7961934 100644 --- a/00_python_in_a_nutshell/05_content_functions.ipynb +++ b/00_python_in_a_nutshell/05_content_functions.ipynb @@ -29,7 +29,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## User-defined Functions" + "## Defining Functions" ] }, { @@ -151,7 +151,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/tmp/user/1000/ipykernel_305654/1049141082.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/tmp/user/1000/ipykernel_707190/1049141082.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'result' is not defined" ] } @@ -393,7 +393,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Extending Core Python with the Standard Library" + "## The Standard Library" ] }, { @@ -429,7 +429,7 @@ { "data": { "text/plain": [ - "0.44374384200665107" + "0.7021021034327006" ] }, "execution_count": 16, diff --git a/01_scientific_stack/00_content.ipynb b/01_scientific_stack/00_content.ipynb deleted file mode 100644 index 3498dbd..0000000 --- a/01_scientific_stack/00_content.ipynb +++ /dev/null @@ -1,674 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 1: Python's Scientific Stack" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Python itself does not come with any scientific algorithms. However, over time, many third-party libraries emerged that are useful to build machine learning applications. In this context, \"third-party\" means that the libraries are *not* part of Python's standard library.\n", - "\n", - "Among the popular ones are [numpy](https://numpy.org/) (numerical computations, linear algebra), [pandas](https://pandas.pydata.org/) (data processing), [matplotlib](https://matplotlib.org/) (visualisations), and [scikit-learn](https://scikit-learn.org/stable/index.html) (machine learning algorithms)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Extending Core Python with Third-party Packages" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Before we can import these libraries, we must ensure that they installed on our computers. If you installed Python via the Anaconda Distribution that should already be the case. Otherwise, we can use Python's **package manager** `pip` to install them manually.\n", - "\n", - "`pip` is a so-called command-line interface (CLI), meaning it is a program that is run within a terminal window. JupyterLab allows us to run such a CLI tool from within a notebook by starting a code cell with a single `%` symbol. Here, this does not mean Python's modulo operator but is just an instruction to JupyterLab that the following code is *not* Python." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: numpy in ./.venv/lib/python3.8/site-packages (1.20.3)\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install numpy" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: pandas in ./.venv/lib/python3.8/site-packages (1.2.4)\n", - "Requirement already satisfied: numpy>=1.16.5 in ./.venv/lib/python3.8/site-packages (from pandas) (1.20.3)\n", - "Requirement already satisfied: python-dateutil>=2.7.3 in ./.venv/lib/python3.8/site-packages (from pandas) (2.8.1)\n", - "Requirement already satisfied: pytz>=2017.3 in ./.venv/lib/python3.8/site-packages (from pandas) (2021.1)\n", - "Requirement already satisfied: six>=1.5 in ./.venv/lib/python3.8/site-packages (from python-dateutil>=2.7.3->pandas) (1.16.0)\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install pandas" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: matplotlib in ./.venv/lib/python3.8/site-packages (3.4.2)\n", - "Requirement already satisfied: python-dateutil>=2.7 in ./.venv/lib/python3.8/site-packages (from matplotlib) (2.8.1)\n", - "Requirement already satisfied: pyparsing>=2.2.1 in ./.venv/lib/python3.8/site-packages (from matplotlib) (2.4.7)\n", - "Requirement already satisfied: pillow>=6.2.0 in ./.venv/lib/python3.8/site-packages (from matplotlib) (8.2.0)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in ./.venv/lib/python3.8/site-packages (from matplotlib) (1.3.1)\n", - "Requirement already satisfied: numpy>=1.16 in ./.venv/lib/python3.8/site-packages (from matplotlib) (1.20.3)\n", - "Requirement already satisfied: cycler>=0.10 in ./.venv/lib/python3.8/site-packages (from matplotlib) (0.10.0)\n", - "Requirement already satisfied: six in ./.venv/lib/python3.8/site-packages (from cycler>=0.10->matplotlib) (1.16.0)\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install matplotlib" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: scikit-learn in ./.venv/lib/python3.8/site-packages (0.24.2)\n", - "Requirement already satisfied: joblib>=0.11 in ./.venv/lib/python3.8/site-packages (from scikit-learn) (1.0.1)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in ./.venv/lib/python3.8/site-packages (from scikit-learn) (2.1.0)\n", - "Requirement already satisfied: numpy>=1.13.3 in ./.venv/lib/python3.8/site-packages (from scikit-learn) (1.20.3)\n", - "Requirement already satisfied: scipy>=0.19.1 in ./.venv/lib/python3.8/site-packages (from scikit-learn) (1.6.1)\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install scikit-learn" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After we have ensured that the third-party libraries are installed locally, we can simply go ahead with the `import` statement. All the libraries are commonly imported with shorter prefixes for convenient use later on." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's see how the data type provided by these scientific libraries differ from Python's built-in ones.\n", - "\n", - "As an example, we create a `list` object similar to the one from Chapter 0." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 2, 3]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vector = [1, 2, 3]\n", - "\n", - "vector" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We call the `list` object by the name `vector` as that is what the data mean conceptually. As we remember from our linear algebra courses, vectors should implement scalar-multiplication. So, the following code cell should result in `[3, 6, 9]` as the answer. Surprisingly, the result is a new `list` with all the elements in `vector` repeated three times. That operation is called **concatenation** and is an example of a concept called **operator overloading**. That means that an operator, like `*` in the example, may exhibit a different behavior depending on the data type of its operands." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 2, 3, 1, 2, 3, 1, 2, 3]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "3 * vector" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`numpy`, among others, provides a data type called an **n-dimensional array**. This may sound fancy at first but when used with only 1 or 2 dimensions, it basically represents vectors and matrices as we know them from linear algebra. Additionally, arrays allow for much faster computations as they are implemented in the very efficient [C language](https://en.wikipedia.org/wiki/C_%28programming_language%29) and optimized for numerical operations." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To create an array, we use the [array()](https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html#numpy-array) constructor from the imported `np` module and provide it with a `list` of values." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1, 2, 3])" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v1 = np.array([1, 2, 3])\n", - "\n", - "v1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The vector `v1` can now be multiplied with a scalar yielding a result meaningful in the context of linear algebra." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([3, 6, 9])" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v2 = 3 * v1\n", - "\n", - "v2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To create a matrix, we just use a `list` of (row) `list`s of values." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1, 2, 3],\n", - " [4, 5, 6]])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m1 = np.array([\n", - " [1, 2, 3],\n", - " [4, 5, 6],\n", - "])\n", - "\n", - "m1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can use `numpy`'s `dot()` function to multiply a matrix with a vector to obtain a new vector ..." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([14, 32])" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v3 = np.dot(m1, v1)\n", - "\n", - "v3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "... or simply transpose it by accessing its `.T` attribute." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1, 4],\n", - " [2, 5],\n", - " [3, 6]])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m1.T" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The rules from maths still apply and it makes a difference if a vector is multiplied from the left or the right by a matrix. The following operation will fail." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "shapes (3,) and (2,3) not aligned: 3 (dim 0) != 2 (dim 0)", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mdot\u001b[0;34m(*args, **kwargs)\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m: shapes (3,) and (2,3) not aligned: 3 (dim 0) != 2 (dim 0)" - ] - } - ], - "source": [ - "np.dot(v1, m1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In order to retrieve only a **slice** (i.e., subset) of an array's data, we index into it. For example, the first row of the matrix is ..." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1, 2, 3])" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m1[0, :]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "... while the second column is:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([2, 5])" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m1[:, 1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To acces the lowest element in the right column, two indices can be used." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m1[1, 2]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`numpy` also provides various other functions and constants, such as `linspace()` to create an array of equidistant numbers, `sin()` to calculate the sinus values for all numbers in an array, or simple an approximation for `pi`. To further illustrate the concept of **vectorization**, let us calculate the sinus curve over a range of 100 values, going from negative to positive $3\\pi$." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([-9.42477796, -9.23437841, -9.04397885, -8.8535793 , -8.66317974,\n", - " -8.47278019, -8.28238063, -8.09198108, -7.90158152, -7.71118197,\n", - " -7.52078241, -7.33038286, -7.1399833 , -6.94958375, -6.75918419,\n", - " -6.56878464, -6.37838508, -6.18798553, -5.99758598, -5.80718642,\n", - " -5.61678687, -5.42638731, -5.23598776, -5.0455882 , -4.85518865,\n", - " -4.66478909, -4.47438954, -4.28398998, -4.09359043, -3.90319087,\n", - " -3.71279132, -3.52239176, -3.33199221, -3.14159265, -2.9511931 ,\n", - " -2.76079354, -2.57039399, -2.37999443, -2.18959488, -1.99919533,\n", - " -1.80879577, -1.61839622, -1.42799666, -1.23759711, -1.04719755,\n", - " -0.856798 , -0.66639844, -0.47599889, -0.28559933, -0.09519978,\n", - " 0.09519978, 0.28559933, 0.47599889, 0.66639844, 0.856798 ,\n", - " 1.04719755, 1.23759711, 1.42799666, 1.61839622, 1.80879577,\n", - " 1.99919533, 2.18959488, 2.37999443, 2.57039399, 2.76079354,\n", - " 2.9511931 , 3.14159265, 3.33199221, 3.52239176, 3.71279132,\n", - " 3.90319087, 4.09359043, 4.28398998, 4.47438954, 4.66478909,\n", - " 4.85518865, 5.0455882 , 5.23598776, 5.42638731, 5.61678687,\n", - " 5.80718642, 5.99758598, 6.18798553, 6.37838508, 6.56878464,\n", - " 6.75918419, 6.94958375, 7.1399833 , 7.33038286, 7.52078241,\n", - " 7.71118197, 7.90158152, 8.09198108, 8.28238063, 8.47278019,\n", - " 8.66317974, 8.8535793 , 9.04397885, 9.23437841, 9.42477796])" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = np.linspace(-3 * np.pi, 3 * np.pi, 100)\n", - "\n", - "x" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([-3.67394040e-16, -1.89251244e-01, -3.71662456e-01, -5.40640817e-01,\n", - " -6.90079011e-01, -8.14575952e-01, -9.09631995e-01, -9.71811568e-01,\n", - " -9.98867339e-01, -9.89821442e-01, -9.45000819e-01, -8.66025404e-01,\n", - " -7.55749574e-01, -6.18158986e-01, -4.58226522e-01, -2.81732557e-01,\n", - " -9.50560433e-02, 9.50560433e-02, 2.81732557e-01, 4.58226522e-01,\n", - " 6.18158986e-01, 7.55749574e-01, 8.66025404e-01, 9.45000819e-01,\n", - " 9.89821442e-01, 9.98867339e-01, 9.71811568e-01, 9.09631995e-01,\n", - " 8.14575952e-01, 6.90079011e-01, 5.40640817e-01, 3.71662456e-01,\n", - " 1.89251244e-01, -1.22464680e-16, -1.89251244e-01, -3.71662456e-01,\n", - " -5.40640817e-01, -6.90079011e-01, -8.14575952e-01, -9.09631995e-01,\n", - " -9.71811568e-01, -9.98867339e-01, -9.89821442e-01, -9.45000819e-01,\n", - " -8.66025404e-01, -7.55749574e-01, -6.18158986e-01, -4.58226522e-01,\n", - " -2.81732557e-01, -9.50560433e-02, 9.50560433e-02, 2.81732557e-01,\n", - " 4.58226522e-01, 6.18158986e-01, 7.55749574e-01, 8.66025404e-01,\n", - " 9.45000819e-01, 9.89821442e-01, 9.98867339e-01, 9.71811568e-01,\n", - " 9.09631995e-01, 8.14575952e-01, 6.90079011e-01, 5.40640817e-01,\n", - " 3.71662456e-01, 1.89251244e-01, 1.22464680e-16, -1.89251244e-01,\n", - " -3.71662456e-01, -5.40640817e-01, -6.90079011e-01, -8.14575952e-01,\n", - " -9.09631995e-01, -9.71811568e-01, -9.98867339e-01, -9.89821442e-01,\n", - " -9.45000819e-01, -8.66025404e-01, -7.55749574e-01, -6.18158986e-01,\n", - " -4.58226522e-01, -2.81732557e-01, -9.50560433e-02, 9.50560433e-02,\n", - " 2.81732557e-01, 4.58226522e-01, 6.18158986e-01, 7.55749574e-01,\n", - " 8.66025404e-01, 9.45000819e-01, 9.89821442e-01, 9.98867339e-01,\n", - " 9.71811568e-01, 9.09631995e-01, 8.14575952e-01, 6.90079011e-01,\n", - " 5.40640817e-01, 3.71662456e-01, 1.89251244e-01, 3.67394040e-16])" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y = np.sin(x)\n", - "\n", - "y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With `matplotlib`'s [plot()](https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot) function we can visualize the sinus curve." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.plot(x, y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us quickly generate some random data and draw a scatter plot with `numpy`'s `random` module." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "x = np.random.normal(42, 3, 100)\n", - "y = np.random.gamma(7, 1, 100)\n", - "\n", - "plt.scatter(x, y)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.12" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": false, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/01_scientific_stack/00_content_numpy.ipynb b/01_scientific_stack/00_content_numpy.ipynb new file mode 100644 index 0000000..1872760 --- /dev/null +++ b/01_scientific_stack/00_content_numpy.ipynb @@ -0,0 +1,1354 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note**: Click on \"*Kernel*\" > \"*Restart Kernel and Clear All Outputs*\" in [JupyterLab](https://jupyterlab.readthedocs.io/en/stable/) *before* reading this notebook to reset its output. If you cannot run this file on your machine, you may want to open it [in the cloud ](https://mybinder.org/v2/gh/webartifex/intro-to-data-science/main?urlpath=lab/tree/01_scientific_stack/00_content_numpy.ipynb)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 1: Python's Scientific Stack (Part 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Python itself does not come with any scientific algorithms. However, over time, many third-party libraries emerged that are useful to build machine learning applications. In this context, \"third-party\" means that the libraries are *not* part of Python's standard library.\n", + "\n", + "Among the popular ones are [numpy ](https://numpy.org/) (numerical computations, linear algebra), [pandas ](https://pandas.pydata.org/) (data processing), [matplotlib ](https://matplotlib.org/) (visualisations), and [scikit-learn ](https://scikit-learn.org/stable/index.html) (machine learning algorithms)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extending Python with Third-party Packages" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before we can import these libraries, we must ensure that they installed on our computers. If you installed Python via the Anaconda Distribution that should already be the case. Otherwise, we can use Python's **package manager** `pip` to install them manually.\n", + "\n", + "`pip` is a so-called command-line interface (CLI), meaning it is a program that is run within a terminal window. JupyterLab allows us to run such a CLI tool from within a notebook by starting a code cell with a single `%` symbol. Here, this does not mean Python's modulo operator but is just an instruction to JupyterLab that the following code is *not* Python.\n", + "\n", + "So, let's proceed by installing [numpy ](https://numpy.org/) and [matplotlib ](https://matplotlib.org/)." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: numpy in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (1.21.1)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install numpy" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: matplotlib in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (3.4.3)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (from matplotlib) (2.8.2)\n", + "Requirement already satisfied: cycler>=0.10 in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (from matplotlib) (0.10.0)\n", + "Requirement already satisfied: pyparsing>=2.2.1 in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (from matplotlib) (2.4.7)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (from matplotlib) (1.3.2)\n", + "Requirement already satisfied: pillow>=6.2.0 in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (from matplotlib) (8.3.2)\n", + "Requirement already satisfied: numpy>=1.16 in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (from matplotlib) (1.21.1)\n", + "Requirement already satisfied: six in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (from cycler>=0.10->matplotlib) (1.16.0)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install matplotlib" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After we have ensured that the third-party libraries are installed locally, we can simply go ahead with the `import` statement. All the libraries are commonly imported with shorter prefixes for convenient use later on." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's see how the data type provided by these scientific libraries differ from Python's built-in ones." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vectors and Matrices with Numpy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As an example, let's start by creating a `list` object." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 4, 5]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vector = [1, 2, 3, 4, 5]\n", + "\n", + "vector" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We call the `list` object by the name `vector` as that is what the data is supposed to mean conceptually. As we remember from our linear algebra courses, vectors should implement scalar-multiplication. So, the following code cell should result in `[3, 6, 9, 12, 15]` as the answer. Surprisingly, the result is a new `list` with all the elements in `vector` repeated three times. That operation is called **concatenation** and is an example of a concept called **operator overloading**. That means that an operator, like `*` in the example, may exhibit a different behavior depending on the data type of its operands." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "3 * vector" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[numpy ](https://numpy.org/), among others, provides a data type called an **n-dimensional array**. This may sound fancy at first but when used with only 1 or 2 dimensions, it basically represents vectors and matrices as we know them from linear algebra. Additionally, arrays allow for much faster computations as they are implemented in the very efficient [C language ](https://en.wikipedia.org/wiki/C_%28programming_language%29) and optimized for numerical operations." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To create an array, we use the [np.array() ](https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html#numpy-array) constructor and provide it a `list` of values." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 2, 3, 4, 5])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v1 = np.array([1, 2, 3, 4, 5])\n", + "\n", + "v1" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(v1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The vector `v1` can now be multiplied with a scalar yielding a result meaningful in the context of linear algebra." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 3, 6, 9, 12, 15])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v2 = 3 * v1\n", + "\n", + "v2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To model a matrix, we use a `list` of (row) `list`s of values. Note how the output below the cell contains *two* levels of brackets `[` and `]`." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1, 2, 3, 4, 5],\n", + " [ 6, 7, 8, 9, 10]])" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1 = np.array([\n", + " [1, 2, 3, 4, 5],\n", + " [6, 7, 8, 9, 10],\n", + "])\n", + "\n", + "m1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use the [np.dot() ](https://numpy.org/doc/stable/reference/generated/numpy.dot.html#numpy.dot) function to multiply a matrix with a vector to obtain a new vector ..." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 55, 130])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v3 = np.dot(m1, v1)\n", + "\n", + "v3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "... or simply transpose it by accessing its [.T ](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.T.html#numpy.ndarray.T) attribute." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1, 6],\n", + " [ 2, 7],\n", + " [ 3, 8],\n", + " [ 4, 9],\n", + " [ 5, 10]])" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1.T" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The rules from maths still apply and it makes a difference if a vector is multiplied from the left or the right by a matrix. The following operation will fail." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "shapes (5,) and (2,5) not aligned: 5 (dim 0) != 2 (dim 0)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/user/1000/ipykernel_1264563/568665770.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mdot\u001b[0;34m(*args, **kwargs)\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: shapes (5,) and (2,5) not aligned: 5 (dim 0) != 2 (dim 0)" + ] + } + ], + "source": [ + "np.dot(v1, m1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Indexing & Slicing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to retrieve only a subset of an array's data, we index or slice into it. This is similar to how we index or slice into `list` objects, in particular, if we deal with one-dimensional arrays like `v1`, `v2`, or `v3`." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 2, 3, 4, 5])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Indexing may be done with either positive (`0`-based) indexes from the left or negative (`1`-based) indexes from the right.\n", + "\n", + "Here, we obtain the first and the last element in `v1`." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v1[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v1[-1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Slicing uses the same `:` notation as with `list`s taking *start*, *stop*, and *step* values." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([2, 3, 4])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v1[1:-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([3, 4, 5])" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v1[2:]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 2, 3, 4])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v1[:-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([2, 4])" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v1[1:-1:2]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 3, 5])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v1[::2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Indexing and slicing become slightly more complicated when working with higher dimensional arrays like `m1`. In principle, we must provide either an index or a slice for *each* dimension." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1, 2, 3, 4, 5],\n", + " [ 6, 7, 8, 9, 10]])" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For example, to slice out the first row of the matrix, we write `[0, :]`. The `0` implies taking elements in *only* the *first* row and the `:` means taking elements across *all* columns." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 2, 3, 4, 5])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1[0, :]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For sure, we could also *not* leave out the *start* and *stop* values along the second dimension and obtain the same result. But that would not only be unneccessary but also communicate a different meaning, namely to \"take elements from the first through the fifth columns\" instead of \"take elements from all columns.\"" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 2, 3, 4, 5])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1[0, 0:5]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Whenever we take *all* elements in *later* dimensions (i.e., those more to the right), we may also drop the index or slice instead and keep only the *earlier* ones. However, the previous style is a bit more explicit in that we are working with a two-dimensional array." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 2, 3, 4, 5])" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As another example, let's slice out elements across *all* rows but in only the *second* column. Colloquially, we can say that we \"slice out the second column\" from the matrix." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([2, 7])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1[:, 1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we wanted to slice out a smaller matrix from a larger one, we slice along both dimensions. Above, we have only sliced along one dimension while indexing into the other.\n", + "\n", + "For example, to obtain a 2x2 square matrix consisting of the two left-most columns in `m1`, we can write the following." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1, 2],\n", + " [6, 7]])" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1[:2, :2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly, to slice out a 2x2 matrix consisting of the two right-most columns, we write the following." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 4, 5],\n", + " [ 9, 10]])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1[-2:, -2:]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To access individual elements as scalars, we combine two indexes along both dimensions.\n", + "\n", + "For example, to access the element in the lower-left corner, we write the following." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1[1, 0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dimensionality vs. Shapes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Both, the vectors `v1`, `v2`, and `v3`, and the matrix `m1` have the *same* **data type** from a technical point of view, namely `np.ndarray`." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(v1)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(m1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So, how can we tell that they have different dimensions without looking at how they are displayed below a code cell?\n", + "\n", + "The `np.ndarray` type comes with a couple of **properties** that we can access via the dot notation. Examples are `.ndim` and `.shape`.\n", + "\n", + "While `.ndim` simply tells us how many dimensions an array has, ..." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v1.ndim" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1.ndim" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "... `.shape` reveals the structure of the elements. The one-element tuple `(5,)` below says that there is one dimension along which there are five elements ..." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(5,)" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v1.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "... whereas the two-element tuple `(2, 5)` indicates that the array's elements are placed along two dimensions spanning a grid of two elements in one and five elements into the other dimension. We know such notations already from our linear algebra courses where we would call `m1` a 2x5 matrix." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(2, 5)" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is a relationship behind the dimensionality of an array we are slicing and indexing and what we get back as a result: Whenever we index into an array along some dimension, the result will have one dimension less than the original.\n", + "\n", + "For example, if we start with a two-dimensional array like `m1` and slice along both dimensions, the result will also have two dimensions, even if it holds only one element." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1, 2, 3, 4, 5],\n", + " [ 6, 7, 8, 9, 10]])" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1]])" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1[:1, :1] # Note the double brackets" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If, on the contrary, we slice only along one of the two dimensions and index into the other, the result is a one-dimensional array. So, both of the below slices have the *same* properties and we cannot tell if one of them was (part of) a row or column in `m1`." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([6, 7])" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1[1, :2]" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 5, 10])" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1[:, -1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, indexing along both dimensions gives us back a scalar value." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1[0, 0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Array Constructors & Functions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[numpy ](https://numpy.org/) provides various **constructors** (i.e., functions) to create all kinds of arrays.\n", + "\n", + "For example, [np.linspace() ](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html#numpy.linspace) creates an array of equidistant numbers, often used to model the values on a function's x-axis. [np.pi ](https://numpy.org/doc/stable/reference/constants.html#numpy.pi) is an alias for Python's built-in `math.pi`. The cell below creates `100` coordinate points arranged between $-3\\pi$ and $+3\\pi$." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-9.42477796, -9.23437841, -9.04397885, -8.8535793 , -8.66317974,\n", + " -8.47278019, -8.28238063, -8.09198108, -7.90158152, -7.71118197,\n", + " -7.52078241, -7.33038286, -7.1399833 , -6.94958375, -6.75918419,\n", + " -6.56878464, -6.37838508, -6.18798553, -5.99758598, -5.80718642,\n", + " -5.61678687, -5.42638731, -5.23598776, -5.0455882 , -4.85518865,\n", + " -4.66478909, -4.47438954, -4.28398998, -4.09359043, -3.90319087,\n", + " -3.71279132, -3.52239176, -3.33199221, -3.14159265, -2.9511931 ,\n", + " -2.76079354, -2.57039399, -2.37999443, -2.18959488, -1.99919533,\n", + " -1.80879577, -1.61839622, -1.42799666, -1.23759711, -1.04719755,\n", + " -0.856798 , -0.66639844, -0.47599889, -0.28559933, -0.09519978,\n", + " 0.09519978, 0.28559933, 0.47599889, 0.66639844, 0.856798 ,\n", + " 1.04719755, 1.23759711, 1.42799666, 1.61839622, 1.80879577,\n", + " 1.99919533, 2.18959488, 2.37999443, 2.57039399, 2.76079354,\n", + " 2.9511931 , 3.14159265, 3.33199221, 3.52239176, 3.71279132,\n", + " 3.90319087, 4.09359043, 4.28398998, 4.47438954, 4.66478909,\n", + " 4.85518865, 5.0455882 , 5.23598776, 5.42638731, 5.61678687,\n", + " 5.80718642, 5.99758598, 6.18798553, 6.37838508, 6.56878464,\n", + " 6.75918419, 6.94958375, 7.1399833 , 7.33038286, 7.52078241,\n", + " 7.71118197, 7.90158152, 8.09198108, 8.28238063, 8.47278019,\n", + " 8.66317974, 8.8535793 , 9.04397885, 9.23437841, 9.42477796])" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = np.linspace(-3 * np.pi, 3 * np.pi, 100)\n", + "\n", + "x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Besides constructors, [numpy ](https://numpy.org/) provides all kinds of **vectorized** functions. The concept of **vectorization** means that a function is executed once for *each* element in an array. Vectorized functions are one major benefit of using [numpy ](https://numpy.org/): Not only are they optimized heavily on the C level (i.e., \"behind the scenes\") but also allow us to avoid writing explicit `for`-loops that are for some technical reasons considered \"slow\" in Python.\n", + "\n", + "For example, [np.sin() ](https://numpy.org/doc/stable/reference/generated/numpy.sin.html#numpy.sin) calculates the sine for each element in the `x` array. The resulting `y` array has thus the same `.shape` as `x`." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-3.67394040e-16, -1.89251244e-01, -3.71662456e-01, -5.40640817e-01,\n", + " -6.90079011e-01, -8.14575952e-01, -9.09631995e-01, -9.71811568e-01,\n", + " -9.98867339e-01, -9.89821442e-01, -9.45000819e-01, -8.66025404e-01,\n", + " -7.55749574e-01, -6.18158986e-01, -4.58226522e-01, -2.81732557e-01,\n", + " -9.50560433e-02, 9.50560433e-02, 2.81732557e-01, 4.58226522e-01,\n", + " 6.18158986e-01, 7.55749574e-01, 8.66025404e-01, 9.45000819e-01,\n", + " 9.89821442e-01, 9.98867339e-01, 9.71811568e-01, 9.09631995e-01,\n", + " 8.14575952e-01, 6.90079011e-01, 5.40640817e-01, 3.71662456e-01,\n", + " 1.89251244e-01, -1.22464680e-16, -1.89251244e-01, -3.71662456e-01,\n", + " -5.40640817e-01, -6.90079011e-01, -8.14575952e-01, -9.09631995e-01,\n", + " -9.71811568e-01, -9.98867339e-01, -9.89821442e-01, -9.45000819e-01,\n", + " -8.66025404e-01, -7.55749574e-01, -6.18158986e-01, -4.58226522e-01,\n", + " -2.81732557e-01, -9.50560433e-02, 9.50560433e-02, 2.81732557e-01,\n", + " 4.58226522e-01, 6.18158986e-01, 7.55749574e-01, 8.66025404e-01,\n", + " 9.45000819e-01, 9.89821442e-01, 9.98867339e-01, 9.71811568e-01,\n", + " 9.09631995e-01, 8.14575952e-01, 6.90079011e-01, 5.40640817e-01,\n", + " 3.71662456e-01, 1.89251244e-01, 1.22464680e-16, -1.89251244e-01,\n", + " -3.71662456e-01, -5.40640817e-01, -6.90079011e-01, -8.14575952e-01,\n", + " -9.09631995e-01, -9.71811568e-01, -9.98867339e-01, -9.89821442e-01,\n", + " -9.45000819e-01, -8.66025404e-01, -7.55749574e-01, -6.18158986e-01,\n", + " -4.58226522e-01, -2.81732557e-01, -9.50560433e-02, 9.50560433e-02,\n", + " 2.81732557e-01, 4.58226522e-01, 6.18158986e-01, 7.55749574e-01,\n", + " 8.66025404e-01, 9.45000819e-01, 9.89821442e-01, 9.98867339e-01,\n", + " 9.71811568e-01, 9.09631995e-01, 8.14575952e-01, 6.90079011e-01,\n", + " 5.40640817e-01, 3.71662456e-01, 1.89251244e-01, 3.67394040e-16])" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y = np.sin(x)\n", + "\n", + "y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, let's use [matplotlib ](https://matplotlib.org/)'s [plt.plot() ](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib.pyplot.plot) function to visualize the sine curve between $-3\\pi$ and $+3\\pi$." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(x, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we use only `10` equidistant points for `x`, the resulting curve does not look like a curve. There is a trade-off behind this: To make nice plots, we need a rather high granularity of data points. That, however, causes more computations in the background making the plotting slower. With toy data like the one here this is not an issue. For real life data that may be different." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = np.linspace(-3 * np.pi, 3 * np.pi, 10)\n", + "y = np.sin(x)\n", + "\n", + "plt.plot(x, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[numpy ](https://numpy.org/) provides further constructors. Most notably are the ones in the [np.random ](https://numpy.org/doc/stable/reference/random/index.html#module-numpy.random) module that mirrors the [random ](https://docs.python.org/3/library/random.html) module in the [standard library ](https://docs.python.org/3/library/index.html): For example, [np.random.normal() ](https://numpy.org/doc/stable/reference/random/generated/numpy.random.normal.html#numpy.random.normal) and [np.random.gamma() ](https://numpy.org/doc/stable/reference/random/generated/numpy.random.gamma.html#numpy.random.gamma) return arrays whose elements follow the normal and gamma probability distributions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us quickly generate some random data points and draw a scatter plot with [matplotlib ](https://matplotlib.org/)'s [plt.scatter() ](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.scatter) function." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = np.random.normal(42, 3, 100)\n", + "y = np.random.gamma(7, 1, 100)\n", + "\n", + "plt.scatter(x, y)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/static/link/to_np.png b/static/link/to_np.png new file mode 100644 index 0000000000000000000000000000000000000000..b2911dba8996ea9a3dd08033b90d688b2998fdb1 GIT binary patch literal 1306 zcmV+#1?BpQP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv|NsC0|NjYC_uK#g00(qQO+^Rg3IqrTI40lFh5!Hr9!W$&R5;6xRC`QYbrk;H z+uru}!CKl<1XiA-E0%3+v@7dOP!SLuMBI!-mJvc6WFaNYZ7u>MZcEJ6ZOKT6s}az# z01l%8MO~&WN?ds}7%(iI6iQnP^l@8gd;9qL$JEe73EzL`B;R+wd^zU;xE=Um00!YN za2~Ef68d3qJ0uir314OKIJ__}U0!!iwGxwErl^r4=FglQGCeQ^rCW26XA?HJNMkS# zmRN%8pOfLiVYmS++Tk=XgMn0IJfTRHMU=DJ%P4y^(J6EtwHJ*QC>Y_ieY8I)FCep< zb*P&QeKS$*xzdp|-EOX*7_=n2K9WT9*I1=*)=8cUHLnN6$AxlQ6$L@EyDw^6SEGmS zn{Ln2;{E5Q$#FZV}JVd^I^b{2~(-cC&hEaYVYeK9Fl&@Vx66g-C0^ zG4yQM)Q9hS4A)W+bcn^dtjXNFYfOGFI(>(@t8kXIsP4>7p{A8 zx#+OS6Y*shJ=VZe@)nslu*m7CRlcjqd4SCI&p*^G+3isp-k1MySG9I}qA9`5p6v5j~Mp82(DR=NCXTf@{N^HIyC zjX6@r?7--hd1d*|tDL^1T5b-rAk_6k@EABSCv^@vg1M` zwI2@X?yR<}YGs_*2T6bn82<#qsG?V+*_fX)h8FMjB*n2$N>0V;Sw>yX(s}o7cn#Wt zo{QjDv7*$8h}~>qU)jP3*2d8q^Dg3qVU+0hob<{ALr{ukqf|s3vLUHw65Z^8>fW(w zQPa*d!k_W3yh24Lzk%h$%PAXR9^3?O+lTI7efeLgCXGhr;Joo1QR&qO+JX_HQ#%%L z>xr4vyr{xG`NGmLMMxmDQtDIWM_H)^>;M3OT%h1m*|(@8*;YBhYwCASblNBVvS0?( z`qi)!3gd&^WPBu{fYZm&=FcWo3u0(B6fOD+QUUbf#{VArW_TRrli=g=HLc6Z;Fk&N zvGqS|+y+lZ+K4cnZ4jm~&(cWnHjsknw)I2)11_)u0^m2W0BnE{H~<3&K@{L@P5KKO zfFK=H$}U0x001R)MObuXVRU6WV{&C-bY%cCFfuVMF)%GKG*mD+IxsgnGdC+RFgh?W zSrvqe0000bbVXQnWMOn=I&E)cX=Zr#!I65#lIx{ybFfckWFepeo QHUIzs07*qoM6N<$f);C4(*OVf literal 0 HcmV?d00001 diff --git a/static/link/to_pd.png b/static/link/to_pd.png new file mode 100644 index 0000000000000000000000000000000000000000..85d56c63d6d9f3fe0c5e021285459eb0e2ab9f30 GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0vp^{214Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>CFK7VhX3aoTGO@oSwjTDCIiJI9IOMZY=aa7LReE` zSW|`AL5>szs%Hx>Va<8N-1&jIOAzP)kT}TMKz1r?#(Ut{2vEB4u5?*5gnVk>N|Qj*nq!~Q^B z$&ailFRiC1Pkd(JZ~V?oNYeG$;V4#}Bd{>_sry#E=wL#;+S$?;_phD1cktrLo28GXixc%Go|SGSbF3wkFtB*ElK7nJ;qW#Jo9^xSlaH)D%jE zedfL+19YltiEBhjN@7W>RdP`(kYX@0Ff!CNG|)9L2{Ev+GBmU@Fwr(Jure^vdSnLl lJCcUn{FKbJN^}hdR;K0<4QER~asV|jc)I$ztaD0e0sy9c^#%X{ literal 0 HcmV?d00001 diff --git a/static/link/to_plt.png b/static/link/to_plt.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b443c23a0f21c805b021b776e1ebf31f5e5eb2 GIT binary patch literal 1148 zcmZ`$drVtp6u*RRARE-_HWEUXC1%)-OiPC_apF)AkcU7KT|ibI9q}mqFfuJvA zAgJzJ2-*UnItqf$b0EmdhoGbm2#T!vX)^yL1O?%F*@bB!Av!u*Zm`H?vXYXL?d@%i zMx$1%OG`_mqM}d~6|b)!X2%ZSyDvr+N>pOCPIh`)I+YN|4&NMk3PRfK*O9fVOxox9E zuNI-BofE$`OwLZKHO4@|@ALWe2IB@cOD`q-wSLII_N;aBHPLWQThpam{ZlZiHk-{j zj)MV#8o+Gga(J%g$6xx#CPl+@ec1265(=?D5OBHZMX_;uUZo>+xAi@Wm3w&SIZ86a zc)U8D77)Uncstpya~Y`n-Q=Zo>s&w37U&O@@p`-}Qq`yLV_b~wcCDk9OU@1ultm;G zQ6$Bi}wahI?lmk01)WASc? z)}}iPS?mstQ-LAyQY(8%x9QhPVGNNDu@q)MiD~Upc_AX%plQrZ$R)^9CxXEe4TD>h zumpxXrxc9CpeAS&CKj)1HXjDO?oCpOVkoxipd2R3s91+LG?-Oq-;l^*%#Gn*tyC_N zC@e7PH?*=*iQGEQZez1}Q){eu4>sQf{DR7}(o=T^sx1q^2@z)Iq=gV+J3{w7|9YUY z0fgwx)Re+dc?F+eX&{V|Pwso_z+S=GNl@(K%z^55dg zB`8wFuaY#&5t%fR6VFYEleNgpIIYJghDS%n?~L93tVYPKsJZa*`A_{WFahK9utFU*&)O4~3$nz5oCK literal 0 HcmV?d00001 diff --git a/static/link/to_skl.png b/static/link/to_skl.png new file mode 100644 index 0000000000000000000000000000000000000000..9c780cd00a817a8ab1a43a17b82d7093dec9d40f GIT binary patch literal 837 zcmeAS@N?(olHy`uVBq!ia0vp^{214Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Ib;{6Oe z;~A$<&WioiY4m@G3s8i3WIW>x1hGti57z}3G@NmE&y3U`Gc14zC<_z^ilon2`gfN3 z;~wKwdvTxxfPz6YwtSvu?xrmOwo$B&xw)cZ6ZcqBmjb@x}3znOgsL~xO-xDTZ z=PT0{DsMF7%*qV4Maimj5|pRKDEMfd(=rdAqyhDe(t_LXN$})7O>#DHjU|pK-$ZP3}OU8J;eV zAsp9}6BM`%HWe2X6&f2kRrc8IsrkdyA^gp^5KTzrh5mZnNb zraXNjDl*mS@F8WT#Zy8hBtsT2zIw$pDe3VeVIkA4TO>;sEuLKRby9H9NYpc_?7Tq8gQu&X%Q~loCICI0Nnrp0 literal 0 HcmV?d00001 From dec2bd62534fb60ea20da2bfa517995f81b5ab42 Mon Sep 17 00:00:00 2001 From: Alexander Hess Date: Tue, 5 Oct 2021 01:28:01 +0200 Subject: [PATCH 3/5] Add exercises for numpy --- 01_scientific_stack/01_exercises_arrays.ipynb | 279 ++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 01_scientific_stack/01_exercises_arrays.ipynb diff --git a/01_scientific_stack/01_exercises_arrays.ipynb b/01_scientific_stack/01_exercises_arrays.ipynb new file mode 100644 index 0000000..3b44856 --- /dev/null +++ b/01_scientific_stack/01_exercises_arrays.ipynb @@ -0,0 +1,279 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note**: Click on \"*Kernel*\" > \"*Restart Kernel and Run All*\" in [JupyterLab](https://jupyterlab.readthedocs.io/en/stable/) *after* finishing the exercises to ensure that your solution runs top to bottom *without* any errors. If you cannot run this file on your machine, you may want to open it [in the cloud ](https://mybinder.org/v2/gh/webartifex/intro-to-data-science/main?urlpath=lab/tree/01_scientific_stack/01_exercises_arrays.ipynb)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 0: Python's Scientific Stack (Coding Exercises)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The exercises below assume that you have read the preceeding content sections.\n", + "\n", + "The `...`'s in the code cells indicate where you need to fill in code snippets. The number of `...`'s within a code cell give you a rough idea of how many lines of code are needed to solve the task. You should not need to create any additional code cells for your final solution. However, you may want to use temporary code cells to try out some ideas." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Working with Arrays" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another useful constructor [numpy ](https://numpy.org/) provides is [np.arange() ](https://numpy.org/doc/stable/reference/generated/numpy.arange.html#numpy.arange) which works similar to Python's [range() ](https://docs.python.org/3/library/functions.html#func-range) built-in.\n", + "\n", + "**Q1**: Create a one-dimensional array with [np.arange() ](https://numpy.org/doc/stable/reference/generated/numpy.arange.html#numpy.arange) holding the `int`egers from `0` through `9`!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "v1 = np.arange(...)\n", + "\n", + "v1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q2**: Create a one-dimensional array with [np.arange() ](https://numpy.org/doc/stable/reference/generated/numpy.arange.html#numpy.arange) holding the `int`egers from `100` through `109`!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "v2 = np.arange(...)\n", + "\n", + "v2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q3**: Create a one-dimensional array with [np.arange() ](https://numpy.org/doc/stable/reference/generated/numpy.arange.html#numpy.arange) holding the even `int`egers from `80` through `100`!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "v3 = np.arange(...)\n", + "\n", + "v3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q4**: Create a one-dimensional array with [np.arange() ](https://numpy.org/doc/stable/reference/generated/numpy.arange.html#numpy.arange) holding the odd `int`egers between `80` and `100` in backwards order!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "v4 = np.arange(...)\n", + "\n", + "v4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[np.arange() ](https://numpy.org/doc/stable/reference/generated/numpy.arange.html#numpy.arange) is often combined with the `ndarray` method [.reshape() ](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.reshape.html#numpy.ndarray.reshape) that takes a `tuple` as its input specifying the `.shape` of the resulting array.\n", + "\n", + "**Q5**: Create a two-dimensional array modeling a 5x2 matrix by the name `m1` with [np.arange() ](https://numpy.org/doc/stable/reference/generated/numpy.arange.html#numpy.arange) holding the `int`egers from `1` through `10`!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m1 = np.arange(...).reshape((...))\n", + "\n", + "m1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q6**: Create a two-dimensional array modeling a 5x5 square matrix by the name `m2` with [np.arange() ](https://numpy.org/doc/stable/reference/generated/numpy.arange.html#numpy.arange) holding the `int`egers from `1` through `25` and flip the elements along the main diagonal!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m2 = np.arange(...).reshape((...)). ...\n", + "\n", + "m2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q7**: Slice out the matrix `m3` as the first two rows of `m1`!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m3 = m1[..., ...]\n", + "\n", + "m3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q8**: Slice out the matrix `m4` as the last two rows of `m1`!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m4 = m1[..., ...]\n", + "\n", + "m4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q9**: Slice out the matrix `m5` from `m1` such that it holds all elements that are on an *odd* row and column!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m5 = m2[..., ...]\n", + "\n", + "m5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q10**: Slice out the matrix `m6` from `m1` such that it holds all elements that are on an *even* row and column!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m6 = m2[..., ...]\n", + "\n", + "m6" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q11**: Slice out the matrix `m7` from `m1` such that it holds all elements that are on an *even* row and an *odd* column!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m7 = m2[..., ...]\n", + "\n", + "m7" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From b7ab0cf959017315228fc54c0617fb50ba20a7ab Mon Sep 17 00:00:00 2001 From: Alexander Hess Date: Tue, 5 Oct 2021 01:28:29 +0200 Subject: [PATCH 4/5] Add overview on pandas --- 01_scientific_stack/02_content_pandas.ipynb | 3480 +++++++++++++++++++ 01_scientific_stack/orders.csv | 695 ++++ 2 files changed, 4175 insertions(+) create mode 100644 01_scientific_stack/02_content_pandas.ipynb create mode 100644 01_scientific_stack/orders.csv diff --git a/01_scientific_stack/02_content_pandas.ipynb b/01_scientific_stack/02_content_pandas.ipynb new file mode 100644 index 0000000..7939074 --- /dev/null +++ b/01_scientific_stack/02_content_pandas.ipynb @@ -0,0 +1,3480 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note**: Click on \"*Kernel*\" > \"*Restart Kernel and Clear All Outputs*\" in [JupyterLab](https://jupyterlab.readthedocs.io/en/stable/) *before* reading this notebook to reset its output. If you cannot run this file on your machine, you may want to open it [in the cloud ](https://mybinder.org/v2/gh/webartifex/intro-to-data-science/main?urlpath=lab/tree/01_scientific_stack/02_content_pandas.ipynb)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 1: Python's Scientific Stack (Part 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For practitioners, the [numpy ](https://numpy.org/) library may feel a bit too \"technical\" or too close to \"real programming\" and they may prefer something that looks and feels more like Excel. That is where the [pandas ](https://pandas.pydata.org/) library comes in.\n", + "\n", + "Let's first `pip` install and then `import` it." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: pandas in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (1.3.3)\n", + "Requirement already satisfied: numpy>=1.17.3 in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (from pandas) (1.21.1)\n", + "Requirement already satisfied: python-dateutil>=2.7.3 in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (from pandas) (2.8.2)\n", + "Requirement already satisfied: pytz>=2017.3 in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (from pandas) (2021.3)\n", + "Requirement already satisfied: six>=1.5 in /home/webartifex/repos/intro-to-data-science/.venv/lib/python3.8/site-packages (from python-dateutil>=2.7.3->pandas) (1.16.0)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install pandas" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Excel-like Data with Pandas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the same folder as this notebook there is a file named \"*orders.csv*\" that holds the order data of an urban meal delivery platform operating in Bordeaux, France. Open in with a double-click and take a look at its contents right here in JupyterLab!\n", + "\n", + "[pandas ](https://pandas.pydata.org/) provides a [pd.read_csv() ](https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html#pandas.read_csv) function that, as the name suggests, can open and read in CSV data. For Excel files, there is also a [pd.read_excel() ](https://pandas.pydata.org/docs/reference/api/pandas.read_excel.html) function but the CSV format is probably more widespread in use.\n", + "\n", + "Let's read in the \"*orders.csv*\" file with [pd.read_csv() ](https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html#pandas.read_csv) specifying the \"order_id\" column as the **index**. Here, index is a column with *unique* values that allow the identification of each row in a dataset. If we don't specify an index column, [pandas ](https://pandas.pydata.org/) creates a surrogate index as a sequence of integers 1, 2, 3, and so on." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(\"orders.csv\", index_col=\"order_id\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`df` models a table-like data structure, comparable to one tab in an Excel file. [pandas ](https://pandas.pydata.org/) and JupyterLab are designed to work well together: The `df` object shows a preview of the dataset below the code cell. The rows are the **records** in the dataset and the columns take the role of the **attributes** each record has. Each column comes with a **domain** of allowable values." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
placed_atrestaurant_idrestauranto_streeto_zipo_cityo_latitudeo_longitudecustomer_idd_streetd_zipd_cityd_latituded_longitudetotalcourier_idpickup_atdelivery_atcancelled
order_id
1925942016-07-18 12:23:131204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.57587010298Rue Rolland 1433000Bordeaux44.842592-0.58052120501423.02016-07-18 12:38:082016-07-18 12:48:220
1926442016-07-18 12:48:551204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.5758706037Rue Rolland 1433000Bordeaux44.842592-0.58052124501426.02016-07-18 13:03:082016-07-18 13:12:010
1926582016-07-18 13:00:131205Taj Mahal24 Rue Du Parlement Sainte-Catherine33000Bordeaux44.840405-0.57394073830Rue Batailley 1233000Bordeaux44.838504-0.59196125501423.02016-07-18 13:19:042016-07-18 13:29:030
1932422016-07-18 20:39:541208Chez Ambre And Michel1 Rue Matignon33000Bordeaux44.850258-0.58620410298Rue Rolland 1433000Bordeaux44.842592-0.58052115501420.02016-07-18 20:55:522016-07-18 21:05:280
1927192016-07-18 13:52:041206La Maison Du Glacier1 Place Saint Pierre33000Bordeaux44.839706-0.5706726037Rue Rolland 1433000Bordeaux44.842592-0.58052124501426.02016-07-18 14:01:232016-07-18 14:08:360
............................................................
2120212016-07-30 22:29:521249Pitaya Sainte Catherine275 Rue Sainte Catherine33000Bordeaux44.831692-0.57320780400Boulevard President Franklin Roosevelt 1533400Bordeaux44.820591-0.58204822501410.02016-07-30 22:50:162016-07-30 23:02:540
2115012016-07-30 20:44:501204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.57587080163Rue Marsan 2233300Bordeaux44.856133-0.57617212501415.02016-07-30 21:02:322016-07-30 21:06:190
2115082016-07-30 20:45:551254Funky Burger5 Rue Du Loup33000Bordeaux44.838081-0.57228180168Rue Des Sablieres 4233800Bordeaux44.825488-0.57526416801461.02016-07-30 21:13:312016-07-30 21:19:450
2115102016-07-30 20:46:051219La Tagliatella14 Rue Guiraude33000Bordeaux44.839388-0.57478180169Rue Pasteur 3533200Bordeaux44.845053-0.60115740851411.02016-07-30 21:11:002016-07-30 21:23:240
2115192016-07-30 20:46:551254Funky Burger5 Rue Du Loup33000Bordeaux44.838081-0.57228180172Rue Monadey 2833800Bordeaux44.828816-0.57078920501817.02016-07-30 21:05:462016-07-30 21:14:070
\n", + "

694 rows × 19 columns

\n", + "
" + ], + "text/plain": [ + " placed_at restaurant_id restaurant \\\n", + "order_id \n", + "192594 2016-07-18 12:23:13 1204 Max A Table \n", + "192644 2016-07-18 12:48:55 1204 Max A Table \n", + "192658 2016-07-18 13:00:13 1205 Taj Mahal \n", + "193242 2016-07-18 20:39:54 1208 Chez Ambre And Michel \n", + "192719 2016-07-18 13:52:04 1206 La Maison Du Glacier \n", + "... ... ... ... \n", + "212021 2016-07-30 22:29:52 1249 Pitaya Sainte Catherine \n", + "211501 2016-07-30 20:44:50 1204 Max A Table \n", + "211508 2016-07-30 20:45:55 1254 Funky Burger \n", + "211510 2016-07-30 20:46:05 1219 La Tagliatella \n", + "211519 2016-07-30 20:46:55 1254 Funky Burger \n", + "\n", + " o_street o_zip o_city o_latitude \\\n", + "order_id \n", + "192594 36 Rue Cornac 33000 Bordeaux 44.851402 \n", + "192644 36 Rue Cornac 33000 Bordeaux 44.851402 \n", + "192658 24 Rue Du Parlement Sainte-Catherine 33000 Bordeaux 44.840405 \n", + "193242 1 Rue Matignon 33000 Bordeaux 44.850258 \n", + "192719 1 Place Saint Pierre 33000 Bordeaux 44.839706 \n", + "... ... ... ... ... \n", + "212021 275 Rue Sainte Catherine 33000 Bordeaux 44.831692 \n", + "211501 36 Rue Cornac 33000 Bordeaux 44.851402 \n", + "211508 5 Rue Du Loup 33000 Bordeaux 44.838081 \n", + "211510 14 Rue Guiraude 33000 Bordeaux 44.839388 \n", + "211519 5 Rue Du Loup 33000 Bordeaux 44.838081 \n", + "\n", + " o_longitude customer_id d_street \\\n", + "order_id \n", + "192594 -0.575870 10298 Rue Rolland 14 \n", + "192644 -0.575870 6037 Rue Rolland 14 \n", + "192658 -0.573940 73830 Rue Batailley 12 \n", + "193242 -0.586204 10298 Rue Rolland 14 \n", + "192719 -0.570672 6037 Rue Rolland 14 \n", + "... ... ... ... \n", + "212021 -0.573207 80400 Boulevard President Franklin Roosevelt 15 \n", + "211501 -0.575870 80163 Rue Marsan 22 \n", + "211508 -0.572281 80168 Rue Des Sablieres 42 \n", + "211510 -0.574781 80169 Rue Pasteur 35 \n", + "211519 -0.572281 80172 Rue Monadey 28 \n", + "\n", + " d_zip d_city d_latitude d_longitude total courier_id \\\n", + "order_id \n", + "192594 33000 Bordeaux 44.842592 -0.580521 2050 1423.0 \n", + "192644 33000 Bordeaux 44.842592 -0.580521 2450 1426.0 \n", + "192658 33000 Bordeaux 44.838504 -0.591961 2550 1423.0 \n", + "193242 33000 Bordeaux 44.842592 -0.580521 1550 1420.0 \n", + "192719 33000 Bordeaux 44.842592 -0.580521 2450 1426.0 \n", + "... ... ... ... ... ... ... \n", + "212021 33400 Bordeaux 44.820591 -0.582048 2250 1410.0 \n", + "211501 33300 Bordeaux 44.856133 -0.576172 1250 1415.0 \n", + "211508 33800 Bordeaux 44.825488 -0.575264 1680 1461.0 \n", + "211510 33200 Bordeaux 44.845053 -0.601157 4085 1411.0 \n", + "211519 33800 Bordeaux 44.828816 -0.570789 2050 1817.0 \n", + "\n", + " pickup_at delivery_at cancelled \n", + "order_id \n", + "192594 2016-07-18 12:38:08 2016-07-18 12:48:22 0 \n", + "192644 2016-07-18 13:03:08 2016-07-18 13:12:01 0 \n", + "192658 2016-07-18 13:19:04 2016-07-18 13:29:03 0 \n", + "193242 2016-07-18 20:55:52 2016-07-18 21:05:28 0 \n", + "192719 2016-07-18 14:01:23 2016-07-18 14:08:36 0 \n", + "... ... ... ... \n", + "212021 2016-07-30 22:50:16 2016-07-30 23:02:54 0 \n", + "211501 2016-07-30 21:02:32 2016-07-30 21:06:19 0 \n", + "211508 2016-07-30 21:13:31 2016-07-30 21:19:45 0 \n", + "211510 2016-07-30 21:11:00 2016-07-30 21:23:24 0 \n", + "211519 2016-07-30 21:05:46 2016-07-30 21:14:07 0 \n", + "\n", + "[694 rows x 19 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The data type behind `df` is called a [pd.DataFrame ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html#pandas.DataFrame). `DataFrame`s are built around [numpy ](https://numpy.org/)'s `ndarray`s providing an interface optimized for **interactive usage** (i.e., a data scientist exploring a dataset step by step)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pandas.core.frame.DataFrame" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`DataFrame`s come with many methdods.\n", + "\n", + "For example, [.head() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.head.html#pandas.DataFrame.head) and [.tail() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.tail.html#pandas.DataFrame.tail) show the first and last `n` rows, defaulting to `5`." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
placed_atrestaurant_idrestauranto_streeto_zipo_cityo_latitudeo_longitudecustomer_idd_streetd_zipd_cityd_latituded_longitudetotalcourier_idpickup_atdelivery_atcancelled
order_id
1925942016-07-18 12:23:131204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.57587010298Rue Rolland 1433000Bordeaux44.842592-0.58052120501423.02016-07-18 12:38:082016-07-18 12:48:220
1926442016-07-18 12:48:551204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.5758706037Rue Rolland 1433000Bordeaux44.842592-0.58052124501426.02016-07-18 13:03:082016-07-18 13:12:010
1926582016-07-18 13:00:131205Taj Mahal24 Rue Du Parlement Sainte-Catherine33000Bordeaux44.840405-0.57394073830Rue Batailley 1233000Bordeaux44.838504-0.59196125501423.02016-07-18 13:19:042016-07-18 13:29:030
1932422016-07-18 20:39:541208Chez Ambre And Michel1 Rue Matignon33000Bordeaux44.850258-0.58620410298Rue Rolland 1433000Bordeaux44.842592-0.58052115501420.02016-07-18 20:55:522016-07-18 21:05:280
1927192016-07-18 13:52:041206La Maison Du Glacier1 Place Saint Pierre33000Bordeaux44.839706-0.5706726037Rue Rolland 1433000Bordeaux44.842592-0.58052124501426.02016-07-18 14:01:232016-07-18 14:08:360
\n", + "
" + ], + "text/plain": [ + " placed_at restaurant_id restaurant \\\n", + "order_id \n", + "192594 2016-07-18 12:23:13 1204 Max A Table \n", + "192644 2016-07-18 12:48:55 1204 Max A Table \n", + "192658 2016-07-18 13:00:13 1205 Taj Mahal \n", + "193242 2016-07-18 20:39:54 1208 Chez Ambre And Michel \n", + "192719 2016-07-18 13:52:04 1206 La Maison Du Glacier \n", + "\n", + " o_street o_zip o_city o_latitude \\\n", + "order_id \n", + "192594 36 Rue Cornac 33000 Bordeaux 44.851402 \n", + "192644 36 Rue Cornac 33000 Bordeaux 44.851402 \n", + "192658 24 Rue Du Parlement Sainte-Catherine 33000 Bordeaux 44.840405 \n", + "193242 1 Rue Matignon 33000 Bordeaux 44.850258 \n", + "192719 1 Place Saint Pierre 33000 Bordeaux 44.839706 \n", + "\n", + " o_longitude customer_id d_street d_zip d_city \\\n", + "order_id \n", + "192594 -0.575870 10298 Rue Rolland 14 33000 Bordeaux \n", + "192644 -0.575870 6037 Rue Rolland 14 33000 Bordeaux \n", + "192658 -0.573940 73830 Rue Batailley 12 33000 Bordeaux \n", + "193242 -0.586204 10298 Rue Rolland 14 33000 Bordeaux \n", + "192719 -0.570672 6037 Rue Rolland 14 33000 Bordeaux \n", + "\n", + " d_latitude d_longitude total courier_id pickup_at \\\n", + "order_id \n", + "192594 44.842592 -0.580521 2050 1423.0 2016-07-18 12:38:08 \n", + "192644 44.842592 -0.580521 2450 1426.0 2016-07-18 13:03:08 \n", + "192658 44.838504 -0.591961 2550 1423.0 2016-07-18 13:19:04 \n", + "193242 44.842592 -0.580521 1550 1420.0 2016-07-18 20:55:52 \n", + "192719 44.842592 -0.580521 2450 1426.0 2016-07-18 14:01:23 \n", + "\n", + " delivery_at cancelled \n", + "order_id \n", + "192594 2016-07-18 12:48:22 0 \n", + "192644 2016-07-18 13:12:01 0 \n", + "192658 2016-07-18 13:29:03 0 \n", + "193242 2016-07-18 21:05:28 0 \n", + "192719 2016-07-18 14:08:36 0 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + "
placed_atrestaurant_idrestauranto_streeto_zipo_cityo_latitudeo_longitudecustomer_idd_streetd_zipd_cityd_latituded_longitudetotalcourier_idpickup_atdelivery_atcancelled
order_id
2115102016-07-30 20:46:051219La Tagliatella14 Rue Guiraude33000Bordeaux44.839388-0.57478180169Rue Pasteur 3533200Bordeaux44.845053-0.60115740851411.02016-07-30 21:11:002016-07-30 21:23:240
2115192016-07-30 20:46:551254Funky Burger5 Rue Du Loup33000Bordeaux44.838081-0.57228180172Rue Monadey 2833800Bordeaux44.828816-0.57078920501817.02016-07-30 21:05:462016-07-30 21:14:070
\n", + "
" + ], + "text/plain": [ + " placed_at restaurant_id restaurant o_street \\\n", + "order_id \n", + "211510 2016-07-30 20:46:05 1219 La Tagliatella 14 Rue Guiraude \n", + "211519 2016-07-30 20:46:55 1254 Funky Burger 5 Rue Du Loup \n", + "\n", + " o_zip o_city o_latitude o_longitude customer_id \\\n", + "order_id \n", + "211510 33000 Bordeaux 44.839388 -0.574781 80169 \n", + "211519 33000 Bordeaux 44.838081 -0.572281 80172 \n", + "\n", + " d_street d_zip d_city d_latitude d_longitude total \\\n", + "order_id \n", + "211510 Rue Pasteur 35 33200 Bordeaux 44.845053 -0.601157 4085 \n", + "211519 Rue Monadey 28 33800 Bordeaux 44.828816 -0.570789 2050 \n", + "\n", + " courier_id pickup_at delivery_at cancelled \n", + "order_id \n", + "211510 1411.0 2016-07-30 21:11:00 2016-07-30 21:23:24 0 \n", + "211519 1817.0 2016-07-30 21:05:46 2016-07-30 21:14:07 0 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.tail(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[.info() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.info.html#pandas.DataFrame.info) shows on overview of the columns. In particular, it shows how many cells are filled in in a column (i.e., are \"non-null\") and what **data type** (i.e., \"dtype\") *all* values in a column have. \"int64\" and \"float64\" imply that there are only `int` and `float` values in a column (taking up to 64 bits or 1s and 0s in memory). \"object\" is [pandas ](https://pandas.pydata.org/)' way of telling us it could not deduce any data type more specific than textual data. For the columns holding timestamps (e.g., \"placed_at\") we will convert the values further below.\n", + "\n", + "Looking at the output, we see that some columns hold the data of **origin**-**destination** pairs, corresponding to restaurants and customers. Other columns store data following the dispatch and delivery process of couriers picking up and delivering meals at various points in time." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Int64Index: 694 entries, 192594 to 211519\n", + "Data columns (total 19 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 placed_at 694 non-null object \n", + " 1 restaurant_id 694 non-null int64 \n", + " 2 restaurant 694 non-null object \n", + " 3 o_street 694 non-null object \n", + " 4 o_zip 694 non-null int64 \n", + " 5 o_city 694 non-null object \n", + " 6 o_latitude 694 non-null float64\n", + " 7 o_longitude 694 non-null float64\n", + " 8 customer_id 694 non-null int64 \n", + " 9 d_street 694 non-null object \n", + " 10 d_zip 694 non-null int64 \n", + " 11 d_city 694 non-null object \n", + " 12 d_latitude 694 non-null float64\n", + " 13 d_longitude 694 non-null float64\n", + " 14 total 694 non-null int64 \n", + " 15 courier_id 690 non-null float64\n", + " 16 pickup_at 665 non-null object \n", + " 17 delivery_at 663 non-null object \n", + " 18 cancelled 694 non-null int64 \n", + "dtypes: float64(5), int64(6), object(8)\n", + "memory usage: 108.4+ KB\n" + ] + } + ], + "source": [ + "df.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[.describe() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.describe.html#pandas.DataFrame.describe) shows statistics on all numerical columns in a `DataFrame`.\n", + "\n", + "For the example orders, such statistics may not be meaningful for all numerical columns as some of them merely hold IDs or zip codes." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
restaurant_ido_zipo_latitudeo_longitudecustomer_idd_zipd_latituded_longitudetotalcourier_idcancelled
count694.000000694.000000694.000000694.000000694.000000694.000000694.000000694.000000694.000000690.000000694.000000
mean1228.47982733075.21613844.839258-0.57575974751.12680133191.61383344.838623-0.5760402294.6368881484.7550720.044669
std18.001091207.9714350.0074710.00692014604.304963307.3786970.0115450.0107991060.695748154.5862100.206724
min1204.00000033000.00000044.818180-0.5994002377.00000033000.00000044.809813-0.606892350.0000001403.0000000.000000
25%1212.00000033000.00000044.836910-0.57934576648.50000033000.00000044.829981-0.5816121500.0000001415.0000000.000000
50%1224.00000033000.00000044.838287-0.57394078146.00000033000.00000044.838364-0.5750561969.5000001424.0000000.000000
75%1244.00000033000.00000044.841721-0.57228179331.50000033300.00000044.846696-0.5696012750.0000001462.0000000.000000
max1267.00000033800.00000044.855438-0.55057680401.00000033800.00000044.877693-0.5379528370.0000002013.0000001.000000
\n", + "
" + ], + "text/plain": [ + " restaurant_id o_zip o_latitude o_longitude customer_id \\\n", + "count 694.000000 694.000000 694.000000 694.000000 694.000000 \n", + "mean 1228.479827 33075.216138 44.839258 -0.575759 74751.126801 \n", + "std 18.001091 207.971435 0.007471 0.006920 14604.304963 \n", + "min 1204.000000 33000.000000 44.818180 -0.599400 2377.000000 \n", + "25% 1212.000000 33000.000000 44.836910 -0.579345 76648.500000 \n", + "50% 1224.000000 33000.000000 44.838287 -0.573940 78146.000000 \n", + "75% 1244.000000 33000.000000 44.841721 -0.572281 79331.500000 \n", + "max 1267.000000 33800.000000 44.855438 -0.550576 80401.000000 \n", + "\n", + " d_zip d_latitude d_longitude total courier_id \\\n", + "count 694.000000 694.000000 694.000000 694.000000 690.000000 \n", + "mean 33191.613833 44.838623 -0.576040 2294.636888 1484.755072 \n", + "std 307.378697 0.011545 0.010799 1060.695748 154.586210 \n", + "min 33000.000000 44.809813 -0.606892 350.000000 1403.000000 \n", + "25% 33000.000000 44.829981 -0.581612 1500.000000 1415.000000 \n", + "50% 33000.000000 44.838364 -0.575056 1969.500000 1424.000000 \n", + "75% 33300.000000 44.846696 -0.569601 2750.000000 1462.000000 \n", + "max 33800.000000 44.877693 -0.537952 8370.000000 2013.000000 \n", + "\n", + " cancelled \n", + "count 694.000000 \n", + "mean 0.044669 \n", + "std 0.206724 \n", + "min 0.000000 \n", + "25% 0.000000 \n", + "50% 0.000000 \n", + "75% 0.000000 \n", + "max 1.000000 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Indexing & Slicing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`DataFrame`s support being indexed or sliced, both in the row and column dimensions.\n", + "\n", + "To obtain all data in a single column, we index into the `DataFrame` with the column's name.\n", + "\n", + "For example, `restaurant_col` provides a list of only the restaurant names. Its index are still the \"order_id\"s." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "order_id\n", + "192594 Max A Table\n", + "192644 Max A Table\n", + "192658 Taj Mahal\n", + "193242 Chez Ambre And Michel\n", + "192719 La Maison Du Glacier\n", + "Name: restaurant, dtype: object" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "restaurant_col = df[\"restaurant\"]\n", + "\n", + "restaurant_col.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The data type of a single column is [pd.Series ](https://pandas.pydata.org/docs/reference/api/pandas.Series.html#pandas.Series), which is very similar to a `DataFrame` with only one column. `Series` objects work like built-in `list`s with added functionalities." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pandas.core.series.Series" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(restaurant_col)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we index with a `list` of column names, the result is itself another `DataFrame`. That operation is like slicing out a smaller matrix from a larger one as we saw with `ndarray`s before.\n", + "\n", + "For example, let's pull out all location data of the orders' origins (i.e., restaurants)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + "
o_streeto_zipo_cityo_latitudeo_longitude
order_id
19259436 Rue Cornac33000Bordeaux44.851402-0.575870
19264436 Rue Cornac33000Bordeaux44.851402-0.575870
19265824 Rue Du Parlement Sainte-Catherine33000Bordeaux44.840405-0.573940
1932421 Rue Matignon33000Bordeaux44.850258-0.586204
1927191 Place Saint Pierre33000Bordeaux44.839706-0.570672
\n", + "
" + ], + "text/plain": [ + " o_street o_zip o_city o_latitude \\\n", + "order_id \n", + "192594 36 Rue Cornac 33000 Bordeaux 44.851402 \n", + "192644 36 Rue Cornac 33000 Bordeaux 44.851402 \n", + "192658 24 Rue Du Parlement Sainte-Catherine 33000 Bordeaux 44.840405 \n", + "193242 1 Rue Matignon 33000 Bordeaux 44.850258 \n", + "192719 1 Place Saint Pierre 33000 Bordeaux 44.839706 \n", + "\n", + " o_longitude \n", + "order_id \n", + "192594 -0.575870 \n", + "192644 -0.575870 \n", + "192658 -0.573940 \n", + "193242 -0.586204 \n", + "192719 -0.570672 " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "origins = df[[\"o_street\", \"o_zip\", \"o_city\", \"o_latitude\", \"o_longitude\"]]\n", + "\n", + "origins.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To access individual rows, we index not into a `DataFrame` directly but into its [.loc ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html#pandas.DataFrame.loc) object (which also exists for `Series`).\n", + "\n", + "Here, `200800` is an \"order_id\" number. The result is a `Series` object where the original `DataFrame`'s columns become the index." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "placed_at 2016-07-24 19:30:52\n", + "restaurant_id 1204\n", + "restaurant Max A Table\n", + "o_street 36 Rue Cornac\n", + "o_zip 33000\n", + "o_city Bordeaux\n", + "o_latitude 44.851402\n", + "o_longitude -0.57587\n", + "customer_id 76187\n", + "d_street Rue Judaique 213\n", + "d_zip 33000\n", + "d_city Bordeaux\n", + "d_latitude 44.840829\n", + "d_longitude -0.595445\n", + "total 2250\n", + "courier_id 1468.0\n", + "pickup_at 2016-07-24 19:50:52\n", + "delivery_at 2016-07-24 19:58:16\n", + "cancelled 0\n", + "Name: 200800, dtype: object" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[200800]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also index into the `restaurant_col` and `origins` objects from above. As `restaurant_col` is a `Series`, we get back a scalar value." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Max A Table'" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "restaurant_col.loc[200800]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "o_street 36 Rue Cornac\n", + "o_zip 33000\n", + "o_city Bordeaux\n", + "o_latitude 44.851402\n", + "o_longitude -0.57587\n", + "Name: 200800, dtype: object" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "origins.loc[200800]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Slicing also works with [.loc ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html#pandas.DataFrame.loc). A tiny difference to Python's built-in slicing, the upper bound is included in the slice as well!" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
placed_atrestaurant_idrestauranto_streeto_zipo_cityo_latitudeo_longitudecustomer_idd_streetd_zipd_cityd_latituded_longitudetotalcourier_idpickup_atdelivery_atcancelled
order_id
2003002016-07-24 13:46:151207Le Jardin Pekinois9 Rue Des Freres Bonie33000Bordeaux44.837078-0.57957276030Rue Villeneuve 133000Bordeaux44.839927-0.58001238201426.02016-07-24 14:12:452016-07-24 14:16:590
2003052016-07-24 13:49:251207Le Jardin Pekinois9 Rue Des Freres Bonie33000Bordeaux44.837078-0.57957276033Rue Du Ha 5433000Bordeaux44.835898-0.57794116891405.02016-07-24 14:12:042016-07-24 14:15:540
2008002016-07-24 19:30:521204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.57587076187Rue Judaique 21333000Bordeaux44.840829-0.59544522501468.02016-07-24 19:50:522016-07-24 19:58:160
\n", + "
" + ], + "text/plain": [ + " placed_at restaurant_id restaurant \\\n", + "order_id \n", + "200300 2016-07-24 13:46:15 1207 Le Jardin Pekinois \n", + "200305 2016-07-24 13:49:25 1207 Le Jardin Pekinois \n", + "200800 2016-07-24 19:30:52 1204 Max A Table \n", + "\n", + " o_street o_zip o_city o_latitude o_longitude \\\n", + "order_id \n", + "200300 9 Rue Des Freres Bonie 33000 Bordeaux 44.837078 -0.579572 \n", + "200305 9 Rue Des Freres Bonie 33000 Bordeaux 44.837078 -0.579572 \n", + "200800 36 Rue Cornac 33000 Bordeaux 44.851402 -0.575870 \n", + "\n", + " customer_id d_street d_zip d_city d_latitude \\\n", + "order_id \n", + "200300 76030 Rue Villeneuve 1 33000 Bordeaux 44.839927 \n", + "200305 76033 Rue Du Ha 54 33000 Bordeaux 44.835898 \n", + "200800 76187 Rue Judaique 213 33000 Bordeaux 44.840829 \n", + "\n", + " d_longitude total courier_id pickup_at \\\n", + "order_id \n", + "200300 -0.580012 3820 1426.0 2016-07-24 14:12:45 \n", + "200305 -0.577941 1689 1405.0 2016-07-24 14:12:04 \n", + "200800 -0.595445 2250 1468.0 2016-07-24 19:50:52 \n", + "\n", + " delivery_at cancelled \n", + "order_id \n", + "200300 2016-07-24 14:16:59 0 \n", + "200305 2016-07-24 14:15:54 0 \n", + "200800 2016-07-24 19:58:16 0 " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[200300:200800]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "order_id\n", + "200300 Le Jardin Pekinois\n", + "200305 Le Jardin Pekinois\n", + "200800 Max A Table\n", + "Name: restaurant, dtype: object" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "restaurant_col.loc[200300:200800]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + "
o_streeto_zipo_cityo_latitudeo_longitude
order_id
2003009 Rue Des Freres Bonie33000Bordeaux44.837078-0.579572
2003059 Rue Des Freres Bonie33000Bordeaux44.837078-0.579572
20080036 Rue Cornac33000Bordeaux44.851402-0.575870
\n", + "
" + ], + "text/plain": [ + " o_street o_zip o_city o_latitude o_longitude\n", + "order_id \n", + "200300 9 Rue Des Freres Bonie 33000 Bordeaux 44.837078 -0.579572\n", + "200305 9 Rue Des Freres Bonie 33000 Bordeaux 44.837078 -0.579572\n", + "200800 36 Rue Cornac 33000 Bordeaux 44.851402 -0.575870" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "origins.loc[200300:200800]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[.loc ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html#pandas.DataFrame.loc) also allows us to index and slice in both dimensions simultaneously. The first index or slice goes along the row dimension while the second index or slice selects the columns." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + "
o_streeto_zipo_cityo_latitudeo_longitude
order_id
2003009 Rue Des Freres Bonie33000Bordeaux44.837078-0.579572
2003059 Rue Des Freres Bonie33000Bordeaux44.837078-0.579572
20080036 Rue Cornac33000Bordeaux44.851402-0.575870
\n", + "
" + ], + "text/plain": [ + " o_street o_zip o_city o_latitude o_longitude\n", + "order_id \n", + "200300 9 Rue Des Freres Bonie 33000 Bordeaux 44.837078 -0.579572\n", + "200305 9 Rue Des Freres Bonie 33000 Bordeaux 44.837078 -0.579572\n", + "200800 36 Rue Cornac 33000 Bordeaux 44.851402 -0.575870" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[\n", + " 200300:200800,\n", + " [\"o_street\", \"o_zip\", \"o_city\", \"o_latitude\", \"o_longitude\"]\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Type Casting" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As [.info() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.info.html#pandas.DataFrame.info) already revealed above, the timestamp columns could only be parsed as generic objects (i.e., textual data). Also, the \"cancelled\" column which holds only `True` or `False` values does not have a `bool` data type." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Int64Index: 694 entries, 192594 to 211519\n", + "Data columns (total 19 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 placed_at 694 non-null object \n", + " 1 restaurant_id 694 non-null int64 \n", + " 2 restaurant 694 non-null object \n", + " 3 o_street 694 non-null object \n", + " 4 o_zip 694 non-null int64 \n", + " 5 o_city 694 non-null object \n", + " 6 o_latitude 694 non-null float64\n", + " 7 o_longitude 694 non-null float64\n", + " 8 customer_id 694 non-null int64 \n", + " 9 d_street 694 non-null object \n", + " 10 d_zip 694 non-null int64 \n", + " 11 d_city 694 non-null object \n", + " 12 d_latitude 694 non-null float64\n", + " 13 d_longitude 694 non-null float64\n", + " 14 total 694 non-null int64 \n", + " 15 courier_id 690 non-null float64\n", + " 16 pickup_at 665 non-null object \n", + " 17 delivery_at 663 non-null object \n", + " 18 cancelled 694 non-null int64 \n", + "dtypes: float64(5), int64(6), object(8)\n", + "memory usage: 124.6+ KB\n" + ] + } + ], + "source": [ + "df.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The [pd.to_datetime() ](https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html#pandas.to_datetime) function **casts** the timestamp columns correctly." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "order_id\n", + "192594 2016-07-18 12:23:13\n", + "192644 2016-07-18 12:48:55\n", + "192658 2016-07-18 13:00:13\n", + "193242 2016-07-18 20:39:54\n", + "192719 2016-07-18 13:52:04\n", + " ... \n", + "212021 2016-07-30 22:29:52\n", + "211501 2016-07-30 20:44:50\n", + "211508 2016-07-30 20:45:55\n", + "211510 2016-07-30 20:46:05\n", + "211519 2016-07-30 20:46:55\n", + "Name: placed_at, Length: 694, dtype: datetime64[ns]" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.to_datetime(df[\"placed_at\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's overwrite the original \"placed_at\" column with one that has the correct data type." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "df[\"placed_at\"] = pd.to_datetime(df[\"placed_at\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The [.astype() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.astype.html#pandas.DataFrame.astype) method generalizes this idea and allows us to cast several columns in a `DataFrame`. It takes a `dict`ionary mapping column names to data types as its input. Instead of references to actual data types (e.g., `bool`), it also understands [pandas ](https://pandas.pydata.org/)-specific data types provides as text." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "df = df.astype({\n", + " \"pickup_at\": \"datetime64[ns]\",\n", + " \"delivery_at\": \"datetime64[ns]\",\n", + " \"cancelled\": bool,\n", + "})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, all columns in `df` have more applicable data types." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Int64Index: 694 entries, 192594 to 211519\n", + "Data columns (total 19 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 placed_at 694 non-null datetime64[ns]\n", + " 1 restaurant_id 694 non-null int64 \n", + " 2 restaurant 694 non-null object \n", + " 3 o_street 694 non-null object \n", + " 4 o_zip 694 non-null int64 \n", + " 5 o_city 694 non-null object \n", + " 6 o_latitude 694 non-null float64 \n", + " 7 o_longitude 694 non-null float64 \n", + " 8 customer_id 694 non-null int64 \n", + " 9 d_street 694 non-null object \n", + " 10 d_zip 694 non-null int64 \n", + " 11 d_city 694 non-null object \n", + " 12 d_latitude 694 non-null float64 \n", + " 13 d_longitude 694 non-null float64 \n", + " 14 total 694 non-null int64 \n", + " 15 courier_id 690 non-null float64 \n", + " 16 pickup_at 665 non-null datetime64[ns]\n", + " 17 delivery_at 663 non-null datetime64[ns]\n", + " 18 cancelled 694 non-null bool \n", + "dtypes: bool(1), datetime64[ns](3), float64(5), int64(5), object(5)\n", + "memory usage: 119.9+ KB\n" + ] + } + ], + "source": [ + "df.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Filtering" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A common operation when working with `DataFrame`s is to filter for rows fulfilling certain conditions. That is implemented by so-called **boolean filters** in [pandas ](https://pandas.pydata.org/), which is simply a `DataFrame` or `Series` holding only `True` or `False` values.\n", + "\n", + "One way to obtain such objects is to use relational operators with columns.\n", + "\n", + "`max_a_table` holds `True` values for all orders at the restaurant with the ID `1204`." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "order_id\n", + "192594 True\n", + "192644 True\n", + "192658 False\n", + "193242 False\n", + "192719 False\n", + " ... \n", + "212021 False\n", + "211501 True\n", + "211508 False\n", + "211510 False\n", + "211519 False\n", + "Name: restaurant_id, Length: 694, dtype: bool" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "max_a_table = df[\"restaurant_id\"] == 1204\n", + "\n", + "max_a_table" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, let's use a boolean filter to index into `df`. That gives us back a new `DataFame` with all orders belonging to the restaurant \"Max A Table\"." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
placed_atrestaurant_idrestauranto_streeto_zipo_cityo_latitudeo_longitudecustomer_idd_streetd_zipd_cityd_latituded_longitudetotalcourier_idpickup_atdelivery_atcancelled
order_id
1925942016-07-18 12:23:131204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.5758710298Rue Rolland 1433000Bordeaux44.842592-0.58052120501423.02016-07-18 12:38:082016-07-18 12:48:22False
1926442016-07-18 12:48:551204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.575876037Rue Rolland 1433000Bordeaux44.842592-0.58052124501426.02016-07-18 13:03:082016-07-18 13:12:01False
1943352016-07-19 20:35:211204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.5758774268Place Canteloup 1233800Bordeaux44.833834-0.56567431001420.02016-07-19 20:51:162016-07-19 21:01:08False
1966152016-07-21 19:50:151204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.5758774901Rue Marcelin Jourdan 5533200Bordeaux44.850360-0.59736120501418.02016-07-21 20:12:292016-07-21 20:25:57False
1968392016-07-21 20:27:221204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.5758774966Rue Sainte-Catherine 13733000Bordeaux44.836516-0.57398337501472.02016-07-21 20:41:422016-07-21 21:14:41False
\n", + "
" + ], + "text/plain": [ + " placed_at restaurant_id restaurant o_street \\\n", + "order_id \n", + "192594 2016-07-18 12:23:13 1204 Max A Table 36 Rue Cornac \n", + "192644 2016-07-18 12:48:55 1204 Max A Table 36 Rue Cornac \n", + "194335 2016-07-19 20:35:21 1204 Max A Table 36 Rue Cornac \n", + "196615 2016-07-21 19:50:15 1204 Max A Table 36 Rue Cornac \n", + "196839 2016-07-21 20:27:22 1204 Max A Table 36 Rue Cornac \n", + "\n", + " o_zip o_city o_latitude o_longitude customer_id \\\n", + "order_id \n", + "192594 33000 Bordeaux 44.851402 -0.57587 10298 \n", + "192644 33000 Bordeaux 44.851402 -0.57587 6037 \n", + "194335 33000 Bordeaux 44.851402 -0.57587 74268 \n", + "196615 33000 Bordeaux 44.851402 -0.57587 74901 \n", + "196839 33000 Bordeaux 44.851402 -0.57587 74966 \n", + "\n", + " d_street d_zip d_city d_latitude d_longitude \\\n", + "order_id \n", + "192594 Rue Rolland 14 33000 Bordeaux 44.842592 -0.580521 \n", + "192644 Rue Rolland 14 33000 Bordeaux 44.842592 -0.580521 \n", + "194335 Place Canteloup 12 33800 Bordeaux 44.833834 -0.565674 \n", + "196615 Rue Marcelin Jourdan 55 33200 Bordeaux 44.850360 -0.597361 \n", + "196839 Rue Sainte-Catherine 137 33000 Bordeaux 44.836516 -0.573983 \n", + "\n", + " total courier_id pickup_at delivery_at cancelled \n", + "order_id \n", + "192594 2050 1423.0 2016-07-18 12:38:08 2016-07-18 12:48:22 False \n", + "192644 2450 1426.0 2016-07-18 13:03:08 2016-07-18 13:12:01 False \n", + "194335 3100 1420.0 2016-07-19 20:51:16 2016-07-19 21:01:08 False \n", + "196615 2050 1418.0 2016-07-21 20:12:29 2016-07-21 20:25:57 False \n", + "196839 3750 1472.0 2016-07-21 20:41:42 2016-07-21 21:14:41 False " + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[df[\"restaurant_id\"] == 1204].head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Instead of an explicit condition, we can also use a reference to a boolean filter created above." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
placed_atrestaurant_idrestauranto_streeto_zipo_cityo_latitudeo_longitudecustomer_idd_streetd_zipd_cityd_latituded_longitudetotalcourier_idpickup_atdelivery_atcancelled
order_id
1925942016-07-18 12:23:131204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.5758710298Rue Rolland 1433000Bordeaux44.842592-0.58052120501423.02016-07-18 12:38:082016-07-18 12:48:22False
1926442016-07-18 12:48:551204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.575876037Rue Rolland 1433000Bordeaux44.842592-0.58052124501426.02016-07-18 13:03:082016-07-18 13:12:01False
1943352016-07-19 20:35:211204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.5758774268Place Canteloup 1233800Bordeaux44.833834-0.56567431001420.02016-07-19 20:51:162016-07-19 21:01:08False
1966152016-07-21 19:50:151204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.5758774901Rue Marcelin Jourdan 5533200Bordeaux44.850360-0.59736120501418.02016-07-21 20:12:292016-07-21 20:25:57False
1968392016-07-21 20:27:221204Max A Table36 Rue Cornac33000Bordeaux44.851402-0.5758774966Rue Sainte-Catherine 13733000Bordeaux44.836516-0.57398337501472.02016-07-21 20:41:422016-07-21 21:14:41False
\n", + "
" + ], + "text/plain": [ + " placed_at restaurant_id restaurant o_street \\\n", + "order_id \n", + "192594 2016-07-18 12:23:13 1204 Max A Table 36 Rue Cornac \n", + "192644 2016-07-18 12:48:55 1204 Max A Table 36 Rue Cornac \n", + "194335 2016-07-19 20:35:21 1204 Max A Table 36 Rue Cornac \n", + "196615 2016-07-21 19:50:15 1204 Max A Table 36 Rue Cornac \n", + "196839 2016-07-21 20:27:22 1204 Max A Table 36 Rue Cornac \n", + "\n", + " o_zip o_city o_latitude o_longitude customer_id \\\n", + "order_id \n", + "192594 33000 Bordeaux 44.851402 -0.57587 10298 \n", + "192644 33000 Bordeaux 44.851402 -0.57587 6037 \n", + "194335 33000 Bordeaux 44.851402 -0.57587 74268 \n", + "196615 33000 Bordeaux 44.851402 -0.57587 74901 \n", + "196839 33000 Bordeaux 44.851402 -0.57587 74966 \n", + "\n", + " d_street d_zip d_city d_latitude d_longitude \\\n", + "order_id \n", + "192594 Rue Rolland 14 33000 Bordeaux 44.842592 -0.580521 \n", + "192644 Rue Rolland 14 33000 Bordeaux 44.842592 -0.580521 \n", + "194335 Place Canteloup 12 33800 Bordeaux 44.833834 -0.565674 \n", + "196615 Rue Marcelin Jourdan 55 33200 Bordeaux 44.850360 -0.597361 \n", + "196839 Rue Sainte-Catherine 137 33000 Bordeaux 44.836516 -0.573983 \n", + "\n", + " total courier_id pickup_at delivery_at cancelled \n", + "order_id \n", + "192594 2050 1423.0 2016-07-18 12:38:08 2016-07-18 12:48:22 False \n", + "192644 2450 1426.0 2016-07-18 13:03:08 2016-07-18 13:12:01 False \n", + "194335 3100 1420.0 2016-07-19 20:51:16 2016-07-19 21:01:08 False \n", + "196615 2050 1418.0 2016-07-21 20:12:29 2016-07-21 20:25:57 False \n", + "196839 3750 1472.0 2016-07-21 20:41:42 2016-07-21 21:14:41 False " + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[max_a_table].head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Combining the filter with a `list` of columns allows us to further narrow down the `DataFrame`.\n", + "\n", + "For example, the preview below shows us the first five customers \"Max A Table\" had in the target period." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + "
customer_idd_streetd_zipd_cityd_latituded_longitude
order_id
19259410298Rue Rolland 1433000Bordeaux44.842592-0.580521
1926446037Rue Rolland 1433000Bordeaux44.842592-0.580521
19433574268Place Canteloup 1233800Bordeaux44.833834-0.565674
19661574901Rue Marcelin Jourdan 5533200Bordeaux44.850360-0.597361
19683974966Rue Sainte-Catherine 13733000Bordeaux44.836516-0.573983
\n", + "
" + ], + "text/plain": [ + " customer_id d_street d_zip d_city d_latitude \\\n", + "order_id \n", + "192594 10298 Rue Rolland 14 33000 Bordeaux 44.842592 \n", + "192644 6037 Rue Rolland 14 33000 Bordeaux 44.842592 \n", + "194335 74268 Place Canteloup 12 33800 Bordeaux 44.833834 \n", + "196615 74901 Rue Marcelin Jourdan 55 33200 Bordeaux 44.850360 \n", + "196839 74966 Rue Sainte-Catherine 137 33000 Bordeaux 44.836516 \n", + "\n", + " d_longitude \n", + "order_id \n", + "192594 -0.580521 \n", + "192644 -0.580521 \n", + "194335 -0.565674 \n", + "196615 -0.597361 \n", + "196839 -0.573983 " + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[\n", + " max_a_table,\n", + " [\"customer_id\", \"d_street\", \"d_zip\", \"d_city\", \"d_latitude\", \"d_longitude\"]\n", + "].head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Boolean filters can be created in an arbitray fashion by combining several conditions with `&` and `|` modeling logical AND and OR operators.\n", + "\n", + "The example lists the first five customers of \"Max A Table\" in a target area provided as latitude-longitude coordinates." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + "
customer_idd_streetd_zipd_cityd_latituded_longitude
order_id
19661574901Rue Marcelin Jourdan 5533200Bordeaux44.850360-0.597361
20080076187Rue Judaique 21333000Bordeaux44.840829-0.595445
20089376218Rue Notre Dame 2133000Bordeaux44.850260-0.572377
20278876786Rue De Leybardie 2733300Bordeaux44.861360-0.565057
20256376730Rue Lombard 4733300Bordeaux44.858661-0.563095
\n", + "
" + ], + "text/plain": [ + " customer_id d_street d_zip d_city d_latitude \\\n", + "order_id \n", + "196615 74901 Rue Marcelin Jourdan 55 33200 Bordeaux 44.850360 \n", + "200800 76187 Rue Judaique 213 33000 Bordeaux 44.840829 \n", + "200893 76218 Rue Notre Dame 21 33000 Bordeaux 44.850260 \n", + "202788 76786 Rue De Leybardie 27 33300 Bordeaux 44.861360 \n", + "202563 76730 Rue Lombard 47 33300 Bordeaux 44.858661 \n", + "\n", + " d_longitude \n", + "order_id \n", + "196615 -0.597361 \n", + "200800 -0.595445 \n", + "200893 -0.572377 \n", + "202788 -0.565057 \n", + "202563 -0.563095 " + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[\n", + " (\n", + " max_a_table\n", + " &\n", + " (\n", + " (df[\"d_latitude\"] > 44.85)\n", + " |\n", + " (df[\"d_longitude\"] < -0.59)\n", + " ) \n", + " ),\n", + " [\"customer_id\", \"d_street\", \"d_zip\", \"d_city\", \"d_latitude\", \"d_longitude\"]\n", + "].head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[.isin() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.isin.html#pandas.DataFrame.isin) is another useful method: It allows us to provide a `list` of values that we are filtering for in a column." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + "
placed_atcustomer_idd_streetd_zipd_citytotal
order_id
1926442016-07-18 12:48:556037Rue Rolland 1433000Bordeaux2450
2109452016-07-30 19:30:3979900Rue Du Couvent 1633000Bordeaux1650
2113632016-07-30 20:27:4580095Rue De La Porte Saint-Jean 833000Bordeaux2400
\n", + "
" + ], + "text/plain": [ + " placed_at customer_id d_street \\\n", + "order_id \n", + "192644 2016-07-18 12:48:55 6037 Rue Rolland 14 \n", + "210945 2016-07-30 19:30:39 79900 Rue Du Couvent 16 \n", + "211363 2016-07-30 20:27:45 80095 Rue De La Porte Saint-Jean 8 \n", + "\n", + " d_zip d_city total \n", + "order_id \n", + "192644 33000 Bordeaux 2450 \n", + "210945 33000 Bordeaux 1650 \n", + "211363 33000 Bordeaux 2400 " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[\n", + " (\n", + " max_a_table\n", + " &\n", + " df[\"customer_id\"].isin([6037, 79900, 80095])\n", + " ),\n", + " [\"placed_at\", \"customer_id\", \"d_street\", \"d_zip\", \"d_city\", \"total\"]\n", + "].head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `~` operator negates a condition. So, in the cell below we see all orders at \"Max A Table\" except the ones from the indicated customers." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/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", + "
placed_atcustomer_idd_streetd_zipd_citytotal
order_id
1925942016-07-18 12:23:1310298Rue Rolland 1433000Bordeaux2050
1943352016-07-19 20:35:2174268Place Canteloup 1233800Bordeaux3100
1966152016-07-21 19:50:1574901Rue Marcelin Jourdan 5533200Bordeaux2050
1968392016-07-21 20:27:2274966Rue Sainte-Catherine 13733000Bordeaux3750
1986312016-07-22 21:29:4075047Rue Boudet 2933000Bordeaux2650
\n", + "
" + ], + "text/plain": [ + " placed_at customer_id d_street d_zip \\\n", + "order_id \n", + "192594 2016-07-18 12:23:13 10298 Rue Rolland 14 33000 \n", + "194335 2016-07-19 20:35:21 74268 Place Canteloup 12 33800 \n", + "196615 2016-07-21 19:50:15 74901 Rue Marcelin Jourdan 55 33200 \n", + "196839 2016-07-21 20:27:22 74966 Rue Sainte-Catherine 137 33000 \n", + "198631 2016-07-22 21:29:40 75047 Rue Boudet 29 33000 \n", + "\n", + " d_city total \n", + "order_id \n", + "192594 Bordeaux 2050 \n", + "194335 Bordeaux 3100 \n", + "196615 Bordeaux 2050 \n", + "196839 Bordeaux 3750 \n", + "198631 Bordeaux 2650 " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[\n", + " (\n", + " max_a_table\n", + " &\n", + " ~df[\"customer_id\"].isin([6037, 79900, 80095])\n", + " ),\n", + " [\"placed_at\", \"customer_id\", \"d_street\", \"d_zip\", \"d_city\", \"total\"]\n", + "].head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## DataFrame Methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have learned the basics of selecting the data we want from a `DataFrame`, let's look at a couple of methods that allow us to obtain some infos out of a `DataFrame`, in particular, to run some **descriptive statistics**.\n", + "\n", + "[.unique() ](https://pandas.pydata.org/docs/reference/api/pandas.Series.unique.html#pandas.Series.unique) is a simple `Series` method returning an `ndarray` with all values that are in the `Series` once.\n", + "\n", + "Here, we get an overview of how many restaurants there are in Bordeaux in the target time horizon." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1204, 1205, 1208, 1206, 1209, 1207, 1211, 1213, 1214, 1212, 1216,\n", + " 1215, 1217, 1218, 1219, 1220, 1221, 1223, 1222, 1224, 1225, 1229,\n", + " 1226, 1227, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1239,\n", + " 1241, 1242, 1243, 1245, 1244, 1246, 1247, 1249, 1254, 1250, 1256,\n", + " 1258, 1259, 1260, 1263, 1264, 1266, 1265, 1267])" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"restaurant_id\"].unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "52" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df[\"restaurant_id\"].unique())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To obtain an `ndarray` of all customer IDs of \"Max A Table\", we write the following." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([10298, 6037, 74268, 74901, 74966, 75047, 76187, 76218, 76442,\n", + " 76396, 76421, 76786, 76822, 76730, 76871, 75687, 77409, 77386,\n", + " 77355, 77556, 78129, 78353, 78608, 78621, 78958, 79119, 79153,\n", + " 76838, 79234, 79486, 79576, 79563, 79653, 79900, 79912, 80026,\n", + " 80204, 80095, 80163])" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[\n", + " max_a_table,\n", + " \"customer_id\"\n", + "].unique()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[.value_counts() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.value_counts.html#pandas.DataFrame.value_counts) is similar to [.unique() ](https://pandas.pydata.org/docs/reference/api/pandas.Series.unique.html#pandas.Series.unique) and provides an array sorted by the counts of how often an element occurs in a column or `Series` in descending order.\n", + "\n", + "We use it to list the `10` most popular restaurants and customers in the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1254 78\n", + "1207 47\n", + "1204 39\n", + "1217 37\n", + "1212 32\n", + "1244 25\n", + "1225 25\n", + "1249 23\n", + "1242 19\n", + "1221 18\n", + "Name: restaurant_id, dtype: int64" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"restaurant_id\"].value_counts().head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "73919 14\n", + "10298 12\n", + "6037 8\n", + "77048 5\n", + "4210 4\n", + "74426 4\n", + "9304 3\n", + "76838 3\n", + "75905 3\n", + "74791 3\n", + "Name: customer_id, dtype: int64" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"customer_id\"].value_counts().head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[.sum() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sum.html#pandas.DataFrame.sum), [.min() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.min.html#pandas.DataFrame.min), [.max() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.max.html#pandas.DataFrame.max), [.mean() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.mean.html#pandas.DataFrame.mean), and [.round() ](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.round.html#pandas.DataFrame.round) are self-explanatory.\n", + "\n", + "We use it to analyze the overall spendings in Bordeaux and for \"Max A Table\"." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "15924.78" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"total\"].sum() / 100 # Convert to Euro" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "885.0" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[\n", + " max_a_table,\n", + " \"total\"\n", + "].sum() / 100" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.5" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"total\"].min() / 100" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "83.7" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"total\"].max() / 100" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "12.5" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[\n", + " max_a_table,\n", + " \"total\"\n", + "].min() / 100" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "60.0" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[\n", + " max_a_table,\n", + " \"total\"\n", + "].max() / 100" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "22.94636887608069" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"total\"].mean() / 100" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "22.95" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"total\"].mean().round() / 100" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "22.69" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[\n", + " max_a_table,\n", + " \"total\"\n", + "].mean().round() / 100" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/01_scientific_stack/orders.csv b/01_scientific_stack/orders.csv new file mode 100644 index 0000000..4f1c9b6 --- /dev/null +++ b/01_scientific_stack/orders.csv @@ -0,0 +1,695 @@ +order_id,placed_at,restaurant_id,restaurant,o_street,o_zip,o_city,o_latitude,o_longitude,customer_id,d_street,d_zip,d_city,d_latitude,d_longitude,total,courier_id,pickup_at,delivery_at,cancelled +192594,2016-07-18 12:23:13,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,10298,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,2050,1423,2016-07-18 12:38:08,2016-07-18 12:48:22,0 +192644,2016-07-18 12:48:55,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,6037,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,2450,1426,2016-07-18 13:03:08,2016-07-18 13:12:01,0 +192658,2016-07-18 13:00:13,1205,Taj Mahal,24 Rue Du Parlement Sainte-Catherine,33000,Bordeaux,44.840405,-0.57394,73830,Rue Batailley 12,33000,Bordeaux,44.8385037,-0.5919612,2550,1423,2016-07-18 13:19:04,2016-07-18 13:29:03,0 +193242,2016-07-18 20:39:54,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,10298,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,1550,1420,2016-07-18 20:55:52,2016-07-18 21:05:28,0 +192719,2016-07-18 13:52:04,1206,La Maison Du Glacier,1 Place Saint Pierre,33000,Bordeaux,44.839706,-0.570672,6037,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,2450,1426,2016-07-18 14:01:23,2016-07-18 14:08:36,0 +193364,2016-07-18 21:04:09,1209,La Gamelle,23 Rue Des Freres Bonie,33000,Bordeaux,44.836849,-0.580108,6037,Rue De La Croix Blanche 7,33000,Bordeaux,44.84433070000001,-0.5892649999999999,4450,1416,2016-07-18 21:33:26,2016-07-18 21:48:22,0 +192999,2016-07-18 19:55:21,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,73919,Rue Amedee Saint-Germain 121,33800,Bordeaux,44.8183009,-0.5637869999999999,2340,1415,2016-07-18 20:17:00,2016-07-18 20:30:21,0 +193367,2016-07-18 21:04:52,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,6037,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,2350,1426,2016-07-18 21:27:45,2016-07-18 21:39:11,0 +193406,2016-07-18 21:13:46,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,6037,Rue Kleber 13,33200,Bordeaux,44.8476855,-0.6068918,1739,1426,2016-07-18 21:33:42,2016-07-18 22:04:08,0 +193865,2016-07-19 13:35:37,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,6037,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,1450,1426,2016-07-19 13:49:11,2016-07-19 14:01:25,0 +193881,2016-07-19 13:45:24,1213,Lupo,"23 Place Pey Berland, 33000 Bordeaux",33000,Bordeaux,44.837158,-0.576632,6037,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,1550,1408,2016-07-19 13:59:17,2016-07-19 14:24:44,0 +193886,2016-07-19 13:52:31,1206,La Maison Du Glacier,1 Place Saint Pierre,33000,Bordeaux,44.839706,-0.570672,73919,Rue Amedee Saint-Germain 121,33800,Bordeaux,44.8183009,-0.5637869999999999,2450,1424,2016-07-19 13:59:06,2016-07-19 14:13:49,0 +194124,2016-07-19 19:47:12,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,74212,Cours Edouard Vaillant 35,33300,Bordeaux,44.8606007,-0.5582429999999999,3150,1403,2016-07-19 20:07:42,2016-07-19 20:17:00,0 +193748,2016-07-19 12:18:58,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,73919,Rue Amedee Saint-Germain 121,33800,Bordeaux,44.8183009,-0.5637869999999999,1650,1426,2016-07-19 12:40:10,2016-07-19 12:49:53,0 +193753,2016-07-19 12:20:20,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,73919,Rue Amedee Saint-Germain 121,33800,Bordeaux,44.8183009,-0.5637869999999999,1450,1408,2016-07-19 12:38:17,2016-07-19 12:49:48,0 +194659,2016-07-19 21:49:40,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,10298,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,2080,1416,2016-07-19 22:19:48,2016-07-19 22:29:50,0 +194280,2016-07-19 20:24:08,1215,Moon Wok,17 Place Fernand Lafargue,33000,Bordeaux,44.837299,-0.572124,74253,Rue Lafontaine 35,33800,Bordeaux,44.8268384,-0.5708527,1450,1423,2016-07-19 20:34:34,2016-07-19 20:46:56,0 +194335,2016-07-19 20:35:21,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,74268,Place Canteloup 12,33800,Bordeaux,44.8338344,-0.5656738,3100,1420,2016-07-19 20:51:16,2016-07-19 21:01:08,0 +194669,2016-07-19 21:52:30,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,4210,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,1750,1403,2016-07-19 22:10:18,,1 +194675,2016-07-19 21:54:35,1218,Le Rizana,7 Rue Gaspard Philippe,33000,Bordeaux,44.833736,-0.56662,22771,Rue Rolland 1,33000,Bordeaux,44.8427648,-0.5794479,1450,1420,2016-07-19 22:06:57,2016-07-19 22:27:18,0 +194466,2016-07-19 21:03:15,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,74308,Rue Neuve 15,33130,Bordeaux,44.8108466,-0.5658726,2250,1423,2016-07-19 21:21:43,2016-07-19 21:36:41,0 +194681,2016-07-19 21:56:46,1215,Moon Wok,17 Place Fernand Lafargue,33000,Bordeaux,44.837299,-0.572124,73919,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,1900,1416,2016-07-19 22:06:38,2016-07-19 22:29:42,0 +194686,2016-07-19 21:57:59,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,9304,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,3829,1420,,,1 +194697,2016-07-19 22:01:31,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,6037,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,3600,1403,2016-07-19 22:20:54,2016-07-19 22:27:32,0 +194720,2016-07-19 22:11:16,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,9304,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,4090,1420,2016-07-19 22:22:53,2016-07-19 22:27:24,0 +194723,2016-07-19 22:12:53,1205,Taj Mahal,24 Rue Du Parlement Sainte-Catherine,33000,Bordeaux,44.840405,-0.57394,4210,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,1800,1416,2016-07-19 22:24:23,2016-07-19 22:30:08,0 +194826,2016-07-20 11:53:16,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,74411,Cours De L'Argonne 197,33000,Bordeaux,44.824824,-0.5788848999999999,1850,1415,2016-07-20 12:18:27,2016-07-20 12:34:39,0 +194935,2016-07-20 12:39:51,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,73919,Rue Amedee Saint-Germain 121,33800,Bordeaux,44.8183009,-0.5637869999999999,1639,1405,2016-07-20 13:05:38,2016-07-20 13:16:03,0 +194969,2016-07-20 12:59:21,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,10298,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,1630,1415,2016-07-20 13:14:01,2016-07-20 13:20:54,0 +194884,2016-07-20 12:18:46,1222,Les Tartines De Marine,"6 Rue Saint-Sernin, Bordeaux",33000,Bordeaux,44.839336,-0.58194,74426,Rue De Tauzia 42,33800,Bordeaux,44.8291733,-0.5581146,3650,1417,2016-07-20 12:37:44,2016-07-20 12:52:01,0 +195003,2016-07-20 13:26:34,1224,Gyoza Factory,6 Rue Georges Bonnac,33000,Bordeaux,44.840355,-0.581659,10298,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,3279,1415,2016-07-20 13:47:46,2016-07-20 13:52:37,0 +195010,2016-07-20 13:39:04,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,10298,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,3100,1418,2016-07-20 14:10:47,2016-07-20 14:18:15,0 +195272,2016-07-20 19:41:47,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,74513,Rue Bourges 20,33400,Bordeaux,44.81629059999999,-0.5785701,2050,1411,2016-07-20 20:05:13,2016-07-20 20:18:39,0 +195274,2016-07-20 19:42:34,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,74519,Rue Cornac 4,33000,Bordeaux,44.8509545,-0.5721066,1490,1419,2016-07-20 20:22:32,2016-07-20 20:31:04,0 +195337,2016-07-20 19:55:31,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,74541,Cours De La Somme 190,33800,Bordeaux,44.8230039,-0.5722246,2250,1405,2016-07-20 20:15:45,2016-07-20 20:24:59,0 +195177,2016-07-20 19:18:28,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,74499,Rue De Ruat 26,33000,Bordeaux,44.83959189999999,-0.5788992000000001,2050,1420,2016-07-20 19:38:57,2016-07-20 19:46:39,0 +195617,2016-07-20 20:44:39,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,74618,Cours De Verdun 32,33000,Bordeaux,44.8466972,-0.5766392,1510,1420,2016-07-20 21:06:58,2016-07-20 21:11:43,0 +195239,2016-07-20 19:34:12,1209,La Gamelle,23 Rue Des Freres Bonie,33000,Bordeaux,44.836849,-0.580108,74513,Rue Bourges 20,33400,Bordeaux,44.81629059999999,-0.5785701,1350,1411,2016-07-20 19:50:39,2016-07-20 20:18:45,0 +195675,2016-07-20 20:55:12,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,74631,Rue Saint-Jean 85,33800,Bordeaux,44.8248735,-0.5683764,1550,1403,2016-07-20 21:11:42,2016-07-20 21:15:25,0 +195632,2016-07-20 20:46:49,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,74622,Cours Gambetta 164,33400,Bordeaux,44.81533599999999,-0.5858416,3570,1405,2016-07-20 21:05:14,2016-07-20 21:11:07,0 +196085,2016-07-21 12:06:00,1229,Les Mijotes Du Bocal,2 Bis Rue De Cursol,33000,Bordeaux,44.834278,-0.57038,74738,Boulevard Albert 1Er 19,33800,Bordeaux,44.8143014,-0.5710408,1950,1463,2016-07-21 12:18:16,2016-07-21 12:35:29,0 +195862,2016-07-20 21:33:39,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,73919,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,2850,1403,2016-07-20 21:45:18,2016-07-20 21:53:27,0 +195867,2016-07-20 21:35:21,1226,Ici Argentine,84 Boulevard Du President Wilson,33000,Bordeaux,44.840084,-0.5994,73919,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,2950,1420,2016-07-20 21:54:28,2016-07-20 22:00:06,0 +195871,2016-07-20 21:36:50,1227,Cilicie,4 Rue Des Bahutiers,33000,Bordeaux,44.839531,-0.570651,73919,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,3750,1416,2016-07-20 21:53:13,2016-07-20 22:06:27,0 +196093,2016-07-21 12:09:28,1222,Les Tartines De Marine,"6 Rue Saint-Sernin, Bordeaux",33000,Bordeaux,44.839336,-0.58194,74426,Rue De Tauzia 42,33800,Bordeaux,44.8291733,-0.5581146,3450,1430,2016-07-21 12:25:10,2016-07-21 12:41:21,0 +196143,2016-07-21 12:35:44,1230,Is&I Kitchen,12 Place Paul Et Jean-Paul Avisseau,33300,Bordeaux,44.855438,-0.567234,74760,Rue Abel Antoune 14,33110,Bordeaux,44.8674088,-0.5824912,1800,1420,2016-07-21 12:56:42,2016-07-21 13:09:23,0 +196165,2016-07-21 12:42:50,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,73919,Rue Amedee Saint-Germain 121B,33800,Bordeaux,44.8182663,-0.5638276999999999,1630,1415,2016-07-21 12:58:04,2016-07-21 13:13:35,0 +196383,2016-07-21 18:55:20,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,74826,Cours Aristide Briand 80,33000,Bordeaux,44.8316303,-0.5756167999999999,1540,1468,2016-07-21 19:22:23,2016-07-21 19:26:44,0 +196172,2016-07-21 12:44:53,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,73919,Rue Amedee Saint-Germain 121B,33800,Bordeaux,44.8182663,-0.5638276999999999,1820,1405,2016-07-21 12:52:34,2016-07-21 13:22:26,0 +196268,2016-07-21 13:40:56,1229,Les Mijotes Du Bocal,2 Bis Rue De Cursol,33000,Bordeaux,44.834278,-0.57038,10298,Rue Rolland 14,33000,Bordeaux,44.8425916,-0.5805208,1550,1405,2016-07-21 13:50:26,2016-07-21 13:59:29,0 +196474,2016-07-21 19:22:35,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,74850,Rue Lecocq 72 Ter,33000,Bordeaux,44.8344849,-0.5854412,1739,1430,2016-07-21 19:41:57,2016-07-21 19:59:43,0 +196517,2016-07-21 19:32:25,1206,La Maison Du Glacier,1 Place Saint Pierre,33000,Bordeaux,44.839706,-0.570672,74866,Rue Pelleport 120,33800,Bordeaux,44.821873,-0.5631925999999999,2750,1418,2016-07-21 19:41:13,2016-07-21 19:56:09,0 +196288,2016-07-21 13:58:34,1224,Gyoza Factory,6 Rue Georges Bonnac,33000,Bordeaux,44.840355,-0.581659,74791,Cours D'Albret 83,33000,Bordeaux,44.83473619999999,-0.5807051999999999,2000,1405,,,1 +196571,2016-07-21 19:45:25,1232,Anh Kha,48 Rue Saint Sernin,33000,Bordeaux,44.841103,-0.582515,74883,Rue Albert De Mun 26,33000,Bordeaux,44.8487459,-0.5816116,1250,1403,2016-07-21 20:04:02,2016-07-21 20:08:23,0 +196302,2016-07-21 14:18:06,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,74798,Rue De La Rousselle 9,33000,Bordeaux,44.8375181,-0.5692362,1295,1405,2016-07-21 14:34:09,2016-07-21 14:47:58,0 +196792,2016-07-21 20:18:31,1226,Ici Argentine,84 Boulevard Du President Wilson,33000,Bordeaux,44.840084,-0.5994,74958,Rue Poudensan 7,33000,Bordeaux,44.8485698,-0.5869224,1350,1468,2016-07-21 20:39:25,2016-07-21 20:49:01,0 +196615,2016-07-21 19:50:15,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,74901,Rue Marcelin Jourdan 55,33200,Bordeaux,44.8503596,-0.5973613999999999,2050,1418,2016-07-21 20:12:29,2016-07-21 20:25:57,0 +196703,2016-07-21 20:03:55,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,74931,Rue De Ruat 26,33000,Bordeaux,44.83959189999999,-0.5788992000000001,3950,1411,2016-07-21 20:17:35,2016-07-21 20:28:49,0 +196705,2016-07-21 20:04:11,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,74932,Cours Balguerie Stuttenberg 96,33300,Bordeaux,44.8578336,-0.5671222,3400,1430,2016-07-21 20:16:55,2016-07-21 20:28:25,0 +196713,2016-07-21 20:05:58,1234,Mille Et Une Saveurs,"96 Avenue Thiers, 33100 Bordeaux",33100,Bordeaux,44.843746,-0.554713,74934,Rue Du Capitaine Ferrand 22,33100,Bordeaux,44.8518856,-0.5388995,1300,1415,2016-07-21 20:21:25,2016-07-21 20:33:55,0 +196839,2016-07-21 20:27:22,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,74966,Rue Sainte-Catherine 137,33000,Bordeaux,44.83651589999999,-0.5739832000000001,3750,1472,2016-07-21 20:41:42,2016-07-21 21:14:41,0 +197125,2016-07-21 21:15:16,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,75047,Rue Boudet 29,33000,Bordeaux,44.8467347,-0.5763701999999999,2650,1403,,,1 +196851,2016-07-21 20:29:35,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,74970,Avenue De Tivoli 14,33110,Bordeaux,44.8576458,-0.5915104,1639,1403,2016-07-21 20:52:48,2016-07-21 21:02:03,0 +196901,2016-07-21 20:36:38,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,74988,Cours De L'Yser 42,33800,Bordeaux,44.8282049,-0.5686705,1345,1411,2016-07-21 20:54:27,2016-07-21 21:05:07,0 +196997,2016-07-21 20:51:08,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,75014,Rue Des Argentiers 26,33000,Bordeaux,44.8389043,-0.5696971,3140,1430,2016-07-21 21:04:25,2016-07-21 21:12:11,0 +197232,2016-07-21 21:35:11,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,75078,Rue De Candale 11,33000,Bordeaux,44.8319862,-0.5722993,1530,1403,2016-07-21 22:06:11,2016-07-21 22:15:31,0 +197084,2016-07-21 21:06:01,1235,Melodie,17 Rue Leupold,33000,Bordeaux,44.840603,-0.570444,75036,Place Gambetta 20,33000,Bordeaux,44.8404572,-0.5805786,1250,1430,2016-07-21 21:20:55,2016-07-21 21:32:55,0 +197338,2016-07-21 22:14:06,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,75109,Rue Mouneyra 93,33000,Bordeaux,44.8323712,-0.5852105,1590,1416,2016-07-21 22:34:21,2016-07-21 22:42:10,0 +197351,2016-07-21 22:22:47,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,75115,Rue Pierre Duhem 10,33000,Bordeaux,44.8283819,-0.5827968,2700,1472,2016-07-21 22:49:29,2016-07-21 23:01:57,0 +197449,2016-07-22 11:55:55,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,74426,Rue De Tauzia 42,33800,Bordeaux,44.8291733,-0.5581146,5150,1458,2016-07-22 12:11:55,2016-07-22 12:21:27,0 +197096,2016-07-21 21:07:48,1235,Melodie,17 Rue Leupold,33000,Bordeaux,44.840603,-0.570444,75038,Place Gambetta 20,33000,Bordeaux,44.8404572,-0.5805786,1250,1416,2016-07-21 21:27:30,2016-07-21 21:35:31,0 +197101,2016-07-21 21:08:37,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,75039,Rue Lafontaine 9,33800,Bordeaux,44.8268699,-0.5718456,1889,1415,2016-07-21 21:20:28,2016-07-21 21:40:57,0 +197952,2016-07-22 19:39:38,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,75290,Rue Du Docteur Charles Nancel Penard 21,33000,Bordeaux,44.8397886,-0.5814379,2130,1414,2016-07-22 19:57:08,2016-07-22 20:15:17,0 +197597,2016-07-22 12:59:45,1237,Label Terre,2 Cours D'Alsace Lorraine,33000,Bordeaux,44.837952,-0.567716,75192,Rue Cruchinet 3 Bis,33800,Bordeaux,44.8282803,-0.5740767999999999,1250,1468,2016-07-22 13:08:51,2016-07-22 13:16:20,0 +198072,2016-07-22 20:00:00,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,75328,Rue Fondaudege 42,33000,Bordeaux,44.8469544,-0.5807835,2890,1471,2016-07-22 20:15:10,2016-07-22 20:22:48,0 +198113,2016-07-22 20:04:59,1232,Anh Kha,48 Rue Saint Sernin,33000,Bordeaux,44.841103,-0.582515,75344,Rue Georges Mandel 155,33000,Bordeaux,44.8421745,-0.5954264,4150,1407,2016-07-22 20:30:20,2016-07-22 20:37:11,0 +197824,2016-07-22 19:09:17,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,75253,Cours De L'Argonne 48,33000,Bordeaux,44.8288365,-0.5738496,2030,1426,2016-07-22 19:40:08,2016-07-22 19:47:35,0 +198122,2016-07-22 20:05:55,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,75347,Rue De Begles 9,33800,Bordeaux,44.8287747,-0.5680915999999999,2530,1430,2016-07-22 20:18:08,2016-07-22 20:31:14,0 +198184,2016-07-22 20:14:40,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,75366,Rue Guillaume Leblanc 186,33000,Bordeaux,44.83092449999999,-0.5963856,2780,1468,2016-07-22 20:45:55,2016-07-22 20:51:51,0 +198242,2016-07-22 20:23:53,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,75380,Rue Du Grand Maurian 8,33000,Bordeaux,44.83066849999999,-0.6043449,450,1422,2016-07-22 20:41:14,2016-07-22 21:01:46,0 +198257,2016-07-22 20:25:52,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,75389,Boulevard Godard 187,33110,Bordeaux,44.8637918,-0.5812958,2790,1471,2016-07-22 20:37:14,2016-07-22 20:57:56,0 +198202,2016-07-22 20:18:21,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,75370,Rue Monadey 18,33800,Bordeaux,44.8288717,-0.571275,2530,1417,2016-07-22 20:47:02,2016-07-22 20:53:17,0 +198631,2016-07-22 21:29:40,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,75047,Rue Boudet 29,33000,Bordeaux,44.8467347,-0.5763701999999999,2650,1471,2016-07-22 21:42:21,2016-07-22 21:51:58,0 +198676,2016-07-22 21:39:06,1226,Ici Argentine,84 Boulevard Du President Wilson,33000,Bordeaux,44.840084,-0.5994,75519,Rue Margaux 16,33000,Bordeaux,44.8401238,-0.5752217,2950,1426,2016-07-22 21:57:07,2016-07-22 22:06:23,0 +198436,2016-07-22 20:52:46,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,75446,Rue Repond 28,33000,Bordeaux,44.845829,-0.5914465999999999,2760,1426,2016-07-22 21:11:33,2016-07-22 21:19:27,0 +198678,2016-07-22 21:39:12,1224,Gyoza Factory,6 Rue Georges Bonnac,33000,Bordeaux,44.840355,-0.581659,74791,Cours D'Albret 83,33000,Bordeaux,44.83473619999999,-0.5807051999999999,1200,1417,,,1 +198686,2016-07-22 21:40:29,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,75522,Cours Du Medoc 75,33300,Bordeaux,44.8595135,-0.567983,1280,1471,2016-07-22 21:58:23,2016-07-22 22:14:24,0 +198718,2016-07-22 21:47:35,1224,Gyoza Factory,6 Rue Georges Bonnac,33000,Bordeaux,44.840355,-0.581659,75535,Cours D'Albret 83,33000,Bordeaux,44.83473619999999,-0.5807051999999999,1250,1422,,,1 +198544,2016-07-22 21:12:52,1232,Anh Kha,48 Rue Saint Sernin,33000,Bordeaux,44.841103,-0.582515,75483,Rue Colette 2,33800,Bordeaux,44.8249279,-0.5767403999999999,1450,1422,2016-07-22 21:23:35,2016-07-22 21:39:43,0 +198747,2016-07-22 21:54:22,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,75550,Rue Des Pontets 18,33000,Bordeaux,44.8357182,-0.5658378,1250,1417,2016-07-22 22:10:07,2016-07-22 22:18:51,0 +198820,2016-07-22 22:29:19,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,75578,Rue Donissan 56,33000,Bordeaux,44.8287449,-0.5747449,1650,,,,1 +198963,2016-07-23 12:54:54,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,75606,Rue Des Freres Bonie 37,33000,Bordeaux,44.8366789,-0.5806582,1520,1412,2016-07-23 13:14:27,2016-07-23 13:33:02,0 +199379,2016-07-23 19:26:30,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,75711,Avenue Felix Faure 21,33200,Bordeaux,44.8525499,-0.5959232999999999,1830,1409,2016-07-23 19:46:22,2016-07-23 19:57:25,0 +199018,2016-07-23 13:26:10,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,75615,Rue Des Caperans 19,33000,Bordeaux,44.8406437,-0.5715003,1950,1418,2016-07-23 13:38:43,2016-07-23 13:45:16,0 +199038,2016-07-23 13:35:23,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,75621,32 Rue De La Boetie 32,33000,Bordeaux,44.8391885,-0.5812602,1500,1430,2016-07-23 13:43:01,2016-07-23 13:55:16,0 +199091,2016-07-23 14:17:04,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,75632,Rue Lafontaine 86,33800,Bordeaux,44.8270589,-0.5680672999999999,1270,1471,2016-07-23 14:28:50,2016-07-23 14:49:22,0 +199163,2016-07-23 16:12:12,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,75653,Cours De L'Yser 130,33800,Bordeaux,44.82495369999999,-0.5695693,5880,,,,1 +199430,2016-07-23 19:40:32,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,75730,Rue Prunier 120,33300,Bordeaux,44.85971230000001,-0.5741263999999999,2840,1415,2016-07-23 20:04:46,2016-07-23 20:16:47,0 +199280,2016-07-23 18:59:59,1234,Mille Et Une Saveurs,"96 Avenue Thiers, 33100 Bordeaux",33100,Bordeaux,44.843746,-0.554713,75687,Rue De La Rousselle 56,33000,Bordeaux,44.8371635,-0.5677504999999999,3850,1458,2016-07-23 19:15:16,2016-07-23 19:33:24,0 +199487,2016-07-23 19:51:51,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,75747,Rue De La Prevote 6,33000,Bordeaux,44.8440582,-0.5852999,1989,1416,2016-07-23 20:06:33,2016-07-23 20:24:50,0 +199308,2016-07-23 19:10:07,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,75694,Rue De Saincric 22,33000,Bordeaux,44.8320497,-0.5746960999999999,1830,1468,2016-07-23 19:34:10,2016-07-23 19:41:52,0 +199576,2016-07-23 20:10:03,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,75772,Avenue D'Ares 153,33200,Bordeaux,44.8370445,-0.6065231000000001,1530,1468,2016-07-23 20:23:23,2016-07-23 20:32:33,0 +199733,2016-07-23 20:44:37,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,75837,Place De La Bourse 18,33000,Bordeaux,44.8418608,-0.5705232,2390,1471,2016-07-23 21:15:40,2016-07-23 21:24:09,0 +199670,2016-07-23 20:32:01,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,75811,Rue De La Boetie 25,33000,Bordeaux,44.83935049999999,-0.5809105,1910,1416,2016-07-23 20:45:19,2016-07-23 20:59:44,0 +199796,2016-07-23 20:58:37,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,75860,Place Canteloup 12,33800,Bordeaux,44.8338344,-0.5656738,1650,1468,2016-07-23 21:18:56,2016-07-23 21:27:46,0 +199804,2016-07-23 21:01:08,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,75865,Rue Elie Gintrac 5,33000,Bordeaux,44.830883,-0.5716422,2610,1415,2016-07-23 21:19:11,2016-07-23 21:26:40,0 +199821,2016-07-23 21:05:09,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,75872,Cours De La Somme 24,33800,Bordeaux,44.8296549,-0.5713018,1450,1416,2016-07-23 21:17:37,2016-07-23 21:27:33,0 +199827,2016-07-23 21:06:10,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,75874,Rue Borie 44,33300,Bordeaux,44.8544655,-0.5697350999999999,1530,1426,2016-07-23 21:23:42,2016-07-23 21:31:13,0 +199839,2016-07-23 21:09:13,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,75880,Rue Bergeret 23,33000,Bordeaux,44.8322016,-0.5685524,1330,1422,2016-07-23 21:23:04,2016-07-23 21:35:34,0 +199845,2016-07-23 21:10:42,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,75882,Rue Borie 44,33300,Bordeaux,44.8544655,-0.5697350999999999,1530,1409,2016-07-23 21:26:44,2016-07-23 21:33:05,0 +199869,2016-07-23 21:15:22,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,75889,Rue Du Tondu 24,33000,Bordeaux,44.832338,-0.5815905,2510,1458,2016-07-23 21:27:44,2016-07-23 21:36:29,0 +199672,2016-07-23 20:32:12,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,75812,Rue Rene Roy De Clotte 14,33000,Bordeaux,44.8296648,-0.5755587999999999,1700,1468,2016-07-23 20:47:31,2016-07-23 20:56:44,0 +199688,2016-07-23 20:35:15,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,75819,Rue Georges Bonnac 55,33000,Bordeaux,44.840485,-0.5839241,1450,1409,2016-07-23 20:54:42,2016-07-23 21:07:39,0 +199876,2016-07-23 21:16:26,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,75893,Boulevard Godard 40,33300,Bordeaux,44.859547,-0.5891523,1420,1461,2016-07-23 21:35:05,2016-07-23 21:40:43,0 +199881,2016-07-23 21:16:57,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,75895,Rue Borie 44,33300,Bordeaux,44.8544655,-0.5697350999999999,1530,1472,2016-07-23 21:37:08,2016-07-23 21:45:52,0 +199904,2016-07-23 21:21:33,1224,Gyoza Factory,6 Rue Georges Bonnac,33000,Bordeaux,44.840355,-0.581659,75905,Rue De La Prevote 3,33000,Bordeaux,44.8441797,-0.5850267,1800,1416,2016-07-23 21:37:08,2016-07-23 21:40:57,0 +200224,2016-07-24 13:09:05,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,4210,Rue Amedee Saint-Germain 121,33800,Bordeaux,44.8183009,-0.5637869999999999,1700,1412,2016-07-24 13:27:15,2016-07-24 13:43:32,0 +200020,2016-07-23 21:56:25,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,75951,Cite Mouneyra 6,33000,Bordeaux,44.8323473,-0.5844635,1830,1426,2016-07-23 22:15:46,2016-07-23 22:23:17,0 +200300,2016-07-24 13:46:15,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,76030,Rue Villeneuve 1,33000,Bordeaux,44.8399273,-0.5800124999999999,3820,1426,2016-07-24 14:12:45,2016-07-24 14:16:59,0 +200305,2016-07-24 13:49:25,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,76033,Rue Du Ha 54,33000,Bordeaux,44.8358976,-0.5779413999999999,1689,1405,2016-07-24 14:12:04,2016-07-24 14:15:54,0 +200800,2016-07-24 19:30:52,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,76187,Rue Judaique 213,33000,Bordeaux,44.8408287,-0.5954455,2250,1468,2016-07-24 19:50:52,2016-07-24 19:58:16,0 +200635,2016-07-24 18:56:49,1241,My Terroir,24 Place De La Ferme De Richemont,33000,Bordeaux,44.835506,-0.575218,76141,Rue Contrescarpe 9,33000,Bordeaux,44.8310904,-0.5691697,1750,1468,2016-07-24 19:09:03,2016-07-24 19:19:13,0 +200893,2016-07-24 19:46:32,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,76218,Rue Notre Dame 21,33000,Bordeaux,44.8502597,-0.5723775,1300,1415,2016-07-24 20:00:26,2016-07-24 20:09:13,0 +200747,2016-07-24 19:21:44,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,76172,Rue Du Pavillon 17,33000,Bordeaux,44.829336,-0.5778071,1280,1461,2016-07-24 19:43:23,2016-07-24 19:48:43,0 +200927,2016-07-24 19:50:29,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,76233,Rue Henri Dunant 30,33100,Bordeaux,44.8394279,-0.5551889,3000,1418,2016-07-24 20:00:36,2016-07-24 20:13:52,0 +201182,2016-07-24 20:21:04,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,76311,Cours Du Medoc 15Bis,33300,Bordeaux,44.8567725,-0.5650073,1250,1418,2016-07-24 20:36:08,2016-07-24 20:52:45,0 +201199,2016-07-24 20:23:58,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,76319,Place Andre Meunier Dit Mureine 40,33800,Bordeaux,44.828553,-0.5616951,2350,1426,2016-07-24 20:36:16,2016-07-24 20:47:37,0 +201207,2016-07-24 20:24:48,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,76323,Cours De L'Intendance 38,33000,Bordeaux,44.84161539999999,-0.5776260999999999,3750,1415,2016-07-24 20:44:26,2016-07-24 20:53:43,0 +200928,2016-07-24 19:50:32,1227,Cilicie,4 Rue Des Bahutiers,33000,Bordeaux,44.839531,-0.570651,76234,50 Rue Du Temps Passe 50,33000,Bordeaux,44.8512904,-0.5872427,1450,1426,2016-07-24 20:05:16,2016-07-24 20:15:12,0 +201096,2016-07-24 20:12:03,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,76287,Rue De Begles 248,33800,Bordeaux,44.8188697,-0.5660468000000001,2450,1409,2016-07-24 20:28:11,2016-07-24 20:36:53,0 +201231,2016-07-24 20:26:39,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,76334,Rue Du Ha 29,33000,Bordeaux,44.8361233,-0.5772771999999999,2700,1416,2016-07-24 20:41:50,2016-07-24 20:46:53,0 +201553,2016-07-24 21:08:47,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,76442,Rue Emile Fourcand 98,33000,Bordeaux,44.8473528,-0.5872161,2050,1426,2016-07-24 21:21:09,2016-07-24 21:27:17,0 +201422,2016-07-24 20:51:44,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,76396,Rue Marguerite Crauste 1,33000,Bordeaux,44.8363155,-0.5869059999999999,2250,1416,2016-07-24 21:03:56,2016-07-24 21:17:36,0 +201486,2016-07-24 20:59:54,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,76421,Rue Mouneyra 93,33000,Bordeaux,44.8323712,-0.5852105,2050,1415,2016-07-24 21:12:05,2016-07-24 21:20:29,0 +201698,2016-07-24 21:36:59,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,76498,Rue De Blaye 19,33100,Bordeaux,44.8476772,-0.5444045,2750,1416,2016-07-24 21:49:58,2016-07-24 21:59:37,0 +201951,2016-07-25 12:09:25,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,76563,Cours De Luze 71,33300,Bordeaux,44.8578078,-0.5798426999999999,1450,1424,2016-07-25 12:29:38,2016-07-25 12:40:12,0 +201966,2016-07-25 12:17:25,1222,Les Tartines De Marine,"6 Rue Saint-Sernin, Bordeaux",33000,Bordeaux,44.839336,-0.58194,74426,Rue De Tauzia 42,33800,Bordeaux,44.8291733,-0.5581146,2950,1422,2016-07-25 12:35:30,2016-07-25 12:50:39,0 +201704,2016-07-24 21:37:53,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,76501,Rue Lafaurie Monbadon 17,33000,Bordeaux,44.8435447,-0.5799662,2050,1409,2016-07-24 21:50:52,2016-07-24 22:00:14,0 +202030,2016-07-25 12:46:34,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,76581,Rue Ferrere 6 Bis,33000,Bordeaux,44.8481767,-0.5714347,1510,1465,2016-07-25 13:06:20,2016-07-25 13:17:48,0 +201756,2016-07-24 21:51:18,1218,Le Rizana,7 Rue Gaspard Philippe,33000,Bordeaux,44.833736,-0.56662,76515,Rue De La Benauge 74,33100,Bordeaux,44.8406595,-0.5551796999999999,1850,1415,2016-07-24 22:04:43,2016-07-24 22:17:25,0 +202057,2016-07-25 12:58:33,1222,Les Tartines De Marine,"6 Rue Saint-Sernin, Bordeaux",33000,Bordeaux,44.839336,-0.58194,76587,Cours Saint-Louis 38,33300,Bordeaux,44.85734619999999,-0.5703104999999999,1250,1461,2016-07-25 13:19:32,2016-07-25 13:26:35,0 +202059,2016-07-25 12:58:41,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,73830,Rue Courbin 8,33000,Bordeaux,44.8416582,-0.5729175,3600,1426,2016-07-25 13:21:13,2016-07-25 13:29:38,0 +202076,2016-07-25 13:07:46,1209,La Gamelle,23 Rue Des Freres Bonie,33000,Bordeaux,44.836849,-0.580108,10298,Rue Des Argentiers 16,33000,Bordeaux,44.8391736,-0.5698286,3250,1422,,,1 +202079,2016-07-25 13:10:14,1209,La Gamelle,23 Rue Des Freres Bonie,33000,Bordeaux,44.836849,-0.580108,76594,Cours Saint-Louis 38,33300,Bordeaux,44.85734619999999,-0.5703104999999999,1350,1463,,,1 +201762,2016-07-24 21:52:41,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,76517,Rue D'Arcachon 43,33000,Bordeaux,44.8267293,-0.584368,1250,1426,2016-07-24 22:01:45,2016-07-24 22:10:58,0 +202100,2016-07-25 13:21:39,1222,Les Tartines De Marine,"6 Rue Saint-Sernin, Bordeaux",33000,Bordeaux,44.839336,-0.58194,75535,Cours D'Albret 83,33000,Bordeaux,44.83473619999999,-0.5807051999999999,1250,1407,2016-07-25 13:35:12,2016-07-25 13:39:19,0 +202389,2016-07-25 19:41:19,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,76674,Cours De La Somme 24,33800,Bordeaux,44.8296549,-0.5713018,1450,1416,2016-07-25 20:00:43,2016-07-25 20:08:36,0 +202119,2016-07-25 13:37:37,1222,Les Tartines De Marine,"6 Rue Saint-Sernin, Bordeaux",33000,Bordeaux,44.839336,-0.58194,10298,Rue Des Argentiers 16,33000,Bordeaux,44.8391736,-0.5698286,2850,1426,2016-07-25 13:52:38,2016-07-25 13:57:41,0 +202267,2016-07-25 19:11:05,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,76640,Rue De La Devise 35,33000,Bordeaux,44.8402324,-0.5723187,1650,1430,2016-07-25 19:25:08,2016-07-25 19:36:56,0 +202432,2016-07-25 19:49:41,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,76686,Rue Lafaurie Monbadon 39,33000,Bordeaux,44.8443198,-0.5798648,2440,1458,2016-07-25 20:14:45,2016-07-25 20:20:46,0 +202453,2016-07-25 19:53:34,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,76691,Rue De Begles 223,33800,Bordeaux,44.819907,-0.5659968,1350,1424,2016-07-25 20:16:46,2016-07-25 20:26:05,0 +202788,2016-07-25 20:47:48,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,76786,Rue De Leybardie 27,33300,Bordeaux,44.8613599,-0.5650568,1300,1430,2016-07-25 21:02:32,2016-07-25 21:11:06,0 +202471,2016-07-25 19:57:12,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,76697,Cours De La Marne 99,33800,Bordeaux,44.82912350000001,-0.566924,1530,1461,2016-07-25 20:11:00,2016-07-25 20:17:58,0 +202829,2016-07-25 20:54:08,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,76794,Rue De La Tour Du Pin 25,33000,Bordeaux,44.835629,-0.5652444999999999,1950,1416,2016-07-25 21:17:45,2016-07-25 21:26:38,0 +202836,2016-07-25 20:55:24,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,76796,Rue Louis Cabie 42,33800,Bordeaux,44.812272,-0.5716739,5770,1411,2016-07-25 21:12:11,2016-07-25 21:25:30,0 +202478,2016-07-25 19:58:10,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,76700,Rue Belle Etoile 1,33800,Bordeaux,44.8290799,-0.5590144,1390,1460,2016-07-25 20:16:29,2016-07-25 20:34:09,0 +202846,2016-07-25 20:57:10,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,76798,Rue Leberthon 46,33000,Bordeaux,44.8291378,-0.5753912,4535,1458,2016-07-25 21:21:53,2016-07-25 21:30:30,0 +202485,2016-07-25 19:59:55,1209,La Gamelle,23 Rue Des Freres Bonie,33000,Bordeaux,44.836849,-0.580108,76703,Rue Belle Etoile 1,33800,Bordeaux,44.8290799,-0.5590144,1750,1411,2016-07-25 20:21:09,2016-07-25 20:30:42,0 +202493,2016-07-25 20:01:36,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,76706,Rue De Begles 223,33800,Bordeaux,44.819907,-0.5659968,1250,1419,2016-07-25 20:21:56,2016-07-25 20:31:58,0 +202504,2016-07-25 20:03:10,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,76710,Rue De Begles 223,33800,Bordeaux,44.819907,-0.5659968,2230,1416,2016-07-25 20:33:55,2016-07-25 20:42:53,0 +202901,2016-07-25 21:10:39,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,76813,Rue Des Trois-Conils 20,33000,Bordeaux,44.8387071,-0.5755399999999999,1550,1424,2016-07-25 21:39:56,2016-07-25 21:47:30,0 +202904,2016-07-25 21:11:03,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,10298,Rue Des Argentiers 16,33000,Bordeaux,44.8391736,-0.5698286,2400,1460,2016-07-25 21:23:56,2016-07-25 21:33:22,0 +202907,2016-07-25 21:11:43,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,76816,Rue Puysegur 39,33800,Bordeaux,44.8211297,-0.5807266999999999,1950,1411,2016-07-25 21:46:40,2016-07-25 21:51:38,0 +202909,2016-07-25 21:12:51,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,76817,Rue Du Commandant Arnould 29,33000,Bordeaux,44.8358789,-0.5774694,1450,1416,2016-07-25 21:50:40,2016-07-25 21:57:07,0 +202536,2016-07-25 20:09:10,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,76720,Rue Jules Guesde 68,33800,Bordeaux,44.8292454,-0.563711,1350,1430,2016-07-25 20:25:11,2016-07-25 20:32:57,0 +202924,2016-07-25 21:14:37,1234,Mille Et Une Saveurs,"96 Avenue Thiers, 33100 Bordeaux",33100,Bordeaux,44.843746,-0.554713,74519,Rue Cornac 4,33000,Bordeaux,44.8509545,-0.5721066,1350,1460,,,1 +202925,2016-07-25 21:14:46,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,76822,Rue De Ruat 11,33000,Bordeaux,44.84036680000001,-0.5792899,2150,1424,2016-07-25 21:54:55,2016-07-25 22:02:05,0 +202563,2016-07-25 20:13:41,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,76730,Rue Lombard 47,33300,Bordeaux,44.8586611,-0.5630948,1450,1458,2016-07-25 20:26:07,2016-07-25 20:31:50,0 +202948,2016-07-25 21:22:54,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,74268,Place Canteloup 12,33800,Bordeaux,44.8338344,-0.5656738,2450,1458,2016-07-25 21:55:13,2016-07-25 22:03:37,0 +202998,2016-07-25 21:36:14,1232,Anh Kha,48 Rue Saint Sernin,33000,Bordeaux,44.841103,-0.582515,76838,Rue Des Argentiers 16,33000,Bordeaux,44.8391736,-0.5698286,2100,1460,2016-07-25 21:57:50,2016-07-25 22:07:17,0 +202609,2016-07-25 20:19:40,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,76739,Rue Belle Etoile 1,33800,Bordeaux,44.8290799,-0.5590144,1730,1461,2016-07-25 20:43:12,2016-07-25 20:50:26,0 +203420,2016-07-26 13:51:59,1213,Lupo,"23 Place Pey Berland, 33000 Bordeaux",33000,Bordeaux,44.837158,-0.576632,76977,Avenue Thiers 220,33100,Bordeaux,44.8474955,-0.5486833,1839,1415,2016-07-26 14:10:32,2016-07-26 14:22:09,0 +203032,2016-07-25 21:43:52,1241,My Terroir,24 Place De La Ferme De Richemont,33000,Bordeaux,44.835506,-0.575218,76851,Cours De Verdun 4,33000,Bordeaux,44.8453849,-0.5774521,1350,1416,2016-07-25 22:03:59,2016-07-25 22:10:17,0 +203059,2016-07-25 21:53:30,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,76864,Rue Cornac 4,33000,Bordeaux,44.8509545,-0.5721066,1830,1411,2016-07-25 22:08:07,2016-07-25 22:13:50,0 +203089,2016-07-25 22:06:02,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,76871,Rue Georges Bonnac 281,33000,Bordeaux,44.8373509,-0.5948427,1750,1416,2016-07-25 22:25:26,2016-07-25 22:44:35,0 +203095,2016-07-25 22:10:00,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,22771,Rue Amedee Saint-Germain 121,33800,Bordeaux,44.8183009,-0.5637869999999999,4570,1458,2016-07-25 22:29:38,2016-07-25 22:37:30,0 +203434,2016-07-26 14:11:18,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,76981,Rue Crozilhac 4,33000,Bordeaux,44.8505297,-0.5807067,1480,1468,2016-07-26 14:34:52,2016-07-26 14:39:14,0 +203180,2016-07-26 11:41:35,1243,Bagel And Goodies,"53 Cours Le Rouzic, 33100 Bordeaux",33100,Bordeaux,44.842804,-0.550576,76908,Rue De Conde 9,33000,Bordeaux,44.8435849,-0.5733138,1270,1461,2016-07-26 11:58:23,2016-07-26 12:06:57,0 +203506,2016-07-26 18:44:03,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,77012,Rue Du Tondu 39,33000,Bordeaux,44.8320552,-0.5825760999999999,2250,1468,2016-07-26 19:05:50,2016-07-26 19:10:51,0 +203585,2016-07-26 19:14:49,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,77043,Rue Guillaume Leblanc 131,33000,Bordeaux,44.8316538,-0.5951721,1530,1419,2016-07-26 19:28:06,2016-07-26 19:37:42,0 +203290,2016-07-26 12:27:00,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,76943,Rue Naujac 203,33000,Bordeaux,44.85024420000001,-0.5930807,2880,1415,2016-07-26 12:50:12,2016-07-26 13:01:29,0 +203303,2016-07-26 12:32:16,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,76943,Rue Naujac 203,33000,Bordeaux,44.85024420000001,-0.5930807,2390,1468,2016-07-26 12:57:50,2016-07-26 13:13:14,0 +203595,2016-07-26 19:16:39,1245,Eatsalad,55 Rue Saint Remi,33000,Bordeaux,44.841286,-0.573413,77048,Rue Frere 108,33000,Bordeaux,44.8539023,-0.5798308999999999,3040,1426,2016-07-26 19:33:38,2016-07-26 19:44:58,0 +203329,2016-07-26 12:44:29,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,76953,Rue Bouthier 151,33100,Bordeaux,44.8513888,-0.5558318999999999,4550,1418,2016-07-26 13:03:32,2016-07-26 13:20:14,0 +203334,2016-07-26 12:46:11,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,76955,Rue De La Prevote 3,33000,Bordeaux,44.8441797,-0.5850267,1450,1458,2016-07-26 13:12:55,2016-07-26 13:21:16,0 +203602,2016-07-26 19:19:26,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,77048,Rue Frere 108,33000,Bordeaux,44.8539023,-0.5798308999999999,2910,1426,2016-07-26 19:38:45,2016-07-26 19:44:21,0 +203668,2016-07-26 19:32:30,1209,La Gamelle,23 Rue Des Freres Bonie,33000,Bordeaux,44.836849,-0.580108,77077,Cours De La Somme 156,33800,Bordeaux,44.8246015,-0.5725093,3100,1458,2016-07-26 19:48:50,2016-07-26 19:55:56,0 +203696,2016-07-26 19:36:01,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,77088,Rue Gensan 19,33000,Bordeaux,44.835461,-0.5668841,1450,1420,2016-07-26 19:50:43,2016-07-26 20:01:54,0 +203793,2016-07-26 19:54:41,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,77120,Rue Des Augustins 12,33000,Bordeaux,44.8323478,-0.57126,2550,1458,2016-07-26 20:24:58,2016-07-26 20:29:17,0 +203822,2016-07-26 19:58:42,1246,Thai Paradise,70 Rue Des Ayres,33000,Bordeaux,44.836327,-0.575572,77130,Quai Richelieu 17,33000,Bordeaux,44.8391694,-0.5684714,3850,1419,2016-07-26 20:15:19,2016-07-26 20:22:13,0 +203699,2016-07-26 19:36:20,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,77090,Rue Ducau 61,33000,Bordeaux,44.8534777,-0.5759679999999999,2290,1471,2016-07-26 20:12:56,2016-07-26 20:18:44,0 +203825,2016-07-26 19:58:55,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,77133,Cours Xavier Arnozan 41,33000,Bordeaux,44.8492097,-0.5735707,2600,1817,2016-07-26 20:13:53,2016-07-26 20:20:12,0 +203710,2016-07-26 19:38:32,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,77092,Rue Vieillard 9,33300,Bordeaux,44.8607278,-0.5617738999999999,1820,1411,2016-07-26 19:58:37,2016-07-26 20:14:51,0 +203726,2016-07-26 19:41:24,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,77096,Rue Du Puits Descazeaux 6,33000,Bordeaux,44.8367617,-0.5681312,1300,1415,2016-07-26 19:55:26,2016-07-26 20:03:00,0 +203871,2016-07-26 20:06:36,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,77151,Rue Perey 42,33000,Bordeaux,44.82424959999999,-0.5851284,3140,1415,2016-07-26 20:24:30,2016-07-26 20:36:38,0 +203744,2016-07-26 19:45:44,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,75290,Rue Du Docteur Charles Nancel Penard 21,33000,Bordeaux,44.8397886,-0.5814379,2250,1426,2016-07-26 20:05:41,2016-07-26 20:14:04,0 +203756,2016-07-26 19:48:35,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,77105,Allee Serr 59,33100,Bordeaux,44.8430048,-0.5582541,1580,1468,2016-07-26 20:14:48,2016-07-26 20:23:07,0 +203914,2016-07-26 20:13:33,1206,La Maison Du Glacier,1 Place Saint Pierre,33000,Bordeaux,44.839706,-0.570672,77174,Quai Des Chartrons 96,33300,Bordeaux,44.8552969,-0.5663155999999999,3550,1418,2016-07-26 20:25:36,2016-07-26 20:36:34,0 +203917,2016-07-26 20:14:01,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,77176,Rue Monadey 3,33800,Bordeaux,44.8284338,-0.5720206,1500,1420,2016-07-26 20:28:13,2016-07-26 20:34:21,0 +204186,2016-07-26 20:47:55,1206,La Maison Du Glacier,1 Place Saint Pierre,33000,Bordeaux,44.839706,-0.570672,75905,Rue De La Prevote 3,33000,Bordeaux,44.8441797,-0.5850267,2450,1420,2016-07-26 20:55:25,2016-07-26 21:05:09,0 +203950,2016-07-26 20:18:27,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,77188,Rue Robert Lateulade 5,33000,Bordeaux,44.8391431,-0.5865663999999999,2190,1426,2016-07-26 20:47:15,2016-07-26 21:07:09,0 +203984,2016-07-26 20:21:36,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,77195,Rue Pomme D'Or 42,33300,Bordeaux,44.8538481,-0.5700326000000001,1250,1471,2016-07-26 20:40:16,2016-07-26 20:48:00,0 +204194,2016-07-26 20:48:59,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,77281,Rue Du Lavoir 10,33000,Bordeaux,44.8520066,-0.5835382,2250,1471,2016-07-26 21:07:07,2016-07-26 21:11:01,0 +204210,2016-07-26 20:51:44,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,77289,Rue Ausone 29,33000,Bordeaux,44.8375476,-0.5679664,1750,1817,2016-07-26 21:13:44,2016-07-26 21:34:18,0 +204064,2016-07-26 20:32:38,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,77228,Rue Henri Guillemin 10,33300,Bordeaux,44.8635365,-0.5770312,1530,1409,2016-07-26 21:03:54,2016-07-26 21:13:39,0 +204215,2016-07-26 20:52:25,1235,Melodie,17 Rue Leupold,33000,Bordeaux,44.840603,-0.570444,77291,Rue De Vincennes 36,33000,Bordeaux,44.8393325,-0.5961301,1850,1461,2016-07-26 21:14:08,2016-07-26 21:21:21,0 +204091,2016-07-26 20:36:47,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,77239,Rue Dupaty 70,33300,Bordeaux,44.859334,-0.5619312,2450,1468,2016-07-26 20:53:51,2016-07-26 21:02:49,0 +204094,2016-07-26 20:37:13,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,77241,Rue Blanqui 57,33300,Bordeaux,44.8686512,-0.5512760999999999,2500,1411,2016-07-26 20:50:56,2016-07-26 21:08:01,0 +204109,2016-07-26 20:39:11,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,75687,Rue De La Rousselle 56,33000,Bordeaux,44.8371635,-0.5677504999999999,2250,1418,2016-07-26 20:50:55,2016-07-26 21:02:19,0 +204220,2016-07-26 20:53:48,1247,Noonies,16 Avenue Tiers,33100,Bordeaux,44.841251,-0.558816,77293,Rue Mauriac 4,33000,Bordeaux,44.8356333,-0.5673574,1450,1419,2016-07-26 21:13:07,2016-07-26 21:19:02,0 +204229,2016-07-26 20:54:38,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,77297,Passage Moreau 3,33800,Bordeaux,44.8300096,-0.5708578000000001,1550,1472,2016-07-26 21:03:31,2016-07-26 21:16:50,0 +204120,2016-07-26 20:40:05,1246,Thai Paradise,70 Rue Des Ayres,33000,Bordeaux,44.836327,-0.575572,77250,Rue Abbe De L'Epee 85,33000,Bordeaux,44.84239119999999,-0.583046,2350,1458,2016-07-26 20:57:16,2016-07-26 21:04:41,0 +204232,2016-07-26 20:54:45,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,77299,Rue Montmejean 54,33100,Bordeaux,44.8413488,-0.5554852,3590,1418,2016-07-26 21:16:48,2016-07-26 21:24:32,0 +204295,2016-07-26 21:03:40,1232,Anh Kha,48 Rue Saint Sernin,33000,Bordeaux,44.841103,-0.582515,77324,Rue Du Palais Gallien 161,33000,Bordeaux,44.8470899,-0.5817365,1250,1420,2016-07-26 21:13:43,2016-07-26 21:17:05,0 +204515,2016-07-26 21:34:32,1215,Moon Wok,17 Place Fernand Lafargue,33000,Bordeaux,44.837299,-0.572124,77402,Rue Du Peugue 22,33000,Bordeaux,44.8328613,-0.5871291,1530,1411,2016-07-26 21:54:50,2016-07-26 22:09:15,0 +204539,2016-07-26 21:39:07,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,77409,Rue Lafayette 8,33000,Bordeaux,44.8436175,-0.5709337,2800,1458,2016-07-26 21:52:59,2016-07-26 21:57:58,0 +204306,2016-07-26 21:05:24,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,77327,Rue Henri Guillemin 10,33300,Bordeaux,44.8635365,-0.5770312,1300,1468,2016-07-26 21:14:31,2016-07-26 21:20:34,0 +204561,2016-07-26 21:44:48,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,77365,Passage Hermitte 1,33000,Bordeaux,44.8324285,-0.5953436999999999,1550,1471,2016-07-26 21:59:26,2016-07-26 22:11:23,0 +204568,2016-07-26 21:46:35,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,77422,Rue Dupaty 132,33300,Bordeaux,44.8613118,-0.5584047,5850,1461,2016-07-26 22:03:05,2016-07-26 22:07:45,0 +204357,2016-07-26 21:11:38,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,77343,Rue Bergeret 20,33000,Bordeaux,44.8326405,-0.5689734,1889,1426,2016-07-26 21:25:24,2016-07-26 21:30:44,0 +204584,2016-07-26 21:50:49,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,77386,Cours Edouard Vaillant 103,33300,Bordeaux,44.86274299999999,-0.5599192,4650,1415,2016-07-26 21:59:40,2016-07-26 22:15:56,0 +204605,2016-07-26 21:59:19,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,77438,Rue Bragard 4,33000,Bordeaux,44.8328572,-0.5701372,1850,1458,2016-07-26 22:15:43,2016-07-26 22:21:17,0 +204366,2016-07-26 21:12:47,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,77344,Rue Notre Dame 91,33000,Bordeaux,44.8525666,-0.5707285000000001,1400,1420,2016-07-26 21:28:10,2016-07-26 21:34:44,0 +204649,2016-07-26 22:17:38,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,76864,Place Jean Moulin 4,33000,Bordeaux,44.8383642,-0.5780067,1400,1411,2016-07-26 22:30:50,2016-07-26 22:39:03,0 +204391,2016-07-26 21:16:00,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,77355,Rue Manon Cormier 40 Bis,33000,Bordeaux,44.8317588,-0.5894056999999999,2050,1409,2016-07-26 21:30:00,2016-07-26 21:40:06,0 +204421,2016-07-26 21:20:25,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,77365,Passage Hermitte 1,33000,Bordeaux,44.8324285,-0.5953436999999999,1750,1411,,,1 +204793,2016-07-27 12:03:43,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,77502,Rue Du Palais Gallien 102,33000,Bordeaux,44.8450558,-0.5813096,1500,1418,2016-07-27 12:18:46,2016-07-27 12:30:06,0 +204443,2016-07-26 21:21:27,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,77372,Rue Naujac 114,33000,Bordeaux,44.8485952,-0.5890605,1730,1415,2016-07-26 21:44:38,2016-07-26 21:50:49,0 +204827,2016-07-27 12:14:15,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,77048,Rue Frere 108,33000,Bordeaux,44.8539023,-0.5798308999999999,4640,1417,2016-07-27 12:33:54,2016-07-27 12:43:41,0 +204445,2016-07-26 21:21:41,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,77374,Rue Naujac 119,33000,Bordeaux,44.8490118,-0.5890955,350,1417,2016-07-26 21:42:52,2016-07-26 21:51:34,0 +204450,2016-07-26 21:22:11,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,77376,Rue Naujac 114,33000,Bordeaux,44.8485952,-0.5890605,1280,1415,2016-07-26 21:43:06,2016-07-26 21:50:47,0 +204470,2016-07-26 21:26:07,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,77386,Cours Edouard Vaillant 103,33300,Bordeaux,44.86274299999999,-0.5599192,4900,1468,,,1 +204856,2016-07-27 12:22:58,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,77526,Quai Richelieu 55,33000,Bordeaux,44.8371276,-0.5666549,1250,1461,2016-07-27 12:41:40,2016-07-27 12:45:26,0 +205251,2016-07-27 19:19:42,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,77668,Rue Du Pas-Saint-Georges 30,33000,Bordeaux,44.8394088,-0.571848,1789,1471,2016-07-27 19:48:26,2016-07-27 19:58:08,0 +204907,2016-07-27 12:37:24,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,77542,Rue Beyssac 23,33800,Bordeaux,44.8327494,-0.5635261,1480,1424,2016-07-27 12:59:50,2016-07-27 13:07:24,0 +204919,2016-07-27 12:40:49,1245,Eatsalad,55 Rue Saint Remi,33000,Bordeaux,44.841286,-0.573413,66716,Rue Des Freres Bonie 37,33000,Bordeaux,44.8366789,-0.5806582,1450,1430,2016-07-27 12:49:19,2016-07-27 12:56:34,0 +205252,2016-07-27 19:19:48,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,77669,Rue Saint-James 57,33000,Bordeaux,44.8352389,-0.5717896,1300,1458,2016-07-27 19:42:37,2016-07-27 19:46:56,0 +204931,2016-07-27 12:44:41,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,77553,Rue Ramonet 24,33000,Bordeaux,44.8524202,-0.5699839999999999,1950,1418,2016-07-27 12:58:20,2016-07-27 13:11:29,0 +204938,2016-07-27 12:46:58,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,77555,Rue Dubourdieu 58,33800,Bordeaux,44.8216242,-0.5789402,1450,1471,2016-07-27 13:07:04,2016-07-27 13:16:43,0 +205276,2016-07-27 19:24:37,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,77676,Allee Serr 63,33100,Bordeaux,44.8430759,-0.5582185,2490,1410,2016-07-27 19:47:51,2016-07-27 19:57:52,0 +204940,2016-07-27 12:49:08,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,77556,Rue Borie 57,33300,Bordeaux,44.8550543,-0.5704612,2100,1417,2016-07-27 13:05:03,2016-07-27 13:08:36,0 +204950,2016-07-27 12:54:25,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,77559,Cours De La Somme 28,33800,Bordeaux,44.8294953,-0.5717909,2430,1458,2016-07-27 13:14:45,2016-07-27 13:22:38,0 +204954,2016-07-27 12:55:52,1243,Bagel And Goodies,"53 Cours Le Rouzic, 33100 Bordeaux",33100,Bordeaux,44.842804,-0.550576,77560,Quai De Brazza 87,33100,Bordeaux,44.8576232,-0.5465464,1450,1465,2016-07-27 13:13:21,2016-07-27 13:23:59,0 +204967,2016-07-27 12:59:22,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,4210,Rue Des Argentiers 16,33000,Bordeaux,44.8391736,-0.5698286,1450,1463,2016-07-27 13:12:34,2016-07-27 13:26:04,0 +205303,2016-07-27 19:30:58,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,77686,Cours De Quebec 23,33000,Bordeaux,44.8776932,-0.5713868,3800,1419,2016-07-27 19:58:32,2016-07-27 20:12:50,0 +205003,2016-07-27 13:22:54,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,73919,Rue Amedee Saint-Germain 121B,33800,Bordeaux,44.8182663,-0.5638276999999999,1750,1471,2016-07-27 13:36:16,2016-07-27 13:43:04,0 +205018,2016-07-27 13:32:20,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,77580,Rue Du Pere Louis Jabrun 4,33000,Bordeaux,44.8397561,-0.5765158,1250,1426,2016-07-27 13:52:49,2016-07-27 14:01:50,0 +205306,2016-07-27 19:31:29,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,77687,Cours De L'Yser 183,33800,Bordeaux,44.8228196,-0.5713121,1450,1415,2016-07-27 19:49:09,2016-07-27 19:56:25,0 +205039,2016-07-27 13:45:17,1246,Thai Paradise,70 Rue Des Ayres,33000,Bordeaux,44.836327,-0.575572,9304,Rue Des Argentiers 16,33000,Bordeaux,44.8391736,-0.5698286,2050,1417,2016-07-27 13:59:37,2016-07-27 14:05:56,0 +205315,2016-07-27 19:32:53,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,77690,Boulevard Marechal Leclerc 88,33000,Bordeaux,44.82980209999999,-0.5958214,1450,1417,2016-07-27 19:54:05,2016-07-27 20:08:24,0 +205050,2016-07-27 13:53:00,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,77591,Rue Henri Iv 59,33000,Bordeaux,44.8319225,-0.5756333,1500,1418,2016-07-27 14:02:40,2016-07-27 14:08:35,0 +205053,2016-07-27 13:56:47,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,77592,Cours De La Somme 218,33800,Bordeaux,44.8223315,-0.5723672,1689,1461,2016-07-27 14:15:46,2016-07-27 14:21:24,0 +205064,2016-07-27 14:04:15,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,77597,Cours De L'Yser 73,33800,Bordeaux,44.8271783,-0.5694722,1550,1458,2016-07-27 14:20:18,2016-07-27 14:29:45,0 +205365,2016-07-27 19:40:36,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,77714,Rue Chantre 13,33000,Bordeaux,44.83034929999999,-0.5691102,1250,1461,2016-07-27 19:55:44,2016-07-27 20:00:46,0 +205090,2016-07-27 14:25:34,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,77602,Rue Moulinie 30,33000,Bordeaux,44.8325768,-0.5741698,1250,1417,2016-07-27 14:42:19,2016-07-27 14:51:28,0 +205390,2016-07-27 19:43:11,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,77722,Rue De Madrid 9,33000,Bordeaux,44.8317275,-0.5957901,1500,1468,2016-07-27 20:05:41,2016-07-27 20:14:51,0 +205394,2016-07-27 19:43:45,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,77725,Rue Giner De Los Rios 5,33800,Bordeaux,44.8279822,-0.5719232,2310,1474,2016-07-27 20:06:15,2016-07-27 20:18:37,0 +205417,2016-07-27 19:47:45,1235,Melodie,17 Rue Leupold,33000,Bordeaux,44.840603,-0.570444,77734,Rue Villedieu 40,33000,Bordeaux,44.8309041,-0.5759581,3450,1472,2016-07-27 20:01:10,2016-07-27 20:10:00,0 +205218,2016-07-27 19:08:58,1227,Cilicie,4 Rue Des Bahutiers,33000,Bordeaux,44.839531,-0.570651,77658,Rue Carnot 67,33400,Bordeaux,44.8210682,-0.586424,3250,1409,2016-07-27 19:30:32,2016-07-27 19:47:31,0 +205224,2016-07-27 19:10:54,1218,Le Rizana,7 Rue Gaspard Philippe,33000,Bordeaux,44.833736,-0.56662,77660,Rue Carnot 2,33400,Bordeaux,44.8230567,-0.5860741,1850,1420,2016-07-27 19:38:59,2016-07-27 19:47:49,0 +205226,2016-07-27 19:11:29,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,77662,Cours D'Alsace-Et-Lorraine 82,33000,Bordeaux,44.8375334,-0.572369,1330,1422,2016-07-27 19:27:07,2016-07-27 19:33:12,0 +205435,2016-07-27 19:50:38,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,77743,Rue Leo Saignat 50,33000,Bordeaux,44.8270126,-0.5952024,2340,1458,2016-07-27 20:13:53,2016-07-27 20:24:13,0 +205496,2016-07-27 19:57:45,1227,Cilicie,4 Rue Des Bahutiers,33000,Bordeaux,44.839531,-0.570651,77765,Rue Frere 82,33000,Bordeaux,44.8533852,-0.5781620000000001,2550,1412,2016-07-27 20:18:00,2016-07-27 20:41:12,0 +205628,2016-07-27 20:13:35,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,77815,Rue Du Jardin Public 57,33000,Bordeaux,44.8525707,-0.5755049,2900,1966,2016-07-27 20:31:08,2016-07-27 20:40:04,0 +205630,2016-07-27 20:13:42,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,77816,Rue Calve 39,33000,Bordeaux,44.850965,-0.5904863,2030,1461,2016-07-27 20:46:23,2016-07-27 20:58:29,0 +205646,2016-07-27 20:16:08,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,77820,Rue Bergeret 3,33000,Bordeaux,44.8329254,-0.5695346,2750,1409,2016-07-27 20:34:44,2016-07-27 20:48:15,0 +205504,2016-07-27 19:58:54,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,77770,Rue Roger Allo 41,33000,Bordeaux,44.8458473,-0.5885961,1645,1917,2016-07-27 20:16:31,2016-07-27 20:25:40,0 +205514,2016-07-27 20:00:33,1246,Thai Paradise,70 Rue Des Ayres,33000,Bordeaux,44.836327,-0.575572,77777,Rue Robert Lateulade 6,33000,Bordeaux,44.8385397,-0.5861143999999999,3250,1409,2016-07-27 20:13:53,2016-07-27 20:21:00,0 +205520,2016-07-27 20:01:42,1209,La Gamelle,23 Rue Des Freres Bonie,33000,Bordeaux,44.836849,-0.580108,77780,Cours De Verdun 32,33000,Bordeaux,44.8466972,-0.5766392,1600,1817,,,1 +205546,2016-07-27 20:04:06,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,77788,Rue Pierre 36,33000,Bordeaux,44.8393653,-0.5932457,3629,1415,2016-07-27 20:32:07,2016-07-27 20:39:51,0 +205741,2016-07-27 20:24:41,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,77862,Rue Perey 42,33000,Bordeaux,44.82424959999999,-0.5851284,1550,1468,2016-07-27 20:45:09,2016-07-27 20:54:40,0 +205753,2016-07-27 20:25:49,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,77868,Rue Frere 47,33000,Bordeaux,44.8530775,-0.5762526,2010,1430,2016-07-27 20:45:18,2016-07-27 21:05:19,0 +205754,2016-07-27 20:25:55,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,77869,Rue De Begles 81,33800,Bordeaux,44.8258091,-0.5677734,1450,1474,2016-07-27 20:37:08,2016-07-27 20:51:17,0 +205758,2016-07-27 20:26:15,1250,Que Toi,39 Cours D'Alsace-Et-Lorraine,33000,Bordeaux,44.837921,-0.572655,77871,Rue Du Jardin Public 178,33300,Bordeaux,44.8578723,-0.5720590999999999,5350,1471,2016-07-27 20:43:46,2016-07-27 20:55:26,0 +205760,2016-07-27 20:26:47,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,77872,Rue Naujac 40,33000,Bordeaux,44.84788390000001,-0.5857363999999999,1850,1420,2016-07-27 20:40:33,2016-07-27 20:48:11,0 +205767,2016-07-27 20:27:49,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,77874,Rue Ducau 70,33000,Bordeaux,44.8532956,-0.5758964999999999,1650,1917,2016-07-27 20:46:55,2016-07-27 20:52:47,0 +205568,2016-07-27 20:07:05,1235,Melodie,17 Rue Leupold,33000,Bordeaux,44.840603,-0.570444,77798,Rue Des Ayres 73,33000,Bordeaux,44.8367191,-0.5750383,2650,1411,2016-07-27 20:24:38,2016-07-27 20:33:49,0 +205571,2016-07-27 20:07:17,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,77800,Rue Lamourous 12,33000,Bordeaux,44.8295359,-0.5805296,1270,1470,2016-07-27 20:24:43,2016-07-27 20:42:07,0 +205815,2016-07-27 20:32:50,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,77897,Rue Judaique 243,33000,Bordeaux,44.8404965,-0.5974155999999999,1650,1411,2016-07-27 21:30:39,2016-07-27 21:41:48,0 +205978,2016-07-27 20:54:22,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,77971,Rue Du Marechal Joffre 52,33000,Bordeaux,44.834927,-0.5781915,1850,1422,2016-07-27 21:05:06,2016-07-27 21:13:03,0 +205827,2016-07-27 20:34:01,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,77905,Rue Malbec 57,33800,Bordeaux,44.82623419999999,-0.5624823999999999,3160,1411,2016-07-27 20:59:55,2016-07-27 21:13:09,0 +205829,2016-07-27 20:34:23,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,77907,Rue De Begles 81,33800,Bordeaux,44.8258091,-0.5677734,1850,1409,2016-07-27 20:52:54,2016-07-27 20:58:15,0 +205836,2016-07-27 20:34:53,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,77910,Rue Armand Dulamon 11,33300,Bordeaux,44.8635804,-0.5607253,1450,1966,2016-07-27 20:48:47,2016-07-27 20:57:02,0 +205841,2016-07-27 20:35:41,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,77912,Rue Mathieu 53,33000,Bordeaux,44.8309188,-0.5931757999999999,2490,1419,2016-07-27 20:51:52,2016-07-27 20:57:54,0 +205874,2016-07-27 20:40:30,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,77928,Rue De La Boetie 16,33000,Bordeaux,44.839216,-0.5806095,1450,1472,2016-07-27 21:01:40,2016-07-27 21:07:46,0 +205891,2016-07-27 20:42:30,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,77780,Cours De Verdun 32,33000,Bordeaux,44.8466972,-0.5766392,1450,1474,2016-07-27 21:04:31,2016-07-27 21:17:44,0 +205980,2016-07-27 20:54:32,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,77972,Rue Du Docteur Albert Barraud 136,33000,Bordeaux,44.8482827,-0.5829337,1260,1460,2016-07-27 21:10:00,2016-07-27 21:20:48,0 +205911,2016-07-27 20:45:51,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,77946,Rue Grangeneuve 6,33000,Bordeaux,44.8519285,-0.5791967,2650,1458,2016-07-27 21:01:38,2016-07-27 21:08:36,0 +205984,2016-07-27 20:55:27,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,77973,Rue Du Professeur Demons 12,33000,Bordeaux,44.8466116,-0.5789202999999999,5150,1917,2016-07-27 21:30:21,2016-07-27 21:38:17,0 +205923,2016-07-27 20:47:23,1250,Que Toi,39 Cours D'Alsace-Et-Lorraine,33000,Bordeaux,44.837921,-0.572655,77951,Rue De Catros 40,33000,Bordeaux,44.8544157,-0.5824753,3000,1415,2016-07-27 21:05:46,2016-07-27 21:17:19,0 +206020,2016-07-27 21:01:41,1234,Mille Et Une Saveurs,"96 Avenue Thiers, 33100 Bordeaux",33100,Bordeaux,44.843746,-0.554713,77984,Rue Rodrigues-Pereire 31,33000,Bordeaux,44.84428870000001,-0.5848409999999999,2500,1966,2016-07-27 21:21:55,2016-07-27 21:36:18,0 +205954,2016-07-27 20:51:28,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,77959,Rue Du Haillan 2,33000,Bordeaux,44.8466941,-0.5918818,2900,1471,2016-07-27 21:30:20,2016-07-27 21:38:09,0 +205959,2016-07-27 20:52:05,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,77962,Rue Edmond Michelet 18,33000,Bordeaux,44.8400284,-0.5814081,1350,1417,2016-07-27 21:03:40,2016-07-27 21:12:04,0 +205960,2016-07-27 20:52:24,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,77963,Cours De La Somme 134,33800,Bordeaux,44.8257984,-0.5724935,3550,1412,2016-07-27 21:06:16,2016-07-27 21:21:02,0 +206057,2016-07-27 21:05:46,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,77994,Rue De La Liberte 131,33200,Bordeaux,44.8374348,-0.6019112,1830,1817,2016-07-27 21:20:10,2016-07-27 21:34:28,0 +206352,2016-07-27 22:00:12,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,78114,Rue Des Menuts 21,33000,Bordeaux,44.8343454,-0.5679803,1789,1460,2016-07-27 22:23:23,2016-07-27 22:34:52,0 +206067,2016-07-27 21:07:01,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78000,Rue Cheverus 8,33000,Bordeaux,44.8394967,-0.575815,1310,1420,2016-07-27 21:30:30,2016-07-27 21:34:45,0 +206073,2016-07-27 21:07:39,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,77772,Rue Josephine 87,33300,Bordeaux,44.86097789999999,-0.5609343999999999,1300,1415,2016-07-27 21:23:35,2016-07-27 21:29:04,0 +206092,2016-07-27 21:09:40,1250,Que Toi,39 Cours D'Alsace-Et-Lorraine,33000,Bordeaux,44.837921,-0.572655,78008,Rue Barreyre 61,33300,Bordeaux,44.85535600000001,-0.5690356,1650,1426,2016-07-27 21:19:57,2016-07-27 21:30:36,0 +206406,2016-07-27 22:27:39,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,78129,Rue De Conde 3,33000,Bordeaux,44.8433328,-0.5732737,1450,1460,2016-07-27 22:51:25,2016-07-27 23:00:09,0 +206407,2016-07-27 22:28:33,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,78130,Rue Sainte-Catherine 154,33000,Bordeaux,44.8361307,-0.5734376999999999,2050,1412,2016-07-27 22:50:08,2016-07-27 22:58:54,0 +206130,2016-07-27 21:15:29,1226,Ici Argentine,84 Boulevard Du President Wilson,33000,Bordeaux,44.840084,-0.5994,77281,Rue Du Lavoir 20,33000,Bordeaux,44.8523132,-0.5831382,3800,1468,2016-07-27 21:34:03,2016-07-27 21:43:40,0 +206478,2016-07-28 11:36:16,1245,Eatsalad,55 Rue Saint Remi,33000,Bordeaux,44.841286,-0.573413,78162,Rue De Conde 9,33000,Bordeaux,44.8435849,-0.5733138,1730,1917,2016-07-28 11:51:10,2016-07-28 11:59:15,0 +206479,2016-07-28 11:36:38,1243,Bagel And Goodies,"53 Cours Le Rouzic, 33100 Bordeaux",33100,Bordeaux,44.842804,-0.550576,77910,Rue Armand Dulamon 11,33300,Bordeaux,44.8635804,-0.5607253,1920,1416,,,1 +206509,2016-07-28 11:49:11,1245,Eatsalad,55 Rue Saint Remi,33000,Bordeaux,44.841286,-0.573413,78170,Cours Du Marechal Foch 21,33000,Bordeaux,44.8471158,-0.5755477,2030,1417,2016-07-28 12:05:06,2016-07-28 12:13:35,0 +206515,2016-07-28 11:52:29,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,78173,Place Des Basques 19,33000,Bordeaux,44.8387129,-0.5703524999999999,2670,1416,2016-07-28 12:30:00,2016-07-28 12:41:37,0 +206136,2016-07-27 21:16:51,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78022,Cours Pasteur 12,33000,Bordeaux,44.8361566,-0.5752764,1320,1410,2016-07-27 21:34:23,2016-07-27 21:38:59,0 +206151,2016-07-27 21:18:54,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,78028,Rue De La Maison Daurade 5,33000,Bordeaux,44.8418629,-0.5740972,1510,1474,2016-07-27 21:25:45,2016-07-27 21:48:39,0 +206565,2016-07-28 12:11:21,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,78192,Rue Leyteire 73,33000,Bordeaux,44.8326012,-0.5697637,4050,1412,2016-07-28 12:26:42,2016-07-28 12:48:41,0 +206569,2016-07-28 12:12:06,1222,Les Tartines De Marine,"6 Rue Saint-Sernin, Bordeaux",33000,Bordeaux,44.839336,-0.58194,78195,Rue Edouard Larroque 36,33000,Bordeaux,44.8315573,-0.6022223,1850,1426,2016-07-28 12:24:16,2016-07-28 12:34:23,0 +206580,2016-07-28 12:14:57,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,77048,Rue Frere 108,33000,Bordeaux,44.8539023,-0.5798308999999999,2940,1817,,,1 +206186,2016-07-27 21:24:29,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,78042,Rue Poquelin Moliere 37,33000,Bordeaux,44.8398871,-0.5787188999999999,1450,1412,2016-07-27 21:39:37,2016-07-27 21:51:58,0 +206614,2016-07-28 12:26:12,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,78211,Rue Garat 11,33000,Bordeaux,44.8304779,-0.5695108,3100,1430,2016-07-28 12:40:25,2016-07-28 12:49:25,0 +206210,2016-07-27 21:31:37,1218,Le Rizana,7 Rue Gaspard Philippe,33000,Bordeaux,44.833736,-0.56662,78052,Rue Sainte-Catherine 234,33000,Bordeaux,44.8332529,-0.572593,1850,1458,2016-07-27 21:44:55,2016-07-27 21:49:55,0 +206647,2016-07-28 12:34:06,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78219,Rue Corcelle 7,33000,Bordeaux,44.8383454,-0.5712411,1250,1461,2016-07-28 12:57:08,2016-07-28 13:20:06,0 +206219,2016-07-27 21:32:33,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,78057,Rue De Cestas 18,33000,Bordeaux,44.8350231,-0.59985,4490,1461,2016-07-27 22:04:59,2016-07-27 22:12:42,0 +206222,2016-07-27 21:33:04,1226,Ici Argentine,84 Boulevard Du President Wilson,33000,Bordeaux,44.840084,-0.5994,78059,Rue Des Freres Bonie 23,33000,Bordeaux,44.836885,-0.5800599,1500,1817,2016-07-27 21:44:05,2016-07-27 21:53:02,0 +206691,2016-07-28 12:50:35,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,73919,Rue Amedee Saint-Germain 121B,33800,Bordeaux,44.8182663,-0.5638276999999999,1650,1430,2016-07-28 12:58:16,2016-07-28 13:05:57,0 +206692,2016-07-28 12:51:45,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,10298,Rue Des Argentiers 16,33000,Bordeaux,44.8391736,-0.5698286,2470,1461,2016-07-28 13:15:25,2016-07-28 13:20:13,0 +206228,2016-07-27 21:34:10,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,78060,Rue De Begles 375,33800,Bordeaux,44.8139493,-0.5649765,2000,1419,2016-07-27 21:46:17,2016-07-27 22:00:51,0 +206698,2016-07-28 12:52:59,1256,Pitaya Stalingrad,36 Place De Stalingrad,33100,Bordeaux,44.840912,-0.559553,78233,Quai Des Queyries 87,33100,Bordeaux,44.8490447,-0.5606165,1500,1917,2016-07-28 13:10:54,2016-07-28 13:20:24,0 +206704,2016-07-28 12:55:07,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78236,Rue Du Commandant Arnould 12,33000,Bordeaux,44.8368145,-0.5774722,1670,1817,2016-07-28 13:14:46,2016-07-28 13:18:15,0 +206245,2016-07-27 21:36:32,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,78069,Rue Mondenard 52,33000,Bordeaux,44.8460264,-0.5884206,1695,1470,2016-07-27 21:52:17,2016-07-27 22:03:19,0 +206726,2016-07-28 13:03:55,1209,La Gamelle,23 Rue Des Freres Bonie,33000,Bordeaux,44.836849,-0.580108,76838,Rue Des Argentiers 16,33000,Bordeaux,44.8391736,-0.5698286,1600,1416,2016-07-28 13:22:47,2016-07-28 13:30:38,0 +206265,2016-07-27 21:39:41,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,78077,Rue Jardel 36,33100,Bordeaux,44.8418309,-0.5601655000000001,2039,1426,2016-07-27 21:58:41,2016-07-27 22:05:56,0 +206741,2016-07-28 13:09:18,1213,Lupo,"23 Place Pey Berland, 33000 Bordeaux",33000,Bordeaux,44.837158,-0.576632,78249,Rue Batailley 8,33000,Bordeaux,44.8386542,-0.5920658999999999,1430,1471,2016-07-28 13:24:37,2016-07-28 13:32:39,0 +206267,2016-07-27 21:39:54,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,78078,Rue Albert De Mun 8,33000,Bordeaux,44.8481127,-0.5811906000000001,2250,1917,2016-07-27 21:51:45,2016-07-27 22:00:37,0 +206751,2016-07-28 13:14:36,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,78252,Rue Ulysse Gayon 26,33000,Bordeaux,44.8518779,-0.5914444999999999,2490,1430,2016-07-28 13:31:04,2016-07-28 13:43:57,0 +206271,2016-07-27 21:40:58,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78079,Rue Reniere 29,33000,Bordeaux,44.8360806,-0.56895,3150,1410,2016-07-27 22:00:02,2016-07-27 22:05:53,0 +206761,2016-07-28 13:17:33,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78255,Cours D'Alsace-Et-Lorraine 31,33000,Bordeaux,44.8380653,-0.5700327,2250,1417,2016-07-28 13:39:32,2016-07-28 13:43:09,0 +206770,2016-07-28 13:20:37,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,75039,Rue Lafontaine 9,33800,Bordeaux,44.8268699,-0.5718456,1450,1461,2016-07-28 13:34:49,2016-07-28 13:41:59,0 +206291,2016-07-27 21:44:23,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,78086,Cours De La Somme 261,33800,Bordeaux,44.8202033,-0.5725819,3820,1415,,,1 +206784,2016-07-28 13:25:57,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,78263,Rue Mauriac 4,33000,Bordeaux,44.8356333,-0.5673574,1430,1463,2016-07-28 13:41:22,2016-07-28 13:59:39,0 +206786,2016-07-28 13:26:58,1222,Les Tartines De Marine,"6 Rue Saint-Sernin, Bordeaux",33000,Bordeaux,44.839336,-0.58194,78265,Rue Du Docteur Charles Nancel Penard 29,33000,Bordeaux,44.8393967,-0.5816392,1550,1462,2016-07-28 13:38:47,2016-07-28 13:42:05,0 +206789,2016-07-28 13:29:15,1213,Lupo,"23 Place Pey Berland, 33000 Bordeaux",33000,Bordeaux,44.837158,-0.576632,78268,Place Jean Moulin 4,33000,Bordeaux,44.8383642,-0.5780067,1900,1426,2016-07-28 13:47:03,2016-07-28 13:47:09,0 +206794,2016-07-28 13:31:57,1234,Mille Et Une Saveurs,"96 Avenue Thiers, 33100 Bordeaux",33100,Bordeaux,44.843746,-0.554713,78270,Rue Notre Dame 13,33000,Bordeaux,44.8500435,-0.5727966,1650,1917,2016-07-28 13:42:12,2016-07-28 14:00:31,0 +206311,2016-07-27 21:48:49,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,78096,Cours Victor Hugo 92,33000,Bordeaux,44.8344979,-0.5703237999999999,1550,1474,2016-07-27 21:57:18,2016-07-27 22:08:40,0 +206807,2016-07-28 13:37:40,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,78277,Rue Bergeret 34,33000,Bordeaux,44.8321154,-0.568346,1280,1416,2016-07-28 13:57:07,2016-07-28 14:08:10,0 +206831,2016-07-28 13:51:21,1209,La Gamelle,23 Rue Des Freres Bonie,33000,Bordeaux,44.836849,-0.580108,78285,Rue De Conde 9,33000,Bordeaux,44.8435849,-0.5733138,1550,1409,2016-07-28 14:09:10,2016-07-28 14:17:21,0 +206834,2016-07-28 13:54:28,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,78287,Cours De Luze 71,33300,Bordeaux,44.8578078,-0.5798426999999999,1420,1817,2016-07-28 14:08:33,2016-07-28 14:29:30,0 +206850,2016-07-28 14:11:52,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,78290,Rue De Ruat 22,33000,Bordeaux,44.83991959999999,-0.5789662000000001,1500,1405,2016-07-28 14:20:27,2016-07-28 14:27:31,0 +206316,2016-07-27 21:50:46,1227,Cilicie,4 Rue Des Bahutiers,33000,Bordeaux,44.839531,-0.570651,51633,Rue Albert Pitres 38,33000,Bordeaux,44.8522358,-0.5763587,6050,1966,2016-07-27 22:12:48,2016-07-27 22:23:30,0 +206334,2016-07-27 21:56:07,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,78107,Rue Lafiteau 2,33800,Bordeaux,44.8247548,-0.5543089999999999,1950,1458,2016-07-27 22:08:52,2016-07-27 22:18:57,0 +206862,2016-07-28 14:27:13,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,78295,Rue Georges Bonnac 281,33000,Bordeaux,44.8373509,-0.5948427,2430,,,,1 +206863,2016-07-28 14:27:49,1209,La Gamelle,23 Rue Des Freres Bonie,33000,Bordeaux,44.836849,-0.580108,78296,Rue Dumaine 9,33000,Bordeaux,44.8512636,-0.5843792,1600,,,,1 +206336,2016-07-27 21:56:38,1250,Que Toi,39 Cours D'Alsace-Et-Lorraine,33000,Bordeaux,44.837921,-0.572655,78109,Avenue Vercingetorix 39,33000,Bordeaux,44.8289688,-0.6008475999999999,1550,1426,2016-07-27 22:13:10,2016-07-27 22:24:45,0 +206341,2016-07-27 21:57:56,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,78110,Route De Toulouse 141,33400,Bordeaux,44.8098132,-0.5744535,2250,1412,2016-07-27 22:15:43,2016-07-27 22:36:05,0 +207120,2016-07-28 19:32:38,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,78400,Rue Julie 12,33800,Bordeaux,44.8278151,-0.5716082,2500,1418,2016-07-28 19:40:55,2016-07-28 19:45:36,0 +206961,2016-07-28 18:58:30,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,78332,Rue Berruer 140,33000,Bordeaux,44.8325533,-0.6053062,1450,1407,2016-07-28 19:12:34,2016-07-28 19:29:08,0 +206968,2016-07-28 18:59:35,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,78337,Cours De L'Argonne 133,33000,Bordeaux,44.8267816,-0.5766757,2550,1422,2016-07-28 19:07:49,2016-07-28 19:21:49,0 +206985,2016-07-28 19:03:10,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,77740,Rue Vital Carles 16,33000,Bordeaux,44.8409704,-0.5783828,3550,1420,2016-07-28 19:29:33,2016-07-28 19:38:11,0 +207008,2016-07-28 19:08:39,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,78353,Cours Xavier Arnozan 16,33000,Bordeaux,44.8486769,-0.5738774999999999,2150,1412,2016-07-28 19:39:14,2016-07-28 19:55:56,0 +207011,2016-07-28 19:09:49,1245,Eatsalad,55 Rue Saint Remi,33000,Bordeaux,44.841286,-0.573413,76720,Rue Jules Guesde 68,33800,Bordeaux,44.8292454,-0.563711,1540,1420,2016-07-28 19:49:54,2016-07-28 19:58:17,0 +207012,2016-07-28 19:10:27,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,78355,Rue Delord 97,33300,Bordeaux,44.8617642,-0.5602136,2350,1471,2016-07-28 19:29:26,2016-07-28 19:40:57,0 +207024,2016-07-28 19:13:27,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,78361,Cours Saint-Louis 139,33300,Bordeaux,44.8617212,-0.5679938,4250,1410,2016-07-28 19:32:09,2016-07-28 19:39:25,0 +207129,2016-07-28 19:34:41,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,78402,Place Pey Berland 12,33000,Bordeaux,44.8384243,-0.5767298,2110,1407,2016-07-28 19:49:15,2016-07-28 20:01:12,0 +207131,2016-07-28 19:35:00,1227,Cilicie,4 Rue Des Bahutiers,33000,Bordeaux,44.839531,-0.570651,74966,Rue Sainte-Catherine 137,33000,Bordeaux,44.83651589999999,-0.5739832000000001,3250,1412,,,1 +207073,2016-07-28 19:22:22,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,78384,Rue Castillon 20,33000,Bordeaux,44.8404581,-0.5758994,1550,1817,2016-07-28 19:38:58,2016-07-28 19:45:50,0 +207225,2016-07-28 19:50:52,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78435,Cours De Verdun 136,33000,Bordeaux,44.852142,-0.5733604,1250,1407,2016-07-28 20:11:05,2016-07-28 20:21:16,0 +207079,2016-07-28 19:23:50,1258,Pitaya Saint-Remi,42 Rue Saint Remi,33000,Bordeaux,44.84127,-0.572691,78387,Rue Judaique 207,33000,Bordeaux,44.8408778,-0.5951913999999999,2350,1430,2016-07-28 19:37:34,2016-07-28 19:44:59,0 +207461,2016-07-28 20:18:02,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,78530,Rue Rosa Bonheur 18,33000,Bordeaux,44.8491669,-0.5880926,1989,1471,2016-07-28 20:56:16,2016-07-28 21:10:59,0 +207476,2016-07-28 20:19:00,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,78537,Rue De Landiras 24,33000,Bordeaux,44.8292767,-0.5847496,3660,1422,2016-07-28 20:35:35,2016-07-28 20:54:17,0 +207490,2016-07-28 20:21:35,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,78541,Rue Marengo 12,33000,Bordeaux,44.8335207,-0.5687675,1450,1418,2016-07-28 20:50:35,2016-07-28 21:04:50,0 +207507,2016-07-28 20:24:06,1213,Lupo,"23 Place Pey Berland, 33000 Bordeaux",33000,Bordeaux,44.837158,-0.576632,78546,Rue Jean Jacques Rousseau 7,33000,Bordeaux,44.84354159999999,-0.5778329,2160,1416,2016-07-28 20:43:28,2016-07-28 20:49:21,0 +207245,2016-07-28 19:53:18,1213,Lupo,"23 Place Pey Berland, 33000 Bordeaux",33000,Bordeaux,44.837158,-0.576632,78446,Rue Bouquiere 44,33000,Bordeaux,44.8364828,-0.5697892,1360,1410,2016-07-28 20:14:12,2016-07-28 20:18:17,0 +207530,2016-07-28 20:26:34,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,78560,Cours De L'Yser 135,33800,Bordeaux,44.82485740000001,-0.5705146,2450,1461,2016-07-28 20:47:15,2016-07-28 20:50:50,0 +207263,2016-07-28 19:55:23,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,78454,Rue Du Docteur Albert Barraud 133,33000,Bordeaux,44.84833219999999,-0.5836110999999999,4850,1415,2016-07-28 20:09:35,2016-07-28 20:17:48,0 +207545,2016-07-28 20:27:43,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,77666,Rue Du Xiv Juillet 116,33400,Bordeaux,44.8205734,-0.5884878,1600,1422,2016-07-28 20:45:21,2016-07-28 21:01:05,0 +207547,2016-07-28 20:27:45,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,78565,Rue Abbe De L'Epee 58,33000,Bordeaux,44.8416727,-0.5826009999999999,2550,1407,2016-07-28 20:39:08,2016-07-28 20:47:38,0 +207550,2016-07-28 20:28:20,1222,Les Tartines De Marine,"6 Rue Saint-Sernin, Bordeaux",33000,Bordeaux,44.839336,-0.58194,78195,Rue De La Demi Lune 18,33400,Bordeaux,44.8205633,-0.5878728,2550,1426,2016-07-28 20:52:46,2016-07-28 21:09:55,0 +207551,2016-07-28 20:28:24,1241,My Terroir,24 Place De La Ferme De Richemont,33000,Bordeaux,44.835506,-0.575218,78567,Rue Bigot 10,33000,Bordeaux,44.8318092,-0.5692421999999999,3950,1415,2016-07-28 20:39:54,2016-07-28 20:45:40,0 +207554,2016-07-28 20:28:49,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,78568,Rue Commandant Charcot 37,33000,Bordeaux,44.8262919,-0.5889038,1260,1458,2016-07-28 20:49:11,2016-07-28 20:59:55,0 +207265,2016-07-28 19:55:41,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,78455,Allee Serr 63,33100,Bordeaux,44.8430759,-0.5582185,2450,1412,2016-07-28 20:13:08,2016-07-28 20:34:39,0 +207283,2016-07-28 19:57:13,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,78461,Cours Balguerie Stuttenberg 125,33300,Bordeaux,44.8599903,-0.5651621,1370,1460,2016-07-28 20:13:09,2016-07-28 20:27:13,0 +207583,2016-07-28 20:32:49,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,78580,Rue Casteja 10,33000,Bordeaux,44.8425388,-0.5821083,5000,1430,2016-07-28 20:58:29,2016-07-28 21:09:27,0 +207595,2016-07-28 20:34:21,1250,Que Toi,39 Cours D'Alsace-Et-Lorraine,33000,Bordeaux,44.837921,-0.572655,78586,Impasse Sainte-Ursule 18,33000,Bordeaux,44.8317342,-0.5848804,3250,2013,2016-07-28 20:44:16,2016-07-28 21:02:01,0 +207285,2016-07-28 19:57:33,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,77048,Rue Frere 108,33000,Bordeaux,44.8539023,-0.5798308999999999,5150,1418,2016-07-28 20:12:24,2016-07-28 20:18:49,0 +207297,2016-07-28 19:58:39,1232,Anh Kha,48 Rue Saint Sernin,33000,Bordeaux,44.841103,-0.582515,78467,Cours De L'Argonne 60,33000,Bordeaux,44.8285656,-0.5741868,3050,1458,2016-07-28 20:20:01,2016-07-28 20:26:47,0 +207637,2016-07-28 20:39:04,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,78598,Avenue Thiers 226,33100,Bordeaux,44.8480225,-0.5485361,6300,1405,2016-07-28 20:52:26,2016-07-28 21:04:13,0 +207313,2016-07-28 20:00:31,1259,Perditempo,25 Quai Richelieu,33000,Bordeaux,44.838787,-0.568008,25864,Rue Teulere 7,33000,Bordeaux,44.8358028,-0.5699863,3600,1426,2016-07-28 20:29:25,2016-07-28 20:33:32,0 +207654,2016-07-28 20:41:02,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,78603,Rue Turenne 49,33000,Bordeaux,44.8460455,-0.5830609999999999,1600,1412,2016-07-28 21:05:11,2016-07-28 21:20:35,0 +207670,2016-07-28 20:42:50,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,78608,Rue Poyenne 27,33300,Bordeaux,44.8564324,-0.5655224,2450,1416,2016-07-28 21:14:31,2016-07-28 21:20:14,0 +207677,2016-07-28 20:43:49,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78611,Rue Notre Dame 15,33000,Bordeaux,44.8500308,-0.5724791,1290,1409,2016-07-28 20:53:10,2016-07-28 21:12:11,0 +207336,2016-07-28 20:03:35,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78483,Rue Paul Denuce 5,33800,Bordeaux,44.8233937,-0.5790662,2260,1817,2016-07-28 20:15:10,2016-07-28 20:24:55,0 +207695,2016-07-28 20:46:02,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,78618,Rue De Suzon 230,33400,Bordeaux,44.8120343,-0.5779974,1450,1461,2016-07-28 21:04:12,2016-07-28 21:10:54,0 +207700,2016-07-28 20:46:45,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,78621,Cours Balguerie Stuttenberg 286,33300,Bordeaux,44.8638811,-0.5589876000000001,1850,1416,2016-07-28 21:14:25,2016-07-28 21:24:13,0 +207351,2016-07-28 20:05:21,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,78489,Rue De Metz 17,33000,Bordeaux,44.8378442,-0.5971111,2395,1471,2016-07-28 20:28:56,2016-07-28 20:40:53,0 +207711,2016-07-28 20:47:57,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,78629,Avenue De Tivoli 117,33110,Bordeaux,44.8619123,-0.5929316,5630,1471,2016-07-28 21:36:38,2016-07-28 21:46:22,0 +207718,2016-07-28 20:48:33,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,78633,Cours De L'Intendance 26,33000,Bordeaux,44.8415735,-0.5766424,3390,1407,2016-07-28 21:09:26,2016-07-28 21:18:30,0 +207719,2016-07-28 20:48:37,1208,Chez Ambre And Michel,1 Rue Matignon,33000,Bordeaux,44.850258,-0.586204,78634,Rue Bergeret 20,33000,Bordeaux,44.8326405,-0.5689734,1550,1430,2016-07-28 21:17:02,2016-07-28 21:31:20,0 +207727,2016-07-28 20:49:32,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,78639,Rue Permentade 32,33000,Bordeaux,44.8325401,-0.5683798,1450,1420,2016-07-28 21:06:11,2016-07-28 21:15:23,0 +207729,2016-07-28 20:49:49,1246,Thai Paradise,70 Rue Des Ayres,33000,Bordeaux,44.836327,-0.575572,78641,Rue Milliere 35,33000,Bordeaux,44.8297433,-0.5767682,4150,1415,2016-07-28 21:07:04,2016-07-28 21:15:24,0 +207730,2016-07-28 20:49:58,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,78642,Rue Du Tondu 158,33000,Bordeaux,44.8286112,-0.5876055,2450,1458,2016-07-28 21:05:41,2016-07-28 21:17:08,0 +207353,2016-07-28 20:05:28,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78490,Rue Castelnau D'Auros 6,33000,Bordeaux,44.841255,-0.5817717,1270,2013,2016-07-28 20:19:12,2016-07-28 20:26:57,0 +207366,2016-07-28 20:06:39,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,75889,Rue Du Tondu 24,33000,Bordeaux,44.832338,-0.5815905,1860,1420,2016-07-28 20:22:15,2016-07-28 20:37:09,0 +207754,2016-07-28 20:52:56,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,78650,Rue Sainte-Catherine 221,33000,Bordeaux,44.8333233,-0.5732607,1950,1426,2016-07-28 21:14:18,2016-07-28 21:29:20,0 +207764,2016-07-28 20:53:44,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,78655,Avenue Sadi Carnot 8,33110,Bordeaux,44.8638177,-0.5940788,1450,1460,2016-07-28 21:35:00,2016-07-28 21:47:37,0 +207377,2016-07-28 20:08:10,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,77409,Rue Lafayette 8,33000,Bordeaux,44.8436175,-0.5709337,2420,1422,2016-07-28 20:19:51,2016-07-28 20:27:43,0 +207805,2016-07-28 20:59:56,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78671,Rue Pelleport 108,33800,Bordeaux,44.8221305,-0.5625848999999999,1560,1817,2016-07-28 21:08:40,2016-07-28 21:26:41,0 +207808,2016-07-28 21:00:06,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,78673,Rue Pascal Mothes 1,33800,Bordeaux,44.8246358,-0.5724106999999999,3150,1407,2016-07-28 21:20:49,2016-07-28 21:32:43,0 +207382,2016-07-28 20:08:40,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78498,Rue Lafayette 8,33000,Bordeaux,44.8436175,-0.5709337,2420,1422,,,1 +207825,2016-07-28 21:02:41,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78680,Rue Pelleport 108,33800,Bordeaux,44.8221305,-0.5625848999999999,1490,1817,2016-07-28 21:13:02,2016-07-28 21:26:41,0 +207398,2016-07-28 20:10:50,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,78506,Cours D'Albret 100,33000,Bordeaux,44.8327483,-0.5794673,3050,1430,2016-07-28 20:27:52,2016-07-28 20:33:37,0 +207437,2016-07-28 20:15:30,1247,Noonies,16 Avenue Tiers,33100,Bordeaux,44.841251,-0.558816,78519,Rue Borie 57,33300,Bordeaux,44.8550543,-0.5704612,1590,1412,2016-07-28 20:40:50,2016-07-28 20:57:16,0 +207834,2016-07-28 21:04:00,1222,Les Tartines De Marine,"6 Rue Saint-Sernin, Bordeaux",33000,Bordeaux,44.839336,-0.58194,78685,Rue Bergeret 3,33000,Bordeaux,44.8329254,-0.5695346,2850,1412,2016-07-28 21:29:59,2016-07-28 21:47:34,0 +207438,2016-07-28 20:15:36,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78520,Rue Sainte-Colombe 8,33000,Bordeaux,44.8371882,-0.5699911999999999,1340,1426,2016-07-28 20:39:20,2016-07-28 20:42:36,0 +207440,2016-07-28 20:15:43,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,78521,Rue Edouard Mayaudon 36,33100,Bordeaux,44.8481926,-0.5489845,3650,1410,2016-07-28 20:32:21,2016-07-28 20:43:22,0 +207885,2016-07-28 21:11:48,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,78702,Rue Furtado 3,33800,Bordeaux,44.82517439999999,-0.562736,1550,1426,2016-07-28 21:26:22,2016-07-28 21:37:10,0 +207444,2016-07-28 20:16:12,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,78523,Boulevard George V 21,33000,Bordeaux,44.82691579999999,-0.5918899,2500,1420,2016-07-28 20:31:07,2016-07-28 20:42:26,0 +207908,2016-07-28 21:15:01,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78709,Cours Pasteur 21 Bis,33000,Bordeaux,44.8356037,-0.5756361999999999,2130,1422,2016-07-28 21:24:38,2016-07-28 21:31:39,0 +207450,2016-07-28 20:17:00,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,78525,Rue De Metz 17,33000,Bordeaux,44.8378442,-0.5971111,1750,1817,2016-07-28 20:30:27,2016-07-28 20:50:46,0 +208201,2016-07-28 22:25:16,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,78823,Rue De La Croix Blanche 22,33000,Bordeaux,44.8441355,-0.5898898,4690,1416,2016-07-28 22:50:17,2016-07-28 22:55:36,0 +207926,2016-07-28 21:17:02,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,78715,Rue Turenne 14,33000,Bordeaux,44.8457902,-0.5812155999999999,2550,2013,2016-07-28 21:38:36,2016-07-28 21:46:52,0 +207942,2016-07-28 21:19:07,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,78720,Rue Des Sablieres 63,33800,Bordeaux,44.8247479,-0.5757321,1360,1420,2016-07-28 21:32:28,2016-07-28 21:51:04,0 +208314,2016-07-29 11:45:59,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,78878,Rue Lecocq 130,33000,Bordeaux,44.8328744,-0.5897378,8370,1418,2016-07-29 12:32:50,2016-07-29 12:40:37,0 +207987,2016-07-28 21:26:38,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78740,Rue Ravez 20,33000,Bordeaux,44.83644630000001,-0.5724156,2280,1458,2016-07-28 21:36:36,2016-07-28 21:43:38,0 +207988,2016-07-28 21:27:01,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78741,Rue Jean De Malet 1,33800,Bordeaux,44.8301777,-0.5654178,2110,1458,2016-07-28 21:40:29,2016-07-28 21:50:06,0 +207989,2016-07-28 21:27:03,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,78742,Rue Judaique 268,33000,Bordeaux,44.8400846,-0.597563,1900,1415,2016-07-28 21:41:00,2016-07-28 21:50:53,0 +208018,2016-07-28 21:33:02,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,78757,Rue Ausone 30,33000,Bordeaux,44.8377437,-0.5677322,1450,1416,2016-07-28 21:43:49,2016-07-28 21:49:43,0 +208358,2016-07-29 12:04:44,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,78896,Rue Turenne 279,33000,Bordeaux,44.8497522,-0.5954946999999999,4300,1817,2016-07-29 12:37:27,2016-07-29 12:51:39,0 +208100,2016-07-28 21:49:11,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,78785,Rue Le Reynard 6,33800,Bordeaux,44.8336251,-0.5638126999999999,1830,2013,2016-07-28 22:02:32,2016-07-28 22:16:22,0 +208107,2016-07-28 21:51:29,1256,Pitaya Stalingrad,36 Place De Stalingrad,33100,Bordeaux,44.840912,-0.559553,78788,Rue Porte De La Monnaie 29,33800,Bordeaux,44.8321496,-0.5631799,2350,1416,2016-07-28 22:06:40,2016-07-28 22:13:43,0 +208112,2016-07-28 21:52:36,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78790,Cours De La Marne 71,33800,Bordeaux,44.8297535,-0.5685724,4090,1817,2016-07-28 22:05:01,2016-07-28 22:11:28,0 +208366,2016-07-29 12:06:46,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,2377,Rue Malbec 35,33800,Bordeaux,44.8268294,-0.5619661,2750,1465,2016-07-29 12:19:57,2016-07-29 12:33:00,0 +208118,2016-07-28 21:54:54,1218,Le Rizana,7 Rue Gaspard Philippe,33000,Bordeaux,44.833736,-0.56662,78792,Rue De La Benauge 175,33100,Bordeaux,44.8415454,-0.5502176,2650,1817,2016-07-28 22:18:24,2016-07-28 22:30:22,0 +208392,2016-07-29 12:16:06,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,78913,Rue Charles Marionneau 4,33000,Bordeaux,44.8419347,-0.5864636,1450,1461,2016-07-29 12:49:48,2016-07-29 12:54:20,0 +208145,2016-07-28 22:04:36,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78799,Cours De L'Yser 186,33800,Bordeaux,44.822439,-0.5706013999999999,2410,1409,2016-07-28 22:27:58,2016-07-28 22:36:31,0 +208147,2016-07-28 22:05:05,1218,Le Rizana,7 Rue Gaspard Philippe,33000,Bordeaux,44.833736,-0.56662,78800,Rue Terrasson 90,33800,Bordeaux,44.8202167,-0.5767623,1450,2013,2016-07-28 22:28:16,2016-07-28 22:37:28,0 +208393,2016-07-29 12:16:09,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,78914,Rue Sainte-Colombe 6,33000,Bordeaux,44.8373396,-0.5699076,1450,1420,2016-07-29 12:31:37,2016-07-29 12:35:26,0 +208399,2016-07-29 12:17:53,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,73919,Rue Amedee Saint-Germain 121B,33800,Bordeaux,44.8182663,-0.5638276999999999,2760,1462,2016-07-29 12:33:58,2016-07-29 12:43:42,0 +208176,2016-07-28 22:13:41,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78811,Place Fernand Lafargue 7,33000,Bordeaux,44.8368697,-0.5716759,2060,1460,2016-07-28 22:32:55,2016-07-28 22:39:50,0 +208417,2016-07-29 12:21:44,1256,Pitaya Stalingrad,36 Place De Stalingrad,33100,Bordeaux,44.840912,-0.559553,78923,Rue De La Rousselle 74,33000,Bordeaux,44.8368599,-0.5670333,3250,1471,2016-07-29 13:16:11,2016-07-29 13:20:49,0 +208191,2016-07-28 22:19:36,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78818,Rue Barreyre 57,33300,Bordeaux,44.8553864,-0.5687884000000001,2030,1458,2016-07-28 22:31:15,2016-07-28 22:40:34,0 +208436,2016-07-29 12:28:54,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78929,Rue Dublan 13,33800,Bordeaux,44.8277396,-0.5732661,3030,1420,2016-07-29 12:51:18,2016-07-29 12:58:35,0 +208572,2016-07-29 13:13:37,1250,Que Toi,39 Cours D'Alsace-Et-Lorraine,33000,Bordeaux,44.837921,-0.572655,78975,Cours De L'Argonne 133,33000,Bordeaux,44.8267816,-0.5766757,2050,1430,2016-07-29 13:19:00,2016-07-29 13:33:16,0 +208437,2016-07-29 12:30:11,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,77151,Rue Perey 42,33000,Bordeaux,44.82424959999999,-0.5851284,2200,1416,2016-07-29 12:58:45,2016-07-29 13:08:29,0 +208594,2016-07-29 13:29:11,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,78983,Rue De La Porte Dijeaux 68,33000,Bordeaux,44.8407296,-0.5788188,1320,1420,,,1 +208600,2016-07-29 13:32:40,1213,Lupo,"23 Place Pey Berland, 33000 Bordeaux",33000,Bordeaux,44.837158,-0.576632,78984,Rue Sainte-Catherine 220,33000,Bordeaux,44.8336525,-0.5730919999999999,1360,1463,2016-07-29 13:44:18,2016-07-29 13:52:07,0 +208602,2016-07-29 13:36:14,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,78985,Rue Du Jardin Public 107,33000,Bordeaux,44.8540971,-0.5746055,2910,1471,2016-07-29 13:48:57,2016-07-29 14:05:12,0 +208438,2016-07-29 12:30:27,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,78930,Rue Du Loup 64,33000,Bordeaux,44.8379284,-0.5744606999999999,1750,1465,2016-07-29 12:56:00,2016-07-29 13:05:43,0 +208608,2016-07-29 13:41:29,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78989,Rue De La Rousselle 39,33000,Bordeaux,44.8370395,-0.5683842,2160,1465,2016-07-29 14:05:32,2016-07-29 14:09:13,0 +208451,2016-07-29 12:36:04,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,78854,Rue Mandron 87,33000,Bordeaux,44.8538185,-0.5811208,1450,1414,2016-07-29 12:49:50,2016-07-29 13:23:52,0 +208617,2016-07-29 13:44:37,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,78994,Rue Du Mirail 48,33000,Bordeaux,44.833023,-0.5708925,1450,1430,2016-07-29 13:53:57,2016-07-29 14:03:30,0 +208620,2016-07-29 13:46:59,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,78996,Rue De Carros 11,33800,Bordeaux,44.8205624,-0.5786616,1350,1418,2016-07-29 14:10:36,2016-07-29 14:15:52,0 +208457,2016-07-29 12:37:16,1235,Melodie,17 Rue Leupold,33000,Bordeaux,44.840603,-0.570444,78938,Cours De La Marne 190,33800,Bordeaux,44.82803639999999,-0.5596099999999999,3450,1418,2016-07-29 12:54:09,2016-07-29 13:02:05,0 +208461,2016-07-29 12:38:14,1222,Les Tartines De Marine,"6 Rue Saint-Sernin, Bordeaux",33000,Bordeaux,44.839336,-0.58194,78940,Rue Edouard Larroque 36,33000,Bordeaux,44.8315573,-0.6022223,1550,1462,2016-07-29 12:58:44,2016-07-29 13:07:00,0 +208465,2016-07-29 12:40:38,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78942,Rue Sainte-Catherine 115,33000,Bordeaux,44.8374691,-0.5738075,1370,1430,2016-07-29 13:06:37,2016-07-29 13:09:45,0 +208697,2016-07-29 18:33:10,1226,Ici Argentine,84 Boulevard Du President Wilson,33000,Bordeaux,44.840084,-0.5994,79026,Cours Marc Nouaux 86,33000,Bordeaux,44.8471704,-0.5969618999999999,7000,1420,2016-07-29 19:00:13,2016-07-29 19:06:53,0 +208698,2016-07-29 18:33:21,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,77614,Rue De Laseppe 42,33000,Bordeaux,44.8529914,-0.5836756,4500,1998,2016-07-29 18:53:49,2016-07-29 19:11:06,0 +208705,2016-07-29 18:39:03,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,79028,Rue Monadey 29,33800,Bordeaux,44.8283983,-0.5708394999999999,2950,1405,2016-07-29 18:50:34,2016-07-29 19:01:25,0 +208494,2016-07-29 12:47:48,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,78947,Rue De Gironde 37,33300,Bordeaux,44.8646468,-0.5518704999999999,2950,1424,2016-07-29 12:57:27,2016-07-29 13:05:45,0 +208724,2016-07-29 18:48:53,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,79034,Rue Constantin 37,33000,Bordeaux,44.8506478,-0.5738262000000001,1540,1412,2016-07-29 19:08:20,2016-07-29 19:22:10,0 +208521,2016-07-29 12:55:52,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,78957,Rue Amedee Saint-Germain 57,33800,Bordeaux,44.8229738,-0.5592062999999999,3500,1418,2016-07-29 13:19:20,2016-07-29 13:29:07,0 +208783,2016-07-29 19:08:38,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,78337,Cours De L'Argonne 133,33000,Bordeaux,44.8267816,-0.5766757,1500,1403,2016-07-29 19:15:54,2016-07-29 19:23:32,0 +208800,2016-07-29 19:13:21,1205,Taj Mahal,24 Rue Du Parlement Sainte-Catherine,33000,Bordeaux,44.840405,-0.57394,79072,Rue Duplessy 22,33000,Bordeaux,44.848126,-0.5804165,4590,1405,2016-07-29 19:34:14,2016-07-29 19:40:37,0 +208524,2016-07-29 12:56:08,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,78958,Cours Aristide Briand 59,33000,Bordeaux,44.8313421,-0.5761406,2050,1461,2016-07-29 13:17:23,2016-07-29 13:34:47,0 +208531,2016-07-29 12:58:44,1209,La Gamelle,23 Rue Des Freres Bonie,33000,Bordeaux,44.836849,-0.580108,10298,Rue Des Argentiers 16,33000,Bordeaux,44.8391736,-0.5698286,1689,1817,2016-07-29 13:05:41,2016-07-29 13:15:32,0 +208854,2016-07-29 19:22:27,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,79092,Cours Du Medoc 15Bis,33300,Bordeaux,44.8567725,-0.5650073,1410,1420,2016-07-29 19:51:49,2016-07-29 20:03:29,0 +208547,2016-07-29 13:04:55,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,78965,Rue Monadey 12,33800,Bordeaux,44.8288059,-0.5715572,2550,1420,2016-07-29 13:16:05,2016-07-29 13:25:11,0 +208865,2016-07-29 19:25:06,1215,Moon Wok,17 Place Fernand Lafargue,33000,Bordeaux,44.837299,-0.572124,79097,Rue Carnot 1,33400,Bordeaux,44.8229657,-0.5861759999999999,3050,1817,2016-07-29 19:48:48,2016-07-29 19:59:54,0 +208963,2016-07-29 19:42:25,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,79128,Rue Pauline Kergomard 35,33800,Bordeaux,44.823186,-0.574915,3180,1422,2016-07-29 20:01:47,2016-07-29 20:14:20,0 +208912,2016-07-29 19:34:58,1205,Taj Mahal,24 Rue Du Parlement Sainte-Catherine,33000,Bordeaux,44.840405,-0.57394,79109,Avenue Charles De Gaulle 114,33200,Bordeaux,44.8494454,-0.6033054999999999,3650,1415,2016-07-29 19:51:02,2016-07-29 20:01:33,0 +208932,2016-07-29 19:37:35,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,79116,Rue Giner De Los Rios 50,33800,Bordeaux,44.8280535,-0.5693978,1450,1917,2016-07-29 19:52:20,2016-07-29 19:57:25,0 +208938,2016-07-29 19:38:09,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,79119,Rue Maryse Bastie 20,33300,Bordeaux,44.86264569999999,-0.5795558,2150,1405,2016-07-29 19:50:58,2016-07-29 20:06:24,0 +208979,2016-07-29 19:44:36,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,79135,Rue Georges Bonnac 177,33000,Bordeaux,44.8387976,-0.5898502,1630,1430,2016-07-29 19:50:53,2016-07-29 19:59:58,0 +209324,2016-07-29 20:24:47,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,79257,Passage Birly 50,33800,Bordeaux,44.8218884,-0.5746236000000001,2290,1917,2016-07-29 20:46:59,2016-07-29 20:59:22,0 +208986,2016-07-29 19:44:54,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,79139,Rue Vilaris 19 Bis,33800,Bordeaux,44.825563,-0.5636495,2850,1817,2016-07-29 20:06:29,2016-07-29 20:21:52,0 +209342,2016-07-29 20:26:14,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79265,Rue Saint-Sernin 20,33000,Bordeaux,44.8398386,-0.5819402,2130,1412,2016-07-29 20:39:58,2016-07-29 20:54:23,0 +208987,2016-07-29 19:44:55,1227,Cilicie,4 Rue Des Bahutiers,33000,Bordeaux,44.839531,-0.570651,79140,Cours Journu Auber 18,33300,Bordeaux,44.8582889,-0.5682868,2450,1416,2016-07-29 20:01:30,2016-07-29 20:20:04,0 +209350,2016-07-29 20:27:27,1205,Taj Mahal,24 Rue Du Parlement Sainte-Catherine,33000,Bordeaux,44.840405,-0.57394,79268,Rue De Cardoze 14,33200,Bordeaux,44.83799339999999,-0.6021928999999999,2800,1403,2016-07-29 20:46:15,2016-07-29 20:55:17,0 +209013,2016-07-29 19:48:56,1233,Punjab,39 Rue Saint Remi,33000,Bordeaux,44.841393,-0.572534,79145,Rue De Lalande 41,33000,Bordeaux,44.8335047,-0.5753986999999999,1500,1412,2016-07-29 20:02:36,2016-07-29 20:19:50,0 +209363,2016-07-29 20:28:57,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,79215,Rue Saint Remi 66,33000,Bordeaux,44.8411214,-0.5739778000000001,1570,1426,,,1 +209387,2016-07-29 20:31:06,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79284,Rue Fonfrede 11,33800,Bordeaux,44.8256705,-0.5719398,1370,1420,2016-07-29 20:50:49,2016-07-29 20:58:06,0 +209390,2016-07-29 20:31:24,1250,Que Toi,39 Cours D'Alsace-Et-Lorraine,33000,Bordeaux,44.837921,-0.572655,79287,Quai Richelieu 55,33000,Bordeaux,44.8371276,-0.5666549,1550,1416,2016-07-29 20:40:39,2016-07-29 20:43:24,0 +209017,2016-07-29 19:50:05,1246,Thai Paradise,70 Rue Des Ayres,33000,Bordeaux,44.836327,-0.575572,79147,Rue Du Muguet 17,33000,Bordeaux,44.8367251,-0.5686976,3850,1410,2016-07-29 20:09:56,2016-07-29 20:15:21,0 +209403,2016-07-29 20:33:44,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,79293,Rue Sanche De Pomiers 30,33000,Bordeaux,44.8318677,-0.5689497,1989,1412,2016-07-29 20:59:11,2016-07-29 21:10:33,0 +209405,2016-07-29 20:33:53,1229,Les Mijotes Du Bocal,2 Bis Rue De Cursol,33000,Bordeaux,44.834278,-0.57038,79295,Place Pierre Jacques Dormoy 18,33800,Bordeaux,44.82643909999999,-0.5639328,1950,1409,2016-07-29 20:54:43,,1 +209412,2016-07-29 20:35:34,1263,Noorn Akorn,8 Cours D'Albret,33000,Bordeaux,44.838734,-0.581611,79298,Rue Verteuil 1,33000,Bordeaux,44.8389448,-0.5809113,2750,1430,2016-07-29 20:50:11,2016-07-29 20:54:31,0 +209027,2016-07-29 19:51:27,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,79151,Rue Emile Zola 34,33400,Bordeaux,44.8231508,-0.5887801,3800,1403,2016-07-29 19:58:07,2016-07-29 20:09:35,0 +209426,2016-07-29 20:37:08,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79303,Cours Aristide Briand 102 B,33000,Bordeaux,44.8313444,-0.5745409,1470,1405,2016-07-29 20:49:00,2016-07-29 20:54:35,0 +209432,2016-07-29 20:38:21,1209,La Gamelle,23 Rue Des Freres Bonie,33000,Bordeaux,44.836849,-0.580108,79307,Rue Albert De Mun 26,33000,Bordeaux,44.8487459,-0.5816116,2039,1430,,,1 +209033,2016-07-29 19:51:49,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,79153,Rue Barreyre 182,33300,Bordeaux,44.8584901,-0.5739877999999999,3950,1416,2016-07-29 20:11:01,2016-07-29 20:15:20,0 +209095,2016-07-29 19:57:33,1250,Que Toi,39 Cours D'Alsace-Et-Lorraine,33000,Bordeaux,44.837921,-0.572655,79169,Rue Barreyre 61,33300,Bordeaux,44.85535600000001,-0.5690356,2650,1998,2016-07-29 20:07:50,2016-07-29 20:20:29,0 +209479,2016-07-29 20:43:10,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79324,Cours Victor Hugo 150,33000,Bordeaux,44.8348979,-0.5741788,1600,1415,2016-07-29 21:04:33,2016-07-29 21:09:33,0 +209499,2016-07-29 20:45:12,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,79334,Rue Latour 5,33000,Bordeaux,44.8504343,-0.5704513,1450,1998,2016-07-29 20:57:05,2016-07-29 21:04:42,0 +209185,2016-07-29 20:07:11,1205,Taj Mahal,24 Rue Du Parlement Sainte-Catherine,33000,Bordeaux,44.840405,-0.57394,79207,Rue De Tauzia 45,33800,Bordeaux,44.8291658,-0.558665,2400,1430,2016-07-29 20:15:02,2016-07-29 20:29:29,0 +209543,2016-07-29 20:49:50,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79357,Rue Rene Roy De Clotte 17,33000,Bordeaux,44.8295877,-0.5754490999999999,1440,1817,2016-07-29 21:05:31,2016-07-29 21:14:56,0 +209562,2016-07-29 20:51:58,1206,La Maison Du Glacier,1 Place Saint Pierre,33000,Bordeaux,44.839706,-0.570672,79369,Rue Jean Burguet 8,33000,Bordeaux,44.8344422,-0.5781535,1650,1415,2016-07-29 21:01:23,2016-07-29 21:17:30,0 +209569,2016-07-29 20:52:49,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,79372,Rue Boudet 35,33000,Bordeaux,44.8473251,-0.5759476,1340,1458,2016-07-29 21:18:56,2016-07-29 21:25:06,0 +209591,2016-07-29 20:55:38,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,79382,Rue De La Fraternite 35,33400,Bordeaux,44.8199976,-0.5817819,1950,1470,2016-07-29 21:06:11,2016-07-29 21:20:43,0 +209592,2016-07-29 20:55:39,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,79383,Place Nansouty 234,33800,Bordeaux,44.8204061,-0.5716893,5750,1412,2016-07-29 21:15:56,2016-07-29 21:30:18,0 +209593,2016-07-29 20:56:04,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,79384,Quai Des Chartrons 95,33300,Bordeaux,44.8546068,-0.5657744,1330,1430,2016-07-29 21:07:05,2016-07-29 21:28:11,0 +209191,2016-07-29 20:07:53,1213,Lupo,"23 Place Pey Berland, 33000 Bordeaux",33000,Bordeaux,44.837158,-0.576632,79211,Rue Minvielle 30,33000,Bordeaux,44.8536486,-0.5723744,2160,1424,2016-07-29 20:18:19,2016-07-29 20:27:07,0 +209635,2016-07-29 21:00:46,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,79399,Rue Beyssac 22,33800,Bordeaux,44.8327439,-0.5633967,2050,1917,2016-07-29 21:20:12,2016-07-29 21:34:39,0 +209651,2016-07-29 21:02:42,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,79404,Cours De La Somme 134,33800,Bordeaux,44.8257984,-0.5724935,4050,1420,2016-07-29 21:16:19,2016-07-29 21:26:29,0 +209653,2016-07-29 21:02:44,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,79406,Rue Tanesse 13,33000,Bordeaux,44.8314504,-0.5775499,1350,1461,2016-07-29 21:12:36,2016-07-29 21:16:37,0 +209206,2016-07-29 20:08:38,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,79215,Rue Saint Remi 66,33000,Bordeaux,44.8411214,-0.5739778000000001,1820,1403,2016-07-29 20:16:36,2016-07-29 20:38:06,0 +209666,2016-07-29 21:03:45,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,79412,Rue Camille Sauvageau 73,33800,Bordeaux,44.83221109999999,-0.5635616999999999,4180,1416,2016-07-29 21:30:40,2016-07-29 21:38:59,0 +209671,2016-07-29 21:04:22,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79414,Rue Des Trois-Conils 20,33000,Bordeaux,44.8387071,-0.5755399999999999,3760,1409,2016-07-29 21:28:28,2016-07-29 21:31:16,0 +209216,2016-07-29 20:10:03,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,77625,Rue De Grassi 23,33000,Bordeaux,44.8405499,-0.5771273,3210,1420,2016-07-29 20:25:33,2016-07-29 20:32:26,0 +209679,2016-07-29 21:05:23,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,79416,Rue Heriard Dubreuil 25,33000,Bordeaux,44.8479427,-0.5928829999999999,4390,1458,2016-07-29 21:27:24,2016-07-29 21:32:43,0 +209234,2016-07-29 20:12:59,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,79222,Cours Saint-Louis 16,33300,Bordeaux,44.8563692,-0.5708489,2130,1458,2016-07-29 20:30:45,2016-07-29 20:38:52,0 +209689,2016-07-29 21:06:48,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79419,Rue Servandoni 64,33000,Bordeaux,44.8337777,-0.5840013000000001,3810,1409,2016-07-29 21:44:26,2016-07-29 21:50:59,0 +209254,2016-07-29 20:15:20,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,79228,Rue Valentin Hauy 1,33000,Bordeaux,44.8347436,-0.6018987,1450,1422,2016-07-29 20:26:46,2016-07-29 20:41:31,0 +209692,2016-07-29 21:07:00,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,79420,Rue Du Bocage 57,33200,Bordeaux,44.8541641,-0.5983086,1490,1426,,,1 +209697,2016-07-29 21:08:08,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,79422,Rue Colbert 5,33000,Bordeaux,44.8465328,-0.588842,3529,1403,2016-07-29 21:34:58,2016-07-29 21:43:14,0 +209711,2016-07-29 21:09:18,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,79428,Rue Des Bahutiers 35,33000,Bordeaux,44.83866769999999,-0.5709273,2880,1998,2016-07-29 21:32:45,2016-07-29 21:38:25,0 +209255,2016-07-29 20:15:22,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79229,Rue De Laseppe 70,33000,Bordeaux,44.8529788,-0.5850312,2390,1410,2016-07-29 20:27:53,2016-07-29 20:37:57,0 +209256,2016-07-29 20:15:49,1235,Melodie,17 Rue Leupold,33000,Bordeaux,44.840603,-0.570444,79230,Rue Naujac 178,33000,Bordeaux,44.8495864,-0.5924585,1850,1415,2016-07-29 20:27:04,2016-07-29 20:35:23,0 +209735,2016-07-29 21:11:37,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79439,Rue Servandoni 66,33000,Bordeaux,44.8338125,-0.584163,1250,1472,2016-07-29 21:33:16,2016-07-29 21:40:08,0 +209257,2016-07-29 20:15:54,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,79231,Rue Bergeon 2,33800,Bordeaux,44.8298519,-0.5697599,1830,1409,2016-07-29 20:39:21,2016-07-29 20:42:58,0 +209260,2016-07-29 20:16:00,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,79232,Avenue De Tivoli 14,33110,Bordeaux,44.8576458,-0.5915104,2440,1472,2016-07-29 20:31:39,2016-07-29 20:43:27,0 +209781,2016-07-29 21:18:00,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,76838,Rue Des Argentiers 16,33000,Bordeaux,44.8391736,-0.5698286,6000,1426,2016-07-29 21:28:05,2016-07-29 21:54:56,0 +209785,2016-07-29 21:18:25,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,79460,Rue Jean Jacques Rousseau 7,33000,Bordeaux,44.84354159999999,-0.5778329,1600,1430,2016-07-29 21:36:16,2016-07-29 21:44:17,0 +209266,2016-07-29 20:16:54,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,79233,Rue Du Professeur Daguin 50,33800,Bordeaux,44.8142965,-0.5620291,2050,1902,2016-07-29 20:51:50,2016-07-29 20:59:58,0 +209795,2016-07-29 21:20:46,1234,Mille Et Une Saveurs,"96 Avenue Thiers, 33100 Bordeaux",33100,Bordeaux,44.843746,-0.554713,79463,Rue Du Chai Des Farines 17,33000,Bordeaux,44.8390942,-0.5693821,4350,1817,2016-07-29 21:47:28,2016-07-29 21:56:42,0 +209267,2016-07-29 20:16:56,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,79234,Rue Condorcet 43,33000,Bordeaux,44.857335,-0.5776279999999999,2050,1998,2016-07-29 20:32:25,2016-07-29 20:40:21,0 +209808,2016-07-29 21:22:30,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,79469,Rue Fondaudege 144,33000,Bordeaux,44.8489417,-0.5846662,1650,1471,2016-07-29 21:34:51,2016-07-29 21:51:25,0 +209270,2016-07-29 20:17:35,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,79235,Place Gavinies 20,33000,Bordeaux,44.8328338,-0.5946578,1600,1426,2016-07-29 20:28:05,2016-07-29 20:41:01,0 +209826,2016-07-29 21:25:15,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79474,Cours Pasteur 40,33000,Bordeaux,44.8329886,-0.573878,2690,1998,2016-07-29 21:51:13,2016-07-29 22:07:15,0 +209280,2016-07-29 20:19:07,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,79240,Rue Pourmann 9,33300,Bordeaux,44.8677266,-0.5489567,1250,1424,2016-07-29 20:33:37,2016-07-29 20:46:12,0 +209843,2016-07-29 21:27:36,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,79307,Rue Albert De Mun 26,33000,Bordeaux,44.8487459,-0.5816116,2230,1470,2016-07-29 21:49:49,2016-07-29 21:59:13,0 +209844,2016-07-29 21:27:56,1241,My Terroir,24 Place De La Ferme De Richemont,33000,Bordeaux,44.835506,-0.575218,79481,Cours De L'Argonne 17,33000,Bordeaux,44.829904,-0.5734106,1750,1415,2016-07-29 21:44:18,2016-07-29 21:49:10,0 +209858,2016-07-29 21:29:39,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,79486,Rue De Leybardie 27,33300,Bordeaux,44.8613599,-0.5650568,1350,1410,2016-07-29 21:56:54,2016-07-29 22:16:36,0 +209289,2016-07-29 20:20:01,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79243,Rue Judaique 213,33000,Bordeaux,44.8408287,-0.5954455,1900,1471,2016-07-29 20:34:10,2016-07-29 20:44:35,0 +209859,2016-07-29 21:29:42,1213,Lupo,"23 Place Pey Berland, 33000 Bordeaux",33000,Bordeaux,44.837158,-0.576632,79487,Rue Ernest Renan 55,33000,Bordeaux,44.84949839999999,-0.5923147,2380,1409,,,1 +209860,2016-07-29 21:29:46,1245,Eatsalad,55 Rue Saint Remi,33000,Bordeaux,44.841286,-0.573413,79488,Rue Turenne 127,33000,Bordeaux,44.8467424,-0.5870031,1450,1471,2016-07-29 21:41:00,2016-07-29 21:57:30,0 +209873,2016-07-29 21:31:33,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,79494,Rue De Cauderes 34,33400,Bordeaux,44.81545440000001,-0.5744315,1340,1472,2016-07-29 21:45:51,2016-07-29 21:59:13,0 +209290,2016-07-29 20:20:03,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,79244,Rue Roustaing 59,33400,Bordeaux,44.8175414,-0.590035,3050,1817,2016-07-29 20:32:42,2016-07-29 20:37:47,0 +209878,2016-07-29 21:33:02,1250,Que Toi,39 Cours D'Alsace-Et-Lorraine,33000,Bordeaux,44.837921,-0.572655,79496,Rue Bertrand De Goth 89,33800,Bordeaux,44.8200043,-0.5775741,2350,1817,2016-07-29 21:59:07,2016-07-29 22:22:26,0 +209886,2016-07-29 21:33:44,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79500,Rue Charles Marionneau 41,33000,Bordeaux,44.8404897,-0.5868244,4010,1430,2016-07-29 22:02:26,2016-07-29 22:12:39,0 +209888,2016-07-29 21:34:35,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,79501,Rue Des Argentiers 1,33000,Bordeaux,44.8395709,-0.5703804,1810,1458,2016-07-29 21:40:26,2016-07-29 22:08:36,0 +209900,2016-07-29 21:36:36,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,79507,Rue Theresia Cabarrus 53,33000,Bordeaux,44.8238595,-0.5966503,1860,1415,2016-07-29 22:12:00,2016-07-29 22:36:03,0 +209294,2016-07-29 20:20:29,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,79246,Rue Du Docteur Charles Nancel Penard 21,33000,Bordeaux,44.8397886,-0.5814379,1530,1420,2016-07-29 20:40:08,2016-07-29 20:47:05,0 +209910,2016-07-29 21:37:54,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79512,Rue Tustal 19,33000,Bordeaux,44.838474,-0.5752626,1570,1426,2016-07-29 22:02:58,2016-07-29 22:09:28,0 +210051,2016-07-29 22:09:51,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,77984,Rue Rodrigues-Pereire 31,33000,Bordeaux,44.84428870000001,-0.5848409999999999,3400,1409,2016-07-29 22:30:54,2016-07-29 22:39:56,0 +209936,2016-07-29 21:41:35,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,79525,Rue Esprit Des Lois 14,33000,Bordeaux,44.8429576,-0.5723083,3200,1426,2016-07-29 22:08:53,2016-07-29 22:17:59,0 +209939,2016-07-29 21:42:00,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,79528,Rue Edmond Costedoat 29,33000,Bordeaux,44.8310742,-0.5784439,3250,1817,2016-07-29 22:09:33,2016-07-29 22:15:31,0 +209947,2016-07-29 21:45:07,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,79531,Passage Lafontaine 10,33800,Bordeaux,44.8266776,-0.5713045,1450,1472,2016-07-29 22:08:51,2016-07-29 22:13:05,0 +209948,2016-07-29 21:45:07,1205,Taj Mahal,24 Rue Du Parlement Sainte-Catherine,33000,Bordeaux,44.840405,-0.57394,79532,Rue Henri Iv 29,33000,Bordeaux,44.8322203,-0.5768331,3590,1409,2016-07-29 22:00:33,2016-07-29 22:08:07,0 +210068,2016-07-29 22:19:05,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,79576,Rue Emile Fourcand 87,33000,Bordeaux,44.8477529,-0.5870999,1650,1426,2016-07-29 22:33:53,2016-07-29 22:42:58,0 +209991,2016-07-29 21:54:10,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79551,Rue Milliere 35,33000,Bordeaux,44.8297433,-0.5767682,1450,1416,2016-07-29 22:19:58,2016-07-29 22:29:14,0 +210080,2016-07-29 22:22:02,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,4420,Rue Tustal 19,33000,Bordeaux,44.838474,-0.5752626,2400,1472,2016-07-29 22:41:21,2016-07-29 22:45:05,0 +210025,2016-07-29 22:02:31,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,79563,Rue Tastet 18,33000,Bordeaux,44.8353074,-0.5814444999999999,1300,1470,2016-07-29 22:19:43,2016-07-29 22:31:42,0 +210142,2016-07-30 11:44:52,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,79604,Rue Permentade 43,33000,Bordeaux,44.8325515,-0.569302,1540,1458,2016-07-30 12:02:31,2016-07-30 12:09:54,0 +210217,2016-07-30 12:24:28,1264,Koeben,32 Rue De Palais Gallien,33000,Bordeaux,44.8428,-0.581592,79628,Rue De Landiras 36,33000,Bordeaux,44.82899099999999,-0.5849419,6640,1471,2016-07-30 13:09:49,2016-07-30 13:21:29,0 +210441,2016-07-30 13:41:02,1258,Pitaya Saint-Remi,42 Rue Saint Remi,33000,Bordeaux,44.84127,-0.572691,79695,Rue Du Jardin Public 107,33000,Bordeaux,44.8540971,-0.5746055,2300,1416,2016-07-30 13:52:23,2016-07-30 13:58:24,0 +210454,2016-07-30 13:46:26,1222,Les Tartines De Marine,"6 Rue Saint-Sernin, Bordeaux",33000,Bordeaux,44.839336,-0.58194,78195,Rue Edouard Larroque 36,33000,Bordeaux,44.8315573,-0.6022223,1850,1407,2016-07-30 13:56:11,2016-07-30 14:06:33,0 +210459,2016-07-30 13:48:15,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79700,Rue De La Fusterie 9,33000,Bordeaux,44.835886,-0.5659738,1490,1430,2016-07-30 14:01:04,2016-07-30 14:08:06,0 +210460,2016-07-30 13:48:30,1250,Que Toi,39 Cours D'Alsace-Et-Lorraine,33000,Bordeaux,44.837921,-0.572655,79701,Rue Beaubadat 5,33000,Bordeaux,44.8393017,-0.5777057999999999,2400,1462,2016-07-30 13:55:18,2016-07-30 14:12:12,0 +210473,2016-07-30 13:52:33,1245,Eatsalad,55 Rue Saint Remi,33000,Bordeaux,44.841286,-0.573413,79708,Rue Donissan 65,33000,Bordeaux,44.8287407,-0.5749175,1830,1462,2016-07-30 14:07:52,2016-07-30 14:19:16,0 +210476,2016-07-30 13:53:01,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,79709,Rue Laclotte 13,33000,Bordeaux,44.8485326,-0.5816281,1950,1416,2016-07-30 14:07:47,2016-07-30 14:15:52,0 +210483,2016-07-30 13:55:26,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79713,Rue Tastet 17,33000,Bordeaux,44.8352922,-0.5819312999999999,2320,1430,2016-07-30 14:11:29,2016-07-30 14:23:13,0 +210229,2016-07-30 12:28:06,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,79629,Rue Du Loup 38,33000,Bordeaux,44.8378633,-0.5733415000000001,1450,1462,2016-07-30 12:36:17,2016-07-30 12:40:33,0 +210510,2016-07-30 14:05:02,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,79720,Cours De La Marne 71,33000,Bordeaux,44.8299256,-0.5684971999999999,3800,1462,2016-07-30 14:24:32,2016-07-30 14:30:46,0 +210239,2016-07-30 12:30:49,1216,Sushimi,8 Rue Courbin,33000,Bordeaux,44.841721,-0.572962,79632,Rue Sauteyron 39,33000,Bordeaux,44.83046359999999,-0.5744745,2790,1462,2016-07-30 12:44:20,2016-07-30 12:51:23,0 +210523,2016-07-30 14:12:28,1266,Sambo'S Shop,8 Rue Jean Burguet,33000,Bordeaux,44.834511,-0.578444,79728,Rue Saint-Nicolas 20,33800,Bordeaux,44.82736449999999,-0.5748215999999999,2750,1430,2016-07-30 14:26:44,2016-07-30 14:33:21,0 +210250,2016-07-30 12:33:41,1265,Chez Frango,23 Cours Portal,33000,Bordeaux,44.853027,-0.573322,79635,Cours Edouard Vaillant 35,33300,Bordeaux,44.8606007,-0.5582429999999999,1600,1405,2016-07-30 12:56:01,2016-07-30 13:03:56,0 +210256,2016-07-30 12:35:31,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,79637,Rue Des Sablieres 41,33800,Bordeaux,44.825741,-0.5761274,1600,1430,2016-07-30 12:43:33,2016-07-30 12:54:26,0 +210258,2016-07-30 12:36:24,1265,Chez Frango,23 Cours Portal,33000,Bordeaux,44.853027,-0.573322,79639,Rue Prunier 101,33300,Bordeaux,44.8599122,-0.5739065999999999,2100,1420,2016-07-30 12:57:07,2016-07-30 13:02:57,0 +210586,2016-07-30 15:04:30,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,75905,Rue De La Prevote 3,33000,Bordeaux,44.8441797,-0.5850267,1650,1902,2016-07-30 15:18:29,2016-07-30 15:27:14,0 +210270,2016-07-30 12:41:00,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,79644,Rue Lecocq 72 Ter,33000,Bordeaux,44.8344849,-0.5854412,1730,1461,2016-07-30 13:04:02,2016-07-30 13:06:47,0 +210296,2016-07-30 12:49:27,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,79653,Avenue Charles De Gaulle 78,33200,Bordeaux,44.8490356,-0.601607,1250,1403,2016-07-30 13:01:17,2016-07-30 13:11:24,0 +210650,2016-07-30 16:46:33,1267,Lekkers,68 Quai Des Chartrons,33300,Bordeaux,44.853039,-0.56808,79770,Rue De Tivoli 42,33000,Bordeaux,44.8548974,-0.5906612,1910,1902,,,1 +210660,2016-07-30 17:07:41,1213,Lupo,"23 Place Pey Berland, 33000 Bordeaux",33000,Bordeaux,44.837158,-0.576632,78268,Quai Louis Xviii 5,33000,Bordeaux,44.8439813,-0.5709155,1789,1917,,,1 +210303,2016-07-30 12:51:46,1266,Sambo'S Shop,8 Rue Jean Burguet,33000,Bordeaux,44.834511,-0.578444,79656,Cite Mouneyra 6,33000,Bordeaux,44.8323473,-0.5844635,2050,1417,2016-07-30 13:10:07,2016-07-30 13:16:14,0 +210305,2016-07-30 12:51:56,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,79657,Rue Fonfrede 72,33800,Bordeaux,44.8255934,-0.5687881,2550,1458,2016-07-30 13:00:49,2016-07-30 13:13:32,0 +210314,2016-07-30 12:54:30,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78930,Rue Du Loup 64,33000,Bordeaux,44.8379284,-0.5744606999999999,2060,1416,2016-07-30 13:19:15,2016-07-30 13:28:05,0 +210320,2016-07-30 12:56:08,1258,Pitaya Saint-Remi,42 Rue Saint Remi,33000,Bordeaux,44.84127,-0.572691,79661,Rue Capdeville 50,33000,Bordeaux,44.8439792,-0.5884277,2000,1416,2016-07-30 13:13:03,2016-07-30 13:33:39,0 +210738,2016-07-30 18:36:49,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,75192,Rue Cruchinet 3 Bis,33800,Bordeaux,44.8282803,-0.5740767999999999,1450,1426,2016-07-30 18:58:05,2016-07-30 19:04:57,0 +210740,2016-07-30 18:37:20,1215,Moon Wok,17 Place Fernand Lafargue,33000,Bordeaux,44.837299,-0.572124,79812,Rue Theresia Cabarrus 53,33000,Bordeaux,44.8238595,-0.5966503,1290,1430,2016-07-30 18:50:09,2016-07-30 19:05:07,0 +210344,2016-07-30 13:01:48,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79670,Rue De Lalande 22,33000,Bordeaux,44.8340583,-0.5749860999999999,1490,1462,2016-07-30 13:10:37,2016-07-30 13:19:38,0 +210760,2016-07-30 18:46:02,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,79594,Rue Bernard Adour 72,33200,Bordeaux,44.8385352,-0.6030561999999999,2070,1407,2016-07-30 19:04:03,2016-07-30 19:15:06,0 +210772,2016-07-30 18:50:33,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,79828,Rue Thiac 41,33000,Bordeaux,44.843956,-0.5843895,6020,1414,2016-07-30 19:21:59,2016-07-30 19:35:21,0 +210353,2016-07-30 13:04:13,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,77592,Cours De La Somme 218,33800,Bordeaux,44.8223315,-0.5723672,2650,1462,2016-07-30 13:15:49,2016-07-30 13:26:03,0 +210397,2016-07-30 13:21:36,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,79680,Rue Poquelin Moliere 4,33000,Bordeaux,44.8399797,-0.5762754,1550,1405,2016-07-30 13:36:04,2016-07-30 13:40:41,0 +210831,2016-07-30 19:10:00,1205,Taj Mahal,24 Rue Du Parlement Sainte-Catherine,33000,Bordeaux,44.840405,-0.57394,79846,Rue Tiffonet 3,33800,Bordeaux,44.82997080000001,-0.5721143,3940,1902,2016-07-30 19:26:24,2016-07-30 19:42:45,0 +210400,2016-07-30 13:22:45,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,79681,Rue Saumenude 4,33800,Bordeaux,44.8320106,-0.5668432999999999,1300,1430,2016-07-30 13:51:13,2016-07-30 13:56:21,0 +210868,2016-07-30 19:16:40,1265,Chez Frango,23 Cours Portal,33000,Bordeaux,44.853027,-0.573322,79861,Rue Vital Mareille 7,33300,Bordeaux,44.8663259,-0.5727107,1850,1403,2016-07-30 19:28:53,2016-07-30 19:36:24,0 +210407,2016-07-30 13:25:44,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,79684,Rue Castillon 48,33110,Bordeaux,44.859618,-0.593731,1750,1424,2016-07-30 13:36:21,2016-07-30 13:48:23,0 +210875,2016-07-30 19:17:48,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,79865,Rue Casteja 10,33000,Bordeaux,44.8425388,-0.5821083,2210,1414,2016-07-30 19:50:09,2016-07-30 20:01:14,0 +210414,2016-07-30 13:29:24,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79686,Rue Courbin 7,33000,Bordeaux,44.8415367,-0.5730461,1810,1461,2016-07-30 13:54:31,2016-07-30 13:57:26,0 +210890,2016-07-30 19:21:13,1250,Que Toi,39 Cours D'Alsace-Et-Lorraine,33000,Bordeaux,44.837921,-0.572655,79870,Cours De La Somme 25,33000,Bordeaux,44.8293983,-0.5725353,1650,2007,2016-07-30 19:27:33,2016-07-30 19:42:57,0 +210903,2016-07-30 19:23:56,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79876,Cours Pasteur 25,33000,Bordeaux,44.8354524,-0.5754927,3779,1426,2016-07-30 19:34:47,2016-07-30 19:38:49,0 +210415,2016-07-30 13:29:25,1245,Eatsalad,55 Rue Saint Remi,33000,Bordeaux,44.841286,-0.573413,78940,Rue Edouard Larroque 36,33000,Bordeaux,44.8315573,-0.6022223,1540,1461,2016-07-30 14:04:21,2016-07-30 14:14:03,0 +211164,2016-07-30 20:03:28,1265,Chez Frango,23 Cours Portal,33000,Bordeaux,44.853027,-0.573322,79229,Rue De Laseppe 70,33000,Bordeaux,44.8529788,-0.5850312,5650,1407,2016-07-30 20:27:41,2016-07-30 20:36:23,0 +210926,2016-07-30 19:28:06,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,79890,Avenue Du President Robert Schuman 100,33110,Bordeaux,44.8577966,-0.5965661999999999,2700,1403,2016-07-30 19:46:31,2016-07-30 19:54:57,0 +210933,2016-07-30 19:28:54,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,79893,Rue Babin 36,33000,Bordeaux,44.822148,-0.5970131,1950,1420,2016-07-30 19:45:56,2016-07-30 19:55:21,0 +210945,2016-07-30 19:30:39,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,79900,Rue Du Couvent 16,33000,Bordeaux,44.8507446,-0.5710947,1650,1416,2016-07-30 19:46:00,2016-07-30 19:49:15,0 +210953,2016-07-30 19:31:59,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79905,Rue Hippolyte Minier 33,33800,Bordeaux,44.8235407,-0.5678198999999999,1480,1462,2016-07-30 19:45:23,2016-07-30 19:58:26,0 +210958,2016-07-30 19:32:38,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,79906,Cours Du Medoc 75,33300,Bordeaux,44.8595135,-0.567983,1989,1422,2016-07-30 19:50:06,2016-07-30 20:07:45,0 +210959,2016-07-30 19:32:47,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79907,Cours De La Marne 15,33800,Bordeaux,44.830309,-0.5712351,1330,1462,2016-07-30 19:45:28,2016-07-30 19:53:40,0 +211198,2016-07-30 20:07:49,1256,Pitaya Stalingrad,36 Place De Stalingrad,33100,Bordeaux,44.840912,-0.559553,80014,Rue Laplace 14,33100,Bordeaux,44.8479178,-0.5379524,3250,2007,2016-07-30 20:24:57,2016-07-30 20:57:12,0 +210963,2016-07-30 19:33:23,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,79911,Rue Georges Bonnac 74,33000,Bordeaux,44.8397053,-0.5855431,1450,1417,2016-07-30 19:51:43,2016-07-30 20:04:26,0 +210964,2016-07-30 19:33:29,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,79912,Rue Judaique 96,33000,Bordeaux,44.8411608,-0.5865775999999999,2500,1416,2016-07-30 19:45:54,2016-07-30 19:56:19,0 +210982,2016-07-30 19:35:50,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,79920,Rue Gaspard Philippe 3,33000,Bordeaux,44.833956,-0.566577,2910,2013,2016-07-30 19:55:16,2016-07-30 20:15:48,0 +211218,2016-07-30 20:10:33,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,80022,Rue Giner De Los Rios 25,33800,Bordeaux,44.82787,-0.5710516,2350,1420,2016-07-30 20:29:17,2016-07-30 20:34:50,0 +210997,2016-07-30 19:39:46,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,79929,Rue Servandoni 64,33000,Bordeaux,44.8337777,-0.5840013000000001,2130,1471,2016-07-30 19:57:04,2016-07-30 20:02:55,0 +210999,2016-07-30 19:40:01,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,79931,Rue Des Trois-Conils 10,33000,Bordeaux,44.8387233,-0.5749896999999999,1950,1817,2016-07-30 19:55:54,2016-07-30 20:07:35,0 +211004,2016-07-30 19:41:01,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,79934,Cours D'Albret 83,33000,Bordeaux,44.83473619999999,-0.5807051999999999,1350,1426,2016-07-30 19:50:30,2016-07-30 19:54:24,0 +211009,2016-07-30 19:41:49,1205,Taj Mahal,24 Rue Du Parlement Sainte-Catherine,33000,Bordeaux,44.840405,-0.57394,79936,Rue Neuve 14,33000,Bordeaux,44.83716260000001,-0.5692237,6240,1415,2016-07-30 20:00:20,2016-07-30 20:09:16,0 +211224,2016-07-30 20:11:05,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,80026,Rue Dupaty 127,33300,Bordeaux,44.8610947,-0.5590109,3050,1403,2016-07-30 20:24:43,2016-07-30 20:32:19,0 +211022,2016-07-30 19:44:20,1258,Pitaya Saint-Remi,42 Rue Saint Remi,33000,Bordeaux,44.84127,-0.572691,79941,Rue De La Vieille Tour 14,33000,Bordeaux,44.8411971,-0.5796273,1300,1411,2016-07-30 20:06:16,2016-07-30 20:12:02,0 +211229,2016-07-30 20:11:34,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80029,Rue Guadet 18,33000,Bordeaux,44.8534528,-0.5787933,1590,1817,2016-07-30 20:27:23,2016-07-30 20:38:22,0 +211233,2016-07-30 20:11:55,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80031,Place Saint-Pierre 1,33000,Bordeaux,44.8396897,-0.5706097,1350,1462,2016-07-30 20:22:40,2016-07-30 20:24:45,0 +211052,2016-07-30 19:47:44,1242,Fufu Saint Remi,37 Rue Saint Remi,33000,Bordeaux,44.841438,-0.572537,74791,Cours D'Albret 83,33000,Bordeaux,44.83473619999999,-0.5807051999999999,1050,1424,2016-07-30 19:59:28,2016-07-30 20:06:35,0 +211055,2016-07-30 19:47:53,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79951,Rue Matignon 19,33000,Bordeaux,44.850675,-0.5852400999999999,2020,1407,2016-07-30 20:03:24,2016-07-30 20:15:49,0 +211064,2016-07-30 19:49:13,1211,Haru Haru,93 Cours Gambetta,33400,Bordeaux,44.8181798,-0.5851184,79956,Rue Jules Ferry 8,33400,Bordeaux,44.8186746,-0.5802976,1650,1420,2016-07-30 20:00:41,2016-07-30 20:04:44,0 +211075,2016-07-30 19:51:38,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,79964,Rue Desse 52,33000,Bordeaux,44.8284946,-0.588137,2100,1461,2016-07-30 20:03:36,2016-07-30 20:23:05,0 +211242,2016-07-30 20:12:51,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,80036,Cours De L'Argonne 134,33800,Bordeaux,44.8263696,-0.5767346,2300,1458,2016-07-30 20:30:03,2016-07-30 20:36:34,0 +211269,2016-07-30 20:15:40,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,80044,Cours De L'Intendance 62,33000,Bordeaux,44.8416129,-0.5791577,1330,1430,2016-07-30 20:25:24,2016-07-30 20:44:55,0 +211102,2016-07-30 19:56:43,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,79974,Rue De Lurbe 22,33000,Bordeaux,44.8431163,-0.580502,1550,1430,2016-07-30 20:11:35,2016-07-30 20:21:24,0 +211115,2016-07-30 19:58:13,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,78989,Rue De La Rousselle 39,33000,Bordeaux,44.8370395,-0.5683842,1939,1817,2016-07-30 20:16:46,2016-07-30 20:23:14,0 +211120,2016-07-30 19:59:14,1227,Cilicie,4 Rue Des Bahutiers,33000,Bordeaux,44.839531,-0.570651,79982,Rue Calve 39,33000,Bordeaux,44.850965,-0.5904863,3450,1415,2016-07-30 20:21:14,2016-07-30 20:31:33,0 +211281,2016-07-30 20:17:36,1225,Billy Factory,5 Place Louis Barthou,33000,Bordeaux,44.827942,-0.59441,80050,Rue Saint-Remi 25,33000,Bordeaux,44.84142869999999,-0.5719069,1650,1470,2016-07-30 20:47:01,2016-07-30 21:08:53,0 +211132,2016-07-30 20:00:22,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,79989,Rue Maurice 47,33300,Bordeaux,44.8587196,-0.5637679,1450,1403,2016-07-30 20:13:28,2016-07-30 20:29:10,0 +211134,2016-07-30 20:00:35,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,79990,Rue Batailley 5,33000,Bordeaux,44.8385634,-0.5927257,3340,1998,2016-07-30 20:14:34,2016-07-30 20:32:27,0 +211138,2016-07-30 20:00:57,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,79992,Rue De Pessac 18-20,33000,Bordeaux,44.8306244,-0.5791144000000001,3550,1461,2016-07-30 20:11:46,2016-07-30 20:28:05,0 +211139,2016-07-30 20:01:02,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,79993,Rue Du Mirail 19,33000,Bordeaux,44.8341514,-0.5713275999999999,1400,2013,2016-07-30 20:24:15,2016-07-30 20:29:31,0 +211147,2016-07-30 20:02:02,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,79996,Rue Henri Iv 68,33000,Bordeaux,44.83197639999999,-0.5750737,1340,1458,2016-07-30 20:21:22,2016-07-30 20:26:32,0 +211152,2016-07-30 20:02:22,1256,Pitaya Stalingrad,36 Place De Stalingrad,33100,Bordeaux,44.840912,-0.559553,79998,Hlm Midi 3,33270,Bordeaux,44.8377811,-0.5398575999999999,3250,2007,2016-07-30 20:25:10,2016-07-30 20:38:25,0 +211283,2016-07-30 20:17:44,1227,Cilicie,4 Rue Des Bahutiers,33000,Bordeaux,44.839531,-0.570651,80051,Place De La Victoire 16,33000,Bordeaux,44.8304515,-0.5731404,1450,1462,2016-07-30 20:30:59,2016-07-30 20:46:10,0 +211153,2016-07-30 20:02:38,1267,Lekkers,68 Quai Des Chartrons,33300,Bordeaux,44.853039,-0.56808,78788,Rue Porte De La Monnaie 29,33800,Bordeaux,44.8321496,-0.5631799,2190,1422,,,1 +211288,2016-07-30 20:18:11,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,80053,Rue Barrau 5,33000,Bordeaux,44.8260581,-0.5782250999999999,2490,1409,2016-07-30 20:40:14,2016-07-30 20:47:55,0 +211301,2016-07-30 20:20:53,1263,Noorn Akorn,8 Cours D'Albret,33000,Bordeaux,44.838734,-0.581611,80061,Cours D'Alsace-Et-Lorraine 7,33000,Bordeaux,44.8380932,-0.5680670999999999,3750,1411,2016-07-30 20:35:45,2016-07-30 20:49:45,0 +211304,2016-07-30 20:21:06,1220,Jardin Phnom Penh,1 Rue Du Cerf Volant,33000,Bordeaux,44.838287,-0.570993,80062,Rue Minvielle 24,33000,Bordeaux,44.8533359,-0.5722665000000001,3000,2013,2016-07-30 20:46:30,2016-07-30 20:59:14,0 +211553,2016-07-30 20:50:28,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,80184,Rue Honore Picon 18,33100,Bordeaux,44.8415421,-0.5598141999999999,5180,1417,2016-07-30 21:33:02,2016-07-30 21:44:09,0 +211554,2016-07-30 20:50:34,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,80185,Passage Hermitte 76,33000,Bordeaux,44.8323778,-0.5979375,2540,1470,2016-07-30 21:14:19,2016-07-30 21:29:16,0 +211555,2016-07-30 20:50:37,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,80186,Rue De La Ville De Mirmont 10,33000,Bordeaux,44.84692930000001,-0.5795985,3429,1409,2016-07-30 21:17:18,2016-07-30 21:33:37,0 +211306,2016-07-30 20:21:10,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,80063,Cours De L'Argonne 14,33000,Bordeaux,44.8298523,-0.5729818,1250,1458,2016-07-30 20:45:27,2016-07-30 20:50:41,0 +211309,2016-07-30 20:21:31,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,80065,Rue Turenne 60,33000,Bordeaux,44.8456362,-0.5839462999999999,2190,1424,2016-07-30 20:44:49,2016-07-30 20:50:16,0 +211311,2016-07-30 20:21:41,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,80066,Rue De Riviere 14 Bis,33000,Bordeaux,44.8545895,-0.5888850999999999,1450,1415,2016-07-30 20:37:39,2016-07-30 20:47:48,0 +211590,2016-07-30 20:54:42,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,80204,Rue Du Jardin Public 183,33300,Bordeaux,44.8566262,-0.5733922,1550,1415,2016-07-30 21:12:01,2016-07-30 21:16:21,0 +211593,2016-07-30 20:55:11,1239,Tam Tam Saigon,7 Rue Paulin,33000,Bordeaux,44.846516,-0.588076,80206,Rue Pierre 48,33000,Bordeaux,44.83888109999999,-0.5931356999999999,3640,1424,2016-07-30 21:22:09,2016-07-30 21:27:48,0 +211315,2016-07-30 20:21:58,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,80068,Rue Toulouse Lautrec 12,33000,Bordeaux,44.8401153,-0.5807992,2850,1471,2016-07-30 20:36:25,2016-07-30 20:47:29,0 +211596,2016-07-30 20:55:46,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80207,Cours De La Marne 71,33800,Bordeaux,44.8297535,-0.5685724,2260,1414,2016-07-30 21:17:59,2016-07-30 21:25:04,0 +211604,2016-07-30 20:57:10,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80213,Rue Sauteyron 42,33000,Bordeaux,44.8309061,-0.5743011,2540,1462,2016-07-30 21:19:03,2016-07-30 21:24:21,0 +211320,2016-07-30 20:22:52,1214,Koh I Noor,3 Rue Du Puits Descujols,33000,Bordeaux,44.841011,-0.570755,80072,Rue Du Tondu 95,33000,Bordeaux,44.8306107,-0.584649,4150,1416,2016-07-30 20:40:37,2016-07-30 20:53:09,0 +211620,2016-07-30 20:59:12,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,80220,Rue Lefol 17,33800,Bordeaux,44.822116,-0.5640639,2830,1416,2016-07-30 21:37:15,2016-07-30 21:47:33,0 +211335,2016-07-30 20:24:11,1246,Thai Paradise,70 Rue Des Ayres,33000,Bordeaux,44.836327,-0.575572,80079,Avenue Jeanne D'Arc 20,33000,Bordeaux,44.8267427,-0.593746,1950,1998,,,1 +211626,2016-07-30 20:59:59,1217,Henny'S Burger,22 Rue Fondaudege,33000,Bordeaux,44.845875,-0.579345,80224,Rue Cadroin 52,33000,Bordeaux,44.8280881,-0.5768124,3520,1430,2016-07-30 21:34:45,2016-07-30 21:47:07,0 +211638,2016-07-30 21:01:57,1245,Eatsalad,55 Rue Saint Remi,33000,Bordeaux,44.841286,-0.573413,80228,Cours De L'Argonne 63,33000,Bordeaux,44.8286506,-0.5746177,2130,1416,2016-07-30 21:11:05,2016-07-30 21:45:42,0 +211657,2016-07-30 21:04:25,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,79528,Rue Edmond Costedoat 29,33000,Bordeaux,44.8310742,-0.5784439,2720,2013,2016-07-30 21:33:26,2016-07-30 21:42:03,0 +211359,2016-07-30 20:27:07,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,79219,Rue Du Pont De La Mousque 24,33000,Bordeaux,44.8418427,-0.5727019999999999,4590,1817,2016-07-30 20:48:18,2016-07-30 20:55:12,0 +211673,2016-07-30 21:05:57,1266,Sambo'S Shop,8 Rue Jean Burguet,33000,Bordeaux,44.834511,-0.578444,80242,Rue Lafontaine 35,33800,Bordeaux,44.8268384,-0.5708527,3690,1471,2016-07-30 21:27:01,2016-07-30 21:33:00,0 +211687,2016-07-30 21:07:51,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80247,Cours De L'Yser 205,33800,Bordeaux,44.8220466,-0.5715914999999999,1480,1420,2016-07-30 21:34:54,2016-07-30 21:44:07,0 +211363,2016-07-30 20:27:45,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,80095,Rue De La Porte Saint-Jean 8,33000,Bordeaux,44.837728,-0.5682188,2400,1817,2016-07-30 20:42:51,2016-07-30 21:01:17,0 +211694,2016-07-30 21:09:38,1244,Fufu Chartrons,71 Cours Portal,33300,Bordeaux,44.85516,-0.572128,80251,Rue Delord 68,33300,Bordeaux,44.8605192,-0.5597696999999999,1850,1415,2016-07-30 21:22:25,2016-07-30 21:26:54,0 +211380,2016-07-30 20:30:03,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80104,Rue Du Docteur Albert Barraud 143,33000,Bordeaux,44.8484576,-0.5831115,1490,1461,2016-07-30 20:50:57,2016-07-30 20:58:50,0 +211386,2016-07-30 20:30:34,1227,Cilicie,4 Rue Des Bahutiers,33000,Bordeaux,44.839531,-0.570651,80108,Place Charles Gruet 22,33000,Bordeaux,44.8466782,-0.5809398,4250,1422,2016-07-30 20:43:46,2016-07-30 20:59:31,0 +211753,2016-07-30 21:20:02,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80273,Rue Du Chai Des Farines 22,33000,Bordeaux,44.8391999,-0.5689409,3240,1458,2016-07-30 21:41:43,2016-07-30 21:45:44,0 +211388,2016-07-30 20:30:59,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,80109,Allee D'Orleans 28,33000,Bordeaux,44.8436986,-0.5727521,2130,1414,2016-07-30 20:49:12,2016-07-30 20:58:19,0 +211759,2016-07-30 21:20:32,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80277,Cours De La Somme 127,33800,Bordeaux,44.8257462,-0.5732807,2980,1817,2016-07-30 21:46:13,2016-07-30 21:56:24,0 +211767,2016-07-30 21:21:58,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,80280,Rue De Lescure 26,33000,Bordeaux,44.8328755,-0.6005678,1739,1410,2016-07-30 21:46:04,2016-07-30 22:04:43,0 +211397,2016-07-30 20:31:55,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80111,Rue Des Trois-Conils 4,33000,Bordeaux,44.8388325,-0.5746124,1420,1417,2016-07-30 20:46:18,2016-07-30 20:51:03,0 +211770,2016-07-30 21:22:34,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,74631,Rue Saint-Jean 85,33800,Bordeaux,44.8248735,-0.5683764,1800,1998,2016-07-30 21:41:41,2016-07-30 21:54:29,0 +211786,2016-07-30 21:24:08,1258,Pitaya Saint-Remi,42 Rue Saint Remi,33000,Bordeaux,44.84127,-0.572691,80288,Rue De Lyon 65,33000,Bordeaux,44.8479107,-0.5920831,2300,1462,2016-07-30 21:33:42,2016-07-30 21:41:45,0 +211405,2016-07-30 20:32:53,1215,Moon Wok,17 Place Fernand Lafargue,33000,Bordeaux,44.837299,-0.572124,80114,Rue Jean Dollfus 2,33100,Bordeaux,44.8458207,-0.5572484,2580,1410,2016-07-30 20:50:34,2016-07-30 20:58:30,0 +211791,2016-07-30 21:25:33,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,80292,Rue Pauline Kergomard 3,33800,Bordeaux,44.82313449999999,-0.5768487000000001,1440,1817,2016-07-30 21:51:11,2016-07-30 22:00:44,0 +211802,2016-07-30 21:26:59,1250,Que Toi,39 Cours D'Alsace-Et-Lorraine,33000,Bordeaux,44.837921,-0.572655,80299,Rue De Lalande 54,33000,Bordeaux,44.8328105,-0.5750839999999999,3100,1416,2016-07-30 22:01:34,2016-07-30 22:08:09,0 +211408,2016-07-30 20:33:26,1258,Pitaya Saint-Remi,42 Rue Saint Remi,33000,Bordeaux,44.84127,-0.572691,80116,Rue Binaud 42,33300,Bordeaux,44.8584843,-0.5703737999999999,1450,2013,2016-07-30 20:50:32,2016-07-30 21:04:59,0 +211811,2016-07-30 21:29:15,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80303,Passage Birly 28,33800,Bordeaux,44.8210383,-0.5745384,2860,1471,2016-07-30 21:56:38,2016-07-30 22:07:10,0 +211817,2016-07-30 21:30:19,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,80307,Rue Jean Soula 24,33000,Bordeaux,44.8417678,-0.5902303,4900,2013,2016-07-30 21:50:53,2016-07-30 22:12:54,0 +211822,2016-07-30 21:31:27,1265,Chez Frango,23 Cours Portal,33000,Bordeaux,44.853027,-0.573322,80311,Rue Du Professeur Demons 4,33000,Bordeaux,44.846326,-0.5792183,4050,1415,2016-07-30 21:49:19,2016-07-30 21:53:32,0 +211824,2016-07-30 21:31:42,1258,Pitaya Saint-Remi,42 Rue Saint Remi,33000,Bordeaux,44.84127,-0.572691,80312,Rue Thiac 24,33000,Bordeaux,44.8436228,-0.5830795,1450,1424,2016-07-30 21:40:35,2016-07-30 21:45:45,0 +211410,2016-07-30 20:33:36,1221,Le Veneto,25 Allee De Tourny,33000,Bordeaux,44.84473,-0.578606,80118,Rue Du Palais Gallien 157,33000,Bordeaux,44.8470835,-0.5819766,2110,1424,2016-07-30 20:54:16,2016-07-30 20:58:39,0 +211834,2016-07-30 21:33:48,1212,Cote Terrasse,198 Cours De L'Argonne,33800,Bordeaux,44.824543,-0.578545,78506,Cours D'Albret 100,33000,Bordeaux,44.8327483,-0.5794673,2950,1470,2016-07-30 21:53:21,2016-07-30 22:05:03,0 +211838,2016-07-30 21:34:15,1207,Le Jardin Pekinois,9 Rue Des Freres Bonie,33000,Bordeaux,44.837078,-0.579572,80307,Rue Jean Soula 24,33000,Bordeaux,44.8417678,-0.5902303,2200,2013,2016-07-30 22:05:25,2016-07-30 22:11:41,0 +211845,2016-07-30 21:35:38,1260,L'Epicerie Bordelaise,14 Rue Ravez,33000,Bordeaux,44.837101,-0.57272,80322,Place Paul Et Jean Paul Avisseau 12,33300,Bordeaux,44.8553722,-0.5670307,5050,1424,2016-07-30 22:03:22,2016-07-30 22:13:35,0 +211414,2016-07-30 20:34:02,1234,Mille Et Une Saveurs,"96 Avenue Thiers, 33100 Bordeaux",33100,Bordeaux,44.843746,-0.554713,80119,Rue Gay Lussac 20,33100,Bordeaux,44.8479962,-0.5389155999999999,2320,1407,2016-07-30 20:54:50,2016-07-30 21:06:37,0 +211415,2016-07-30 20:34:16,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,80120,Rue Saint-Nicolas 28,33800,Bordeaux,44.8274105,-0.5744838,3350,1462,2016-07-30 20:45:57,2016-07-30 20:53:25,0 +211873,2016-07-30 21:42:41,1234,Mille Et Une Saveurs,"96 Avenue Thiers, 33100 Bordeaux",33100,Bordeaux,44.843746,-0.554713,80336,Rue Saint-James 16,33000,Bordeaux,44.8363773,-0.5713289000000001,1700,1458,2016-07-30 22:30:53,2016-07-30 22:36:00,0 +211428,2016-07-30 20:35:51,1223,Bag'Elles Coffee,19 Rue Du Mirail,33000,Bordeaux,44.83419,-0.571462,80131,Rue Moulinie 34,33000,Bordeaux,44.8325767,-0.5743935,1830,1458,2016-07-30 20:55:55,2016-07-30 20:59:15,0 +211884,2016-07-30 21:45:16,1215,Moon Wok,17 Place Fernand Lafargue,33000,Bordeaux,44.837299,-0.572124,80341,Avenue Emile Counord 66,33300,Bordeaux,44.8583131,-0.5747824,1510,1422,2016-07-30 22:19:06,2016-07-30 22:32:43,0 +211886,2016-07-30 21:45:22,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80342,Rue De Lurbe 42,33000,Bordeaux,44.84320169999999,-0.5813754,1260,1462,2016-07-30 22:09:17,2016-07-30 22:15:13,0 +211887,2016-07-30 21:45:36,1258,Pitaya Saint-Remi,42 Rue Saint Remi,33000,Bordeaux,44.84127,-0.572691,80343,Place De La Bourse 1,33000,Bordeaux,44.8410114,-0.5698930999999999,1450,1415,2016-07-30 22:01:24,2016-07-30 22:20:26,0 +211448,2016-07-30 20:37:32,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,80138,Rue De La Rousselle 39,33000,Bordeaux,44.8370395,-0.5683842,1300,1458,2016-07-30 20:52:59,2016-07-30 21:08:09,0 +211919,2016-07-30 21:52:34,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80357,Cours De L'Yser 59,33800,Bordeaux,44.82763749999999,-0.5692632,4530,1415,2016-07-30 22:24:57,2016-07-30 22:31:10,0 +211458,2016-07-30 20:38:38,1236,Marhaba,27 Rue Des Faures,33800,Bordeaux,44.834766,-0.565754,80142,Rue Du Loup 80,33000,Bordeaux,44.8375925,-0.5751784999999999,3050,1420,2016-07-30 21:08:35,2016-07-30 21:13:31,0 +211937,2016-07-30 21:56:30,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,80364,Rue De Begles 207,33800,Bordeaux,44.8204686,-0.5658826,1550,1998,2016-07-30 22:09:49,2016-07-30 22:20:30,0 +211959,2016-07-30 22:07:41,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80374,Rue Cornac 4,33000,Bordeaux,44.8509545,-0.5721066,1730,1409,2016-07-30 22:24:02,2016-07-30 22:42:09,0 +211961,2016-07-30 22:08:35,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80376,Rue Mauriac 4,33000,Bordeaux,44.8356333,-0.5673574,2110,1817,2016-07-30 22:25:56,2016-07-30 22:34:44,0 +211470,2016-07-30 20:40:06,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,80150,Rue Bertrand De Goth 77,33800,Bordeaux,44.8206584,-0.5781041,1450,1403,2016-07-30 21:04:27,2016-07-30 21:11:31,0 +211483,2016-07-30 20:41:19,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80154,Cours Georges Clemenceau 19,33000,Bordeaux,44.8426144,-0.5797966,4370,1417,2016-07-30 20:58:38,2016-07-30 21:05:40,0 +211990,2016-07-30 22:15:41,1231,Umami Ramen,8 Place Fernand Lafargue,33000,Bordeaux,44.83691,-0.573943,79140,Cours Journu Auber 18B,33300,Bordeaux,44.8583873,-0.5683251,2150,1471,2016-07-30 22:27:42,2016-07-30 22:39:56,0 +212001,2016-07-30 22:21:42,1205,Taj Mahal,24 Rue Du Parlement Sainte-Catherine,33000,Bordeaux,44.840405,-0.57394,80396,Cours De L'Argonne 38,33000,Bordeaux,44.829183,-0.5735610999999999,2050,1416,2016-07-30 22:42:26,2016-07-30 22:56:09,0 +212010,2016-07-30 22:25:20,1205,Taj Mahal,24 Rue Du Parlement Sainte-Catherine,33000,Bordeaux,44.840405,-0.57394,80400,Boulevard President Franklin Roosevelt 15,33400,Bordeaux,44.82059090000001,-0.5820482,2000,1410,2016-07-30 22:43:33,2016-07-30 23:02:32,0 +212012,2016-07-30 22:25:58,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80401,Rue Neuve 39,33000,Bordeaux,44.8362618,-0.5694502,1450,1415,2016-07-30 22:40:48,2016-07-30 22:46:24,0 +211488,2016-07-30 20:42:34,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80158,Rue Cazemajor 13,33800,Bordeaux,44.825148,-0.5676435,1450,1998,2016-07-30 21:04:11,2016-07-30 21:14:31,0 +212021,2016-07-30 22:29:52,1249,Pitaya Sainte Catherine,275 Rue Sainte Catherine,33000,Bordeaux,44.831692,-0.573207,80400,Boulevard President Franklin Roosevelt 15,33400,Bordeaux,44.82059090000001,-0.5820482,2250,1410,2016-07-30 22:50:16,2016-07-30 23:02:54,0 +211501,2016-07-30 20:44:50,1204,Max A Table,36 Rue Cornac,33000,Bordeaux,44.851402,-0.57587,80163,Rue Marsan 22,33300,Bordeaux,44.8561327,-0.576172,1250,1415,2016-07-30 21:02:32,2016-07-30 21:06:19,0 +211508,2016-07-30 20:45:55,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80168,Rue Des Sablieres 42,33800,Bordeaux,44.825488,-0.5752645,1680,1461,2016-07-30 21:13:31,2016-07-30 21:19:45,0 +211510,2016-07-30 20:46:05,1219,La Tagliatella,14 Rue Guiraude,33000,Bordeaux,44.8393877,-0.5747810999999999,80169,Rue Pasteur 35,33200,Bordeaux,44.8450528,-0.6011569999999999,4085,1411,2016-07-30 21:11:00,2016-07-30 21:23:24,0 +211519,2016-07-30 20:46:55,1254,Funky Burger,5 Rue Du Loup,33000,Bordeaux,44.838081,-0.572281,80172,Rue Monadey 28,33800,Bordeaux,44.8288161,-0.5707895,2050,1817,2016-07-30 21:05:46,2016-07-30 21:14:07,0 From de06d4859dcf590daf7fc6da8fff963c5d8fd646 Mon Sep 17 00:00:00 2001 From: Alexander Hess Date: Tue, 5 Oct 2021 01:28:43 +0200 Subject: [PATCH 5/5] Add exercises for pandas --- .../03_exercises_simple_queries.ipynb | 215 ++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 01_scientific_stack/03_exercises_simple_queries.ipynb diff --git a/01_scientific_stack/03_exercises_simple_queries.ipynb b/01_scientific_stack/03_exercises_simple_queries.ipynb new file mode 100644 index 0000000..e588608 --- /dev/null +++ b/01_scientific_stack/03_exercises_simple_queries.ipynb @@ -0,0 +1,215 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note**: Click on \"*Kernel*\" > \"*Restart Kernel and Run All*\" in [JupyterLab](https://jupyterlab.readthedocs.io/en/stable/) *after* finishing the exercises to ensure that your solution runs top to bottom *without* any errors. If you cannot run this file on your machine, you may want to open it [in the cloud ](https://mybinder.org/v2/gh/webartifex/intro-to-data-science/main?urlpath=lab/tree/01_scientific_stack/03_exercises_simple_queries.ipynb)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 0: Python's Scientific Stack (Coding Exercises)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The exercises below assume that you have read the preceeding content sections.\n", + "\n", + "The `...`'s in the code cells indicate where you need to fill in code snippets. The number of `...`'s within a code cell give you a rough idea of how many lines of code are needed to solve the task. You should not need to create any additional code cells for your final solution. However, you may want to use temporary code cells to try out some ideas." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Queries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The [pd.read_csv() ](https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html#pandas.read_csv) function is very customizable. For example, it takes `dtype` and `parse_dates` inputs, which allows us to parse the timestamp and \"cancelled\" columns correctly right away." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(\n", + " \"orders.csv\",\n", + " index_col=\"order_id\",\n", + " dtype={\"cancelled\": bool},\n", + " parse_dates=[\"placed_at\", \"pickup_at\", \"delivery_at\"]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1**: Write a filter to pull out orders of the restaurant with the name \"Funky Burger\" only!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "funky_burger = ...\n", + "\n", + "df[funky_burger].head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q2**: Ensure that there is only one restaurant by this name!\n", + "\n", + "Hint: While several restaurants may share the same name, their ID is still different" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q3**: How many orders did \"Funky Burger\" *receive* in the target horizon?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(df.loc[...])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q4**: How many orders did \"Funky Burger\" *deliver* in the target horizon?\n", + "\n", + "Hint: \"deliver\" implies that an order must not be cancelled" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(...)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q5**: How much revenue did \"Funky Burger\" make?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "...\n", + " ... & ...,\n", + " \"...\"\n", + "..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q6**: What was the average order's total at \"Funky Burger\"?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "...\n", + " ...\n", + " ...\n", + "..." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}