From 85f569aa803b60350578efbf87ab91f4bdef4581 Mon Sep 17 00:00:00 2001 From: Mark Roth Date: Thu, 28 Mar 2024 09:27:02 -0400 Subject: [PATCH] Add citibike example --- example/Citibike.ipynb | 925 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 925 insertions(+) create mode 100644 example/Citibike.ipynb diff --git a/example/Citibike.ipynb b/example/Citibike.ipynb new file mode 100644 index 0000000..243c443 --- /dev/null +++ b/example/Citibike.ipynb @@ -0,0 +1,925 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ef4ba8c0-2b1e-4dca-96a9-22ff2173b09f", + "metadata": {}, + "source": [ + "# Demo: Gross Adjusted Income vs. Citibike Usage Analysis using Memento\n", + "\n", + "Note: This is not a scientific analysis and is simply a demonstration of a typical research scenario and how Memento might be used to organize a notebook conducting similar research.\n", + "\n", + "
Disclaimer:\n", + "

This document is being distributed for informational and educational purposes only and is not an offer to sell or the solicitation of an offer to buy any securities or other instruments. The information contained herein is not intended to provide, and should not be relied upon for, investment advice. The views expressed herein are not necessarily the views of Two Sigma Investments, LP or any of its affiliates (collectively, “Two Sigma”). Such views reflect the assumptions of the author(s) of the document and are subject to change without notice. The document may employ data derived from third-party sources. No representation is made by Two Sigma as to the accuracy of such information and the use of such information in no way implies an endorsement of the source of such information or its validity.

\n", + "\n", + "

The copyrights and/or trademarks in some of the images, logos or other material used herein may be owned by entities other than Two Sigma. If so, such copyrights and/or trademarks are most likely owned by the entity that created the material and are used purely for identification and comment as fair use under international copyright and/or trademark laws. Use of such image, copyright or trademark does not imply any association with such organization (or endorsement of such organization) by Two Sigma, nor vice versa.

\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "6dfa4249-f92e-4bb5-9494-ff7818ea7ef6", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Init and Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 192, + "id": "d72cca6a-6276-4672-9508-c7537d709fa0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: boto3 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (1.34.71)\n", + "Requirement already satisfied: matplotlib in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (3.8.3)\n", + "Requirement already satisfied: geopy in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (2.4.1)\n", + "Collecting scipy\n", + " Downloading scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (60 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m60.4/60.4 kB\u001b[0m \u001b[31m2.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: botocore<1.35.0,>=1.34.71 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from boto3) (1.34.71)\n", + "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from boto3) (1.0.1)\n", + "Requirement already satisfied: s3transfer<0.11.0,>=0.10.0 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from boto3) (0.10.1)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from matplotlib) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from matplotlib) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from matplotlib) (4.50.0)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from matplotlib) (1.4.5)\n", + "Requirement already satisfied: numpy<2,>=1.21 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from matplotlib) (1.26.4)\n", + "Requirement already satisfied: packaging>=20.0 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from matplotlib) (24.0)\n", + "Requirement already satisfied: pillow>=8 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from matplotlib) (10.2.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from matplotlib) (3.1.2)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from matplotlib) (2.9.0.post0)\n", + "Requirement already satisfied: geographiclib<3,>=1.52 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from geopy) (2.0)\n", + "Requirement already satisfied: urllib3!=2.2.0,<3,>=1.25.4 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from botocore<1.35.0,>=1.34.71->boto3) (2.2.1)\n", + "Requirement already satisfied: six>=1.5 in /home/mroth/data/projects/twosigma/memento/venv/memento/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n", + "Downloading scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (38.4 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m38.4/38.4 MB\u001b[0m \u001b[31m33.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", + "\u001b[?25hInstalling collected packages: scipy\n", + "Successfully installed scipy-1.12.0\n" + ] + } + ], + "source": [ + "# sudo apt-get install graphviz\n", + "!pip install boto3 matplotlib geopy scipy" + ] + }, + { + "cell_type": "code", + "execution_count": 193, + "id": "3abfdc86-14e3-4b40-a460-b9607b7e030a", + "metadata": {}, + "outputs": [], + "source": [ + "from twosigma.memento import memento_function\n", + "import boto3\n", + "from io import BytesIO, StringIO\n", + "import zipfile\n", + "import pandas as pd\n", + "import matplotlib\n", + "import requests\n", + "from geopy.geocoders import Nominatim\n", + "import matplotlib.pyplot as plt\n", + "from scipy import stats" + ] + }, + { + "cell_type": "markdown", + "id": "a9af39a1-229a-4538-89a5-640d6d41317b", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Citibike Trip Data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3ba02267-2f7d-4fed-9868-d3b3a073f0b9", + "metadata": {}, + "outputs": [], + "source": [ + "@memento_function\n", + "def ingest_citibike(year: int):\n", + " bucket = \"tripdata\"\n", + " s3_client = boto3.client(\"s3\")\n", + " zip_filename = f\"{year}-citibike-tripdata.zip\"\n", + " response = s3_client.get_object(Bucket=bucket, Key=zip_filename)\n", + " object_data = response['Body'].read()\n", + " return object_data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "dabae2f4-2662-4879-be95-67a40f850d3a", + "metadata": {}, + "outputs": [], + "source": [ + "def list_citibike_csvs(zip: zipfile.ZipFile) -> list[str]:\n", + " return sorted([file for file in zip.namelist() if file.endswith(\"_1.csv\")], key=lambda f: f[f.rindex(\"/\")+1:])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "100b9534-359b-41c2-a5f7-4fc18f9d1c21", + "metadata": {}, + "outputs": [], + "source": [ + "@memento_function\n", + "def citibike_tripdata_csv(year: int, month: int) -> str:\n", + " yyyymm = f\"{year}{month:02}\"\n", + " data = ingest_citibike(year)\n", + " zip = zipfile.ZipFile(BytesIO(data))\n", + " name_list = list_citibike_csvs(zip)\n", + " names_for_month = [name for name in name_list if yyyymm in name]\n", + " if len(names_for_month) >= 1:\n", + " name = names_for_month[0]\n", + " with zip.open(name) as f:\n", + " return f.read().decode(\"utf-8\")\n", + " else:\n", + " return None\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d4d88f7c-45f1-4837-b83a-627842ef9d12", + "metadata": {}, + "outputs": [], + "source": [ + "@memento_function\n", + "def normalize_citibike_tripdata(year: int, month: int = None) -> pd.DataFrame:\n", + " if month is None:\n", + " all_dfs = [normalize_citibike_tripdata(year, m) for m in range(1, 13)]\n", + " all_dfs = [df for df in all_dfs if df is not None]\n", + " return pd.concat(all_dfs)\n", + " else:\n", + " return pd.read_csv(StringIO(citibike_tripdata_csv(year, month)))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "b7fba306-4b7a-4dba-ad17-8e0d7101dc96", + "metadata": {}, + "outputs": [], + "source": [ + "@memento_function\n", + "def zip_by_lat_long(lat: float, long: float) -> int:\n", + " geolocator = Nominatim(user_agent=\"twosigma_memento_example\")\n", + " location = geolocator.reverse((lat, long))\n", + " if location.raw.get('address', {}).get('postcode'):\n", + " return location.raw['address']['postcode']\n", + " else:\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "6ddbac5a-2375-428f-8b6d-78db6180f5c5", + "metadata": {}, + "outputs": [], + "source": [ + "@memento_function\n", + "def start_usage(year: int) -> pd.DataFrame:\n", + " df = normalize_citibike_tripdata(2020)\n", + " df = df \\\n", + " .groupby(\"start station id\") \\\n", + " .agg(\n", + " count=(\"start station id\", \"size\"),\n", + " lat=(\"start station latitude\", \"first\"),\n", + " long=(\"start station longitude\", \"first\")\n", + " ) \\\n", + " .reset_index() \\\n", + " .drop(\"start station id\", axis=1)\n", + " \n", + " # df is now (count, lat, long). Look up zip code\n", + " df[\"zipcode\"] = df.apply(lambda row: zip_by_lat_long(row[\"lat\"], row[\"long\"]), axis=1)\n", + " return df\n", + "\n", + "\n", + "@memento_function\n", + "def end_usage(year: int) -> pd.DataFrame:\n", + " df = normalize_citibike_tripdata(2020)\n", + " df = df \\\n", + " .groupby(\"end station id\") \\\n", + " .agg(\n", + " count=(\"end station id\", \"size\"),\n", + " lat=(\"end station latitude\", \"first\"),\n", + " long=(\"end station longitude\", \"first\")\n", + " ) \\\n", + " .reset_index() \\\n", + " .drop(\"end station id\", axis=1)\n", + " \n", + " # df is now (count, lat, long). Look up zip code\n", + " df[\"zipcode\"] = df.apply(lambda row: zip_by_lat_long(row[\"lat\"], row[\"long\"]), axis=1)\n", + " return df\n" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "id": "624eb259-621f-4819-b925-13d009f913ed", + "metadata": {}, + "outputs": [], + "source": [ + "@memento_function\n", + "def citibike_activity_by_zip(year: int) -> pd.DataFrame:\n", + " \"\"\"Rides that started or ended in each zip code, over the course of the year\"\"\"\n", + " df_start = start_usage(year)\n", + " df_end = end_usage(year)\n", + " d1 = df_start.drop([\"lat\", \"long\"], axis=1).groupby(\"zipcode\").sum().reset_index()\n", + " d2 = df_end.drop([\"lat\", \"long\"], axis=1).groupby(\"zipcode\").sum().reset_index()\n", + " d3 = d1.set_index(\"zipcode\").add(d2.set_index(\"zipcode\"), fill_value=0).reset_index()\n", + " d3[\"zipcode\"] = d3[\"zipcode\"].astype(int)\n", + " return d3" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "65a60690-226d-4dcf-9a03-94fc991e55e5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "%3\n", + "\n", + "\n", + "\n", + "e1cd35ee\n", + "\n", + "citibike_activity_by_zip\n", + "\n", + "\n", + "\n", + "7f68612d\n", + "\n", + "end_usage\n", + "\n", + "\n", + "\n", + "e1cd35ee->7f68612d\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "ccc846ef\n", + "\n", + "start_usage\n", + "\n", + "\n", + "\n", + "e1cd35ee->ccc846ef\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2c30b248\n", + "\n", + "normalize_citibike_tripdata\n", + "\n", + "\n", + "\n", + "7f68612d->2c30b248\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "93592f4d\n", + "\n", + "zip_by_lat_long\n", + "\n", + "\n", + "\n", + "7f68612d->93592f4d\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "ccc846ef->2c30b248\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "ccc846ef->93592f4d\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "1ed63db4\n", + "\n", + "citibike_tripdata_csv\n", + "\n", + "\n", + "\n", + "2c30b248->1ed63db4\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2d9f38ea\n", + "\n", + "ingest_citibike\n", + "\n", + "\n", + "\n", + "1ed63db4->2d9f38ea\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 115, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "citibike_activity_by_zip.dependencies()" + ] + }, + { + "cell_type": "markdown", + "id": "2867e3ad-794b-4eac-9054-6647eeadec6f", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## IRS Data by Zip Code" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "id": "a413e29e-15a6-4f04-b67c-727f81611b72", + "metadata": {}, + "outputs": [], + "source": [ + "@memento_function\n", + "def ingest_irs_gov_zip(year: int) -> bytes:\n", + " url = f\"https://www.irs.gov/pub/irs-soi/{year-2000}zpallnoagi.csv\"\n", + " response = requests.get(url)\n", + " return response.content" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "id": "c5d813cd-9782-48ea-88b6-a21ad954a4a9", + "metadata": {}, + "outputs": [], + "source": [ + "@memento_function\n", + "def normalize_irs_gov_zip(year: int) -> pd.DataFrame:\n", + " data = ingest_irs_gov_zip(year)\n", + " csv = data.decode(\"utf-8\")\n", + " df = pd.read_csv(StringIO(csv))\n", + " df.columns = [col.lower() for col in df.columns]\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "id": "313bf04e-6656-4c83-9661-18524c9be083", + "metadata": {}, + "outputs": [], + "source": [ + "@memento_function\n", + "def irs_agi_per_person_by_zip(year: int) -> pd.DataFrame:\n", + " \"\"\"Compute mean AGI per person in each ZIP\"\"\"\n", + " df = normalize_irs_gov_zip(year)\n", + " # (a00100: AGI, n1: count)\n", + " df[\"agi\"] = df[\"a00100\"] * 1000.0 / df[\"n1\"]\n", + " return df[[\"zipcode\", \"agi\"]]" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "id": "10904a66-d5a2-4b0d-b7bf-915f3af94cf5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "%3\n", + "\n", + "\n", + "\n", + "2cf646b3\n", + "\n", + "irs_agi_per_person_by_zip\n", + "\n", + "\n", + "\n", + "01594205\n", + "\n", + "normalize_irs_gov_zip\n", + "\n", + "\n", + "\n", + "2cf646b3->01594205\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fc7ceed1\n", + "\n", + "ingest_irs_gov_zip\n", + "\n", + "\n", + "\n", + "01594205->fc7ceed1\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 172, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "irs_agi_per_person_by_zip.dependencies()" + ] + }, + { + "cell_type": "markdown", + "id": "464c8390-88e0-48c2-b021-3679d6f5403e", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Join" + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "id": "edad20e6-3382-4483-850f-3872cc997685", + "metadata": {}, + "outputs": [], + "source": [ + "@memento_function\n", + "def citibike_usage_and_agi_by_zip(year: int) -> pd.DataFrame:\n", + " df_citibike = citibike_activity_by_zip(2020) \n", + " df_irs = irs_agi_per_person_by_zip(2020)\n", + " df = df_citibike.rename(columns={\"count\": \"citibike_usage\"}).merge(df_irs, on=\"zipcode\", how=\"inner\")\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "id": "da6b1631-f5aa-4d3e-9c79-c162f570771e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "%3\n", + "\n", + "\n", + "\n", + "2ea77d09\n", + "\n", + "citibike_usage_and_agi_by_zip\n", + "\n", + "\n", + "\n", + "e1cd35ee\n", + "\n", + "citibike_activity_by_zip\n", + "\n", + "\n", + "\n", + "2ea77d09->e1cd35ee\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2cf646b3\n", + "\n", + "irs_agi_per_person_by_zip\n", + "\n", + "\n", + "\n", + "2ea77d09->2cf646b3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "7f68612d\n", + "\n", + "end_usage\n", + "\n", + "\n", + "\n", + "e1cd35ee->7f68612d\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "ccc846ef\n", + "\n", + "start_usage\n", + "\n", + "\n", + "\n", + "e1cd35ee->ccc846ef\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "01594205\n", + "\n", + "normalize_irs_gov_zip\n", + "\n", + "\n", + "\n", + "2cf646b3->01594205\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2c30b248\n", + "\n", + "normalize_citibike_tripdata\n", + "\n", + "\n", + "\n", + "7f68612d->2c30b248\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "93592f4d\n", + "\n", + "zip_by_lat_long\n", + "\n", + "\n", + "\n", + "7f68612d->93592f4d\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "ccc846ef->2c30b248\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "ccc846ef->93592f4d\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "1ed63db4\n", + "\n", + "citibike_tripdata_csv\n", + "\n", + "\n", + "\n", + "2c30b248->1ed63db4\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2d9f38ea\n", + "\n", + "ingest_citibike\n", + "\n", + "\n", + "\n", + "1ed63db4->2d9f38ea\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "fc7ceed1\n", + "\n", + "ingest_irs_gov_zip\n", + "\n", + "\n", + "\n", + "01594205->fc7ceed1\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 186, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "citibike_usage_and_agi_by_zip.dependencies()" + ] + }, + { + "cell_type": "markdown", + "id": "ced52459-bb32-4bf6-a8f2-20285a473110", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Plot" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "id": "ddcd59f2-6a3d-49a8-9315-42f5e756c6b4", + "metadata": {}, + "outputs": [], + "source": [ + "df = citibike_usage_and_agi_by_zip(year=2020)" + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "id": "650f954a-5498-4ecc-bafc-d74163526611", + "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", + "
zipcodecitibike_usageagi
070873.042344.191546
1730245.0165762.133241
273047.050591.104553
3730611.059873.759398
4730717.063170.202952
............
8811238249581.0114466.614810
891136936586.038412.689585
90113737126.036881.548056
911138558067.050903.892801
92114151511.070225.906736
\n", + "

93 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " zipcode citibike_usage agi\n", + "0 7087 3.0 42344.191546\n", + "1 7302 45.0 165762.133241\n", + "2 7304 7.0 50591.104553\n", + "3 7306 11.0 59873.759398\n", + "4 7307 17.0 63170.202952\n", + ".. ... ... ...\n", + "88 11238 249581.0 114466.614810\n", + "89 11369 36586.0 38412.689585\n", + "90 11373 7126.0 36881.548056\n", + "91 11385 58067.0 50903.892801\n", + "92 11415 1511.0 70225.906736\n", + "\n", + "[93 rows x 3 columns]" + ] + }, + "execution_count": 188, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 202, + "id": "38eef90d-c762-4561-9273-3f0fb766376f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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tiztiIiIiEyNyWwl5uFkb9B2RERERKbGZLYSC/Jzg7fcHsUV4JIhv6pBkJ+bKcMiIiIi0hmT2UrM2kqG8D7+AFAkoVXdDu/jz3qzREREZLGYzFZyYQHeWDO8NbzkmkMJvOT2WDO8NevMEhERkUXjogmEsABvdPf34gpgREREJDlm7Zk9duwY+vTpg5o1a0Imk2HHjh0ltt+2bRu6d++OGjVqwNnZGcHBwdi3b59pgq3grK1kCK5fHS+1qoXg+tWZyBIREZEkmDWZffLkCVq2bIlVq1bp1P7YsWPo3r079uzZgzNnzuDFF19Enz59cO7cOSNHSkRERESWSCaEsIjlnWQyGbZv345+/frptV+zZs0wePBgzJs3T6f2GRkZkMvlSE9Ph7OzcxkiJSIiIiJj0idfk/SYWaVSiczMTLi5FV86KicnBzk5OerbGRkZpgiNiIiIiExA0tUMPvroIzx+/BiDBg0qts2iRYsgl8vVPz4+PiaMkIiIiIiMSbLJ7KZNmxAREYEff/wRHh4exbabM2cO0tPT1T937941YZREREREZEySHGawZcsWjB07Fj/99BNCQkJKbGtnZwc7OzsTRUZEREREpiS5ntnNmzdj9OjR2Lx5M3r37m3ucIiIiIjIjMzaM/v48WPcuHFDfTsxMRGxsbFwc3NDnTp1MGfOHNy7dw/fffcdgPyhBSNHjsSnn36Kdu3aITk5GQBQtWpVyOVyszwGIiIiIjIfs/bMnj59GoGBgQgMDAQATJ8+HYGBgeoyW0lJSbhz5466/bp165CXl4dJkybB29tb/TNlyhSzxE9ERERE5mUxdWZNhXVmiYiIiCybPvma5MbMEhERERGpMJklIiIiIsliMktEREREksVkloiIiIgki8ksEREREUkWk1kiIiIikiwms0REREQkWUxmiYiIiEiymMwSERERkWQxmSUiIiIiyWIyS0RERESSxWSWiIiIiCSLySwRERERSRaTWSIiIiKSLCazRERERCRZTGaJiIiISLKYzBIRERGRZDGZJSIiIiLJYjJLRERERJLFZJaIiIiIJIvJLBERERFJFpNZIiIiIpIsJrNEREREJFlMZomIiIhIspjMEhEREZFkMZklIiIiIsliMktEREREksVkloiIiIgki8ksEREREUkWk1kiIiIikiwms0REREQkWUxmiYiIiEiymMwSERER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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8, 6))\n", + "x = df[\"agi\"]\n", + "y = df[\"citibike_usage\"]\n", + "slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)\n", + "trend_y = slope * x + intercept\n", + "plt.scatter(x, y)\n", + "plt.plot(x, trend_y, color=\"red\")\n", + "plt.xlabel(\"Mean Adjusted Gross Income (USD) for ZIP Code\")\n", + "plt.ylabel(\"Citibike Trip Starts + Ends\")\n", + "plt.title(\"ZIP Code Mean Income vs. Citibike Trips with Trendline\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 203, + "id": "6e440644-ca0d-4ae6-8acc-9d88dc7c466c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.556482518196366 138727.27634896868 0.3509066738711846 0.0005634972170450429 0.15567018690300002\n" + ] + } + ], + "source": [ + "print(slope, intercept, r_value, p_value, std_err)" + ] + }, + { + "cell_type": "markdown", + "id": "ae8c02c5-0ffa-4eba-b246-2cc6e3f287a4", + "metadata": {}, + "source": [ + "There is a weak but statistically significant positive correlation between zip code mean AGI and citibike trips started or ended in that zip code.\n", + "\n", + "Citibike usage is statistically higher in neighborhoods with higher incomes, which could indicate that wealthier neighborhoods benefit from Citibike more." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "memento", + "language": "python", + "name": "memento" + }, + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}