{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [],
   "source": [
    "import boto3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [],
   "source": [
    "s3 = boto3.client('s3')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "import gzip\n",
    "\n",
    "import pandas\n",
    "\n",
    "import csv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_recent_follower_files():\n",
    "    return s3.list_objects_v2(\n",
    "        Bucket='apollo-data-dumps', \n",
    "        MaxKeys=10,\n",
    "        Prefix='SpotifyArtistFollowers/ExportSpotifyArtistFollowers-2021', \n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_recent_artist_files():\n",
    "    return s3.list_objects_v2(\n",
    "        Bucket='apollo-data-dumps', \n",
    "        MaxKeys=10,\n",
    "        Prefix='SpotifyArtists/ExportSpotifyArtists-2021', \n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'ResponseMetadata': {'RequestId': '620AEF0320000DE1',\n",
       "  'HostId': 'lbXnM/v/H11+f0RNxhCViRA9nrMCrIfXSbHYG/nWnjKCOVlDM36dBjU9/CGVArdTpEEyj32bWPE=',\n",
       "  'HTTPStatusCode': 200,\n",
       "  'HTTPHeaders': {'x-amz-id-2': 'lbXnM/v/H11+f0RNxhCViRA9nrMCrIfXSbHYG/nWnjKCOVlDM36dBjU9/CGVArdTpEEyj32bWPE=',\n",
       "   'x-amz-request-id': '620AEF0320000DE1',\n",
       "   'date': 'Wed, 13 Jan 2021 19:36:19 GMT',\n",
       "   'x-amz-bucket-region': 'eu-west-1',\n",
       "   'content-type': 'application/xml',\n",
       "   'transfer-encoding': 'chunked',\n",
       "   'server': 'AmazonS3'},\n",
       "  'RetryAttempts': 0},\n",
       " 'IsTruncated': False,\n",
       " 'Contents': [{'Key': 'SpotifyArtists/ExportSpotifyArtists-2021-01-05T00.00.00.csv.gz',\n",
       "   'LastModified': datetime.datetime(2021, 1, 5, 18, 26, 54, tzinfo=tzutc()),\n",
       "   'ETag': '\"15fc69ec2c27c9b5ebe94716f9c686bd-7\"',\n",
       "   'Size': 35103005,\n",
       "   'StorageClass': 'STANDARD'},\n",
       "  {'Key': 'SpotifyArtists/ExportSpotifyArtists-2021-01-12T00.00.00.csv.gz',\n",
       "   'LastModified': datetime.datetime(2021, 1, 12, 16, 54, 25, tzinfo=tzutc()),\n",
       "   'ETag': '\"3283edbad1d17c2eb123049552ac9007-7\"',\n",
       "   'Size': 33712857,\n",
       "   'StorageClass': 'STANDARD'}],\n",
       " 'Name': 'apollo-data-dumps',\n",
       " 'Prefix': 'SpotifyArtists/ExportSpotifyArtists-2021',\n",
       " 'MaxKeys': 10,\n",
       " 'EncodingType': 'url',\n",
       " 'KeyCount': 2}"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "artists"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [],
   "source": [
    "artists = get_recent_artist_files()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [],
   "source": [
    "obj = recent['Contents'][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "ename": "ClientError",
     "evalue": "An error occurred (404) when calling the HeadObject operation: Not Found",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mClientError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-131-9c53a2ff66ce>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ms3\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhead_object\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mBucket\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'apollo-data-dumps'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mKey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Key'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m'adad'\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~/src/thundr/tracker/venv/lib/python3.7/site-packages/botocore/client.py\u001b[0m in \u001b[0;36m_api_call\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    355\u001b[0m                     \"%s() only accepts keyword arguments.\" % py_operation_name)\n\u001b[1;32m    356\u001b[0m             \u001b[0;31m# The \"self\" in this scope is referring to the BaseClient.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 357\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_api_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moperation_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    358\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    359\u001b[0m         \u001b[0m_api_call\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpy_operation_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/src/thundr/tracker/venv/lib/python3.7/site-packages/botocore/client.py\u001b[0m in \u001b[0;36m_make_api_call\u001b[0;34m(self, operation_name, api_params)\u001b[0m\n\u001b[1;32m    674\u001b[0m             \u001b[0merror_code\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mparsed_response\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Error\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Code\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    675\u001b[0m             \u001b[0merror_class\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexceptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_code\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merror_code\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 676\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0merror_class\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparsed_response\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moperation_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    677\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    678\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mparsed_response\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mClientError\u001b[0m: An error occurred (404) when calling the HeadObject operation: Not Found"
     ]
    }
   ],
   "source": [
    "s3.head_object(Bucket='apollo-data-dumps', Key=obj['Key'] + 'adad')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [],
   "source": [
    "from importlib import reload"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<module 'boto3' from '/Users/joel/src/thundr/tracker/venv/lib/python3.7/site-packages/boto3/__init__.py'>"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reload(boto3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "s3.download_fileobj?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "def open_s3(key):\n",
    "    with open('/tmp/s3out.gz', 'wb') as gzdata:\n",
    "        s3.download_fileobj('apollo-data-dumps', key, gzdata)\n",
    "    with gzip.open('/tmp/s3out.gz', 'rt') as gzdata:\n",
    "        return list(csv.reader(gzdata, delimiter='\\t'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "rows = open_s3(obj['Key'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "import csv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "197845"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(rows)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "I/O operation on closed file.",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-60-a8004233194d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mrowslist\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrows\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m: I/O operation on closed file."
     ]
    }
   ],
   "source": [
    "rowslist = list(rows)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "artist_data = open_s3(artists['Contents'][0]['Key'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['\\ufeffartist_id',\n",
       "  'artist_name',\n",
       "  'most_recent_album_copyright',\n",
       "  'most_recent_album_release_date',\n",
       "  'most_recent_track_id',\n",
       "  'most_recent_track_isrc'],\n",
       " ['0000BlyH0BpSivfg8y7QSb',\n",
       "  'TWO RUSSIAN COWBOYS',\n",
       "  '2005 Two Russian Cowboys',\n",
       "  '2005-08-04',\n",
       "  '31GJGTb912rLiG8Qs5UhmV',\n",
       "  'uscgj1663078'],\n",
       " ['0001eLqDalxleHQiCiEzXI',\n",
       "  'Doc Sausage & his Mad Lads',\n",
       "  '(C) 2013 Fresh Sound Records',\n",
       "  '2013',\n",
       "  '4IZKq4ZzgAMe6aiGQ91KhH',\n",
       "  'QM7281589185'],\n",
       " ['0001wHqxbF2YYRQxGdbyER',\n",
       "  'Motion Drive',\n",
       "  '2016 YSE-Millennium',\n",
       "  '2016-07-01',\n",
       "  '6tcNeFEqa6Wsv2Jg1tVHlJ',\n",
       "  'GBBYB1602605'],\n",
       " ['0001ZVMPt41Vwzt1zsmuzp',\n",
       "  'Thyro & Yumi',\n",
       "  '2018 Viva Records Corporation',\n",
       "  '2018-03-09',\n",
       "  '2VeQyDRW3mUmmZqWHBV4QB',\n",
       "  'PHV031810200'],\n",
       " ['0002XY9y3JhjzTZqNCqEcv',\n",
       "  'Katie Price & Peter Andre',\n",
       "  '(C) 2006 K and P Recordings',\n",
       "  '2006-01-01',\n",
       "  '32wn8hnfPf4XafdbyDRA0H',\n",
       "  'GBPPM0600001'],\n",
       " ['00045gNg7mLEf9UY9yhD0t',\n",
       "  'Kubus & BangBang',\n",
       "  '(C) 2008 Top Notch',\n",
       "  '2008-01-01',\n",
       "  '2MdfU4IeG6QtNxQHTkKFed',\n",
       "  'NLG660700201'],\n",
       " ['0004C5XZIKZyd2RWvP4sOq',\n",
       "  'Faron Young, Nat Stuckey',\n",
       "  '1977 K-Tel',\n",
       "  '1977',\n",
       "  '7CvKozB0NhwRTcKng00tfP',\n",
       "  'USDEI7902261'],\n",
       " ['0005FKkd2owK8ersgDh5D1',\n",
       "  'Nagirčalmmiid',\n",
       "  '2020 Monkey Collective Productions',\n",
       "  '2020-12-04',\n",
       "  '7tZaRxjwlfR48PKSSFP9Kf',\n",
       "  'QZNWV2012669'],\n",
       " ['00062R77rIfIEB3NClI1E9',\n",
       "  'Orchestravaganza',\n",
       "  '2020 Barnstorm Devoir',\n",
       "  '2020-09-01',\n",
       "  '4XDNA9jiq944pnanEzz9IR',\n",
       "  'SEXGF2019101']]"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "artist_data[0:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pandas.DataFrame(rows[1:], columns=rows[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['followers_count'] = df.followers_count.astype(int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['\\ufeffartist_id', 'followers_count', 'as_of'],\n",
       " ['0001wHqxbF2YYRQxGdbyER', '5741', '2021-01-01T00:00:00'],\n",
       " ['0001ZVMPt41Vwzt1zsmuzp', '12769', '2021-01-01T00:00:00'],\n",
       " ['0002XY9y3JhjzTZqNCqEcv', '1561', '2021-01-01T00:00:00'],\n",
       " ['000BblCiHJeKvtiq5aiHOs', '1957', '2021-01-01T00:00:00'],\n",
       " ['000Dq0VqTZpxOP6jQMscVL', '4552', '2021-01-01T00:00:00']]"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rows[0:6]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[<AxesSubplot:title={'center':'followers_count'}>]], dtype=object)"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.hist(column='followers_count', log=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "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>﻿artist_id</th>\n",
       "      <th>followers_count</th>\n",
       "      <th>as_of</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>71</th>\n",
       "      <td>008PpLcKUtVXle6JSwkq3I</td>\n",
       "      <td>915</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>122</th>\n",
       "      <td>00dhGVtq7dKHii7FPEopwm</td>\n",
       "      <td>25</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>206</th>\n",
       "      <td>00Kj91nF1l4o35fAtfDAjW</td>\n",
       "      <td>29</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>441</th>\n",
       "      <td>01agtJ7Ob6B8N8jC8QvAJ6</td>\n",
       "      <td>29</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>805</th>\n",
       "      <td>01ZP85CNi7Y9t1e0one46k</td>\n",
       "      <td>487</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>196121</th>\n",
       "      <td>7vUQ69pnimnTG3WAWnVP9i</td>\n",
       "      <td>0</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>196417</th>\n",
       "      <td>7wlDjszaVnIH1DpZaJcJHX</td>\n",
       "      <td>0</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>197414</th>\n",
       "      <td>7yyl43NN4h6ZFP1DnbzeaJ</td>\n",
       "      <td>21</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>197572</th>\n",
       "      <td>7zFlr6Y537SdALqy0Xfvth</td>\n",
       "      <td>116</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>197735</th>\n",
       "      <td>7zrkFhYAp6dBxsydmJkouN</td>\n",
       "      <td>10</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>577 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                    ﻿artist_id  followers_count                as_of\n",
       "71      008PpLcKUtVXle6JSwkq3I              915  2021-01-01T00:00:00\n",
       "122     00dhGVtq7dKHii7FPEopwm               25  2021-01-01T00:00:00\n",
       "206     00Kj91nF1l4o35fAtfDAjW               29  2021-01-01T00:00:00\n",
       "441     01agtJ7Ob6B8N8jC8QvAJ6               29  2021-01-01T00:00:00\n",
       "805     01ZP85CNi7Y9t1e0one46k              487  2021-01-01T00:00:00\n",
       "...                        ...              ...                  ...\n",
       "196121  7vUQ69pnimnTG3WAWnVP9i                0  2021-01-01T00:00:00\n",
       "196417  7wlDjszaVnIH1DpZaJcJHX                0  2021-01-01T00:00:00\n",
       "197414  7yyl43NN4h6ZFP1DnbzeaJ               21  2021-01-01T00:00:00\n",
       "197572  7zFlr6Y537SdALqy0Xfvth              116  2021-01-01T00:00:00\n",
       "197735  7zrkFhYAp6dBxsydmJkouN               10  2021-01-01T00:00:00\n",
       "\n",
       "[577 rows x 3 columns]"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df.followers_count < 1000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "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>﻿artist_id</th>\n",
       "      <th>followers_count</th>\n",
       "      <th>as_of</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0001wHqxbF2YYRQxGdbyER</td>\n",
       "      <td>5741</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0001ZVMPt41Vwzt1zsmuzp</td>\n",
       "      <td>12769</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0002XY9y3JhjzTZqNCqEcv</td>\n",
       "      <td>1561</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>000BblCiHJeKvtiq5aiHOs</td>\n",
       "      <td>1957</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>000Dq0VqTZpxOP6jQMscVL</td>\n",
       "      <td>4552</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>197839</th>\n",
       "      <td>7zZ3TJxA3IqtrBU2u5fHXT</td>\n",
       "      <td>3281</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>197840</th>\n",
       "      <td>7zZ9G6gooDsBf5Jryy5zYj</td>\n",
       "      <td>4750</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>197841</th>\n",
       "      <td>7zzEDpdrxCyTTCnQzXseOs</td>\n",
       "      <td>1233</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>197842</th>\n",
       "      <td>7zZqqCg1H2Jpe42p8gFXcd</td>\n",
       "      <td>1122</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>197843</th>\n",
       "      <td>7zzsdcNemyhcNk2wpNsXZt</td>\n",
       "      <td>3145</td>\n",
       "      <td>2021-01-01T00:00:00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>197844 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                    ﻿artist_id  followers_count                as_of\n",
       "0       0001wHqxbF2YYRQxGdbyER             5741  2021-01-01T00:00:00\n",
       "1       0001ZVMPt41Vwzt1zsmuzp            12769  2021-01-01T00:00:00\n",
       "2       0002XY9y3JhjzTZqNCqEcv             1561  2021-01-01T00:00:00\n",
       "3       000BblCiHJeKvtiq5aiHOs             1957  2021-01-01T00:00:00\n",
       "4       000Dq0VqTZpxOP6jQMscVL             4552  2021-01-01T00:00:00\n",
       "...                        ...              ...                  ...\n",
       "197839  7zZ3TJxA3IqtrBU2u5fHXT             3281  2021-01-01T00:00:00\n",
       "197840  7zZ9G6gooDsBf5Jryy5zYj             4750  2021-01-01T00:00:00\n",
       "197841  7zzEDpdrxCyTTCnQzXseOs             1233  2021-01-01T00:00:00\n",
       "197842  7zZqqCg1H2Jpe42p8gFXcd             1122  2021-01-01T00:00:00\n",
       "197843  7zzsdcNemyhcNk2wpNsXZt             3145  2021-01-01T00:00:00\n",
       "\n",
       "[197844 rows x 3 columns]"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
