{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Lesson7-AWSML-Case-Studies.ipynb", "version": "0.3.2", "provenance": [], "collapsed_sections": [ "bq4VmHjPpMOR", "WcZCtRRN6J2l", "YW22mRwZ6RSl", "D6zp_J2K-iVn", "o3j8pTFwixkQ", "MUp-WrPOmJVu" ], "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "metadata": { "id": "j8TnIYSn1rvg", "colab_type": "text" }, "cell_type": "markdown", "source": [ "# Lesson 7: Case Studies\n", "\n", "[Watch Lesson 7: Case Studies Video](https://learning.oreilly.com/videos/aws-certified-machine/9780135556597/9780135556597-ACML_01_07_00)" ] }, { "metadata": { "id": "c_Id55m6Jsbu", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Pragmatic AI Labs\n", "\n" ] }, { "metadata": { "id": "e5p96AqpSDZa", "colab_type": "text" }, "cell_type": "markdown", "source": [ "![alt text](https://paiml.com/images/logo_with_slogan_white_background.png)\n", "\n", "This notebook was produced by [Pragmatic AI Labs](https://paiml.com/). You can continue learning about these topics by:\n", "\n", "* Buying a copy of [Pragmatic AI: An Introduction to Cloud-Based Machine Learning](http://www.informit.com/store/pragmatic-ai-an-introduction-to-cloud-based-machine-9780134863863) from Informit.\n", "* Buying a copy of [Pragmatic AI: An Introduction to Cloud-Based Machine Learning](https://www.amazon.com/Pragmatic-AI-Introduction-Cloud-Based-Learning/dp/0134863860) from Amazon\n", "* Reading an online copy of [Pragmatic AI:Pragmatic AI: An Introduction to Cloud-Based Machine Learning](https://www.safaribooksonline.com/library/view/pragmatic-ai-an/9780134863924/)\n", "* Watching video [Essential Machine Learning and AI with Python and Jupyter Notebook-Video-SafariOnline](https://www.safaribooksonline.com/videos/essential-machine-learning/9780135261118) on Safari Books Online.\n", "* Watching video [AWS Certified Machine Learning-Speciality](https://learning.oreilly.com/videos/aws-certified-machine/9780135556597)\n", "* Purchasing video [Essential Machine Learning and AI with Python and Jupyter Notebook- Purchase Video](http://www.informit.com/store/essential-machine-learning-and-ai-with-python-and-jupyter-9780135261095)\n", "* Viewing more content at [noahgift.com](https://noahgift.com/)\n" ] }, { "metadata": { "id": "bq4VmHjPpMOR", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Load AWS API Keys" ] }, { "metadata": { "id": "aWrzIk7WpRoh", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Put keys in local or remote GDrive: \n", "\n", "`cp ~/.aws/credentials /Users/myname/Google\\ Drive/awsml/`" ] }, { "metadata": { "id": "hPWO_zyRopXN", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Mount GDrive\n" ] }, { "metadata": { "id": "XI73HZNLobp4", "colab_type": "code", "outputId": "fd9be4a2-0f47-4580-9793-49a6f4e44e64", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "cell_type": "code", "source": [ "from google.colab import drive\n", "drive.mount('/content/gdrive', force_remount=True)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Mounted at /content/gdrive\n" ], "name": "stdout" } ] }, { "metadata": { "id": "UNyzZwgmoxwm", "colab_type": "code", "outputId": "80a98691-3926-4666-82c7-f27f606fbfaf", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "cell_type": "code", "source": [ "import os;os.listdir(\"/content/gdrive/My Drive/awsml\")" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['kaggle.json', 'credentials', 'config']" ] }, "metadata": { "tags": [] }, "execution_count": 27 } ] }, { "metadata": { "id": "fYu0ekUlqPk6", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Install Boto" ] }, { "metadata": { "id": "dJDDrUkWrYRY", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "!pip -q install boto3\n" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "FpJhrpSQsK5E", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Create API Config" ] }, { "metadata": { "id": "QxRwGOZtsN0-", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "!mkdir -p ~/.aws &&\\\n", " cp /content/gdrive/My\\ Drive/awsml/credentials ~/.aws/credentials " ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "Kj977UW3rph_", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Test Comprehend API Call" ] }, { "metadata": { "id": "P-A8Cia-raT0", "colab_type": "code", "outputId": "8dc13e19-1f30-4631-cb67-2a4e05a61aec", "colab": { "base_uri": "https://localhost:8080/", "height": 238 } }, "cell_type": "code", "source": [ "import boto3\n", "comprehend = boto3.client(service_name='comprehend', region_name=\"us-east-1\")\n", "text = \"There is smoke in San Francisco\"\n", "comprehend.detect_sentiment(Text=text, LanguageCode='en')" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{'ResponseMetadata': {'HTTPHeaders': {'connection': 'keep-alive',\n", " 'content-length': '160',\n", " 'content-type': 'application/x-amz-json-1.1',\n", " 'date': 'Fri, 14 Dec 2018 16:11:55 GMT',\n", " 'x-amzn-requestid': 'fa00db36-ffba-11e8-882b-8bc33ca9084d'},\n", " 'HTTPStatusCode': 200,\n", " 'RequestId': 'fa00db36-ffba-11e8-882b-8bc33ca9084d',\n", " 'RetryAttempts': 0},\n", " 'Sentiment': 'NEUTRAL',\n", " 'SentimentScore': {'Mixed': 0.008628507144749165,\n", " 'Negative': 0.1037612184882164,\n", " 'Neutral': 0.8582549691200256,\n", " 'Positive': 0.0293553676456213}}" ] }, "metadata": { "tags": [] }, "execution_count": 4 } ] }, { "metadata": { "id": "WcZCtRRN6J2l", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## 7.1 Sagemaker Features" ] }, { "metadata": { "id": "ZAwxrTUcfeko", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Search" ] }, { "metadata": { "id": "xJN-eXYDtpVE", "colab_type": "text" }, "cell_type": "markdown", "source": [ "#### [Demo] Search" ] }, { "metadata": { "id": "60kLF_hRfgZd", "colab_type": "text" }, "cell_type": "markdown", "source": [ "[Manage Machine Learning Experiments with Search](https://docs.aws.amazon.com/sagemaker/latest/dg/search.html)\n", "\n", "\n", "\n", "* Finding training jobs\n", "* Rank training jobs\n", "* Tracing lineage of a model\n", "\n" ] }, { "metadata": { "id": "OVuZQBAg-gHf", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Ground Truth" ] }, { "metadata": { "id": "MYIx7nJT0z2z", "colab_type": "text" }, "cell_type": "markdown", "source": [ "![ground_truth](https://user-images.githubusercontent.com/58792/49688683-9bdba100-faca-11e8-8d93-a55ce6c35a92.png)\n", "\n", "\n", "\n", "* Setup and Manage labeling jobs\n", "* Uses active learning and human labeling\n", "* First 500 objects labeled per month are free\n", "\n" ] }, { "metadata": { "id": "xfvNv4E237k9", "colab_type": "text" }, "cell_type": "markdown", "source": [ "#### [Demo] Labeling Job" ] }, { "metadata": { "id": "0pU-_czP4Blj", "colab_type": "text" }, "cell_type": "markdown", "source": [ "" ] }, { "metadata": { "id": "nl1K5TVY00Pg", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Notebook" ] }, { "metadata": { "id": "guMyo-9P014a", "colab_type": "text" }, "cell_type": "markdown", "source": [ "![notebooks](https://user-images.githubusercontent.com/58792/49688694-d04f5d00-faca-11e8-9fad-eb63b2534b07.png)" ] }, { "metadata": { "id": "o6nEwQ1tGiOl", "colab_type": "text" }, "cell_type": "markdown", "source": [ "#### [Demo] Sagemaker Notebooks\n", "\n", "* Create and run Jupyter Notebooks\n", " - Using Jupyter\n", " - Using JupyterLab\n", " - Using the terminal\n", " \n", "* Lifecycle configurations\n", "\n", "* Git Repositories\n", " - public repositories can be cloned on Notebook launch\n", "\n" ] }, { "metadata": { "id": "iKGPvalK02Yt", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Training" ] }, { "metadata": { "id": "WwNsFi6602eK", "colab_type": "text" }, "cell_type": "markdown", "source": [ "![training](https://user-images.githubusercontent.com/58792/49688717-05f44600-facb-11e8-8d7f-cf33d272573a.png)" ] }, { "metadata": { "id": "UGQQyDJtUN6D", "colab_type": "text" }, "cell_type": "markdown", "source": [ "#### [Demo] Sagemaker Training\n", "\n", "* Algorithms\n", " - Create algorithm\n", " - Subscribe [AWS Marketplace](https://aws.amazon.com/marketplace/search/results?page=1&filters=fulfillment_options%2Cresource_type&fulfillment_options=SAGEMAKER&resource_type=ALGORITHM)\n", "\n", " \n", "* Training Jobs\n", "\n", "* HyperParameter Tuning Jobs\n" ] }, { "metadata": { "id": "F9YxzTDT04lq", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Inference" ] }, { "metadata": { "id": "9OALWADP05aM", "colab_type": "text" }, "cell_type": "markdown", "source": [ "![inference](https://user-images.githubusercontent.com/58792/49688735-2fad6d00-facb-11e8-94cb-cba9322e309b.png)" ] }, { "metadata": { "id": "RQqvKpzIp1Sl", "colab_type": "text" }, "cell_type": "markdown", "source": [ "#### [Demo] Sagemaker Inference\n", "\n", "* Compilation jobs\n", "\n", "* Model packages\n", "\n", "* Models\n", "\n", "* Endpoint configurations\n", "\n", "* Endpoints\n", "\n", "* Batch transform jobs\n" ] }, { "metadata": { "id": "1Q52AI5CW3eh", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Built in Sagemaker Algorithms" ] }, { "metadata": { "id": "NzsQUYX7W5Xa", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Table of [algorithms provided by Amazon Sagemaker](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html)\n", "\n", "![aws_algorithms](https://user-images.githubusercontent.com/58792/49692597-58595500-fb13-11e8-9db3-e1fe371ac36a.png)\n" ] }, { "metadata": { "id": "E4mpkoTycugo", "colab_type": "text" }, "cell_type": "markdown", "source": [ "\n", "\n", "\n" ] }, { "metadata": { "id": "YW22mRwZ6RSl", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## 7.2 DeepLense Features" ] }, { "metadata": { "id": "AIPltTzbsRY6", "colab_type": "text" }, "cell_type": "markdown", "source": [ "![tech_specs](https://user-images.githubusercontent.com/58792/50003518-c0b39680-ff58-11e8-86dc-5a57e1482ef3.png)" ] }, { "metadata": { "id": "QOB1dQJHtmOi", "colab_type": "text" }, "cell_type": "markdown", "source": [ "![mqt](https://user-images.githubusercontent.com/58792/45307777-bfe01400-b4d4-11e8-88a3-149317f9dffc.png)" ] }, { "metadata": { "id": "KNYr5yn4txIw", "colab_type": "text" }, "cell_type": "markdown", "source": [ "![detection](https://user-images.githubusercontent.com/58792/45308029-688e7380-b4d5-11e8-8ffb-9422184c274c.png)" ] }, { "metadata": { "id": "zpGAF0WS-mdS", "colab_type": "text" }, "cell_type": "markdown", "source": [ "#### [Demo] DeepLense" ] }, { "metadata": { "id": "AGmBAdl8Z1EQ", "colab_type": "text" }, "cell_type": "markdown", "source": [ "" ] }, { "metadata": { "id": "fXpNEXuP6RYH", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## 7.3 Kinesis Features" ] }, { "metadata": { "id": "LV-LMaYT-wuO", "colab_type": "text" }, "cell_type": "markdown", "source": [ "[Kinesis FAQ](https://aws.amazon.com/kinesis/data-streams/faqs/)\n", "\n", "* Processes Data in Real-Time\n", "* Can process hundreds of TBs an hour\n", "* Example inputs are: \n", " - logs\n", " - financial transactions\n", " * Streaming Data" ] }, { "metadata": { "id": "Tnye93h6h0jn", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "!pip install -q sensible" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "gCR4VAgV75DC", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "import boto3\n" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "dQVPZr-c799V", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "import asyncio\n", "import time\n", "import datetime\n", "import uuid\n", "import boto3\n", "import json\n", "from sensible.loginit import logger\n", "\n", "LOG = logger(__name__)\n", "\n", "def firehose_client(region_name=\"us-east-1\"):\n", " \"\"\"Kinesis Firehose client\"\"\"\n", "\n", " firehose_conn = boto3.client(\"firehose\", region_name=region_name)\n", " extra_msg = {\"region_name\": region_name, \"aws_service\": \"firehose\"}\n", " LOG.info(\"firehose connection initiated\", extra=extra_msg)\n", " return firehose_conn\n", "\n", "async def put_record(data,\n", " client,\n", " delivery_stream_name=\"aws-ml-cert\"):\n", " \"\"\"\n", " See this:\n", " http://boto3.readthedocs.io/en/latest/reference/services/\n", " firehose.html#Firehose.Client.put_record\n", " \"\"\"\n", " extra_msg = {\"aws_service\": \"firehose\"}\n", " LOG.info(f\"Pushing record to firehose: {data}\", extra=extra_msg)\n", " response = client.put_record(\n", " DeliveryStreamName=delivery_stream_name,\n", " Record={\n", " 'Data': data\n", " }\n", " )\n", " return response\n", "\n", "\n", "def gen_uuid_events():\n", " \"\"\"Creates a time stamped UUID based event\"\"\"\n", "\n", " current_time = 'test-{date:%Y-%m-%d %H:%M:%S}'.format(date=datetime.datetime.now())\n", " event_id = str(uuid.uuid4())\n", " event = {event_id:current_time}\n", " return json.dumps(event)\n", "\n", "def send_async_firehose_events(count=100):\n", " \"\"\"Async sends events to firehose\"\"\"\n", "\n", " start = time.time() \n", " client = firehose_client()\n", " extra_msg = {\"aws_service\": \"firehose\"}\n", " loop = asyncio.get_event_loop()\n", " tasks = []\n", " LOG.info(f\"sending aysnc events TOTAL {count}\",extra=extra_msg)\n", " num = 0\n", " for _ in range(count):\n", " tasks.append(asyncio.ensure_future(put_record(gen_uuid_events(), client)))\n", " LOG.info(f\"sending aysnc events: COUNT {num}/{count}\")\n", " num +=1\n", " loop.run_until_complete(asyncio.wait(tasks))\n", " loop.close()\n", " end = time.time() \n", " LOG.info(\"Total time: {}\".format(end - start))\n", "\n" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "nhWXJvwc8hNp", "colab_type": "code", "outputId": "6f5cd3d1-bb57-4381-812e-bd9dfad79071", "colab": { "base_uri": "https://localhost:8080/", "height": 428 } }, "cell_type": "code", "source": [ "send_async_firehose_events(10)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "2018-12-14 18:49:58,211 - __main__ - INFO - firehose connection initiated\n", "2018-12-14 18:49:58,213 - __main__ - INFO - sending aysnc events TOTAL 10\n", "2018-12-14 18:49:58,214 - __main__ - INFO - sending aysnc events: COUNT 0/10\n", "2018-12-14 18:49:58,216 - __main__ - INFO - sending aysnc events: COUNT 1/10\n", "2018-12-14 18:49:58,220 - __main__ - INFO - sending aysnc events: COUNT 2/10\n", "2018-12-14 18:49:58,221 - __main__ - INFO - sending aysnc events: COUNT 3/10\n", "2018-12-14 18:49:58,225 - __main__ - INFO - sending aysnc events: COUNT 4/10\n", "2018-12-14 18:49:58,228 - __main__ - INFO - sending aysnc events: COUNT 5/10\n", "2018-12-14 18:49:58,231 - __main__ - INFO - sending aysnc events: COUNT 6/10\n", "2018-12-14 18:49:58,233 - __main__ - INFO - sending aysnc events: COUNT 7/10\n", "2018-12-14 18:49:58,236 - __main__ - INFO - sending aysnc events: COUNT 8/10\n", "2018-12-14 18:49:58,237 - __main__ - INFO - sending aysnc events: COUNT 9/10\n", "2018-12-14 18:49:58,242 - __main__ - INFO - Pushing record to firehose: {\"23bacac0-6eff-410f-b655-a7faa122b68f\": \"test-2018-12-14 18:49:58\"}\n", "2018-12-14 18:49:58,364 - __main__ - INFO - Pushing record to firehose: {\"03b15c89-e0a2-46b8-b8d3-cdd71e2ab140\": \"test-2018-12-14 18:49:58\"}\n", "2018-12-14 18:49:58,404 - __main__ - INFO - Pushing record to firehose: {\"5ff296d3-f43a-4e69-b61b-624603a354b4\": \"test-2018-12-14 18:49:58\"}\n", "2018-12-14 18:49:58,448 - __main__ - INFO - Pushing record to firehose: {\"7ca78179-7ff7-49d1-bd6c-08ca5569737c\": \"test-2018-12-14 18:49:58\"}\n", "2018-12-14 18:49:58,486 - __main__ - INFO - Pushing record to firehose: {\"554e587b-2d59-4e4f-95a3-75e4fb129c60\": \"test-2018-12-14 18:49:58\"}\n", "2018-12-14 18:49:58,511 - __main__ - INFO - Pushing record to firehose: {\"30532d9e-6f3a-4366-b6ab-3bf9291c4e0b\": \"test-2018-12-14 18:49:58\"}\n", "2018-12-14 18:49:58,548 - __main__ - INFO - Pushing record to firehose: {\"99cdff7d-32d1-424b-886e-9e93bb5e5a03\": \"test-2018-12-14 18:49:58\"}\n", "2018-12-14 18:49:58,575 - __main__ - INFO - Pushing record to firehose: {\"8ea0c709-a8a5-4bde-9454-c6dd5691d58a\": \"test-2018-12-14 18:49:58\"}\n", "2018-12-14 18:49:58,610 - __main__ - INFO - Pushing record to firehose: {\"99ce9671-7971-415c-9c64-ac2c82f9f478\": \"test-2018-12-14 18:49:58\"}\n", "2018-12-14 18:49:58,643 - __main__ - INFO - Pushing record to firehose: {\"dc515833-8474-4377-9514-0f6d6fcfa403\": \"test-2018-12-14 18:49:58\"}\n", "2018-12-14 18:49:58,677 - __main__ - INFO - Total time: 0.5094583034515381\n" ], "name": "stderr" } ] }, { "metadata": { "id": "D6zp_J2K-iVn", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## 7.4 AWS Flavored Python" ] }, { "metadata": { "id": "PG-xBi-u-27q", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Boto3" ] }, { "metadata": { "id": "o9NCTCQe5yC_", "colab_type": "text" }, "cell_type": "markdown", "source": [ "* Main Interface for working with AWS\n", "\n", "* Any Service in AWS can be communicated with Boto\n", "* If Amazon is a country this is the language\n", "\n" ] }, { "metadata": { "id": "JjEX_5Xbe4BM", "colab_type": "text" }, "cell_type": "markdown", "source": [ "#### Communicate with S3" ] }, { "metadata": { "id": "T8SwLHP7iZ4z", "colab_type": "code", "outputId": "5c79f31c-9f3c-4a8b-f0bf-8bce2233a332", "colab": { "base_uri": "https://localhost:8080/", "height": 5511 } }, "cell_type": "code", "source": [ "import boto3\n", "resource = boto3.resource(\"s3\")\n", "resource.meta.client.download_file('testntest', 'nba_2017_endorsement_full_stats.csv',\n", "'/tmp/nba_2017_endorsement_full_stats.csv')" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "{\"message\": \"Loading JSON file: /usr/local/lib/python3.6/dist-packages/boto3/data/s3/2006-03-01/resources-1.json\"}\n", "{\"message\": \"Loading JSON file: /usr/local/lib/python3.6/dist-packages/boto3/data/s3/2006-03-01/resources-1.json\"}\n", "{\"message\": \"Event choose-service-name: calling handler \"}\n", "{\"message\": \"Event choose-service-name: calling handler \"}\n", "{\"message\": \"Loading JSON file: /usr/local/lib/python3.6/dist-packages/botocore/data/s3/2006-03-01/service-2.json\"}\n", "{\"message\": \"Loading JSON file: /usr/local/lib/python3.6/dist-packages/botocore/data/s3/2006-03-01/service-2.json\"}\n", "{\"message\": \"Event creating-client-class.s3: calling handler \"}\n", "{\"message\": \"Event creating-client-class.s3: calling handler \"}\n", "{\"message\": \"Event creating-client-class.s3: calling handler ._handler at 0x7f8fb54f9730>\"}\n", "{\"message\": \"Event creating-client-class.s3: calling handler ._handler at 0x7f8fb54f9730>\"}\n", "{\"message\": \"Event creating-client-class.s3: calling handler \"}\n", "{\"message\": \"Event creating-client-class.s3: calling handler \"}\n", "{\"message\": \"The s3 config key is not a dictionary type, ignoring its value of: None\"}\n", "{\"message\": \"The s3 config key is not a dictionary type, ignoring its value of: None\"}\n", "{\"message\": \"Setting s3 timeout as (60, 60)\"}\n", "{\"message\": \"Setting s3 timeout as (60, 60)\"}\n", "{\"message\": \"Registering retry handlers for service: s3\"}\n", "{\"message\": \"Registering retry handlers for service: s3\"}\n", "{\"message\": \"Defaulting to S3 virtual host style addressing with path style addressing fallback.\"}\n", "{\"message\": \"Defaulting to S3 virtual host style addressing with path style addressing fallback.\"}\n", "{\"message\": \"Loading s3:s3\"}\n", "{\"message\": \"Loading s3:s3\"}\n", "{\"message\": \"Acquiring 0\"}\n", "{\"message\": \"Acquiring 0\"}\n", "{\"message\": \"DownloadSubmissionTask(transfer_id=0, {'transfer_future': }) about to wait for the following futures []\"}\n", "{\"message\": \"DownloadSubmissionTask(transfer_id=0, {'transfer_future': }) about to wait for the following futures []\"}\n", "{\"message\": \"DownloadSubmissionTask(transfer_id=0, {'transfer_future': }) done waiting for dependent futures\"}\n", "{\"message\": \"DownloadSubmissionTask(transfer_id=0, {'transfer_future': }) done waiting for dependent futures\"}\n", "{\"message\": \"Executing task DownloadSubmissionTask(transfer_id=0, {'transfer_future': }) with kwargs {'client': , 'config': , 'osutil': , 'request_executor': , 'transfer_future': , 'io_executor': }\"}\n", "{\"message\": \"Executing task DownloadSubmissionTask(transfer_id=0, {'transfer_future': }) with kwargs {'client': , 'config': , 'osutil': , 'request_executor': , 'transfer_future': , 'io_executor': }\"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event before-call.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event before-call.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event before-call.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event before-call.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Making request for OperationModel(name=HeadObject) with params: {'url_path': '/testntest/nba_2017_endorsement_full_stats.csv', 'query_string': {}, 'method': 'HEAD', 'headers': {'User-Agent': 'Boto3/1.9.62 Python/3.6.7 Linux/4.14.65+ Botocore/1.12.62 Resource'}, 'body': b'', 'url': 'https://s3.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv', 'context': {'client_region': 'us-east-1', 'client_config': , 'has_streaming_input': False, 'auth_type': None, 'signing': {'bucket': 'testntest'}}}\"}\n", "{\"message\": \"Making request for OperationModel(name=HeadObject) with params: {'url_path': '/testntest/nba_2017_endorsement_full_stats.csv', 'query_string': {}, 'method': 'HEAD', 'headers': {'User-Agent': 'Boto3/1.9.62 Python/3.6.7 Linux/4.14.65+ Botocore/1.12.62 Resource'}, 'body': b'', 'url': 'https://s3.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv', 'context': {'client_region': 'us-east-1', 'client_config': , 'has_streaming_input': False, 'auth_type': None, 'signing': {'bucket': 'testntest'}}}\"}\n", "{\"message\": \"Event request-created.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event request-created.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event request-created.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event request-created.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event choose-signer.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event before-sign.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event before-sign.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Checking for DNS compatible bucket for: https://s3.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"Checking for DNS compatible bucket for: https://s3.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"URI updated to: https://testntest.s3.amazonaws.com/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"URI updated to: https://testntest.s3.amazonaws.com/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"CanonicalRequest:\\nHEAD\\n/nba_2017_endorsement_full_stats.csv\\n\\nhost:testntest.s3.amazonaws.com\\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\\nx-amz-date:20181214T190639Z\\n\\nhost;x-amz-content-sha256;x-amz-date\\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\n", "{\"message\": \"CanonicalRequest:\\nHEAD\\n/nba_2017_endorsement_full_stats.csv\\n\\nhost:testntest.s3.amazonaws.com\\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\\nx-amz-date:20181214T190639Z\\n\\nhost;x-amz-content-sha256;x-amz-date\\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T190639Z\\n20181214/us-east-1/s3/aws4_request\\ndc464718e66f61dbbd6306f072011e817a11700464a81c78e77bac008daaa11b\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T190639Z\\n20181214/us-east-1/s3/aws4_request\\ndc464718e66f61dbbd6306f072011e817a11700464a81c78e77bac008daaa11b\"}\n", "{\"message\": \"Signature:\\ndccf5cd1ba1f8ffd257e709de85d54d05de887bf6c7a0539fb74f037e3c727de\"}\n", "{\"message\": \"Signature:\\ndccf5cd1ba1f8ffd257e709de85d54d05de887bf6c7a0539fb74f037e3c727de\"}\n", "{\"message\": \"Event request-created.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event request-created.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Starting new HTTPS connection (1): testntest.s3.amazonaws.com\"}\n", "{\"message\": \"Starting new HTTPS connection (1): testntest.s3.amazonaws.com\"}\n", "{\"message\": \"https://testntest.s3.amazonaws.com:443 \\\"HEAD /nba_2017_endorsement_full_stats.csv HTTP/1.1\\\" 400 0\"}\n", "{\"message\": \"https://testntest.s3.amazonaws.com:443 \\\"HEAD /nba_2017_endorsement_full_stats.csv HTTP/1.1\\\" 400 0\"}\n", "{\"message\": \"Response headers: {'x-amz-request-id': '22146DB0C1CFB102', 'x-amz-id-2': 'L5unIiNB7+FTulP8F6l1f4Blmuo6WKNSZ5oKnNlJI4QMN/lL6amNBiEKIyFg7MgUmogD/X4FA2o=', 'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Date': 'Fri, 14 Dec 2018 19:06:39 GMT', 'Connection': 'close', 'Server': 'AmazonS3'}\"}\n", "{\"message\": \"Response headers: {'x-amz-request-id': '22146DB0C1CFB102', 'x-amz-id-2': 'L5unIiNB7+FTulP8F6l1f4Blmuo6WKNSZ5oKnNlJI4QMN/lL6amNBiEKIyFg7MgUmogD/X4FA2o=', 'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Date': 'Fri, 14 Dec 2018 19:06:39 GMT', 'Connection': 'close', 'Server': 'AmazonS3'}\"}\n", "{\"message\": \"Response body:\\nb''\"}\n", "{\"message\": \"Response body:\\nb''\"}\n", "{\"message\": \"Event needs-retry.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event needs-retry.s3.HeadObject: calling handler \"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"Event needs-retry.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event needs-retry.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event before-call.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event before-call.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event before-call.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event before-call.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Making request for OperationModel(name=HeadBucket) with params: {'url_path': '/testntest', 'query_string': {}, 'method': 'HEAD', 'headers': {'User-Agent': 'Boto3/1.9.62 Python/3.6.7 Linux/4.14.65+ Botocore/1.12.62 Resource'}, 'body': b'', 'url': 'https://s3.amazonaws.com/testntest', 'context': {'client_region': 'us-east-1', 'client_config': , 'has_streaming_input': False, 'auth_type': None, 'signing': {'bucket': 'testntest'}}}\"}\n", "{\"message\": \"Making request for OperationModel(name=HeadBucket) with params: {'url_path': '/testntest', 'query_string': {}, 'method': 'HEAD', 'headers': {'User-Agent': 'Boto3/1.9.62 Python/3.6.7 Linux/4.14.65+ Botocore/1.12.62 Resource'}, 'body': b'', 'url': 'https://s3.amazonaws.com/testntest', 'context': {'client_region': 'us-east-1', 'client_config': , 'has_streaming_input': False, 'auth_type': None, 'signing': {'bucket': 'testntest'}}}\"}\n", "{\"message\": \"Event request-created.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event request-created.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event request-created.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event request-created.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event choose-signer.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event before-sign.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event before-sign.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Checking for DNS compatible bucket for: https://s3.amazonaws.com/testntest\"}\n", "{\"message\": \"Checking for DNS compatible bucket for: https://s3.amazonaws.com/testntest\"}\n", "{\"message\": \"URI updated to: https://testntest.s3.amazonaws.com/\"}\n", "{\"message\": \"URI updated to: https://testntest.s3.amazonaws.com/\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"CanonicalRequest:\\nHEAD\\n/\\n\\nhost:testntest.s3.amazonaws.com\\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\\nx-amz-date:20181214T190639Z\\n\\nhost;x-amz-content-sha256;x-amz-date\\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\n", "{\"message\": \"CanonicalRequest:\\nHEAD\\n/\\n\\nhost:testntest.s3.amazonaws.com\\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\\nx-amz-date:20181214T190639Z\\n\\nhost;x-amz-content-sha256;x-amz-date\\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T190639Z\\n20181214/us-east-1/s3/aws4_request\\n799fcd8c0621e283d6b947f1e3d95eef142741deedd165dd48ee8811d5f9d852\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T190639Z\\n20181214/us-east-1/s3/aws4_request\\n799fcd8c0621e283d6b947f1e3d95eef142741deedd165dd48ee8811d5f9d852\"}\n", "{\"message\": \"Signature:\\n662dcd262b4b95999730c002394be231cf02ad3b1d8cc90da9399bfd585bc1e7\"}\n", "{\"message\": \"Signature:\\n662dcd262b4b95999730c002394be231cf02ad3b1d8cc90da9399bfd585bc1e7\"}\n", "{\"message\": \"Event request-created.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event request-created.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Starting new HTTPS connection (2): testntest.s3.amazonaws.com\"}\n", "{\"message\": \"Starting new HTTPS connection (2): testntest.s3.amazonaws.com\"}\n", "{\"message\": \"https://testntest.s3.amazonaws.com:443 \\\"HEAD / HTTP/1.1\\\" 400 0\"}\n", "{\"message\": \"https://testntest.s3.amazonaws.com:443 \\\"HEAD / HTTP/1.1\\\" 400 0\"}\n", "{\"message\": \"Response headers: {'x-amz-bucket-region': 'us-east-2', 'x-amz-request-id': '269DCC355D0E8FC5', 'x-amz-id-2': 'zDCOaU9LZsqhOzJNjRUBAl/pNuU9j05NC1GAxcfrjdhft16LSuDDk2Ay3Hu8j6kk2kmUx55SZSo=', 'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Date': 'Fri, 14 Dec 2018 19:06:39 GMT', 'Connection': 'close', 'Server': 'AmazonS3'}\"}\n", "{\"message\": \"Response headers: {'x-amz-bucket-region': 'us-east-2', 'x-amz-request-id': '269DCC355D0E8FC5', 'x-amz-id-2': 'zDCOaU9LZsqhOzJNjRUBAl/pNuU9j05NC1GAxcfrjdhft16LSuDDk2Ay3Hu8j6kk2kmUx55SZSo=', 'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Date': 'Fri, 14 Dec 2018 19:06:39 GMT', 'Connection': 'close', 'Server': 'AmazonS3'}\"}\n", "{\"message\": \"Response body:\\nb''\"}\n", "{\"message\": \"Response body:\\nb''\"}\n", "{\"message\": \"Event needs-retry.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event needs-retry.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"Event needs-retry.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event needs-retry.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"S3 client configured for region us-east-1 but the bucket testntest is in region us-east-2; Please configure the proper region to avoid multiple unnecessary redirects and signing attempts.\"}\n", "{\"message\": \"S3 client configured for region us-east-1 but the bucket testntest is in region us-east-2; Please configure the proper region to avoid multiple unnecessary redirects and signing attempts.\"}\n", "{\"message\": \"Updating URI from https://s3.amazonaws.com/testntest to https://s3.us-east-2.amazonaws.com/testntest\"}\n", "{\"message\": \"Updating URI from https://s3.amazonaws.com/testntest to https://s3.us-east-2.amazonaws.com/testntest\"}\n", "{\"message\": \"Response received to retry, sleeping for 0 seconds\"}\n", "{\"message\": \"Response received to retry, sleeping for 0 seconds\"}\n", "{\"message\": \"Event request-created.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event request-created.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event request-created.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event request-created.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event choose-signer.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event before-sign.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event before-sign.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Checking for DNS compatible bucket for: https://s3.us-east-2.amazonaws.com/testntest\"}\n", "{\"message\": \"Checking for DNS compatible bucket for: https://s3.us-east-2.amazonaws.com/testntest\"}\n", "{\"message\": \"URI updated to: https://testntest.s3.us-east-2.amazonaws.com/\"}\n", "{\"message\": \"URI updated to: https://testntest.s3.us-east-2.amazonaws.com/\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"CanonicalRequest:\\nHEAD\\n/\\n\\nhost:testntest.s3.us-east-2.amazonaws.com\\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\\nx-amz-date:20181214T190639Z\\n\\nhost;x-amz-content-sha256;x-amz-date\\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\n", "{\"message\": \"CanonicalRequest:\\nHEAD\\n/\\n\\nhost:testntest.s3.us-east-2.amazonaws.com\\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\\nx-amz-date:20181214T190639Z\\n\\nhost;x-amz-content-sha256;x-amz-date\\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T190639Z\\n20181214/us-east-2/s3/aws4_request\\n871d114aad45e44f48590659e690e4bf80e931590de143cb6d43315e11738099\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T190639Z\\n20181214/us-east-2/s3/aws4_request\\n871d114aad45e44f48590659e690e4bf80e931590de143cb6d43315e11738099\"}\n", "{\"message\": \"Signature:\\ncf9f8ade13bca861c824070d31f9e931bce82e0339dffac638ead2c7a6d3a932\"}\n", "{\"message\": \"Signature:\\ncf9f8ade13bca861c824070d31f9e931bce82e0339dffac638ead2c7a6d3a932\"}\n", "{\"message\": \"Event request-created.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event request-created.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Starting new HTTPS connection (1): testntest.s3.us-east-2.amazonaws.com\"}\n", "{\"message\": \"Starting new HTTPS connection (1): testntest.s3.us-east-2.amazonaws.com\"}\n", "{\"message\": \"https://testntest.s3.us-east-2.amazonaws.com:443 \\\"HEAD / HTTP/1.1\\\" 200 0\"}\n", "{\"message\": \"https://testntest.s3.us-east-2.amazonaws.com:443 \\\"HEAD / HTTP/1.1\\\" 200 0\"}\n", "{\"message\": \"Response headers: {'x-amz-id-2': 'TrkXI9rge0KJy+wVICwUfQAA5KlU5u8B98N8FegMqGYacUpn+4NnGpAkkpUgGdr9pbyruUjvcUQ=', 'x-amz-request-id': 'D5556B95E431CCA8', 'Date': 'Fri, 14 Dec 2018 19:06:40 GMT', 'x-amz-bucket-region': 'us-east-2', 'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Server': 'AmazonS3'}\"}\n", "{\"message\": \"Response headers: {'x-amz-id-2': 'TrkXI9rge0KJy+wVICwUfQAA5KlU5u8B98N8FegMqGYacUpn+4NnGpAkkpUgGdr9pbyruUjvcUQ=', 'x-amz-request-id': 'D5556B95E431CCA8', 'Date': 'Fri, 14 Dec 2018 19:06:40 GMT', 'x-amz-bucket-region': 'us-east-2', 'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Server': 'AmazonS3'}\"}\n", "{\"message\": \"Response body:\\nb''\"}\n", "{\"message\": \"Response body:\\nb''\"}\n", "{\"message\": \"Event needs-retry.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"Event needs-retry.s3.HeadBucket: calling handler \"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"Event needs-retry.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"Event needs-retry.s3.HeadBucket: calling handler >\"}\n", "{\"message\": \"S3 request was previously redirected, not redirecting.\"}\n", "{\"message\": \"S3 request was previously redirected, not redirecting.\"}\n", "{\"message\": \"S3 client configured for region us-east-1 but the bucket testntest is in region us-east-2; Please configure the proper region to avoid multiple unnecessary redirects and signing attempts.\"}\n", "{\"message\": \"S3 client configured for region us-east-1 but the bucket testntest is in region us-east-2; Please configure the proper region to avoid multiple unnecessary redirects and signing attempts.\"}\n", "{\"message\": \"Updating URI from https://s3.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv to https://s3.us-east-2.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"Updating URI from https://s3.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv to https://s3.us-east-2.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"Response received to retry, sleeping for 0 seconds\"}\n", "{\"message\": \"Response received to retry, sleeping for 0 seconds\"}\n", "{\"message\": \"Event request-created.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event request-created.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event request-created.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event request-created.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event choose-signer.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event before-sign.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event before-sign.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Checking for DNS compatible bucket for: https://s3.us-east-2.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"Checking for DNS compatible bucket for: https://s3.us-east-2.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"URI updated to: https://testntest.s3.us-east-2.amazonaws.com/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"URI updated to: https://testntest.s3.us-east-2.amazonaws.com/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"CanonicalRequest:\\nHEAD\\n/nba_2017_endorsement_full_stats.csv\\n\\nhost:testntest.s3.us-east-2.amazonaws.com\\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\\nx-amz-date:20181214T190639Z\\n\\nhost;x-amz-content-sha256;x-amz-date\\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\n", "{\"message\": \"CanonicalRequest:\\nHEAD\\n/nba_2017_endorsement_full_stats.csv\\n\\nhost:testntest.s3.us-east-2.amazonaws.com\\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\\nx-amz-date:20181214T190639Z\\n\\nhost;x-amz-content-sha256;x-amz-date\\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T190639Z\\n20181214/us-east-2/s3/aws4_request\\neb0c92849dfd44b981e88b39e8c9a0902c387dba4f88c7df0487a9cb9c53c456\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T190639Z\\n20181214/us-east-2/s3/aws4_request\\neb0c92849dfd44b981e88b39e8c9a0902c387dba4f88c7df0487a9cb9c53c456\"}\n", "{\"message\": \"Signature:\\n69c32ba74cc83cb2e6ebca4e2d7f48fa012a70988c578d8ea3112117cc81f56d\"}\n", "{\"message\": \"Signature:\\n69c32ba74cc83cb2e6ebca4e2d7f48fa012a70988c578d8ea3112117cc81f56d\"}\n", "{\"message\": \"Event request-created.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event request-created.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Starting new HTTPS connection (2): testntest.s3.us-east-2.amazonaws.com\"}\n", "{\"message\": \"Starting new HTTPS connection (2): testntest.s3.us-east-2.amazonaws.com\"}\n", "{\"message\": \"https://testntest.s3.us-east-2.amazonaws.com:443 \\\"HEAD /nba_2017_endorsement_full_stats.csv HTTP/1.1\\\" 200 0\"}\n", "{\"message\": \"https://testntest.s3.us-east-2.amazonaws.com:443 \\\"HEAD /nba_2017_endorsement_full_stats.csv HTTP/1.1\\\" 200 0\"}\n", "{\"message\": \"Response headers: {'x-amz-id-2': 'O2LxC3y1e7b9U6TdAD21AtaVybEiTaqedFKWg0/Lfn7V2PYA0sD0PjGfIosDZFv9DHEXg9KGL/0=', 'x-amz-request-id': 'AFB111AF0C49CA92', 'Date': 'Fri, 14 Dec 2018 19:06:41 GMT', 'Last-Modified': 'Wed, 29 Nov 2017 18:48:35 GMT', 'ETag': '\\\"60ea033c62d2b044f596333cd464baa3\\\"', 'Accept-Ranges': 'bytes', 'Content-Type': 'text/csv', 'Content-Length': '1447', 'Server': 'AmazonS3'}\"}\n", "{\"message\": \"Response headers: {'x-amz-id-2': 'O2LxC3y1e7b9U6TdAD21AtaVybEiTaqedFKWg0/Lfn7V2PYA0sD0PjGfIosDZFv9DHEXg9KGL/0=', 'x-amz-request-id': 'AFB111AF0C49CA92', 'Date': 'Fri, 14 Dec 2018 19:06:41 GMT', 'Last-Modified': 'Wed, 29 Nov 2017 18:48:35 GMT', 'ETag': '\\\"60ea033c62d2b044f596333cd464baa3\\\"', 'Accept-Ranges': 'bytes', 'Content-Type': 'text/csv', 'Content-Length': '1447', 'Server': 'AmazonS3'}\"}\n", "{\"message\": \"Response body:\\nb''\"}\n", "{\"message\": \"Response body:\\nb''\"}\n", "{\"message\": \"Event needs-retry.s3.HeadObject: calling handler \"}\n", "{\"message\": \"Event needs-retry.s3.HeadObject: calling handler \"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"Event needs-retry.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"Event needs-retry.s3.HeadObject: calling handler >\"}\n", "{\"message\": \"S3 request was previously redirected, not redirecting.\"}\n", "{\"message\": \"S3 request was previously redirected, not redirecting.\"}\n", "{\"message\": \"Submitting task ImmediatelyWriteIOGetObjectTask(transfer_id=0, {'bucket': 'testntest', 'key': 'nba_2017_endorsement_full_stats.csv', 'extra_args': {}}) to executor for transfer request: 0.\"}\n", "{\"message\": \"Submitting task ImmediatelyWriteIOGetObjectTask(transfer_id=0, {'bucket': 'testntest', 'key': 'nba_2017_endorsement_full_stats.csv', 'extra_args': {}}) to executor for transfer request: 0.\"}\n", "{\"message\": \"Acquiring 0\"}\n", "{\"message\": \"Acquiring 0\"}\n", "{\"message\": \"ImmediatelyWriteIOGetObjectTask(transfer_id=0, {'bucket': 'testntest', 'key': 'nba_2017_endorsement_full_stats.csv', 'extra_args': {}}) about to wait for the following futures []\"}\n", "{\"message\": \"Releasing acquire 0/None\"}\n", "{\"message\": \"ImmediatelyWriteIOGetObjectTask(transfer_id=0, {'bucket': 'testntest', 'key': 'nba_2017_endorsement_full_stats.csv', 'extra_args': {}}) about to wait for the following futures []\"}\n", "{\"message\": \"Releasing acquire 0/None\"}\n", "{\"message\": \"ImmediatelyWriteIOGetObjectTask(transfer_id=0, {'bucket': 'testntest', 'key': 'nba_2017_endorsement_full_stats.csv', 'extra_args': {}}) done waiting for dependent futures\"}\n", "{\"message\": \"ImmediatelyWriteIOGetObjectTask(transfer_id=0, {'bucket': 'testntest', 'key': 'nba_2017_endorsement_full_stats.csv', 'extra_args': {}}) done waiting for dependent futures\"}\n", "{\"message\": \"Executing task ImmediatelyWriteIOGetObjectTask(transfer_id=0, {'bucket': 'testntest', 'key': 'nba_2017_endorsement_full_stats.csv', 'extra_args': {}}) with kwargs {'client': , 'bucket': 'testntest', 'key': 'nba_2017_endorsement_full_stats.csv', 'fileobj': , 'extra_args': {}, 'callbacks': [], 'max_attempts': 5, 'download_output_manager': , 'io_chunksize': 262144, 'bandwidth_limiter': None}\"}\n", "{\"message\": \"Executing task ImmediatelyWriteIOGetObjectTask(transfer_id=0, {'bucket': 'testntest', 'key': 'nba_2017_endorsement_full_stats.csv', 'extra_args': {}}) with kwargs {'client': , 'bucket': 'testntest', 'key': 'nba_2017_endorsement_full_stats.csv', 'fileobj': , 'extra_args': {}, 'callbacks': [], 'max_attempts': 5, 'download_output_manager': , 'io_chunksize': 262144, 'bandwidth_limiter': None}\"}\n", "{\"message\": \"Event before-parameter-build.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.GetObject: calling handler >\"}\n", "{\"message\": \"Event before-parameter-build.s3.GetObject: calling handler >\"}\n", "{\"message\": \"Event before-parameter-build.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event before-call.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event before-call.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event before-call.s3.GetObject: calling handler >\"}\n", "{\"message\": \"Event before-call.s3.GetObject: calling handler >\"}\n", "{\"message\": \"Updating URI from https://s3.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv to https://s3.us-east-2.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"Updating URI from https://s3.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv to https://s3.us-east-2.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"Making request for OperationModel(name=GetObject) with params: {'url_path': '/testntest/nba_2017_endorsement_full_stats.csv', 'query_string': {}, 'method': 'GET', 'headers': {'User-Agent': 'Boto3/1.9.62 Python/3.6.7 Linux/4.14.65+ Botocore/1.12.62 Resource'}, 'body': b'', 'url': 'https://s3.us-east-2.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv', 'context': {'client_region': 'us-east-1', 'client_config': , 'has_streaming_input': False, 'auth_type': None, 'signing': {'region': 'us-east-2', 'bucket': 'testntest', 'endpoint': 'https://s3.us-east-2.amazonaws.com'}}}\"}\n", "{\"message\": \"Making request for OperationModel(name=GetObject) with params: {'url_path': '/testntest/nba_2017_endorsement_full_stats.csv', 'query_string': {}, 'method': 'GET', 'headers': {'User-Agent': 'Boto3/1.9.62 Python/3.6.7 Linux/4.14.65+ Botocore/1.12.62 Resource'}, 'body': b'', 'url': 'https://s3.us-east-2.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv', 'context': {'client_region': 'us-east-1', 'client_config': , 'has_streaming_input': False, 'auth_type': None, 'signing': {'region': 'us-east-2', 'bucket': 'testntest', 'endpoint': 'https://s3.us-east-2.amazonaws.com'}}}\"}\n", "{\"message\": \"Event request-created.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event request-created.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event request-created.s3.GetObject: calling handler >\"}\n", "{\"message\": \"Event request-created.s3.GetObject: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.GetObject: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.GetObject: calling handler >\"}\n", "{\"message\": \"Event choose-signer.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event choose-signer.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event before-sign.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event before-sign.s3.GetObject: calling handler \"}\n", "{\"message\": \"Checking for DNS compatible bucket for: https://s3.us-east-2.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"Checking for DNS compatible bucket for: https://s3.us-east-2.amazonaws.com/testntest/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"URI updated to: https://testntest.s3.us-east-2.amazonaws.com/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"URI updated to: https://testntest.s3.us-east-2.amazonaws.com/nba_2017_endorsement_full_stats.csv\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"CanonicalRequest:\\nGET\\n/nba_2017_endorsement_full_stats.csv\\n\\nhost:testntest.s3.us-east-2.amazonaws.com\\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\\nx-amz-date:20181214T190640Z\\n\\nhost;x-amz-content-sha256;x-amz-date\\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\n", "{\"message\": \"CanonicalRequest:\\nGET\\n/nba_2017_endorsement_full_stats.csv\\n\\nhost:testntest.s3.us-east-2.amazonaws.com\\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\\nx-amz-date:20181214T190640Z\\n\\nhost;x-amz-content-sha256;x-amz-date\\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T190640Z\\n20181214/us-east-2/s3/aws4_request\\n2e243a8c95b06e393be0f7c32cee241b83423b3231c92471266e365180a3de6b\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T190640Z\\n20181214/us-east-2/s3/aws4_request\\n2e243a8c95b06e393be0f7c32cee241b83423b3231c92471266e365180a3de6b\"}\n", "{\"message\": \"Signature:\\n7c748447a0a1a146d02b3995e18ef7f34c3aa47150d51253f043c6161992ca7e\"}\n", "{\"message\": \"Signature:\\n7c748447a0a1a146d02b3995e18ef7f34c3aa47150d51253f043c6161992ca7e\"}\n", "{\"message\": \"Event request-created.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event request-created.s3.GetObject: calling handler \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"https://testntest.s3.us-east-2.amazonaws.com:443 \\\"GET /nba_2017_endorsement_full_stats.csv HTTP/1.1\\\" 200 1447\"}\n", "{\"message\": \"https://testntest.s3.us-east-2.amazonaws.com:443 \\\"GET /nba_2017_endorsement_full_stats.csv HTTP/1.1\\\" 200 1447\"}\n", "{\"message\": \"Response headers: {'x-amz-id-2': 'OzI+sE1ZbetaaRTj+pWA6nPuNi0e1yrAUi1vKcvSShsXqP+LxiQTI5c3pV5y1pT6B4RR06dRBrg=', 'x-amz-request-id': '9763AE9849C42E10', 'Date': 'Fri, 14 Dec 2018 19:06:41 GMT', 'Last-Modified': 'Wed, 29 Nov 2017 18:48:35 GMT', 'ETag': '\\\"60ea033c62d2b044f596333cd464baa3\\\"', 'Accept-Ranges': 'bytes', 'Content-Type': 'text/csv', 'Content-Length': '1447', 'Server': 'AmazonS3'}\"}\n", "{\"message\": \"Response headers: {'x-amz-id-2': 'OzI+sE1ZbetaaRTj+pWA6nPuNi0e1yrAUi1vKcvSShsXqP+LxiQTI5c3pV5y1pT6B4RR06dRBrg=', 'x-amz-request-id': '9763AE9849C42E10', 'Date': 'Fri, 14 Dec 2018 19:06:41 GMT', 'Last-Modified': 'Wed, 29 Nov 2017 18:48:35 GMT', 'ETag': '\\\"60ea033c62d2b044f596333cd464baa3\\\"', 'Accept-Ranges': 'bytes', 'Content-Type': 'text/csv', 'Content-Length': '1447', 'Server': 'AmazonS3'}\"}\n", "{\"message\": \"Response body:\\n\"}\n", "{\"message\": \"Response body:\\n\"}\n", "{\"message\": \"Event needs-retry.s3.GetObject: calling handler \"}\n", "{\"message\": \"Event needs-retry.s3.GetObject: calling handler \"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"Event needs-retry.s3.GetObject: calling handler >\"}\n", "{\"message\": \"Event needs-retry.s3.GetObject: calling handler >\"}\n", "{\"message\": \"IOWriteTask(transfer_id=0, {'offset': 0}) about to wait for the following futures []\"}\n", "{\"message\": \"IOWriteTask(transfer_id=0, {'offset': 0}) about to wait for the following futures []\"}\n", "{\"message\": \"IOWriteTask(transfer_id=0, {'offset': 0}) done waiting for dependent futures\"}\n", "{\"message\": \"IOWriteTask(transfer_id=0, {'offset': 0}) done waiting for dependent futures\"}\n", "{\"message\": \"Executing task IOWriteTask(transfer_id=0, {'offset': 0}) with kwargs {'fileobj': , 'offset': 0}\"}\n", "{\"message\": \"Executing task IOWriteTask(transfer_id=0, {'offset': 0}) with kwargs {'fileobj': , 'offset': 0}\"}\n", "{\"message\": \"IORenameFileTask(transfer_id=0, {'final_filename': '/tmp/nba_2017_endorsement_full_stats.csv'}) about to wait for the following futures []\"}\n", "{\"message\": \"IORenameFileTask(transfer_id=0, {'final_filename': '/tmp/nba_2017_endorsement_full_stats.csv'}) about to wait for the following futures []\"}\n", "{\"message\": \"IORenameFileTask(transfer_id=0, {'final_filename': '/tmp/nba_2017_endorsement_full_stats.csv'}) done waiting for dependent futures\"}\n", "{\"message\": \"IORenameFileTask(transfer_id=0, {'final_filename': '/tmp/nba_2017_endorsement_full_stats.csv'}) done waiting for dependent futures\"}\n", "{\"message\": \"Executing task IORenameFileTask(transfer_id=0, {'final_filename': '/tmp/nba_2017_endorsement_full_stats.csv'}) with kwargs {'fileobj': , 'final_filename': '/tmp/nba_2017_endorsement_full_stats.csv', 'osutil': }\"}\n", "{\"message\": \"Executing task IORenameFileTask(transfer_id=0, {'final_filename': '/tmp/nba_2017_endorsement_full_stats.csv'}) with kwargs {'fileobj': , 'final_filename': '/tmp/nba_2017_endorsement_full_stats.csv', 'osutil': }\"}\n", "{\"message\": \"Releasing acquire 0/None\"}\n", "{\"message\": \"Releasing acquire 0/None\"}\n" ], "name": "stderr" } ] }, { "metadata": { "id": "3lK8io8Ufp6h", "colab_type": "code", "outputId": "5fdbcb47-ab69-487d-a1f9-5eb81398b4a5", "colab": { "base_uri": "https://localhost:8080/", "height": 85 } }, "cell_type": "code", "source": [ "!ls -l /tmp" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "total 4\n", "srw------- 1 root root 0 Dec 14 16:11 drivefs_ipc.0\n", "srw------- 1 root root 0 Dec 14 16:11 drivefs_ipc.0_shell\n", "-rw-r--r-- 1 root root 1447 Dec 14 19:06 nba_2017_endorsement_full_stats.csv\n" ], "name": "stdout" } ] }, { "metadata": { "id": "zsjgykvfftym", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Pandas" ] }, { "metadata": { "id": "rfPwZDxhfx55", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Main Datascience library for AWS and Python\n", "\n", "\n", "\n", "* It is assumed you know about it\n", "* Many study videos will show examples using it\n", "\n" ] }, { "metadata": { "id": "eR1y8H8ofwHP", "colab_type": "code", "outputId": "8f90bcc0-1732-4d12-c6f1-76f8c548ee20", "colab": { "base_uri": "https://localhost:8080/", "height": 182 } }, "cell_type": "code", "source": [ "import pandas as pd\n", "\n", "df = pd.read_csv(\"/tmp/nba_2017_endorsement_full_stats.csv\")\n", "df.head(2)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
PLAYERTEAMSALARY_MILLIONSENDORSEMENT_MILLIONSPCT_ATTENDANCE_STADIUMATTENDANCE_TOTAL_BY_10KFRANCHISE_VALUE_100_MILLIONELO_100XCONFPOSITIONAGEMPGPMPGWINS_RPMPLAYER_TEAM_WINSWIKIPEDIA_PAGEVIEWS_10KTWITTER_FAVORITE_COUNT_1K
0LeBron JamesCleveland Cavaliers30.9655.0100.084.012.015.45EastSF3237.874.037.820.4351.014.705.53
1Kevin DurantGolden State Warriors26.5036.0100.080.026.017.70WestSF2833.462.033.412.2451.06.291.43
\n", "
" ], "text/plain": [ " PLAYER TEAM SALARY_MILLIONS ENDORSEMENT_MILLIONS \\\n", "0 LeBron James Cleveland Cavaliers 30.96 55.0 \n", "1 Kevin Durant Golden State Warriors 26.50 36.0 \n", "\n", " PCT_ATTENDANCE_STADIUM ATTENDANCE_TOTAL_BY_10K \\\n", "0 100.0 84.0 \n", "1 100.0 80.0 \n", "\n", " FRANCHISE_VALUE_100_MILLION ELO_100X CONF POSITION AGE MP GP \\\n", "0 12.0 15.45 East SF 32 37.8 74.0 \n", "1 26.0 17.70 West SF 28 33.4 62.0 \n", "\n", " MPG WINS_RPM PLAYER_TEAM_WINS WIKIPEDIA_PAGEVIEWS_10K \\\n", "0 37.8 20.43 51.0 14.70 \n", "1 33.4 12.24 51.0 6.29 \n", "\n", " TWITTER_FAVORITE_COUNT_1K \n", "0 5.53 \n", "1 1.43 " ] }, "metadata": { "tags": [] }, "execution_count": 15 } ] }, { "metadata": { "id": "83fos9PggDWE", "colab_type": "text" }, "cell_type": "markdown", "source": [ "#### Descriptive Statistics with Pandas" ] }, { "metadata": { "id": "wKYWS_Tnf_qO", "colab_type": "code", "outputId": "f7f3f47f-aedc-4b9d-9651-000f49b12a3f", "colab": { "base_uri": "https://localhost:8080/", "height": 317 } }, "cell_type": "code", "source": [ "df.describe()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SALARY_MILLIONSENDORSEMENT_MILLIONSPCT_ATTENDANCE_STADIUMATTENDANCE_TOTAL_BY_10KFRANCHISE_VALUE_100_MILLIONELO_100XAGEMPGPMPGWINS_RPMPLAYER_TEAM_WINSWIKIPEDIA_PAGEVIEWS_10KTWITTER_FAVORITE_COUNT_1K
count10.00000010.00000010.00000010.00000010.00000010.00000010.00000010.00000010.00000010.00000010.00000010.00000010.00000010.000000
mean23.21600021.70000099.80000080.20000021.37500015.67800029.30000033.89000070.80000033.89000011.50600044.1000006.5320002.764000
std5.29443815.3626532.3944385.2025638.5075541.3611423.1640342.3038378.3904712.3038376.86848712.5914435.2042333.646399
min12.1100008.00000094.00000070.00000010.25000013.74000024.00000029.90000060.00000029.9000001.17000026.0000002.6900000.350000
25%21.70750013.000000100.00000078.50000013.12500015.25000028.00000032.72500062.50000032.7250006.01500032.5000003.4025000.865000
50%23.88000014.500000100.00000080.50000022.50000015.45000028.00000033.85000073.00000033.85000012.86000046.5000004.4750001.485000
75%26.50000031.250000100.00000083.25000026.00000016.27500031.75000034.97500077.75000034.97500016.89000051.0000005.9175002.062500
max30.96000055.000000104.00000089.00000033.00000017.70000035.00000037.80000081.00000037.80000020.43000065.00000017.57000012.280000
\n", "
" ], "text/plain": [ " SALARY_MILLIONS ENDORSEMENT_MILLIONS PCT_ATTENDANCE_STADIUM \\\n", "count 10.000000 10.000000 10.000000 \n", "mean 23.216000 21.700000 99.800000 \n", "std 5.294438 15.362653 2.394438 \n", "min 12.110000 8.000000 94.000000 \n", "25% 21.707500 13.000000 100.000000 \n", "50% 23.880000 14.500000 100.000000 \n", "75% 26.500000 31.250000 100.000000 \n", "max 30.960000 55.000000 104.000000 \n", "\n", " ATTENDANCE_TOTAL_BY_10K FRANCHISE_VALUE_100_MILLION ELO_100X \\\n", "count 10.000000 10.000000 10.000000 \n", "mean 80.200000 21.375000 15.678000 \n", "std 5.202563 8.507554 1.361142 \n", "min 70.000000 10.250000 13.740000 \n", "25% 78.500000 13.125000 15.250000 \n", "50% 80.500000 22.500000 15.450000 \n", "75% 83.250000 26.000000 16.275000 \n", "max 89.000000 33.000000 17.700000 \n", "\n", " AGE MP GP MPG WINS_RPM \\\n", "count 10.000000 10.000000 10.000000 10.000000 10.000000 \n", "mean 29.300000 33.890000 70.800000 33.890000 11.506000 \n", "std 3.164034 2.303837 8.390471 2.303837 6.868487 \n", "min 24.000000 29.900000 60.000000 29.900000 1.170000 \n", "25% 28.000000 32.725000 62.500000 32.725000 6.015000 \n", "50% 28.000000 33.850000 73.000000 33.850000 12.860000 \n", "75% 31.750000 34.975000 77.750000 34.975000 16.890000 \n", "max 35.000000 37.800000 81.000000 37.800000 20.430000 \n", "\n", " PLAYER_TEAM_WINS WIKIPEDIA_PAGEVIEWS_10K TWITTER_FAVORITE_COUNT_1K \n", "count 10.000000 10.000000 10.000000 \n", "mean 44.100000 6.532000 2.764000 \n", "std 12.591443 5.204233 3.646399 \n", "min 26.000000 2.690000 0.350000 \n", "25% 32.500000 3.402500 0.865000 \n", "50% 46.500000 4.475000 1.485000 \n", "75% 51.000000 5.917500 2.062500 \n", "max 65.000000 17.570000 12.280000 " ] }, "metadata": { "tags": [] }, "execution_count": 16 } ] }, { "metadata": { "id": "pV2yYotdgS3g", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Plotting with Python" ] }, { "metadata": { "id": "BHiy-PuOgN3-", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "import warnings\n", "import numpy as np\n", "warnings.simplefilter('ignore', np.RankWarning)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "E0BaAYGbgYEL", "colab_type": "code", "outputId": "c294aaf4-c7a1-4a47-caed-8388c0ce112f", "colab": { "base_uri": "https://localhost:8080/", "height": 556 } }, "cell_type": "code", "source": [ "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "fig, ax = plt.subplots()\n", "fig.set_size_inches(11, 8.5)\n", "sns.regplot(data=df, \n", " x=\"SALARY_MILLIONS\", y=\"ENDORSEMENT_MILLIONS\", \n", " order=2).set_title(\"NBA Salary & Endorsements\")" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Text(0.5,1,'NBA Salary & Endorsements')" ] }, "metadata": { "tags": [] }, "execution_count": 18 }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAApoAAAIKCAYAAACDau+8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xl4lOXd/v9zMpNkCCRAIEFABNxQ\nlEUa+wiCAoKAIqIsKkK14q9PW1zqUndrLYrlq60Ldd+qoI8LAgIKQQEVWlwQiohQEDdEhYSssy/3\n/fsjZiRCMpMw+7xfx+FxZO6Z3PPhEjJnrtVimqYpAAAAIMqyEl0AAAAA0hNBEwAAADFB0AQAAEBM\nEDQBAAAQEwRNAAAAxARBEwAAADFB0AQQNb169dItt9zS4NoHH3ygadOmhb4+8cQTNXr0aI0ePVpn\nnnmmbr/9dvl8vgbfU1VVpUGDBum2225r8v2++eYb/fa3v9WoUaM0atQojR8/Xm+//XbYOufMmaNb\nb721mX+6yNXW1mr69OkaPXq0LrzwQu3Zs6fR1/bq1UsjR44MtUn9f5988kmz3vORRx7RTTfddKil\nJ9ybb74ph8OR6DIARIkt0QUASC8fffSRPvvsM/Xu3fugz3fu3FnLly+XJHm9Xl1++eWaN2+eLrvs\nstBrli5dqmnTpmn+/Pnyer3Kzc096L2uv/56nXvuuXrsscckSZs2bdIll1yiZcuWqXPnzlH+k0Vu\n8eLFOu644/T000/roYce0vz58zVjxoxGXz937lwddthhcawweT300EMaMGCA2rRpk+hSAEQBPZoA\nouraa6/VrFmzInptbm6uBgwYoF27djW4vmjRIo0dO1annnqqVq5c2ej3b9++Xf369Qs97tevn0pL\nS0Oh7dVXX9WYMWN05pln6uKLL9bu3bsPuMcXX3yhiy66SGPGjNHIkSO1dOnS0HO9evXS448/rlGj\nRmn27Nn6y1/+Enquurpa/fr1U0VFxQH39Hq9KioqklTX69q1a9eI2uPnvv32Ww0ePFjPP/+8zjnn\nHA0ZMkRvvvmmJMnj8egPf/iDhg0bpqlTp+qHH34Ifd93332n6dOna9SoURo7dqwWLVrU4H6zZs3S\n1KlTJUn3339/qEf4V7/6Vaj39eOPP9aECRM0cuRITZ48OfT/aMGCBbrqqqt03XXXaejQofr1r3+t\n9evX68ILL9SgQYP08ssvS5JM09Q//vEPjRo1SsOGDdNdd92lYDAoSZo2bZqeffZZXXTRRRoyZIiu\nvfZamaapm2++WV9++aWmTZum9evX68MPP9R5552ns846S2PGjNGyZcta1I4AEoegCSCqxowZI9M0\nQ72WTdm3b59Wr16tYcOGha7t2LFD2dnZ6tatm8aNGxcKSQdz2mmn6aqrrtLzzz+vnTt3SpI6deok\ni8Wiffv26S9/+YueffZZrVixQkcccYQeeeSRA+7x//7f/9OwYcO0bNkyzZo1S7feeqv8fn/oedM0\nVVpaqrFjx2r58uUKBAKSpNWrV6ukpESFhYUH3LOkpESvv/66Lr74YrVv317nnntu2LZoTGVlpbKy\nsrRkyRLdcssteuCBByRJr732msrLy/XWW29pzpw5Wrt2beh7br/9dv3yl79UaWmpHn/8cd111136\n9ttvJdVNSzj++OM1b9487dixQ8uXL9fSpUtVWlqqkSNHat26dXI4HPrd736na6+9Vm+99ZZ+9atf\n6eqrrw7df82aNbriiiu0YsUK7dy5U0899ZReeOEF3X333aE2fv3117V8+XLNnz9fb731lnbt2qX/\n+7//C91j1apVevbZZ1VaWqr3339fGzZs0D333COproe3pKREs2fP1s0336w333xTjz76aETTIgAk\nF4ImgKi75ZZbdN9998nr9R7w3Pfff6/Ro0dr1KhRGjp0qLp166YBAwaEnl+4cKHGjRsnSfrFL36h\nr776SuXl5Qd9n3vvvVcXX3yxlixZorFjx2r48OGhMNOhQwd9/PHHod7NkpKSA3pOpbq5jdOnTw+9\nn9frVVlZWej5oUOHSpJOOOEE5efna926dZKkt99+W2edddYB99u7d69mz56t7777TpMmTdKtt96q\nb775pkFP6c9NmzatwfzMKVOmhJ4LBAI6//zzQzV89913kqT169dr5MiRstlsat++fSis+/1+/fvf\n/w7do2vXrvqf//kfvf/++6HnR44cKUkqKChQRUWFlixZourqak2bNk3jx4/Xxx9/rE6dOunUU0+V\nJI0dO1bffPNN6L2PPvpo9ezZUzk5OerevbsGDx4sq9WqY489Vnv37pVUF8QnTJig/Px82Ww2TZo0\nSStWrAj9uUaPHi273a68vDz16NFD33///QHt0qFDBy1atEg7d+5Ujx499Le//a3RNgSQnJijCSDq\nTjjhBJ188sl69tlnddJJJzV4bv85msFgUHPnztUll1yi1157TcFgUEuWLJHL5QqFCq/XqyVLlujX\nv/71Ae+Tm5ur6dOna/r06aqpqdHy5cs1a9YsHX744Ro0aJAeeughrVq1SsFgUE6nUz179jzgHmvW\nrNGjjz6qyspKWSwWmaYpwzBCz7dr1y709dixY7V06VKdfPLJ+vDDDw86ReCmm27S+PHj1bNnT919\n992hntDG5plKTc/RtFqtysvLkyRlZWWFaquurlZ+fn7odQUFBXI6naqqqpJpmgc8Vz/Eb7VaQ/Mf\nO3XqpDlz5uiZZ57RzJkzdfLJJ+vOO+9UTU2Ndu3apdGjR4fukZOTE7pH69atD1qf1WoN1VdbW6un\nn346NJQeDAYb9P7uPwfTarWGhtX3N2vWLD366KP69a9/LbvdrmuvvbZBTQCSH0ETQExcc801Ov/8\n83X44Yc3+hqr1aoLL7xQ99xzjyoqKrR582Yde+yxevrpp0Ov+eyzz3TzzTcfEDQrKiq0devWUK9b\nQUGBJk+erDVr1mj79u2qqqrSqlWrNG/ePBUWFuqVV17RkiVLGtzD7/frD3/4gx544AGdfvrp8vl8\n6tu3b6P1nn322Zo8ebJOO+00DRgwQAUFBQe8ZsOGDXrkkUdkt9t10kkn6e6779a6des0b968iNot\nUgUFBaqtrQ09rg+B7du3V1ZWlqqrq9W2bVtJdcPlHTp0OOh9TjnlFJ1yyilyuVyaPXu27rvvPk2e\nPFlHHnmkFixYcMDrt2/fHlF9xcXFGj58eGguaEt07NhRt99+u26//XatXbtWV155pYYMGdIg6AJI\nbgydA4iJ4uJiXXzxxZozZ06Tr3v77bdVXFysgoICLVy4UCNGjGjwfO/evVVbW6v//ve/Da57PB5d\nddVVWrNmTeja119/rU2bNqmkpET79u1T165dVVhYqMrKSi1btkxOp7PBPdxut1wul0488URJ0nPP\nPafs7Gy5XK6D1nrkkUfqiCOO0N/+9jeNGTPmoK/p2bOn3nnnHUnSb37zGy1YsEA9evRQx44dm2yH\n5urfv3+ot7aiokLvvfeeJMlms2nw4MGhnsRvvvlG69ev16BBgw64x9q1a3XnnXfKMAzl5eXpuOOO\nk8ViUb9+/VRWVqZNmzZJknbt2qU//vGPMk0z4vrOOOMMvf7663K73ZKkl156SQsXLgz7fTabTTU1\nNfL7/Zo2bVpoKP6EE06QzWZTVhYfW0AqoUcTQMxcdtllevXVVxtcq5+jKdUttCkuLtYTTzwhl8ul\n1atXH7APp1QXWhYtWqQbb7wxdK1Lly569NFH9dBDD+muu+6SaZpq06aNbr75ZvXr109du3bVG2+8\noZEjR6pbt276wx/+oN/97nf661//GuoRKygo0OWXX67x48erQ4cO+t3vfqcRI0bot7/9baNzKs8+\n+2w9+OCDOuOMMw76/KxZs3THHXfo/vvvlyTNmDFDH3/8sc444wzddNNNofmR+5s2bZqsVmuDa1On\nTg3NDz2YyZMna/369RoxYoS6dOmiESNGhHo477zzTt12221asGCBsrOzddddd6lz586hBUH1Tj75\nZL3xxhsaNWqUcnJyVFhYqFmzZslut+uhhx7SzJkz5XQ6lZ2drauvvloWi6XRen5uxIgR2rFjh847\n7zxJ0hFHHKG777477PfV7z161113aeLEibr00ksl1U0buO2229SqVauIawCQeBazOb+iAkCGe/PN\nN1VaWqoHH3ww0aUAQNJjDAIAIuR2u/XUU0+FTjoCADSNoAkAEVi9erXGjBmjYcOGqaSkJNHlAEBK\nYOgcAAAAMUGPJgAAAGKCoAkAAICYSMntjcrKasO/KIHat89TZeXB9+HDT2inyNBOkaGdwqONIkM7\nRYZ2ikwmtFNRUX6jz9GjGQM2mzX8i0A7RYh2igztFB5tFBnaKTK0U2QyvZ0ImgAAAIgJgiYAAABi\ngqAJAACAmCBoAgAAICYImgAAAIgJgiYAAABigqAJAACAmCBoAgAAICYImgAAAIgJgiYAAABigqAJ\nAACAmCBoAgAAICYImgAAAIgJgiYAAABigqAJAACAmCBoAgAAICYImgAAAIgJgiYAAABigqAJAACA\nmEjJoOn2BhJdAgAAAMJIyaDp9PhlmmaiywAAAEATUjJoGoYptzeY6DIAAADQhJQMmlJdryYAAACS\nV8oGzaBhMlcTAAAgiaVs0JTo1QQAAEhmMQ2a27dv14gRIzRv3jxJkt/v13XXXaeJEyfqkksuUXV1\ntSRp8eLFmjBhgiZNmqRXX3014vsHgqY8Pno1AQAAklHMgqbL5dLMmTM1cODA0LVXXnlF7du31/z5\n83XWWWdp/fr1crlcevjhh/XPf/5Tc+fO1XPPPaeqqqqI38fpJmgCAAAko5gFzZycHD355JMqLi4O\n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\nAQBbt27FrbfeOqCN3J49e3DVVVchFAqN+Ls2btyI1atXD+mccuedd2L9+vVD9nfTpk144YUXhvyc\nkf6mhoYGrFmzJna7trYW999/P6699lrceOONuO222/D111/H7l+/fj2+//3vD/gZmzZtwptvvhn7\n/nvuuQfr16/Hrbfeittuuw3Hjh0b8e8jhBCAAk1CSAoKhULYsGEDXnjhBbz66qvYvHkzCgsLsXnz\nZgBa27eDBw8iGAziwIEDo/65mzdvRmlpaSy46u9Xv/oVXn311djHH//4R1RVVeHqq6+GwWDA22+/\nDQCQZRm//OUv8Ytf/OKMPcNNJhO+/PLL2O2mpia0tbWNen9HKxgM4u6778a1116Ld999F1u2bMHj\njz+ORx55BCdPnow9zuPxxDqWDPbkk0/i5ptvxquvvorXX38d3//+9/Hb3/52zPeVEJJeKNAkhKSc\nYDAIn88Hv98f2/azn/0MP/jBDwBoo3yXXnoprrnmmmGDxuH4/X588MEHeO6557B//360tLSM+Fij\n0YjS0lKcOHECAPDEE09g06ZN8Hq9ePXVVzFnzhwsW7bsjL/z29/+NrZs2RK7/dZbb8V6RY+lt99+\nG3PmzMEVV1wR2zZz5kz84Ac/wIsvvhjb9vDDD+OFF16I9Wnur6urCz09PbHbl19+OTZt2jTm+0oI\nSS8UaBJCUo7VasUDDzyA66+/HnfeeSdefPFFVFdXAwAYY9iyZQu++93v4oYbbsCHH344bOA02LZt\n21BWVoaysjJcdtlleOutt0Z8bH19PQ4ePIh58+YBAEpKSnDjjTfiiSeewGuvvYYNGzaM6u9YtWoV\njhw5ArfbDUBLww9O94+FysrKYVsBLly4EJWVlbHbRUVFWLt2LX7/+98Peey//Mu/4Nlnn8UNN9yA\nZ599Frt37x7z/SSEpB8KNAkhKemee+7BZ599hptuuglNTU245ZZb8Prrr2PXrl3gOA5Lly7F5MmT\nUVpaOmI6uL/NmzfjxhtvBADcdNNNQwLNhx56COvXr8d1112Hu+++G08//TSKiopi9//whz/EwYMH\ncddddyErK2tUfwPP87jiiivw3nvvYe/evSguLobdbj+LozA6JpMJqqqOuA/93Xvvvfjwww9RX18/\nYPuqVavwxRdf4MEHH4QgCNi4cSP++Z//ecz3lRCSXsRE7wAhhJwLv98Pu92Oq6++GldffTWuuuoq\nPPPMM5g5cyb8fj+uv/56AFrK980338R111034s+qqanBwYMH0dXVhT/+8Y9gjKG5uRl79+7FkiVL\nAGhzNEtKStDY2Ij169dj9uzZA36GTqdDYWEhJk+efFZ/x3XXXYfHHnsMJ06cwDXXXHN2B2GUZs6c\niU8//XTI9iNHjsRGZaMMBgMefPBBPPXUUwP+Rr/fD6PRiDVr1mDNmjX40Y9+hJUrV8Lj8cBms43L\nfhNCUh+NaBJCUs727dvxd3/3dwPmDNbX18Nut+Ozzz7Dli1b8M477+Cdd97Bhx9+iKNHj6KhoWHE\nn7dlyxbcfPPNeO+99/DOO+/g3XffxT/+4z8OmD8ZVVhYiDvuuAO/+MUvxuRvmT17NkKhELZv345v\nfetbY/IzB1u3bh2qqqqwdevW2LaTJ0/iT3/6E+67774hj7/yyisRCARiC5W6urpwySWXDFg41NLS\nAovFAqvVOi77TAhJDzSiSQhJOatXr0ZNTQ3uvPNOGI1GMMaQnZ2NFStWwGazITc3N/ZYo9GIa6+9\nFm+//TYKCgrw9ddfx8oHAcDNN9+Mt956C6+88sqA33HTTTfhO9/5Dnw+35Dff8cdd2Dr1q344IMP\nsG7duvP+e6655hqcPHkSRqPxtI979913sX///tjtaJA4+G+65ZZbsGjRothtnU6H119/Hf/+7/+O\nl19+GZIkwWg04umnn8akSZOG/V2PPvpobBQ4MzMT//Vf/4XHHnsMPM/H0u2//e1vIQjCuf3RhJAJ\ngWP9i78RQgghhBAyRmhEkxBCxsnjjz+OU6dODdm+evVq3HPPPQnYI0IIiS8a0SSEEEIIIeOCFgMR\nQgghhJBxQYEmIYQQQggZFxRoEkIIIYSQcUGBJiGEEEIIGRcUaBJCCCGEkHHx/wFzfteN+b49oAAA\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "0nTn6vUgnjwP", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Putting it all together (Production Style)" ] }, { "metadata": { "id": "KBV7jNQRF7Po", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "!pip -q install python-json-logger" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "b3uQS3dMF0Kz", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "import logging\n", "from pythonjsonlogger import jsonlogger\n", "\n", "LOG = logging.getLogger()\n", "LOG.setLevel(logging.DEBUG)\n", "logHandler = logging.StreamHandler()\n", "formatter = jsonlogger.JsonFormatter()\n", "logHandler.setFormatter(formatter)\n", "LOG.addHandler(logHandler)\n", "\n", "import click\n", "import boto3\n", "import pandas as pd\n", "\n", "TEST_DF = pd.DataFrame(\n", " {\"SentimentRaw\": [\"I am very Angry\",\n", " \"We are very Happy\",\n", " \"It is raining in Seattle\"]}\n", ")\n", "\n", "def create_sentiment(row):\n", " \"\"\"Uses AWS Comprehend to Create Sentiments on a DataFrame\"\"\"\n", "\n", " LOG.info(f\"Processing {row}\")\n", " comprehend = boto3.client(service_name='comprehend', region_name=\"us-east-1\")\n", " payload = comprehend.detect_sentiment(Text=row, LanguageCode='en')\n", " LOG.debug(f\"Found Sentiment: {payload}\") \n", " sentiment = payload['Sentiment']\n", " return sentiment\n", "\n", "def apply_sentiment(df, column=\"SentimentRaw\"):\n", " \"\"\"Uses Pandas Apply to Create Sentiment Analysis\"\"\"\n", "\n", " df['Sentiment'] = df[column].apply(create_sentiment)\n", " return df" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "v-J7gjksGA7f", "colab_type": "code", "outputId": "85a3be95-afac-477b-c979-6a895019bcbe", "colab": { "base_uri": "https://localhost:8080/", "height": 2383 } }, "cell_type": "code", "source": [ "df = apply_sentiment(TEST_DF)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "{\"message\": \"Processing I am very Angry\"}\n", "{\"message\": \"Processing I am very Angry\"}\n", "{\"message\": \"Event choose-service-name: calling handler \"}\n", "{\"message\": \"Event choose-service-name: calling handler \"}\n", "{\"message\": \"Event creating-client-class.comprehend: calling handler \"}\n", "{\"message\": \"Event creating-client-class.comprehend: calling handler \"}\n", "{\"message\": \"The s3 config key is not a dictionary type, ignoring its value of: None\"}\n", "{\"message\": \"The s3 config key is not a dictionary type, ignoring its value of: None\"}\n", "{\"message\": \"Setting comprehend timeout as (60, 60)\"}\n", "{\"message\": \"Setting comprehend timeout as (60, 60)\"}\n", "{\"message\": \"Registering retry handlers for service: comprehend\"}\n", "{\"message\": \"Registering retry handlers for service: comprehend\"}\n", "{\"message\": \"Event before-parameter-build.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Making request for OperationModel(name=DetectSentiment) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'X-Amz-Target': 'Comprehend_20171127.DetectSentiment', 'Content-Type': 'application/x-amz-json-1.1', 'User-Agent': 'Boto3/1.9.62 Python/3.6.7 Linux/4.14.65+ Botocore/1.12.62'}, 'body': b'{\\\"Text\\\": \\\"I am very Angry\\\", \\\"LanguageCode\\\": \\\"en\\\"}', 'url': 'https://comprehend.us-east-1.amazonaws.com/', 'context': {'client_region': 'us-east-1', 'client_config': , 'has_streaming_input': False, 'auth_type': None}}\"}\n", "{\"message\": \"Making request for OperationModel(name=DetectSentiment) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'X-Amz-Target': 'Comprehend_20171127.DetectSentiment', 'Content-Type': 'application/x-amz-json-1.1', 'User-Agent': 'Boto3/1.9.62 Python/3.6.7 Linux/4.14.65+ Botocore/1.12.62'}, 'body': b'{\\\"Text\\\": \\\"I am very Angry\\\", \\\"LanguageCode\\\": \\\"en\\\"}', 'url': 'https://comprehend.us-east-1.amazonaws.com/', 'context': {'client_region': 'us-east-1', 'client_config': , 'has_streaming_input': False, 'auth_type': None}}\"}\n", "{\"message\": \"Event request-created.comprehend.DetectSentiment: calling handler >\"}\n", "{\"message\": \"Event request-created.comprehend.DetectSentiment: calling handler >\"}\n", "{\"message\": \"Event choose-signer.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Event choose-signer.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"CanonicalRequest:\\nPOST\\n/\\n\\ncontent-type:application/x-amz-json-1.1\\nhost:comprehend.us-east-1.amazonaws.com\\nx-amz-date:20181214T191117Z\\nx-amz-target:Comprehend_20171127.DetectSentiment\\n\\ncontent-type;host;x-amz-date;x-amz-target\\nb1ef9199f866771fdabb0892b573595803acef305db24bf350d5760aa6c2f6e7\"}\n", "{\"message\": \"CanonicalRequest:\\nPOST\\n/\\n\\ncontent-type:application/x-amz-json-1.1\\nhost:comprehend.us-east-1.amazonaws.com\\nx-amz-date:20181214T191117Z\\nx-amz-target:Comprehend_20171127.DetectSentiment\\n\\ncontent-type;host;x-amz-date;x-amz-target\\nb1ef9199f866771fdabb0892b573595803acef305db24bf350d5760aa6c2f6e7\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T191117Z\\n20181214/us-east-1/comprehend/aws4_request\\n5a70db68e9d413b021183cfd1ac3a59e787b866609bacbea09a0abc708a03680\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T191117Z\\n20181214/us-east-1/comprehend/aws4_request\\n5a70db68e9d413b021183cfd1ac3a59e787b866609bacbea09a0abc708a03680\"}\n", "{\"message\": \"Signature:\\n476aa1dc7e2323eb3ffa5861a6c87660c170157a4424d5bb9fd49bc2bb1db321\"}\n", "{\"message\": \"Signature:\\n476aa1dc7e2323eb3ffa5861a6c87660c170157a4424d5bb9fd49bc2bb1db321\"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Starting new HTTPS connection (1): comprehend.us-east-1.amazonaws.com\"}\n", "{\"message\": \"Starting new HTTPS connection (1): comprehend.us-east-1.amazonaws.com\"}\n", "{\"message\": \"https://comprehend.us-east-1.amazonaws.com:443 \\\"POST / HTTP/1.1\\\" 200 166\"}\n", "{\"message\": \"https://comprehend.us-east-1.amazonaws.com:443 \\\"POST / HTTP/1.1\\\" 200 166\"}\n", "{\"message\": \"Response headers: {'Date': 'Fri, 14 Dec 2018 19:11:17 GMT', 'Content-Type': 'application/x-amz-json-1.1', 'Content-Length': '166', 'Connection': 'keep-alive', 'x-amzn-RequestId': '0850c2a4-ffd4-11e8-9915-fbeda43b2a4c'}\"}\n", "{\"message\": \"Response headers: {'Date': 'Fri, 14 Dec 2018 19:11:17 GMT', 'Content-Type': 'application/x-amz-json-1.1', 'Content-Length': '166', 'Connection': 'keep-alive', 'x-amzn-RequestId': '0850c2a4-ffd4-11e8-9915-fbeda43b2a4c'}\"}\n", "{\"message\": \"Response body:\\nb'{\\\"Sentiment\\\":\\\"NEGATIVE\\\",\\\"SentimentScore\\\":{\\\"Mixed\\\":0.014898190274834633,\\\"Negative\\\":0.9444955587387085,\\\"Neutral\\\":0.036787811666727066,\\\"Positive\\\":0.0038184858858585358}}'\"}\n", "{\"message\": \"Response body:\\nb'{\\\"Sentiment\\\":\\\"NEGATIVE\\\",\\\"SentimentScore\\\":{\\\"Mixed\\\":0.014898190274834633,\\\"Negative\\\":0.9444955587387085,\\\"Neutral\\\":0.036787811666727066,\\\"Positive\\\":0.0038184858858585358}}'\"}\n", "{\"message\": \"Event needs-retry.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Event needs-retry.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"Found Sentiment: {'Sentiment': 'NEGATIVE', 'SentimentScore': {'Positive': 0.0038184858858585358, 'Negative': 0.9444955587387085, 'Neutral': 0.036787811666727066, 'Mixed': 0.014898190274834633}, 'ResponseMetadata': {'RequestId': '0850c2a4-ffd4-11e8-9915-fbeda43b2a4c', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Fri, 14 Dec 2018 19:11:17 GMT', 'content-type': 'application/x-amz-json-1.1', 'content-length': '166', 'connection': 'keep-alive', 'x-amzn-requestid': '0850c2a4-ffd4-11e8-9915-fbeda43b2a4c'}, 'RetryAttempts': 0}}\"}\n", "{\"message\": \"Found Sentiment: {'Sentiment': 'NEGATIVE', 'SentimentScore': {'Positive': 0.0038184858858585358, 'Negative': 0.9444955587387085, 'Neutral': 0.036787811666727066, 'Mixed': 0.014898190274834633}, 'ResponseMetadata': {'RequestId': '0850c2a4-ffd4-11e8-9915-fbeda43b2a4c', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Fri, 14 Dec 2018 19:11:17 GMT', 'content-type': 'application/x-amz-json-1.1', 'content-length': '166', 'connection': 'keep-alive', 'x-amzn-requestid': '0850c2a4-ffd4-11e8-9915-fbeda43b2a4c'}, 'RetryAttempts': 0}}\"}\n", "{\"message\": \"Processing We are very Happy\"}\n", "{\"message\": \"Processing We are very Happy\"}\n", "{\"message\": \"Event choose-service-name: calling handler \"}\n", "{\"message\": \"Event choose-service-name: calling handler \"}\n", "{\"message\": \"Event creating-client-class.comprehend: calling handler \"}\n", "{\"message\": \"Event creating-client-class.comprehend: calling handler \"}\n", "{\"message\": \"The s3 config key is not a dictionary type, ignoring its value of: None\"}\n", "{\"message\": \"The s3 config key is not a dictionary type, ignoring its value of: None\"}\n", "{\"message\": \"Setting comprehend timeout as (60, 60)\"}\n", "{\"message\": \"Setting comprehend timeout as (60, 60)\"}\n", "{\"message\": \"Registering retry handlers for service: comprehend\"}\n", "{\"message\": \"Registering retry handlers for service: comprehend\"}\n", "{\"message\": \"Event before-parameter-build.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Making request for OperationModel(name=DetectSentiment) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'X-Amz-Target': 'Comprehend_20171127.DetectSentiment', 'Content-Type': 'application/x-amz-json-1.1', 'User-Agent': 'Boto3/1.9.62 Python/3.6.7 Linux/4.14.65+ Botocore/1.12.62'}, 'body': b'{\\\"Text\\\": \\\"We are very Happy\\\", \\\"LanguageCode\\\": \\\"en\\\"}', 'url': 'https://comprehend.us-east-1.amazonaws.com/', 'context': {'client_region': 'us-east-1', 'client_config': , 'has_streaming_input': False, 'auth_type': None}}\"}\n", "{\"message\": \"Making request for OperationModel(name=DetectSentiment) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'X-Amz-Target': 'Comprehend_20171127.DetectSentiment', 'Content-Type': 'application/x-amz-json-1.1', 'User-Agent': 'Boto3/1.9.62 Python/3.6.7 Linux/4.14.65+ Botocore/1.12.62'}, 'body': b'{\\\"Text\\\": \\\"We are very Happy\\\", \\\"LanguageCode\\\": \\\"en\\\"}', 'url': 'https://comprehend.us-east-1.amazonaws.com/', 'context': {'client_region': 'us-east-1', 'client_config': , 'has_streaming_input': False, 'auth_type': None}}\"}\n", "{\"message\": \"Event request-created.comprehend.DetectSentiment: calling handler >\"}\n", "{\"message\": \"Event request-created.comprehend.DetectSentiment: calling handler >\"}\n", "{\"message\": \"Event choose-signer.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Event choose-signer.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"CanonicalRequest:\\nPOST\\n/\\n\\ncontent-type:application/x-amz-json-1.1\\nhost:comprehend.us-east-1.amazonaws.com\\nx-amz-date:20181214T191117Z\\nx-amz-target:Comprehend_20171127.DetectSentiment\\n\\ncontent-type;host;x-amz-date;x-amz-target\\n3fcc4fd7f43751f3acd87a81645d215bb731eb0f7034f6eebd85d6181bbbf2ed\"}\n", "{\"message\": \"CanonicalRequest:\\nPOST\\n/\\n\\ncontent-type:application/x-amz-json-1.1\\nhost:comprehend.us-east-1.amazonaws.com\\nx-amz-date:20181214T191117Z\\nx-amz-target:Comprehend_20171127.DetectSentiment\\n\\ncontent-type;host;x-amz-date;x-amz-target\\n3fcc4fd7f43751f3acd87a81645d215bb731eb0f7034f6eebd85d6181bbbf2ed\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T191117Z\\n20181214/us-east-1/comprehend/aws4_request\\nd9092213dca760515c3447dfa2ece752b8854b6d9486fef41364bbec5e71f10d\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T191117Z\\n20181214/us-east-1/comprehend/aws4_request\\nd9092213dca760515c3447dfa2ece752b8854b6d9486fef41364bbec5e71f10d\"}\n", "{\"message\": \"Signature:\\n4780d896cc51a51f85ee8efc83a300cca1ec2ee4e89b7ca4ba6e5edb84acdd0a\"}\n", "{\"message\": \"Signature:\\n4780d896cc51a51f85ee8efc83a300cca1ec2ee4e89b7ca4ba6e5edb84acdd0a\"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Starting new HTTPS connection (1): comprehend.us-east-1.amazonaws.com\"}\n", "{\"message\": \"Starting new HTTPS connection (1): comprehend.us-east-1.amazonaws.com\"}\n", "{\"message\": \"https://comprehend.us-east-1.amazonaws.com:443 \\\"POST / HTTP/1.1\\\" 200 166\"}\n", "{\"message\": \"https://comprehend.us-east-1.amazonaws.com:443 \\\"POST / HTTP/1.1\\\" 200 166\"}\n", "{\"message\": \"Response headers: {'Date': 'Fri, 14 Dec 2018 19:11:17 GMT', 'Content-Type': 'application/x-amz-json-1.1', 'Content-Length': '166', 'Connection': 'keep-alive', 'x-amzn-RequestId': '086d998c-ffd4-11e8-983f-d98c2036a672'}\"}\n", "{\"message\": \"Response headers: {'Date': 'Fri, 14 Dec 2018 19:11:17 GMT', 'Content-Type': 'application/x-amz-json-1.1', 'Content-Length': '166', 'Connection': 'keep-alive', 'x-amzn-RequestId': '086d998c-ffd4-11e8-983f-d98c2036a672'}\"}\n", "{\"message\": \"Response body:\\nb'{\\\"Sentiment\\\":\\\"POSITIVE\\\",\\\"SentimentScore\\\":{\\\"Mixed\\\":0.0020924475975334644,\\\"Negative\\\":6.253701285459101E-4,\\\"Neutral\\\":0.011492948047816753,\\\"Positive\\\":0.9857891201972961}}'\"}\n", "{\"message\": \"Response body:\\nb'{\\\"Sentiment\\\":\\\"POSITIVE\\\",\\\"SentimentScore\\\":{\\\"Mixed\\\":0.0020924475975334644,\\\"Negative\\\":6.253701285459101E-4,\\\"Neutral\\\":0.011492948047816753,\\\"Positive\\\":0.9857891201972961}}'\"}\n", "{\"message\": \"Event needs-retry.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Event needs-retry.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"Found Sentiment: {'Sentiment': 'POSITIVE', 'SentimentScore': {'Positive': 0.9857891201972961, 'Negative': 0.0006253701285459101, 'Neutral': 0.011492948047816753, 'Mixed': 0.0020924475975334644}, 'ResponseMetadata': {'RequestId': '086d998c-ffd4-11e8-983f-d98c2036a672', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Fri, 14 Dec 2018 19:11:17 GMT', 'content-type': 'application/x-amz-json-1.1', 'content-length': '166', 'connection': 'keep-alive', 'x-amzn-requestid': '086d998c-ffd4-11e8-983f-d98c2036a672'}, 'RetryAttempts': 0}}\"}\n", "{\"message\": \"Found Sentiment: {'Sentiment': 'POSITIVE', 'SentimentScore': {'Positive': 0.9857891201972961, 'Negative': 0.0006253701285459101, 'Neutral': 0.011492948047816753, 'Mixed': 0.0020924475975334644}, 'ResponseMetadata': {'RequestId': '086d998c-ffd4-11e8-983f-d98c2036a672', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Fri, 14 Dec 2018 19:11:17 GMT', 'content-type': 'application/x-amz-json-1.1', 'content-length': '166', 'connection': 'keep-alive', 'x-amzn-requestid': '086d998c-ffd4-11e8-983f-d98c2036a672'}, 'RetryAttempts': 0}}\"}\n", "{\"message\": \"Processing It is raining in Seattle\"}\n", "{\"message\": \"Processing It is raining in Seattle\"}\n", "{\"message\": \"Event choose-service-name: calling handler \"}\n", "{\"message\": \"Event choose-service-name: calling handler \"}\n", "{\"message\": \"Event creating-client-class.comprehend: calling handler \"}\n", "{\"message\": \"Event creating-client-class.comprehend: calling handler \"}\n", "{\"message\": \"The s3 config key is not a dictionary type, ignoring its value of: None\"}\n", "{\"message\": \"The s3 config key is not a dictionary type, ignoring its value of: None\"}\n", "{\"message\": \"Setting comprehend timeout as (60, 60)\"}\n", "{\"message\": \"Setting comprehend timeout as (60, 60)\"}\n", "{\"message\": \"Registering retry handlers for service: comprehend\"}\n", "{\"message\": \"Registering retry handlers for service: comprehend\"}\n", "{\"message\": \"Event before-parameter-build.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Event before-parameter-build.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Making request for OperationModel(name=DetectSentiment) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'X-Amz-Target': 'Comprehend_20171127.DetectSentiment', 'Content-Type': 'application/x-amz-json-1.1', 'User-Agent': 'Boto3/1.9.62 Python/3.6.7 Linux/4.14.65+ Botocore/1.12.62'}, 'body': b'{\\\"Text\\\": \\\"It is raining in Seattle\\\", \\\"LanguageCode\\\": \\\"en\\\"}', 'url': 'https://comprehend.us-east-1.amazonaws.com/', 'context': {'client_region': 'us-east-1', 'client_config': , 'has_streaming_input': False, 'auth_type': None}}\"}\n", "{\"message\": \"Making request for OperationModel(name=DetectSentiment) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'X-Amz-Target': 'Comprehend_20171127.DetectSentiment', 'Content-Type': 'application/x-amz-json-1.1', 'User-Agent': 'Boto3/1.9.62 Python/3.6.7 Linux/4.14.65+ Botocore/1.12.62'}, 'body': b'{\\\"Text\\\": \\\"It is raining in Seattle\\\", \\\"LanguageCode\\\": \\\"en\\\"}', 'url': 'https://comprehend.us-east-1.amazonaws.com/', 'context': {'client_region': 'us-east-1', 'client_config': , 'has_streaming_input': False, 'auth_type': None}}\"}\n", "{\"message\": \"Event request-created.comprehend.DetectSentiment: calling handler >\"}\n", "{\"message\": \"Event request-created.comprehend.DetectSentiment: calling handler >\"}\n", "{\"message\": \"Event choose-signer.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Event choose-signer.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"Calculating signature using v4 auth.\"}\n", "{\"message\": \"CanonicalRequest:\\nPOST\\n/\\n\\ncontent-type:application/x-amz-json-1.1\\nhost:comprehend.us-east-1.amazonaws.com\\nx-amz-date:20181214T191117Z\\nx-amz-target:Comprehend_20171127.DetectSentiment\\n\\ncontent-type;host;x-amz-date;x-amz-target\\n2b87023c28eae9359c0e0898cdc5f400f25354b7d43533ade7ab063d9110a253\"}\n", "{\"message\": \"CanonicalRequest:\\nPOST\\n/\\n\\ncontent-type:application/x-amz-json-1.1\\nhost:comprehend.us-east-1.amazonaws.com\\nx-amz-date:20181214T191117Z\\nx-amz-target:Comprehend_20171127.DetectSentiment\\n\\ncontent-type;host;x-amz-date;x-amz-target\\n2b87023c28eae9359c0e0898cdc5f400f25354b7d43533ade7ab063d9110a253\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T191117Z\\n20181214/us-east-1/comprehend/aws4_request\\ne7120918a65113acdea424ee61f651eb8bc5a9172b394d58f02220f0e49d46b0\"}\n", "{\"message\": \"StringToSign:\\nAWS4-HMAC-SHA256\\n20181214T191117Z\\n20181214/us-east-1/comprehend/aws4_request\\ne7120918a65113acdea424ee61f651eb8bc5a9172b394d58f02220f0e49d46b0\"}\n", "{\"message\": \"Signature:\\n1e40aa6cd8e8d37ba360a6005e2f63260264012f42435c7b115dcedf5c9516ea\"}\n", "{\"message\": \"Signature:\\n1e40aa6cd8e8d37ba360a6005e2f63260264012f42435c7b115dcedf5c9516ea\"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Sending http request: \"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)\"}\n", "{\"message\": \"Starting new HTTPS connection (1): comprehend.us-east-1.amazonaws.com\"}\n", "{\"message\": \"Starting new HTTPS connection (1): comprehend.us-east-1.amazonaws.com\"}\n", "{\"message\": \"https://comprehend.us-east-1.amazonaws.com:443 \\\"POST / HTTP/1.1\\\" 200 161\"}\n", "{\"message\": \"https://comprehend.us-east-1.amazonaws.com:443 \\\"POST / HTTP/1.1\\\" 200 161\"}\n", "{\"message\": \"Response headers: {'Date': 'Fri, 14 Dec 2018 19:11:17 GMT', 'Content-Type': 'application/x-amz-json-1.1', 'Content-Length': '161', 'Connection': 'keep-alive', 'x-amzn-RequestId': '08884ccb-ffd4-11e8-85ab-85a3217ced42'}\"}\n", "{\"message\": \"Response headers: {'Date': 'Fri, 14 Dec 2018 19:11:17 GMT', 'Content-Type': 'application/x-amz-json-1.1', 'Content-Length': '161', 'Connection': 'keep-alive', 'x-amzn-RequestId': '08884ccb-ffd4-11e8-85ab-85a3217ced42'}\"}\n", "{\"message\": \"Response body:\\nb'{\\\"Sentiment\\\":\\\"NEUTRAL\\\",\\\"SentimentScore\\\":{\\\"Mixed\\\":0.01440255343914032,\\\"Negative\\\":0.044540803879499435,\\\"Neutral\\\":0.5939325094223022,\\\"Positive\\\":0.3471241593360901}}'\"}\n", "{\"message\": \"Response body:\\nb'{\\\"Sentiment\\\":\\\"NEUTRAL\\\",\\\"SentimentScore\\\":{\\\"Mixed\\\":0.01440255343914032,\\\"Negative\\\":0.044540803879499435,\\\"Neutral\\\":0.5939325094223022,\\\"Positive\\\":0.3471241593360901}}'\"}\n", "{\"message\": \"Event needs-retry.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"Event needs-retry.comprehend.DetectSentiment: calling handler \"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"No retry needed.\"}\n", "{\"message\": \"Found Sentiment: {'Sentiment': 'NEUTRAL', 'SentimentScore': {'Positive': 0.3471241593360901, 'Negative': 0.044540803879499435, 'Neutral': 0.5939325094223022, 'Mixed': 0.01440255343914032}, 'ResponseMetadata': {'RequestId': '08884ccb-ffd4-11e8-85ab-85a3217ced42', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Fri, 14 Dec 2018 19:11:17 GMT', 'content-type': 'application/x-amz-json-1.1', 'content-length': '161', 'connection': 'keep-alive', 'x-amzn-requestid': '08884ccb-ffd4-11e8-85ab-85a3217ced42'}, 'RetryAttempts': 0}}\"}\n", "{\"message\": \"Found Sentiment: {'Sentiment': 'NEUTRAL', 'SentimentScore': {'Positive': 0.3471241593360901, 'Negative': 0.044540803879499435, 'Neutral': 0.5939325094223022, 'Mixed': 0.01440255343914032}, 'ResponseMetadata': {'RequestId': '08884ccb-ffd4-11e8-85ab-85a3217ced42', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Fri, 14 Dec 2018 19:11:17 GMT', 'content-type': 'application/x-amz-json-1.1', 'content-length': '161', 'connection': 'keep-alive', 'x-amzn-requestid': '08884ccb-ffd4-11e8-85ab-85a3217ced42'}, 'RetryAttempts': 0}}\"}\n" ], "name": "stderr" } ] }, { "metadata": { "id": "W18fmPVeGVaT", "colab_type": "code", "outputId": "f10550cb-7d44-4a58-a565-0a6bf0c9b8c9", "colab": { "base_uri": "https://localhost:8080/", "height": 142 } }, "cell_type": "code", "source": [ "df.head()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
SentimentRawSentiment
0I am very AngryNEGATIVE
1We are very HappyPOSITIVE
2It is raining in SeattleNEUTRAL
\n", "
" ], "text/plain": [ " SentimentRaw Sentiment\n", "0 I am very Angry NEGATIVE\n", "1 We are very Happy POSITIVE\n", "2 It is raining in Seattle NEUTRAL" ] }, "metadata": { "tags": [] }, "execution_count": 21 } ] }, { "metadata": { "id": "4xg5horKE0g0", "colab_type": "text" }, "cell_type": "markdown", "source": [ "" ] }, { "metadata": { "id": "o3j8pTFwixkQ", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## 7.5 Cloud9" ] }, { "metadata": { "id": "Z4lhXRaIkXzV", "colab_type": "text" }, "cell_type": "markdown", "source": [ "\n", "\n", "* Web based [development environment](https://docs.aws.amazon.com/cloud9/latest/user-guide/sample-python.html)\n", "\n", "\n", "![Cloud9](https://user-images.githubusercontent.com/58792/50033517-afe14000-ffad-11e8-894a-f70389a046d7.png)\n", "\n" ] }, { "metadata": { "id": "5ys3FRxujR3t", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### [Demo]Cloud9" ] }, { "metadata": { "id": "Awy-eESUle1I", "colab_type": "text" }, "cell_type": "markdown", "source": [ "\n", "\n", "* Create a cloud9 environment\n", "* Install Python 3.6\n", "\n", "---\n", "\n", "\n", "\n", "```bash\n", "sudo yum -y update\n", "sudo yum -y install python36\n", "\n", "```\n", "\n", "\n", "\n", "\n" ] }, { "metadata": { "id": "-ZAEzZfO962A", "colab_type": "text" }, "cell_type": "markdown", "source": [ "\n", "**Python Lambda Function**\n", "\n", "```python\n", "import json\n", "import decimal\n", "\n", "\n", "def lambda_handler(event, context):\n", "\n", " print(event)\n", " if 'body' in event:\n", " event = json.loads(event[\"body\"])\n", " \n", " amount = float(event[\"amount\"])\n", " res = []\n", " coins = [1,5,10,25]\n", " coin_lookup = {25: \"quarters\", 10: \"dimes\", 5: \"nickels\", 1: \"pennies\"}\n", " coin = coins.pop()\n", " num, rem = divmod(int(amount*100), coin)\n", " res.append({num:coin_lookup[coin]})\n", " while rem > 0:\n", " coin = coins.pop()\n", " num, rem = divmod(rem, coin)\n", " if num:\n", " if coin in coin_lookup:\n", " res.append({num:coin_lookup[coin]})\n", "\n", " response = {\n", " \"statusCode\": \"200\",\n", " \"headers\": { \"Content-type\": \"application/json\" },\n", " \"body\": json.dumps({\"res\": res})\n", " }\n", "\n", " return response\n", "```\n", "\n" ] }, { "metadata": { "id": "urYzIcPG-GMo", "colab_type": "text" }, "cell_type": "markdown", "source": [ "**payload**\n", "\n", "\n", "\n", "```javascript\n", "{\"amount\": \".71\"}\n", "```\n", "\n" ] }, { "metadata": { "id": "5Z1rghBc-NKi", "colab_type": "text" }, "cell_type": "markdown", "source": [ "**response**\n", "\n", "\n", "\n", "```javascript\n", "Response\n", "{\n", " \"statusCode\": \"200\",\n", " \"headers\": {\n", " \"Content-type\": \"application/json\"\n", " },\n", " \"body\": \"{\\\"res\\\": [{\\\"2\\\": \\\"quarters\\\"}, {\\\"2\\\": \\\"dimes\\\"}, {\\\"1\\\": \\\"pennies\\\"}]}\"\n", "}\n", "\n", "Function Logs\n", "{'amount': '.71'}\n", "\n", "Request ID\n", "d7ec2cad-8da0-4394-957e-41f07bad23ae\n", "```\n", "\n", "\n" ] }, { "metadata": { "id": "Gy-_OksSjU8Q", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "MUp-WrPOmJVu", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## 7.6 Key Terminology" ] }, { "metadata": { "id": "yc--CN_Kolxo", "colab_type": "text" }, "cell_type": "markdown", "source": [ "### Sagemaker Built-in Algorithms\n", "\n" ] }, { "metadata": { "id": "QOi-EXNUoz4O", "colab_type": "text" }, "cell_type": "markdown", "source": [ "#### BlazingText\n", "\n", "\n", "* unsupervised learning algorithm for generating **Word2Vec embeddings.**\n", "* aws blog post [BlazingText](https://aws.amazon.com/blogs/machine-learning/amazon-sagemaker-blazingtext-parallelizing-word2vec-on-multiple-cpus-or-gpus/)\n", "\n", "\n", "\n", "![BlazingText](https://d2908q01vomqb2.cloudfront.net/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59/2018/01/18/sagemaker-word2vec-3-1.gif)" ] }, { "metadata": { "id": "003YCm16q702", "colab_type": "text" }, "cell_type": "markdown", "source": [ "" ] }, { "metadata": { "id": "zCtotY8NpxfW", "colab_type": "text" }, "cell_type": "markdown", "source": [ "#### DeepAR Forecasting\n", "\n", "* supervised learning algorithm for forecasting scalar (that is, one-dimensional) time series using recurrent neural networks (RNN)\n", "* [DeepAR Documentation](https://docs.aws.amazon.com/sagemaker/latest/dg/deepar.html)\n", "\n", "![DeepAR](https://docs.aws.amazon.com/sagemaker/latest/dg/images/deepar-2.png)" ] }, { "metadata": { "id": "M_mqM0pEq1bN", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "YwuDnUj5q_qT", "colab_type": "text" }, "cell_type": "markdown", "source": [ "" ] } ] }