{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction\n", "\n", "First, we must ensure that the Watson Python SDK is installed and ready to use, we'll then import the SDK as well as the pandas library\n", "\n", "**Note: Using `%%capture` just supresses the output, you can remove the line if you want to see the output from pip**" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%%capture\n", "!pip install watson_developer_cloud==2.5.1" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from watson_developer_cloud import DiscoveryV1\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Initialize Watson Discovery\n", "\n", "Now we'll initialize Watson Discovery using our login credentials. In order to obtain these, create a Watson Discovery services with your IBM Cloud account, and generate new credentials." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Enter your own credentials below - be sure to wrap each inside of single quotation marks\n", "credentials = {\n", " 'IAM_API_KEY': 'YOUR DISCOVERY API KEY HERE'\n", "}" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "discovery = DiscoveryV1(\n", " version='2018-08-01',\n", " iam_api_key= credentials['IAM_API_KEY'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Creating the query\n", "\n", "There are a few elements to querying Watson Discovery news, I'll break down each of the elements.\n", "\n", "`environment_id`: `system` just denotes that we're using the system environment\n", "\n", "`collection_id`: We want to query the news collection\n", "\n", "`query`: Basically we will be using a filter in order to isolate the articles that we want, so a query is not neccesary in this case\n", "\n", "`offset`: The number of results (documents) to skip\n", "\n", "`count`: The number of results (documents) to return \n", "\n", "***note: Count and offset is the way pagination of results is implemented, the maximum of total results (offset + count) cannot exceed 1,000***\n", "\n", "`deduplicate`: This is a beta feature to have Watson remove duplicate articles\n", "\n", "`aggregation`: This is a analytic query of the results set - in this case, the entire collection of news articles, filtered by Company (in this case 'bitcoin' is the company in question)\n", "\n", "`filter`: The query for matching documents\n", "\n", "`return_fields`: What items to actually return to us for our use\n", "\n", "**For more information, check out the [query reference](https://cloud.ibm.com/docs/services/discovery/query-reference.html#query-reference)**\n", "\n", "\n", "We are using DEFAULT_COUNT of 50, the maximum you can query at once, and incrementing until we've captured all available documents or hit 1,000 (the maximum)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "all_results = []\n", "\n", "DEFAULT_COUNT = 50\n", "offset = 0\n", "\n", "while offset + DEFAULT_COUNT <= 1000:\n", " try:\n", " result = discovery.query(environment_id='system',\n", " collection_id='news-en',\n", " query='',\n", " offset=offset,\n", " count=DEFAULT_COUNT,\n", " deduplicate=True,\n", " aggregation='filter(enriched_title.entities.type::Company).term(enriched_title.entities.text).timeslice(crawl_date,1day).term(enriched_text.sentiment.document.score)',\n", " filter='Bitcoin',\n", " return_fields=['publication_date', 'enriched_text.sentiment.document'])\n", " \n", " # If the results are empty, stop querying\n", " if not result['results']:\n", " break\n", " \n", " # Add results to all_results and increment offset\n", " all_results.extend(result['results'])\n", " \n", " offset += offset + DEFAULT_COUNT\n", " except:\n", " break" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Using the data\n", "\n", "Now that we've queried Watson Discovery, we need to make the data usable. What is returned is an object with a few different fields, the one we're concerned with though is `results` (the items we asked for in `return_fields` of the query will be here). After each query in the previous `while` loop, we added the `result['results']` to an array of all results. Now we'll work with them.\n", "\n", "First we'll create a pandas dataframe, think of it as putting the data into a spreadsheet. Then we'll iterate over the array of results, and add them to our new dataframe." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "_date = []\n", "_sentiment_label = []\n", "_sentiment_score = []\n", "\n", "for r in all_results:\n", " _date.append(r['publication_date'])\n", " _sentiment_label.append(r['enriched_text']['sentiment']['document']['label'])\n", " _sentiment_score.append(r['enriched_text']['sentiment']['document']['score'])" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "df['publication_date'] = _date\n", "df['sentiment_label'] = _sentiment_label\n", "df['sentiment_score'] = _sentiment_score\n", "df.index = df['publication_date']" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "df['publication_date'] = pd.to_datetime(df['publication_date'])\n", "df.index = df['publication_date']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Looking at the data\n", "\n", "When we call the `df.head()` function, we can visually see the first portion of our data - remember the concept of a spreadsheet? Here we can see how the sentiment label coorelates to the score. Sentinent scores range from negative to positive, -1 to 1, with 0 being neutral. Watson has just taken the leg work away from assigning a label, but you could easily do this yourself as well." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
publication_datesentiment_labelsentiment_score
publication_date
2018-09-23 12:34:002018-09-23 12:34:00negative-0.029183
2018-09-23 11:46:002018-09-23 11:46:00negative-0.560177
2018-09-23 12:42:002018-09-23 12:42:00negative-0.022305
2018-09-23 10:00:002018-09-23 10:00:00negative-0.368113
2018-09-23 12:42:002018-09-23 12:42:00negative-0.167054
\n", "
" ], "text/plain": [ " publication_date sentiment_label sentiment_score\n", "publication_date \n", "2018-09-23 12:34:00 2018-09-23 12:34:00 negative -0.029183\n", "2018-09-23 11:46:00 2018-09-23 11:46:00 negative -0.560177\n", "2018-09-23 12:42:00 2018-09-23 12:42:00 negative -0.022305\n", "2018-09-23 10:00:00 2018-09-23 10:00:00 negative -0.368113\n", "2018-09-23 12:42:00 2018-09-23 12:42:00 negative -0.167054" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Visualizing the data\n", "\n", "Now that we've set up our dataframe, we can use `matplotlib` to visualize a portion of the data. In this example, we're using the sentiment label (negative, positive, neutral), and visualize the data in a pie chart.\n", "\n", "First we import `matplotlib.pyplot`, and just for aesthetics, set the style to use `fivethirtyeight` (as an aside, if you call `matplotlib.style.available`, you can see a full list of styles available. You could also not set the style and use the default as well).\n", "\n", "Finally, the column we want to analyze we previously named `sentimnent`, we access the column with `df['sentiment']`, we then call the helper function `value_counts()` to get a count of each sentiment lable, and then finally use the `plot()` method to plot the data in a pie chart." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.style.use('fivethirtyeight')\n", "\n", "df['sentiment_label'].value_counts().plot(kind='pie', \n", " subplots=False, \n", " startangle=100,\n", " pctdistance=0.85,\n", " autopct='%1.1f%%',\n", " title='Sentiment of articles reporting on Bitcoin')\n", "\n", "# center_circle = plt.Circle((0,0),0.70,fc='white')\n", "# fig = plt.gcf()\n", "# fig.gca().add_artist(center_circle)\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3.5", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.5" } }, "nbformat": 4, "nbformat_minor": 1 }