{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Connecting to Facebook API (part 2)\n", "\n", "Written by Kat Chuang [@katychuang](http://twitter.com/katychuang)\n", "\n", "## Objective\n", "\n", "The goal of this exercise is to connect with Facebook Graph Api to collect information about my most recent posts, and also to collect each posts' subsequent comments and likes. This is a continuation from [part 1](http://nbviewer.jupyter.org/github/katychuang/ipython-notebooks/blob/master/facebook_posting_activity.ipynb)\n", "\n", "I collected data from my most recent posts and previously saved json output into a `file.json`\n", "\n", "In this part we try to plot the data into a chart for visual representation (it's a matplot lib heatmap type of visualization). \n", "\n", "I saved the filename in a separate config file in a separate local folder, `_keys` in a file name `facebook.py`. Inside you want to save a string variable like the following:\n", "\n", "```\n", "data_file=\"XXXXXX\"\n", "```\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "46 posts in this file\n" ] } ], "source": [ "from _keys.facebook import data_file\n", "\n", "import json\n", "with open(data_file) as json_data:\n", " data = json.load(json_data)\n", " \n", "print (len(data), \"posts in this file\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the above code, we read the text file and saved the JSON data to the variable `data` to work with.\n", "\n", "We need to pull the time stamps, and their accompanying day of week. We want to convert a list of timestamps into a list of formatted timestamps. But first, we import datetime and parser. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "21 posts since 2017-03-01\n", "Sunday \t 8\n", "Sunday \t 8\n", "Sunday \t 8\n", "Sunday \t 8\n", "Friday \t 4\n", "Thursday \t 4\n", "Wednesday \t 2\n", "Sunday \t 8\n", "Sunday \t 8\n", "Saturday \t 3\n", "Saturday \t 3\n", "Friday \t 4\n", "Friday \t 4\n", "Friday \t 4\n", "Thursday \t 4\n", "Thursday \t 4\n", "Sunday \t 8\n", "Sunday \t 8\n", "Saturday \t 3\n", "Thursday \t 4\n", "Wednesday \t 2\n" ] } ], "source": [ "from datetime import datetime \n", "from dateutil.parser import parse\n", "\n", "# limit to just march posts\n", "march_posts = list(filter(lambda x: parse(x['created_time'][:-5]) >= datetime(2017, 3, 1), data ))\n", "print(len(march_posts), \"posts since\", datetime(2017, 3, 1).date())\n", "\n", "# get days to count occurrence\n", "march_days = list (map( lambda x: parse(x['created_time']).strftime(\"%A\"), march_posts ))\n", "\n", "# count number of posts by day of week\n", "for day in march_days: print(day, \" \\t\", march_days.count(day))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's write some utility functions to process the data for the chart.\n", "\n", "Scrub turns the raw string type into a datetime type. Then we can pass that into dow() and hod() to format the strings. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def scrub(raw_timestamp):\n", " timestamp = parser.parse(raw_timestamp)\n", " return dow(timestamp), hod(timestamp)\n", "\n", "# returns day of week\n", "def dow(date): return date.strftime(\"%A\") # i.e. Monday\n", "\n", "# returns hour of day\n", "def hod(time): return time.strftime(\"%-I:%M%p\") # i.e. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we want to try create nested lists. A month contains weeks, which in turn contains days. To express this in code, it would be something like so:\n", "\n", "```\n", "M = [W, W, W, ...]\n", "W = [\"Mon\", \"Tues, \"Wed\", \"Thu\", ... ]\n", "```\n", "\n", "The lists are combined into a list of lists. The " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]\n", "active days: \n", " [[0, 0, 1, 1, 0, 1, 1], [0, 0, 0, 1, 1, 1, 1], [0, 0, 1, 1, 1, 0, 1], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]\n" ] } ], "source": [ "yIndex = [\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",\"Sunday\"]\n", "\n", "# Get a list of week numbers, 0-3. Note that March starts on week 9 of 2017 \n", "# but we subtract 9 to start at index 0\n", "get_week = list (map( lambda x: parse(x['created_time']).isocalendar()[1]-9, march_posts ))\n", "\n", "# Get a list of day numbers, 0-6\n", "get_day = list (map( lambda x: yIndex.index(parse(x['created_time']).strftime(\"%A\")), march_posts ))\n", "\n", "# create empty array\n", "from itertools import repeat\n", "month = [[0] * 7 for i in repeat(None, 5)]\n", "print(month)\n", "\n", "# go thru posts to fill in empty array\n", "for i, (w, d) in enumerate(zip(get_week, get_day)):\n", " month[w][d] = 1\n", " \n", "print(\"active days: \\n\", month)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's step it up and count posts per day, so we can have more than 2 shades of colors on the heatmap." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "activity per day: \n", " [[0, 0, 0.047619047619047616, 0.047619047619047616, 0, 0.047619047619047616, 0.09523809523809523], [0, 0, 0, 0.09523809523809523, 0.14285714285714285, 0.09523809523809523, 0.09523809523809523], [0, 0, 0.047619047619047616, 0.047619047619047616, 0.047619047619047616, 0, 0.19047619047619047], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]\n" ] } ], "source": [ "# empty list of lists\n", "activity = [[0] * 7 for i in repeat(None, 5)]\n", "\n", "# the total number of posts\n", "limit = len(get_week)\n", "\n", "# fill in empty array with a fraction\n", "for i, (w, d) in enumerate(zip(get_week, get_day)):\n", " activity[w][d] += 1/limit\n", " \n", "print(\"activity per day: \\n\", activity)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now our data is ready for plotting. Let's do the important config stuff." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's how you create a chart of heatmap type, filled in with values from activity." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "heatmap = ax.pcolor(activity, cmap=plt.cm.Greens, alpha=0.8)\n", "\n", "# put the major ticks at the middle of each cell\n", "ax.set_xticks(np.arange(0,7)+0.5, minor=False)\n", "ax.set_yticks(np.arange(0,5)+0.5, minor=False)\n", "\n", "# want a more natural, table-like display\n", "ax.invert_yaxis()\n", "ax.xaxis.tick_top()\n", "\n", "# labels\n", "column_labels = [\"Mon\", \"Tues\", \"Wed\", \"Thurs\", \"Fri\", \"Sat\", \"Sun\"] \n", "ax.set_xticklabels(column_labels, minor=False)\n", "ax.set_yticklabels(list(''), minor=False)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I'm not liking how the borders look like. So I'm going to create another version with the seaborn library." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\nezWbzSbp4++l/+7vf1dz3t7ero8TEhJUWFioCRMmqLy8XLGxsfroo496oOdd8+m+90XvvvuuXnnl\nFfn4+Cg8PFzPPvusioqKZLfbtX//ftf0cEREhBITE3u5t7fW0ThOnTrV4ffX3fIzzEQ9Em5xcXEq\nKSlRcXFxu/npsLAwFRcXu64V5OXlyc/PT/fff39PdOuO+Pv7q6qqSpK0b98+1/7x48eroqJCZ86c\nkSQdPHhQsbGxamxs1LJly1RcXKzp06dr1apV8vHx0YULF3q03+PGjdPJkyf1zjvv6NFHH5Ukff7z\nn9eoUaO0fft2OZ1O+fj46MEHH9Srr74qSbp69aoSExP1xhtvKDQ0VBUVFaqpqZEk/eEPf+jR/t8u\nf39//fWvf1VjY6NaWlr05ptv3rJtQkKCTp48qfj4eK1evVpXr17lnfYd8Pf315YtW1RZWenad+nS\nJV2/fl1FRUUKDw/X3LlzFRISov3796u1tVXSx2+YPnmD2xd0NI4pU6boH//4hy5fvizLsrR///5e\n7Ck+zePTkpL0xS9+UV/5ylc0cOBA+fn5ufaPGzdOTzzxhObNm6e2tjb5+/vrpZde6vGpuq5IS0tT\nenq6Bg0apNDQUNc03fDhw5Wenq6lS5fKsiz169dPW7Zskbe3t37wgx/oJz/5iXJzc+Xl5aUpU6Zo\n7NixPdrvAQMGKDg4WM3Nze2W+judTj3//PMaN26cJCkzM1OrV69WTEyMmpqaXIt+JCk5OVnz5s3T\nvffeq69//es92v/bNWHCBD388MOKjo7W4MGDNW7cOJ0+ffqmbZcvX67nnntOL7zwgux2u5YsWaIv\nfelLPdxjc3z5y1/Wiy++qI0bN6qmpkb33HOPBg4cqPT0dA0dOlTLly9XTEyMvLy8NGbMGO3du1dt\nbW166KGH9MILL2jx4sV68cUXe3sYHY7jq1/9qhISEjR79mwNHjzYNRuC3mezqJMBAIbp+yUSAAC3\niXADABiHcAMAGIdwAwAYh3ADABiHcAMAGIdwAwAYh3ADABjH7RNKbrRec9fkrjDAy9uosRy+eLC3\nu9Etxg9xGjUWvsf6nvFDnFpesaK3u9EtMidkeOxz2yK7/jQea9/5buxJ9+iRx28BAPq4fz9w3BRM\nSwIAjEPlBgAwrtQh3AAAxk1LEm4AAMmsbCPcAACicgMAGIhrbgAA4xhWuRmW1QAAULkBACQWlAAA\n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\nQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import seaborn as sns\n", "\n", "sns.set(font_scale=1.2)\n", "sns.set_style({\"savefig.dpi\": 100})\n", "\n", "ax = sns.heatmap(activity, cmap=plt.cm.Greens, linewidths=.1)\n", "\n", "ax.xaxis.tick_top()\n", "ax.set_xticklabels(column_labels, minor=False)\n", "ax.set_yticklabels(list(''), minor=False)\n", "\n", "fig = ax.get_figure()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.0" } }, "nbformat": 4, "nbformat_minor": 2 }