-
-
Save acstrahl/66b21e90b9a4c65506f18cf690afc987 to your computer and use it in GitHub Desktop.
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": { | |
| "tags": [] | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "import pandas as pd" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "**How to deal with encoding issues** \n", | |
| "I used `Latin-1` because it is a common encoding type when `utf-8` doesn't work. If `Latin-1` also didn't work, there's a way to investigate encoding using the following:\n", | |
| "\n", | |
| "```python\n", | |
| "import chardet\n", | |
| "\n", | |
| "# Open the file in binary mode\n", | |
| "with open('crunchbase-investments.csv', 'rb') as f:\n", | |
| " # Read the contents of the file\n", | |
| " rawdata = f.read()\n", | |
| " # Use chardet to detect the encoding\n", | |
| " result = chardet.detect(rawdata)\n", | |
| " # Print the detected encoding\n", | |
| " print(result)\n", | |
| "```\n", | |
| "\\* Note that the output for this will be `MacRoman` for this dataset, which is very similar to `Latin-1`." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "52870" | |
| ] | |
| }, | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "chunk_iter = pd.read_csv('crunchbase-investments.csv', chunksize=5000, encoding='Latin-1')\n", | |
| "\n", | |
| "cb_length = []\n", | |
| "\n", | |
| "# looking at dataset's length\n", | |
| "for chunk in chunk_iter:\n", | |
| " cb_length.append(len(chunk))\n", | |
| " \n", | |
| "cb_length = sum(cb_length)\n", | |
| "cb_length" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Index(['company_category_code', 'company_city', 'company_country_code',\n", | |
| " 'company_name', 'company_permalink', 'company_region',\n", | |
| " 'company_state_code', 'funded_at', 'funded_month', 'funded_quarter',\n", | |
| " 'funded_year', 'funding_round_type', 'investor_category_code',\n", | |
| " 'investor_city', 'investor_country_code', 'investor_name',\n", | |
| " 'investor_permalink', 'investor_region', 'investor_state_code',\n", | |
| " 'raised_amount_usd'],\n", | |
| " dtype='object')\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "company_category_code 643\n", | |
| "company_city 533\n", | |
| "company_country_code 1\n", | |
| "company_name 1\n", | |
| "company_permalink 1\n", | |
| "company_region 1\n", | |
| "company_state_code 492\n", | |
| "funded_at 3\n", | |
| "funded_month 3\n", | |
| "funded_quarter 3\n", | |
| "funded_year 3\n", | |
| "funding_round_type 3\n", | |
| "investor_category_code 50427\n", | |
| "investor_city 12480\n", | |
| "investor_country_code 12001\n", | |
| "investor_name 2\n", | |
| "investor_permalink 2\n", | |
| "investor_region 2\n", | |
| "investor_state_code 16809\n", | |
| "raised_amount_usd 3599\n", | |
| "dtype: int64" | |
| ] | |
| }, | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# Counting missing values by column\n", | |
| "chunk_iter = pd.read_csv('crunchbase-investments.csv', chunksize=5000, encoding='Latin-1')\n", | |
| "\n", | |
| "mv_list = []\n", | |
| "for chunk in chunk_iter:\n", | |
| " if not mv_list: # check if mv_list is empty\n", | |
| " columns = chunk.columns\n", | |
| " print(columns.sort_values())\n", | |
| " mv_list.append(chunk.isnull().sum())\n", | |
| "combined_mv_vc = pd.concat(mv_list)\n", | |
| "unique_combined_mv_vc = combined_mv_vc.groupby(combined_mv_vc.index).sum()\n", | |
| "unique_combined_mv_vc" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "funded_year 422960\n", | |
| "raised_amount_usd 422960\n", | |
| "investor_category_code 622424\n", | |
| "investor_state_code 2476607\n", | |
| "investor_country_code 2647292\n", | |
| "investor_city 2885083\n", | |
| "company_state_code 3106051\n", | |
| "company_country_code 3172176\n", | |
| "funded_month 3383584\n", | |
| "funded_quarter 3383584\n", | |
| "investor_region 3396281\n", | |
| "funding_round_type 3410707\n", | |
| "company_region 3411545\n", | |
| "company_category_code 3421104\n", | |
| "company_city 3505886\n", | |
| "funded_at 3542185\n", | |
| "company_name 3591326\n", | |
| "investor_name 3915666\n", | |
| "company_permalink 4057788\n", | |
| "investor_permalink 4980548\n", | |
| "dtype: int64" | |
| ] | |
| }, | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# Total memory footprint for each column\n", | |
| "\n", | |
| "chunk_iter = pd.read_csv('crunchbase-investments.csv', chunksize=5000, encoding='Latin-1')\n", | |
| "counter = 0\n", | |
| "series_memory_fp = pd.Series(dtype='float64')\n", | |
| "for chunk in chunk_iter:\n", | |
| " if counter == 0:\n", | |
| " series_memory_fp = chunk.memory_usage(deep=True)\n", | |
| " else:\n", | |
| " series_memory_fp += chunk.memory_usage(deep=True)\n", | |
| " counter += 1\n", | |
| "\n", | |
| "# Drop memory footprint calculation for the index.\n", | |
| "series_memory_fp_before = series_memory_fp.drop('Index').sort_values()\n", | |
| "series_memory_fp_before" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "np.float64(56.98753070831299)" | |
| ] | |
| }, | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# Total memory footprint of the data (in megabytes)\n", | |
| "series_memory_fp_before.sum() / (1024 * 1024)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Drop columns representing URLs or containing too many missing values (>90% missing)\n", | |
| "drop_cols = ['investor_permalink', 'company_permalink', 'investor_category_code', 'funded_month', 'funded_quarter', 'funded_year']\n", | |
| "keep_cols = chunk.columns.drop(drop_cols)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<bound method IndexOpsMixin.tolist of Index(['company_name', 'company_category_code', 'company_country_code',\n", | |
| " 'company_state_code', 'company_region', 'company_city', 'investor_name',\n", | |
| " 'investor_country_code', 'investor_state_code', 'investor_region',\n", | |
| " 'investor_city', 'funding_round_type', 'funded_at',\n", | |
| " 'raised_amount_usd'],\n", | |
| " dtype='object')>" | |
| ] | |
| }, | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "keep_cols.tolist" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Selecting data types" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Key: Column name, Value: List of types\n", | |
| "col_types = {}\n", | |
| "chunk_iter = pd.read_csv('crunchbase-investments.csv', chunksize=5000, encoding='Latin-1', usecols=keep_cols)\n", | |
| "\n", | |
| "for chunk in chunk_iter:\n", | |
| " for col in chunk.columns:\n", | |
| " if col not in col_types:\n", | |
| " col_types[col] = [str(chunk.dtypes[col])]\n", | |
| " else:\n", | |
| " col_types[col].append(str(chunk.dtypes[col]))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'company_name': {'object'},\n", | |
| " 'company_category_code': {'object'},\n", | |
| " 'company_country_code': {'object'},\n", | |
| " 'company_state_code': {'object'},\n", | |
| " 'company_region': {'object'},\n", | |
| " 'company_city': {'object'},\n", | |
| " 'investor_name': {'object'},\n", | |
| " 'investor_country_code': {'float64', 'object'},\n", | |
| " 'investor_state_code': {'float64', 'object'},\n", | |
| " 'investor_region': {'object'},\n", | |
| " 'investor_city': {'float64', 'object'},\n", | |
| " 'funding_round_type': {'object'},\n", | |
| " 'funded_at': {'object'},\n", | |
| " 'raised_amount_usd': {'float64'}}" | |
| ] | |
| }, | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "uniq_col_types = {}\n", | |
| "for k,v in col_types.items():\n", | |
| " uniq_col_types[k] = set(col_types[k])\n", | |
| "uniq_col_types" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 10, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>company_name</th>\n", | |
| " <th>company_category_code</th>\n", | |
| " <th>company_country_code</th>\n", | |
| " <th>company_state_code</th>\n", | |
| " <th>company_region</th>\n", | |
| " <th>company_city</th>\n", | |
| " <th>investor_name</th>\n", | |
| " <th>investor_country_code</th>\n", | |
| " <th>investor_state_code</th>\n", | |
| " <th>investor_region</th>\n", | |
| " <th>investor_city</th>\n", | |
| " <th>funding_round_type</th>\n", | |
| " <th>funded_at</th>\n", | |
| " <th>raised_amount_usd</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>50000</th>\n", | |
| " <td>NuORDER</td>\n", | |
| " <td>fashion</td>\n", | |
| " <td>USA</td>\n", | |
| " <td>CA</td>\n", | |
| " <td>Los Angeles</td>\n", | |
| " <td>West Hollywood</td>\n", | |
| " <td>Mortimer Singer</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>unknown</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>series-a</td>\n", | |
| " <td>2012-10-01</td>\n", | |
| " <td>3060000.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>50001</th>\n", | |
| " <td>ChaCha</td>\n", | |
| " <td>advertising</td>\n", | |
| " <td>USA</td>\n", | |
| " <td>IN</td>\n", | |
| " <td>Indianapolis</td>\n", | |
| " <td>Carmel</td>\n", | |
| " <td>Morton Meyerson</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>unknown</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>series-b</td>\n", | |
| " <td>2007-10-01</td>\n", | |
| " <td>12000000.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>50002</th>\n", | |
| " <td>Binfire</td>\n", | |
| " <td>software</td>\n", | |
| " <td>USA</td>\n", | |
| " <td>FL</td>\n", | |
| " <td>Bocat Raton</td>\n", | |
| " <td>Bocat Raton</td>\n", | |
| " <td>Moshe Ariel</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>unknown</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>angel</td>\n", | |
| " <td>2008-04-18</td>\n", | |
| " <td>500000.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>50003</th>\n", | |
| " <td>Binfire</td>\n", | |
| " <td>software</td>\n", | |
| " <td>USA</td>\n", | |
| " <td>FL</td>\n", | |
| " <td>Bocat Raton</td>\n", | |
| " <td>Bocat Raton</td>\n", | |
| " <td>Moshe Ariel</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>unknown</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>angel</td>\n", | |
| " <td>2010-01-01</td>\n", | |
| " <td>750000.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>50004</th>\n", | |
| " <td>Unified Color</td>\n", | |
| " <td>software</td>\n", | |
| " <td>USA</td>\n", | |
| " <td>CA</td>\n", | |
| " <td>SF Bay</td>\n", | |
| " <td>South San Frnacisco</td>\n", | |
| " <td>Mr. Andrew Oung</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>unknown</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>angel</td>\n", | |
| " <td>2010-01-01</td>\n", | |
| " <td>NaN</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " company_name company_category_code company_country_code \\\n", | |
| "50000 NuORDER fashion USA \n", | |
| "50001 ChaCha advertising USA \n", | |
| "50002 Binfire software USA \n", | |
| "50003 Binfire software USA \n", | |
| "50004 Unified Color software USA \n", | |
| "\n", | |
| " company_state_code company_region company_city investor_name \\\n", | |
| "50000 CA Los Angeles West Hollywood Mortimer Singer \n", | |
| "50001 IN Indianapolis Carmel Morton Meyerson \n", | |
| "50002 FL Bocat Raton Bocat Raton Moshe Ariel \n", | |
| "50003 FL Bocat Raton Bocat Raton Moshe Ariel \n", | |
| "50004 CA SF Bay South San Frnacisco Mr. Andrew Oung \n", | |
| "\n", | |
| " investor_country_code investor_state_code investor_region \\\n", | |
| "50000 NaN NaN unknown \n", | |
| "50001 NaN NaN unknown \n", | |
| "50002 NaN NaN unknown \n", | |
| "50003 NaN NaN unknown \n", | |
| "50004 NaN NaN unknown \n", | |
| "\n", | |
| " investor_city funding_round_type funded_at raised_amount_usd \n", | |
| "50000 NaN series-a 2012-10-01 3060000.0 \n", | |
| "50001 NaN series-b 2007-10-01 12000000.0 \n", | |
| "50002 NaN angel 2008-04-18 500000.0 \n", | |
| "50003 NaN angel 2010-01-01 750000.0 \n", | |
| "50004 NaN angel 2010-01-01 NaN " | |
| ] | |
| }, | |
| "execution_count": 10, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "chunk.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 11, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Column: company_name, Unique Values: 11574\n", | |
| "Column: company_category_code, Unique Values: 44\n", | |
| "Column: company_country_code, Unique Values: 3\n", | |
| "Column: company_state_code, Unique Values: 51\n", | |
| "Column: company_region, Unique Values: 547\n", | |
| "Column: company_city, Unique Values: 1230\n", | |
| "Column: investor_name, Unique Values: 10466\n", | |
| "Column: investor_country_code, Unique Values: 75\n", | |
| "Column: investor_state_code, Unique Values: 53\n", | |
| "Column: investor_region, Unique Values: 586\n", | |
| "Column: investor_city, Unique Values: 993\n", | |
| "Column: funding_round_type, Unique Values: 10\n", | |
| "Column: funded_at, Unique Values: 2809\n", | |
| "Column: raised_amount_usd, Unique Values: 1469\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# Analyzing unique value counts\n", | |
| "unique_values = {}\n", | |
| "\n", | |
| "chunk_iter = pd.read_csv('crunchbase-investments.csv', chunksize=5000, encoding='Latin-1', usecols=keep_cols)\n", | |
| "for chunk in chunk_iter:\n", | |
| " for col in chunk.columns:\n", | |
| " if col not in unique_values:\n", | |
| " unique_values[col] = set()\n", | |
| " unique_values[col].update(chunk[col].unique())\n", | |
| "\n", | |
| "for col, unique_vals in unique_values.items():\n", | |
| " print(f\"Column: {col}, Unique Values: {len(unique_vals)}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "List of dataset updates to make: \n", | |
| "- [ ] Update to category data type:\n", | |
| " - `company_category_code`\n", | |
| " - `funding_round_type`\n", | |
| " - `investor_state_code`\n", | |
| " - `investor_country_code`\n", | |
| "- [ ] Convert `funded_at` to datetime" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 12, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "funding_round_type 61906\n", | |
| "investor_country_code 81118\n", | |
| "investor_state_code 81811\n", | |
| "company_category_code 94160\n", | |
| "funded_at 422960\n", | |
| "raised_amount_usd 422960\n", | |
| "investor_city 2885083\n", | |
| "company_state_code 3106051\n", | |
| "company_country_code 3172176\n", | |
| "investor_region 3396281\n", | |
| "company_region 3411545\n", | |
| "company_city 3505886\n", | |
| "company_name 3591326\n", | |
| "investor_name 3915666\n", | |
| "dtype: int64\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "np.float64(26.844910621643066)" | |
| ] | |
| }, | |
| "execution_count": 12, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "col_types = {\n", | |
| " 'company_category_code': 'category',\n", | |
| " 'funding_round_type': 'category',\n", | |
| " 'investor_state_code': 'category',\n", | |
| " 'investor_country_code': 'category'\n", | |
| "}\n", | |
| "\n", | |
| "chunk_iter = pd.read_csv('crunchbase-investments.csv', \n", | |
| " chunksize=5000, \n", | |
| " encoding='Latin-1', \n", | |
| " usecols=keep_cols,\n", | |
| " dtype=col_types,\n", | |
| " parse_dates=['funded_at']\n", | |
| " )\n", | |
| "\n", | |
| "counter = 0\n", | |
| "series_memory_fp = pd.Series(dtype='float64')\n", | |
| "for chunk in chunk_iter:\n", | |
| " if counter == 0:\n", | |
| " series_memory_fp = chunk.memory_usage(deep=True)\n", | |
| " else:\n", | |
| " series_memory_fp += chunk.memory_usage(deep=True)\n", | |
| " counter += 1\n", | |
| "\n", | |
| "# Drop memory footprint calculation for the index.\n", | |
| "series_memory_fp_after = series_memory_fp.drop('Index').sort_values()\n", | |
| "print(series_memory_fp_after)\n", | |
| "\n", | |
| "# Total memory footprint of the data (in megabytes)\n", | |
| "series_memory_fp_after.sum() / (1024 * 1024)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 13, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Before</th>\n", | |
| " <th>After</th>\n", | |
| " <th>Difference</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>funding_round_type</th>\n", | |
| " <td>3410707</td>\n", | |
| " <td>61906.0</td>\n", | |
| " <td>-3348801.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>company_category_code</th>\n", | |
| " <td>3421104</td>\n", | |
| " <td>94160.0</td>\n", | |
| " <td>-3326944.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>funded_at</th>\n", | |
| " <td>3542185</td>\n", | |
| " <td>422960.0</td>\n", | |
| " <td>-3119225.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>investor_country_code</th>\n", | |
| " <td>2647292</td>\n", | |
| " <td>81118.0</td>\n", | |
| " <td>-2566174.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>investor_state_code</th>\n", | |
| " <td>2476607</td>\n", | |
| " <td>81811.0</td>\n", | |
| " <td>-2394796.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>company_country_code</th>\n", | |
| " <td>3172176</td>\n", | |
| " <td>3172176.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>company_name</th>\n", | |
| " <td>3591326</td>\n", | |
| " <td>3591326.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>company_city</th>\n", | |
| " <td>3505886</td>\n", | |
| " <td>3505886.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>company_region</th>\n", | |
| " <td>3411545</td>\n", | |
| " <td>3411545.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>company_state_code</th>\n", | |
| " <td>3106051</td>\n", | |
| " <td>3106051.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>investor_name</th>\n", | |
| " <td>3915666</td>\n", | |
| " <td>3915666.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>investor_city</th>\n", | |
| " <td>2885083</td>\n", | |
| " <td>2885083.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>investor_region</th>\n", | |
| " <td>3396281</td>\n", | |
| " <td>3396281.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>raised_amount_usd</th>\n", | |
| " <td>422960</td>\n", | |
| " <td>422960.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>company_permalink</th>\n", | |
| " <td>4057788</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>funded_month</th>\n", | |
| " <td>3383584</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>funded_quarter</th>\n", | |
| " <td>3383584</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>funded_year</th>\n", | |
| " <td>422960</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>investor_category_code</th>\n", | |
| " <td>622424</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>investor_permalink</th>\n", | |
| " <td>4980548</td>\n", | |
| " <td>NaN</td>\n", | |
| " <td>NaN</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Before After Difference\n", | |
| "funding_round_type 3410707 61906.0 -3348801.0\n", | |
| "company_category_code 3421104 94160.0 -3326944.0\n", | |
| "funded_at 3542185 422960.0 -3119225.0\n", | |
| "investor_country_code 2647292 81118.0 -2566174.0\n", | |
| "investor_state_code 2476607 81811.0 -2394796.0\n", | |
| "company_country_code 3172176 3172176.0 0.0\n", | |
| "company_name 3591326 3591326.0 0.0\n", | |
| "company_city 3505886 3505886.0 0.0\n", | |
| "company_region 3411545 3411545.0 0.0\n", | |
| "company_state_code 3106051 3106051.0 0.0\n", | |
| "investor_name 3915666 3915666.0 0.0\n", | |
| "investor_city 2885083 2885083.0 0.0\n", | |
| "investor_region 3396281 3396281.0 0.0\n", | |
| "raised_amount_usd 422960 422960.0 0.0\n", | |
| "company_permalink 4057788 NaN NaN\n", | |
| "funded_month 3383584 NaN NaN\n", | |
| "funded_quarter 3383584 NaN NaN\n", | |
| "funded_year 422960 NaN NaN\n", | |
| "investor_category_code 622424 NaN NaN\n", | |
| "investor_permalink 4980548 NaN NaN" | |
| ] | |
| }, | |
| "execution_count": 13, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "df = pd.DataFrame({\n", | |
| " 'Before': series_memory_fp_before,\n", | |
| " 'After': series_memory_fp_after,\n", | |
| " 'Difference': series_memory_fp_after - series_memory_fp_before\n", | |
| "})\n", | |
| "\n", | |
| "df.sort_values('Difference')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 14, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Before total memory: 56.98753070831299\n", | |
| "After total memory: 26.844910621643066\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print(f'Before total memory: {series_memory_fp_before.sum() / (1024 * 1024)}')\n", | |
| "print(f'After total memory: {series_memory_fp_after.sum() / (1024 * 1024)}')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Loading Chunks into SQLite" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 15, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Tables found in the database: ['investments']\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "import sqlite3\n", | |
| "\n", | |
| "conn = sqlite3.connect('crunchbase2.db')\n", | |
| "cursor = conn.cursor()\n", | |
| "\n", | |
| "chunk_iter = pd.read_csv('crunchbase-investments.csv', \n", | |
| " chunksize=5000, \n", | |
| " encoding='Latin-1', \n", | |
| " usecols=keep_cols,\n", | |
| " dtype=col_types,\n", | |
| " parse_dates=['funded_at']\n", | |
| " )\n", | |
| "for chunk in chunk_iter:\n", | |
| " chunk.to_sql(\"investments\", conn, if_exists='append', index=False)\n", | |
| " \n", | |
| "cursor.execute(\"SELECT name FROM sqlite_master WHERE type='table';\")\n", | |
| "tables = cursor.fetchall()\n", | |
| "\n", | |
| "if tables:\n", | |
| " print(\"Tables found in the database:\", [t[0] for t in tables])\n", | |
| "else:\n", | |
| " print(\"No tables found in the database.\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 16, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "[('AdverCar', 'advertising', 'USA', 'CA', 'SF Bay', 'San Francisco', '1-800-FLOWERS.COM', 'USA', 'NY', 'New York', 'New York', 'series-a', '2012-10-30 00:00:00', 2000000), ('LaunchGram', 'news', 'USA', 'CA', 'SF Bay', 'Mountain View', '10Xelerator', 'USA', 'OH', 'Columbus', 'Columbus', 'other', '2012-01-23 00:00:00', 20000), ('uTaP', 'messaging', 'USA', None, 'United States - Other', None, '10Xelerator', 'USA', 'OH', 'Columbus', 'Columbus', 'other', '2012-01-01 00:00:00', 20000), ('ZoopShop', 'software', 'USA', 'OH', 'Columbus', 'columbus', '10Xelerator', 'USA', 'OH', 'Columbus', 'Columbus', 'angel', '2012-02-15 00:00:00', 20000), ('eFuneral', 'web', 'USA', 'OH', 'Cleveland', 'Cleveland', '10Xelerator', 'USA', 'OH', 'Columbus', 'Columbus', 'other', '2011-09-08 00:00:00', 20000)]\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "cursor.execute(\"SELECT * FROM investments LIMIT 5;\")\n", | |
| "print(cursor.fetchall())" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 30, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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jR9//DEH02S/8PBwdOnSJdNt7u7uuHLlSrZnyJiAJ6ew8CMiIiIi+o/70kyZefPmzbkgOaRBgwZK6xpm+HhZCH3Cwo+IiIiI6D8uJ688fQ+sra3/c0NxuY4fEREREamEcwIS5TxN/d6x8CMiIiKiL8pYk+7t27daTkL035Pxe/e1tSG/hkM9iYiIiOiLjIyMYGFhgUePHsHY2FhaO46IspdcLsejR49gYWEBI6NvK91Y+BERERHRF8lkMri4uCAmJgb37t3Tdhyi/xQDAwPkz58fMpnsm/bDwo+IiIiIvsrExAReXl4c7kmUw0xMTDRylZ2FHxERERGpxMDAAGZmZtqOQURZwAHaREREREREeo6FHxERERERkZ5j4UdERERERKTnWPgRERERERHpORZ+REREREREeo6FHxERERERkZ5j4UdERERERKTnWPgRERERERHpORZ+REREREREeo6FHxERERERkZ5j4UdERERERKTnWPgRERERERHpORZ+REREREREeo6FHxERERERkZ5j4UdERERERKTnjNR9QExMDI4ePYp79+7h5cuXcHBwgL+/PwIDA2FmZpYdGYmIiIiIiOgbqHzFLzw8HGXKlEHBggUxZMgQbNmyBUePHsXChQtRq1YtODk5oXv37rh3716WgkyYMAEymQx9+/aV2l6/fo0ePXogT548sLKyQuPGjfHw4UOFx8XFxaFu3bqwsLCAo6MjBg0ahPfv3yv0OXToEEqVKgVTU1MUKlQIS5cuVTr+7Nmz4eHhATMzM5QtWxanT59W2J6TWYiIiIiIiDRJpcLP398ff/31F9q1a4d79+4hISEB586dw7Fjx3D16lWkpqZi69atkMvlCAgIwPr169UKcebMGcyfPx9+fn4K7f369cP27duxfv16HD58GPHx8WjUqJG0PT09HXXr1sXbt29x4sQJLFu2DEuXLsXIkSOlPjExMahbty6qVq2KqKgo9O3bF506dcLevXulPmvXrkX//v0xatQonD9/HiVKlEBwcDCSkpJyPAsREREREZGmyYQQ4mud9u7di+DgYJV2+OTJE8TGxqJ06dIq9U9LS0OpUqUwZ84c/PnnnyhZsiSmT5+OlJQUODg4YNWqVWjSpAkA4Pr16yhatChOnjyJcuXKYffu3ahXrx7i4+Ph5OQEAJg3bx6GDBmCR48ewcTEBEOGDMHO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uLu7o0mTJpgxYwZq1KgBAwON3R5IRERERERE2Ujl6s3d3R3Hjh3DkSNHcPPmzezMRERERERERBqkcuF3/fp1rFy5EgkJCfjhhx9QunRpTJs2DcCH9fuIiIiIiIjo+6TWeM0KFSpg8eLFSEhIQNeuXbF+/Xqkp6eje/fu+Pvvv/Ho0aPsyklERERERERZlKUb9aysrNC5c2ecOHECV65cQenSpTF8+HC4urpqOh8RERERERF9o2+eoaVo0aKYPHkyHjx4gLVr12oiExEREREREWmQxqbmNDIyQqNGjTS1OyIiIiIiItIQrslARERERESk51j4ERERERER6TkWfkRERERERHqOhR8REREREZGeM1KlkzqTtmzatCnLYYiIiIiIiEjzVLriZ2trK33Z2NggMjISZ8+elbafO3cOkZGRsLW1zbagRERERERElDUqXfFbsmSJ9O8hQ4agWbNmmDdvHgwNDQEA6enp6N69O2xsbLInJREREREREWWZ2vf4LV68GAMHDpSKPgAwNDRE//79sXjxYo2GIyIiIiIiom+nduH3/v17XL9+Xan9+vXrkMvlGglFREREREREmqPSUM+PtW/fHh07dsSdO3dQpkwZAMCpU6cwYcIEtG/fXuMBiYiIiIiI6NuoXfhNnjwZzs7OmDJlChISEgAALi4uGDRoEAYMGKDxgERERERERPRt1C78DAwMMHjwYAwePBipqakAwEldiIiIiIiIvmNZWsD9/fv32L9/P1avXg2ZTAYAiI+PR1pamkbDERERERER0bdT+4rfvXv3UKtWLcTFxeHNmzeoUaMGrK2tMXHiRLx58wbz5s3LjpxERERERESURWoXfn369EFAQACio6ORJ08eqf3nn39G586dNRqOiHSPx287c+Q4sRPq5shxiIiIiPSB2oXf0aNHceLECZiYmCi0e3h44MGDBxoLRkRERERERJqh9j1+crkc6enpSu3//vsvrK2tNRKKiIiIiIiINEftwq9mzZqYPn269L1MJkNaWhpGjRqFOnXqaDIbERERERERaYDaQz2nTJmC4OBg+Pj44PXr12jVqhVu3boFe3t7rF69OjsyEhFpDe9ZJCIiIn2gduGXL18+REdHY+3atYiOjkZaWho6duyI1q1bw9zcPDsyEhERERER0TdQu/ADACMjI7Ru3RqtW7fWdB4iIiIiIiLSMLXv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xo0b4+7duwgLC+PSDkRERERERN8JtZdzSEhIwPv375Xa379/j8TERACAq6srnj9//u3piIiIiIiI6JupfcWvatWq6NKlCxYuXAh/f38AwIULF9CtWzdUq1YNAHDp0iV4enpqNikRERER0SdyYugqh62SPlD7it+iRYuQO3dulC5dGqampjA1NUVAQABy586NRYsWAQCsrKwwZcoUjYclIiIiIiIi9al9xc/Z2RkRERG4fv06bt68CQDw9vaGt7e31Kdq1aqaS0hERERE9B+gbxPv6Nv56LosL+BepEgRFClSRJNZiIiIiIiIKBtkqfD7999/sW3bNsTFxeHt27cK26ZOnaqRYERERERERN8LXb+fVO3CLzIyEg0aNECBAgVw/fp1FC9eHLGxsRBCoFSpUtmRkYiIiIiIiL6B2pO7DB06FAMHDsSlS5dgZmaGjRs34v79+6hcuTKaNm2aHRmJiIiIiIjoG6hd+F27dg1t27YFABgZGeHVq1ewsrJCaGgoJk6cqPGARERERERE9G3ULvwsLS2l+/pcXFxw584dadvjx481l4yIiIiIiIg0Qu17/MqVK4djx46haNGiqFOnDgYMGIBLly5h06ZNKFeuXHZkJCIiIiIiom+gduE3depUpKWlAQDGjBmDtLQ0rF27Fl5eXpzRk4iIiIiI6DukVuGXnp6Of//9F35+fgA+DPucN29etgQjIiIiIiIizVDrHj9DQ0PUrFkTz549y648REREREREpGFqT+5SvHhx3L17NzuyEBERERERUTZQu/D7888/MXDgQOzYsQMJCQlITU1V+CIiIiIiIqLvi9qTu9SpUwcA0KBBA8hkMqldCAGZTIb09HTNpSMiIiIiIqJvpnbhd/DgwezIQURERERERNlE7cKvcuXK2ZGDiIiIiIiIsona9/gBwNGjR/HLL7+gfPnyePDgAQBgxYoVOHbsmEbDERERERER0bdTu/DbuHEjgoODYW5ujvPnz+PNmzcAgJSUFIwbN07jAYmIiIiIiOjbZGlWz3nz5uHvv/+GsbGx1F6hQgWcP39eo+GIiIiIiIjo26ld+N24cQOVKlVSare1tUVycrImMhEREREREZEGqV34OTs74/bt20rtx44dQ4ECBTQSioiIiIiIiDRH7cKvc+fO6NOnD06dOgWZTIb4+HiEh4dj4MCB6Natm1r7OnLkCOrXrw9XV1fIZDJs2bJFYbsQAiNHjoSLiwvMzc0RFBSEW7duKfR5+vQpWrduDRsbG9jZ2aFjx45IS0tT6HPx4kX8+OOPMDMzg5ubG8LCwpSyrF+/HkWKFIGZmRl8fX2xa9curWUhIiIiIiLSJLULv99++w2tWrVC9erVkZaWhkqVKqFTp07o0qULevXqpda+Xrx4gRIlSmD27NmZbg8LC8Nff/2FefPm4dSpU7C0tERwcDBev34t9WndujWuXLmCiIgI7NixA0eOHMGvv/4qbU9NTUXNmjXh7u6Oc+fOYdKkSRg9ejQWLFgg9Tlx4gRatmyJjh074sKFC2jYsCEaNmyIy5cv53gWIiIiIiIiTVN7HT+ZTIZhw4Zh0KBBuH37NtLS0uDj4wMrKyu1D167dm3Url07021CCEyfPh3Dhw/HTz/9BABYvnw5nJycsGXLFrRo0QLXrl3Dnj17cObMGQQEBAAAZs6ciTp16mDy5MlwdXVFeHg43r59i8WLF8PExATFihVDVFQUpk6dKhVlM2bMQK1atTBo0CAAwB9//IGIiAjMmjUL8+bNy9Esn3rz5o00cyrwoXgkIiIiIiJSh9pX/FauXImXL1/CxMQEPj4+KFOmTJaKvq+JiYlBYmIigoKCpDZbW1uULVsWJ0+eBACcPHkSdnZ2UqEFAEFBQTAwMMCpU6ekPpUqVYKJiYnUJzg4GDdu3MCzZ8+kPh8fJ6NPxnFyMsunxo8fD1tbW+nLzc1N1aeQiIiIiIgIQBYKv379+sHR0RGtWrXCrl27kJ6enh25kJiYCABwcnJSaHdycpK2JSYmwtHRUWG7kZERcufOrdAns318fIzP9fl4e05l+dTQoUORkpIifd2/fz/TfkRERERERJ+jduGXkJCANWvWQCaToVmzZnBxcUGPHj1w4sSJ7Mj3n2dqagobGxuFLyIiIiIiInWoXfgZGRmhXr16CA8PR1JSEqZNm4bY2FhUrVoVBQsW1FgwZ2dnAMDDhw8V2h8+fChtc3Z2RlJSksL29+/f4+nTpwp9MtvHx8f4XJ+Pt+dUFiIiIiIiIk1Tu/D7mIWFBYKDg1G7dm14eXkhNjZWQ7EAT09PODs7IzIyUmpLTU3FqVOnEBgYCAAIDAxEcnIyzp07J/U5cOAA5HI5ypYtK/U5cuQI3r17J/WJiIiAt7c3cuXKJfX5+DgZfTKOk5NZiIiIiIiINC1Lhd/Lly8RHh6OOnXqIG/evJg+fTp+/vlnXLlyRa39pKWlISoqClFRUQA+TKISFRWFuLg4yGQy9O3bF3/++Se2bduGS5cuoW3btnB1dUXDhg0BAEWLFkWtWrXQuXNnnD59GsePH0fPnj3RokULuLq6AgBatWoFExMTdOzYEVeuXMHatWsxY8YM9O/fX8rRp08f7NmzB1OmTMH169cxevRonD17Fj179gSAHM1CRERERESkaWov59CiRQvs2LEDFhYWaNasGUaMGCFd9VLX2bNnUbVqVen7jAIoJCQES5cuxeDBg/HixQv8+uuvSE5ORsWKFbFnzx6YmZlJjwkPD0fPnj1RvXp1GBgYoHHjxvjrr7+k7ba2tti3bx969OiB0qVLw97eHiNHjlRYPqF8+fJYtWoVhg8fjt9//x1eXl7YsmULihcvLvXJqSxERERERESapnbhZ2hoiHXr1iE4OBiGhoYK2y5fvqxQLH1NlSpVIIT47HaZTIbQ0FCEhoZ+tk/u3LmxatWqLx7Hz88PR48e/WKfpk2bomnTpt9FFiIiIiIiIk1Su/ALDw9X+P758+dYvXo1Fi5ciHPnzmXb8g5ERERERESUNVme3OXIkSMICQmBi4sLJk+ejGrVquGff/7RZDYiIiIiIiLSALWu+CUmJmLp0qVYtGgRUlNT0axZM7x58wZbtmyBj49PdmUkIiIiIiKib6DyFb/69evD29sbFy9exPTp0xEfH4+ZM2dmZzYiIiIiIiLSAJWv+O3evRu9e/dGt27d4OXllZ2ZiIiIiIiISINUvuJ37NgxPH/+HKVLl0bZsmUxa9YsPH78ODuzERERERERkQaoXPiVK1cOf//9NxISEtClSxesWbMGrq6ukMvliIiIwPPnz7MzJxEREREREWWR2rN6WlpaokOHDjh27BguXbqEAQMGYMKECXB0dESDBg2yIyMRERERERF9gywv5wAA3t7eCAsLw7///ovVq1drKhMRERERERFp0DcVfhkMDQ3RsGFDbNu2TRO7IyIiIiIiIg3SSOFHRERERERE3y8WfkRERERERHqOhR8REREREZGeY+FHRERERESk51j4ERERERER6TkWfkRERERERHqOhR8REREREZGeY+FHRERERESk51j4ERERERER6TkWfkRERERERHqOhR8REREREZGeY+FHRERERESk51j4ERERERER6TkWfkRERERERHqOhR8REREREZGeY+FHRERERESk51j4ERERERER6TkWfkRERERERHqOhR8REREREZGeY+FHRERERESk51j4ERERERER6TkWfkRERERERHqOhR8REREREZGeY+FHRERERESk51j4ERERERER6TkWfkRERERERHqOhR8REREREZGeY+FHRERERESk51j4ERERERER6TkWfkRERERERHqOhR8REREREZGeY+FHRERERESk51j4ERERERER6TkWfkRERERERHqOhR8REREREZGeY+FHRERERESk51j4ERERERER6TkWfkRERERERHqOhR8REREREZGeY+FHRERERESk51j4ERERERER6TkWfkRERERERHqOhZ+WzJ49Gx4eHjAzM0PZsmVx+vRpbUciIiIiIiI9xcJPC9auXYv+/ftj1KhROH/+PEqUKIHg4GAkJSVpOxoREREREekhFn5aMHXqVHTu3Bnt27eHj48P5s2bBwsLCyxevFjb0YiIiIiISA8ZaTvAf83bt29x7tw5DB06VGozMDBAUFAQTp48qdT/zZs3ePPmjfR9SkoKACA1NVWt48rfvMxiYvWomyureD7q06dzAXg+WcXXmvp4PlnD15r6eD5Zw9ea+ng+WfM9vtYy+gshvtpXJlTpRRoTHx+PvHnz4sSJEwgMDJTaBw8ejMOHD+PUqVMK/UePHo0xY8bkdEwiIiIiItIR9+/fR758+b7Yh1f8vnNDhw5F//79pe/lcjmePn2KPHnyQCaTZdtxU1NT4ebmhvv378PGxibbjpNTeD7fL306F4Dn8z3Tp3MBeD7fM306F4Dn8z3Tp3MBeD5ZIYTA8+fP4erq+tW+LPxymL29PQwNDfHw4UOF9ocPH8LZ2Vmpv6mpKUxNTRXa7OzssjOiAhsbG734xcvA8/l+6dO5ADyf75k+nQvA8/me6dO5ADyf75k+nQvA81GXra2tSv04uUsOMzExQenSpREZGSm1yeVyREZGKgz9JCIiIiIi0hRe8dOC/v37IyQkBAEBAShTpgymT5+OFy9eoH379tqORkREREREeoiFnxY0b94cjx49wsiRI5GYmIiSJUtiz549cHJy0nY0iampKUaNGqU0zFRX8Xy+X/p0LgDP53umT+cC8Hy+Z/p0LgDP53umT+cC8HyyG2f1JCIi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\n", | |
| "text/plain": [ | |
| "<Figure size 1000x400 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "pd.set_option('display.float_format', '{:.2f}'.format)\n", | |
| "\n", | |
| "\n", | |
| "df = pd.read_sql(\"\"\"\n", | |
| " SELECT company_category_code, AVG(raised_amount_usd)\n", | |
| " FROM investments\n", | |
| " GROUP BY company_category_code\n", | |
| " ORDER BY AVG(raised_amount_usd) DESC;\"\"\", \n", | |
| " conn)\n", | |
| "df = df.set_index('company_category_code')\n", | |
| "\n", | |
| "top_n = 15 # or any number that looks best\n", | |
| "ax = df.head(top_n).plot(kind='bar', figsize=(10, 4))\n", | |
| "ax.set_ylabel('Average Raised Amount (USD)')\n", | |
| "ax.set_title(f'Top {top_n} Categories by Average Raised Amount')\n", | |
| "ax.ticklabel_format(style='plain', axis='y')\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "anaconda-cloud": {}, | |
| "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.11.0rc1" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 4 | |
| } |
Hi Dominic,
I've recently been working on this as homework too! For my project I downcasted raised_amount_usd to float32 (instead of converting to int64) because it handles NaN values, keeps any potential decimal precision (if present), and uses half the memory of float64.
Hope that helps!
Hey Anna, thank you for your seminar on this! You mentioned, as some 'homework' at the end, that we should try to find a more precise data type for
raised_amount_usd. Currently it'sfloat64- I'm guessing you meant that we should convert it toint64since all the values in that column are whole numbers?However, a datatype of
int64requires all values to be non-null. Unfortunately,raised_amount_usddoes not satisfy this condition.I'm having a hard time eliminating null values in an efficient way.
For example, let's say I run
for chunk in chunk_iter...chunk = chunk.dropna(subset=['raised_amount_usd'])to remove null values.If I run
chunk_iter = pd.read_csv(...)in the next cell, as we repeatedly do, it restores all the null values!Do I have to keep running
for chunk in chunk_iter...chunk = chunk.dropna(subset=['raised_amount_usd'])for every cell?One solution that I've found is to define a unique function, which integrates
pd.read_csv(...), as well as an extra step that drops null values for'raised_amount_usd'. I can then run this unique function instead ofpd.read_csv(...)in each cell.Let me know if there's a better way? Also, let me know if there's a better communication channel to reach out!
Thanks, Dominic
Hi Dominic! Thanks for reaching out with your question! Because it's such a great question and would benefit other Dataquesters, would you mind posting it in the Dataquest community and tagging me (@Anna_Strahl)? I'll chime in there :)
Hi both, thank you for your replies!
@joshdisu, I've changed raised_amount_usd to float32 as per your advice. I didn't realise that float32 saves more memory than int64! I wonder whether int64 is still a more appropriate datatype, given the homework question of finding a more precise datatype for raised_amount_usd. Especially as raised_amount_usd is all integer values...But, I guess if all we are concerned about is memory usage, then float32 is more appropriate?
@acstrahl, I've just posted my question in the Dataquest community, titled "Changing datatypes - Crunchbase Data Engineering" and have tagged you. Thank you for looking at this!
Hey Anna, thank you for your seminar on this! You mentioned, as some 'homework' at the end, that we should try to find a more precise data type for
raised_amount_usd. Currently it'sfloat64- I'm guessing you meant that we should convert it toint64since all the values in that column are whole numbers?However, a datatype of
int64requires all values to be non-null. Unfortunately,raised_amount_usddoes not satisfy this condition.I'm having a hard time eliminating null values in an efficient way.
For example, let's say I run
for chunk in chunk_iter...chunk = chunk.dropna(subset=['raised_amount_usd'])to remove null values.If I run
chunk_iter = pd.read_csv(...)in the next cell, as we repeatedly do, it restores all the null values!Do I have to keep running
for chunk in chunk_iter...chunk = chunk.dropna(subset=['raised_amount_usd'])for every cell?One solution that I've found is to define a unique function, which integrates
pd.read_csv(...), as well as an extra step that drops null values for'raised_amount_usd'. I can then run this unique function instead ofpd.read_csv(...)in each cell.Let me know if there's a better way? Also, let me know if there's a better communication channel to reach out!
Thanks,
Dominic