Skip to content

Instantly share code, notes, and snippets.

@matsuu
Last active September 22, 2024 09:49
Show Gist options
  • Save matsuu/d89288586c6375f69f03843269ae0bf3 to your computer and use it in GitHub Desktop.
Save matsuu/d89288586c6375f69f03843269ae0bf3 to your computer and use it in GitHub Desktop.
yellow_tripdata-jupysql-duckdb.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"18fd148855bd480682480d3fab30c786": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "FloatProgressModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "ProgressView",
"bar_style": "",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_48cf84d0db254e85bb14aafcb10cc97d",
"max": 100,
"min": 0,
"orientation": "horizontal",
"style": "IPY_MODEL_0feb33877b5340f6b2f05582b3d7f78e",
"value": 100
}
},
"48cf84d0db254e85bb14aafcb10cc97d": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": "auto"
}
},
"0feb33877b5340f6b2f05582b3d7f78e": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "ProgressStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"bar_color": "black",
"description_width": ""
}
}
}
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/matsuu/d89288586c6375f69f03843269ae0bf3/larger-than-memory-plotting-with-jupysql-and-duckdb.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "uVfkRDGdmSOB",
"outputId": "bbdcf20c-328f-4dd6-f0c8-59d50cdf9866"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"('yellow_tripdata_2024-07.parquet',\n",
" <http.client.HTTPMessage at 0x7d77cdbdffd0>)"
]
},
"metadata": {},
"execution_count": 24
}
],
"source": [
"# Let's grab an example file: a subset of the NYC Taxi dataset:\n",
"from urllib.request import urlretrieve\n",
"\n",
"urlretrieve(\"https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2024-07.parquet\",\n",
" \"yellow_tripdata_2024-07.parquet\")\n"
]
},
{
"cell_type": "code",
"source": [
"# Install jupysql and the DuckDB SQLAlchemy library duckdb-engine\n",
"%pip install jupysql duckdb-engine --quiet\n",
"# Load jupysql\n",
"%load_ext sql\n",
"# Connect jupysql to an in memory DuckDB instance\n",
"%sql duckdb://"
],
"metadata": {
"id": "gD_wTcdxn4sr",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "cd983c1a-25be-453d-b776-c384f91c94e8"
},
"execution_count": 25,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"The sql extension is already loaded. To reload it, use:\n",
" %reload_ext sql\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"%%sql\n",
"CREATE OR REPLACE TABLE yellow_tripdata AS SELECT * FROM 'yellow_tripdata_2024-07.parquet' WHERE trip_distance <= 20.0;"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 90,
"referenced_widgets": [
"18fd148855bd480682480d3fab30c786",
"48cf84d0db254e85bb14aafcb10cc97d",
"0feb33877b5340f6b2f05582b3d7f78e"
]
},
"id": "7K3zQatDHE4H",
"outputId": "25dc2840-4441-4596-f4b4-2c85f6276ddf"
},
"execution_count": 33,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"Running query in 'duckdb://'"
],
"text/html": [
"<span style=\"None\">Running query in &#x27;duckdb://&#x27;</span>"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "18fd148855bd480682480d3fab30c786"
}
},
"metadata": {}
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"+-------+\n",
"| Count |\n",
"+-------+\n",
"+-------+"
],
"text/html": [
"<table>\n",
" <thead>\n",
" <tr>\n",
" <th>Count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>"
]
},
"metadata": {},
"execution_count": 33
}
]
},
{
"cell_type": "code",
"source": [
"%sqlplot histogram --table 'yellow_tripdata' --column trip_distance"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 490
},
"id": "7wCdehEan6zK",
"outputId": "ca84cd29-96d2-4897-f0c7-9468c94775ef"
},
"execution_count": 34,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<Axes: title={'center': \"'trip_distance' from 'yellow_tripdata'\"}, xlabel='trip_distance', ylabel='Count'>"
]
},
"metadata": {},
"execution_count": 34
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlUAAAHHCAYAAACWQK1nAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABFOElEQVR4nO3dfVgU9f7/8deC3AkCodxIopjlXd4lKmKZlRzJyLSs1GMGZnkTauo5pZ3Ku875afottTStzkk8pyz1lJb3Id6mpOZNeUtmmpaCZgLegrLz+6Mv83UFZMFRWH0+rmuvy515z8x7dnbZl5+dnbUZhmEIAAAAV8WtvBsAAAC4ERCqAAAALECoAgAAsAChCgAAwAKEKgAAAAsQqgAAACxAqAIAALAAoQoAAMAChCoAAAALEKqAq5CcnCybzaaDBw9e1+3abDaNHj263PtwBf/5z39Uv359eXh4KDAwsLzbKXeRkZFKTEw0769evVo2m02rV68ut56scPDgQdlsNiUnJ1fodeLGRqjCTakghFzq3Xffvan+eJ49e1ajR492yTfT0aNHKzIyssS6vXv3KjExUXXq1NEHH3yg999//9o3dxUSExN13333lXcb5W7JkiUO/2lwRRs2bNDo0aOVlZVV5nXcd999DgEYFR+hCvhfZQlVvXr10rlz51SrVq1r09Q17OPs2bMaM2aMS4YqZ61evVp2u11TpkxRYmKinnzyyfJuCU5YsmSJxowZU6platWqpXPnzqlXr17XqKvS2bBhg8aMGXNVoQquh1AFlMGZM2ckSe7u7vL29i406nW9VZQ+Kppjx45JUokf+xmGoXPnzl2HjmC1ixcvKi8vTzabTd7e3nJ3dy/vlnATI1QB+uM8k127dmnNmjWy2Wyy2WzmxzAFHxWuWbNGzz//vEJCQlSjRg2HeZeeyxQZGamHH35YX331lZo1ayZvb281bNhQn3/+ean7ys3N1dChQxUcHKwqVarokUce0S+//FKorqg+vv32W8XFxalatWry8fFR7dq19cwzz0j641yR4OBgSdKYMWPMfS74yOX7779XYmKibrvtNnl7eyssLEzPPPOMTpw44bDd0aNHy2az6ccff1RiYqICAwMVEBCg3r176+zZs4X6/Oijj9SqVStVrlxZt9xyi+6991599dVXDjVLly5V27Zt5evrqypVqig+Pl67du0q9WMXGRmpUaNGSZKCg4Md9q/gGC1fvlwtWrSQj4+P3nvvPUnSTz/9pCeeeEJBQUGqXLmyWrdurcWLFzusu+A8pLlz52rMmDG69dZbVaVKFT3++OPKzs5Wbm6uhgwZopCQEPn5+al3797Kzc0tVf+GYSgyMlKdO3cuNO/8+fMKCAhQv379zGm5ubkaNWqUbr/9dnl5eSkiIkIvvfRSqbdbYN68eYqKipKPj4+qVaump556Sr/++qs5/8svv5TNZtP3339vTvvss89ks9n02GOPOayrQYMG6tatm1PbTUxM1LRp0yTJfF4W/Geh4Byn//mf/9HkyZNVp04deXl5affu3UWe/5SYmCg/Pz/99NNPiouLk6+vr8LDwzV27FgZhuGw3aysLCUmJiogIECBgYFKSEgocpTJmdfG6NGj9eKLL0qSateube5Dwetz5syZeuCBBxQSEiIvLy81bNhQ06dPd+rxQcVWqbwbACqCyZMna9CgQfLz89Mrr7wiSQoNDXWoef755xUcHKyRI0eaI1XF2bdvn7p166b+/fsrISFBM2fO1BNPPKFly5bpT3/6k9N9Pfvss/roo4/05z//WW3atNHKlSsVHx9f4nLHjh1Thw4dFBwcrBEjRigwMFAHDx40g11wcLCmT5+uAQMG6NFHHzXfBJs0aSJJSklJ0U8//aTevXsrLCxMu3bt0vvvv69du3bpm2++KTQi9uSTT6p27doaN26ctm7dqn/+858KCQnRG2+8YdaMGTNGo0ePVps2bTR27Fh5enpq48aNWrlypTp06CDpj5PKExISFBcXpzfeeENnz57V9OnTdc8992jbtm1OnUdVYPLkyfr3v/+t+fPna/r06fLz8zP3T5LS09PVo0cP9evXT88995zq1aunzMxMtWnTRmfPntXgwYNVtWpVzZo1S4888oj++9//6tFHH3XYxrhx4+Tj46MRI0boxx9/1DvvvCMPDw+5ubnp5MmTGj16tL755hslJyerdu3aGjlypNP922w2PfXUU5owYYJ+//13BQUFmfMWLlyonJwcPfXUU5Iku92uRx55RF9//bX69u2rBg0aaMeOHZo0aZJ++OEHLViwwOntSn+E9N69e6tly5YaN26cMjMzNWXKFK1fv17btm1TYGCg7rnnHtlsNq1du9Z8XNetWyc3Nzd9/fXX5rqOHz+uvXv3auDA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v6WXmZkpf39/+fj4yN3dXe7u7kXWXLqOknopipeXl7y8vErxaAAAAFdV7iNVl7Pb7crNzVVUVJQ8PDyUmppqzktPT9ehQ4cUExMjSYqJidGOHTscvqWXkpIif39/NWzY0Ky5dB0FNQXr8PT0VFRUlEON3W5XamqqWeNMLwAA4OZWriNVL7/8sjp27KiaNWvq1KlTmj17tlavXq3ly5crICBAffr00bBhwxQUFCR/f38NGjRIMTEx5rftOnTooIYNG6pXr16aMGGCMjIy9OqrryopKckcIerfv7+mTp2ql156Sc8884xWrlypuXPnavHi//uW27Bhw5SQkKAWLVqoVatWmjx5ss6cOaPevXtLklO9AACAm1u5hqpjx47p6aef1tGjRxUQEKAmTZpo+fLl+tOf/iRJmjRpktzc3NS1a1fl5uYqLi5O7777rrm8u7u7Fi1apAEDBigmJka+vr5KSEjQ2LFjzZratWtr8eLFGjp0qKZMmaIaNWron//8p+Li4syabt266fjx4xo5cqQyMjLUrFkzLVu2zOHk9ZJ6AQAAN7cKd52qGxnXqSqM61QBACo6l7tOFQAAgCsjVAEAAFiAUAUAAGABQhUAAIAFCFUAAAAWIFQBAABYgFAFAABgAUIVAACABQhVAAAAFiBUAQAAWIBQBQAAYAFCFQAAgAUIVQAAABaoVN4N4OYWOWJxiTUHx8dfh04AALg6jFQBAABYgFAFAABggTKFqttuu00nTpwoND0rK0u33XbbVTcFAADgasoUqg4ePKj8/PxC03Nzc/Xrr79edVMAAACuplQnqn/55Zfmv5cvX66AgADzfn5+vlJTUxUZGWlZcwAAAK6iVKGqS5cukiSbzaaEhASHeR4eHoqMjNSbb75pWXMAAACuolShym63S5Jq166tzZs3q1q1atekKQAAAFdTputUHThwwOo+AAAAXFqZL/6Zmpqq1NRUHTt2zBzBKvDhhx9edWMAAACupEyhasyYMRo7dqxatGih6tWry2azWd0XAACASylTqJoxY4aSk5PVq1cvq/sBAABwSWW6TlVeXp7atGljdS8AAAAuq0yh6tlnn9Xs2bOt7gUAAMBllenjv/Pnz+v999/XihUr1KRJE3l4eDjMf+uttyxpDgAAwFWUKVR9//33atasmSRp586dDvM4aR0AANyMyhSqVq1aZXUfAAAA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W+3atRUWFuZwXHJycrRx48Zij0tZXrPlpSBQ7du3TytWrFDVqlVLvY6SntcVyS+//KITJ04U26srHbsC//rXvxQVFaWmTZuWetnyOnYl/e2PioqSh4eHw3FIT0/XoUOHij0OZXmtWrEjcEGffvqp4eXlZSQnJxu7d+82+vbtawQGBhoZGRmGYRhGr169jBEjRpj169evNypVqmT8z//8j7Fnzx5j1KhRhoeHh7Fjx47y2oUiDRgwwAgICDBWr15tHD161LydPXvWrLl838aMGWMsX77c2L9/v7Flyxaje/fuhre3t7Fr167y2IUr+stf/mKsXr3aOHDggLF+/XojNjbWqFatmnHs2DHDMFz3uBXIz883atasaQwfPrzQPFc6bqdOnTK2bdtmbNu2zZBkvPXWW8a2bdvMb8CNHz/eCAwMNL744gvj+++/Nzp37mzUrl3bOHfunLmOBx54wHjnnXfM+yW9ZivCvuXl5RmPPPKIUaNGDWP79u0Or8Hc3Nxi962k53VF2b9Tp04Zf/3rX420tDTjwIEDxooVK4zmzZsbd9xxh3H+/Pli988Vjl2B7Oxso3Llysb06dOLXEdFPXbO/O3v37+/UbNmTWPlypXGt99+a8TExBgxMTEO66lXr57x+eefm/edea1aiVDlwt555x2jZs2ahqenp9GqVSvjm2++Mee1a9fOSEhIcKifO3euUbduXcPT09O48847jcWLF1/njksmqcjbzJkzzZrL923IkCHm4xAaGmo89NBDxtatW69/807o1q2bUb16dcPT09O49dZbjW7duhk//vijOd9Vj1uB5cuXG5KM9PT0QvNc6bitWrWqyOdhQf92u9147bXXjNDQUMPLy8to3759oX2uVauWMWrUKIdpV3rNXi9X2rcDBw4U+xpctWqVuY7L962k5/X1dKX9O3v2rNGhQwcjODjY8PDwMGrVqmU899xzhcKRKx67Au+9957h4+NjZGVlFbmOinrsnPnbf+7cOeP55583brnlFqNy5crGo48+ahw9erTQei5dxpnXqpVs/9sEAAAArgLnVAEAAFiAUAUAAGABQhUAAIAFCFUAAAAWIFQBAABYgFAFAABgAUIVAACABQhVAFze6NGj1axZs2u6jfvuu09Dhgwx70dGRmry5MnXdJsAXAuhCkCFdXmQKc5f//rXQr+ReK1t3rxZffv2daqWAAbcHCqVdwMAUFaGYSg/P19+fn7y8/O7rtsODg6+rtsDUPExUgWgQkpMTNSaNWs0ZcoU2Ww22Ww2JScny2azaenSpYqKipKXl5e+/vrrQh//JSYmqkuXLhozZoyCg4Pl7++v/v37Ky8vz6ltnzlzRk8//bT8/PxUvXp1vfnmm4VqLh19MgxDo0ePVs2aNeXl5aXw8HANHjxY0h+jbT///LOGDh1q7ocknThxQj169NCtt96qypUrq3Hjxvrkk08ctnHfffdp8ODBeumllxQUFKSwsDCNHj3aoSYrK0v9+vVTaGiovL291ahRIy1atMic//XXX6tt27by8fFRRESEBg8erDNnzjj1OAAoHUIVgAppypQpiomJ0XPPPaejR4/q6NGjioiIkCSNGDFC48eP1549e9SkSZMil09NTdWePXu0evVqffLJJ/r88881ZswYp7b94osvas2aNfriiy/01VdfafXq1dq6dWux9Z999pkmTZqk9957T/v27dOCBQvUuHFjSdLnn3+uGjVqaOzYseZ+SNL58+cVFRWlxYsXa+fOnerbt6969eqlTZs2Oax71qxZ8vX11caNGzVhwgSNHTtWKSkpkiS73a6OHTtq/fr1+uijj7R7926NHz9e7u7ukqT9+/frwQcfVNeuXfX9999rzpw5+vrrrzVw4ECnHgcApXTNfqoZAK5Su3btjBdeeMG8v2rVKkOSsWDBAoe6UaNGGU2bNjXvJyQkGEFBQcaZM2fMadOnTzf8/PyM/Pz8K27z1KlThqenpzF37lxz2okTJwwfHx+HXmrVqmVMmjTJMAzDePPNN426desaeXl5Ra7z0toriY+PN/7yl7+Y99u1a2fcc889DjUtW7Y0hg8fbhiGYSxfvtxwc3Mz0tPTi1xfnz59jL59+zpMW7duneHm5macO3euxH4AlA4jVQBcTosWLUqsadq0qSpXrmzej4mJ0enTp3X48OErLrd//37l5eUpOjranBYUFKR69eoVu8wTTzyhc+fO6bbbbtNzzz2n+fPn6+LFi1fcTn5+vl5//XU1btxYQUFB8vPz0/Lly3Xo0CGHustH4qpXr65jx45JkrZv364aNWqobt26RW7ju+++U3JysnnOmZ+fn+Li4mS323XgwIEr9geg9DhRHYDL8fX1Le8WHERERCg9PV0rVqxQSkqKnn/+eU2cOFFr1qyRh4dHkctMnDhRU6ZM0eTJk9W4cWP5+vpqyJAhhc77unx5m80mu90uSfLx8bliX6dPn1a/fv3M87suVbNmzdLsIgAnEKoAVFienp7Kz88v07Lfffedzp07ZwaPb775Rn5+fuZ5WcWpU6eOPDw8tHHjRjN4nDx5Uj/88IPatWtX7HI+Pj7q1KmTOnXqpKSkJNWvX187duxQ8+bNi9yP9evXq3Pnznrqqack/XF+1A8//KCGDRs6vY9NmjTRL7/8oh9++KHI0armzZtr9+7duv32251eJ4Cy4+M/ABVWZGSkNm7cqIMHD+q3334zR2ickZeXpz59+mj37t1asmSJRo0apYEDB8rN7cp/9vz8/NSnTx+9+OKLWrlypXbu3KnExMQrLpecnKx//etf2rlzp3766Sd99NFH8vHxUa1atcz9WLt2rX799Vf99ttvkqQ77rhDKSkp2rBhg/bs2aN+/fopMzPT6f2TpHbt2unee+9V165dlZKSogMHDmjp0qVatmyZJGn48OHasGGDBg4cqO3bt2vfvn364osvOFEduEYIVQAqrL/+9a9yd3dXw4YNFRwcXOh8oytp37697rjjDt17773q1q2bHnnkkUKXIyjOxIkT1bZtW3Xq1EmxsbG65557FBUVVWx9YGCgPvjgA919991q0qSJVqxYoYULF6pq1aqSpLFjx+rgwYOqU6eOeX2rV199Vc2bN1dcXJzuu+8+hYWFqUuXLk7vX4HPPvtMLVu2VI8ePdSwYUO99NJL5qhYkyZNtGbNGv3www9q27at7rrrLo0cOVLh4eGl3g6AktkMwzDKuwkAsFJiYqKysrK0YMGC8m4FwE2EkSoAAAALEKoA3FQOHTrkcImBy2+l+YgRAC7Fx38AbioXL17UwYMHi50fGRmpSpX4YjSA0iNUAQAAWICP/wAAACxAqAIAALAAoQoAAMAChCoAAAALEKoAAAAsQKgCAACwAKEKAADAAoQqAAAAC/x/mDryZMWdUXYAAAAASUVORK5CYII=\n"
},
"metadata": {}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment