{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Datenvisualisierung hat mich schon immer fasziniert. Leider hatte ich nie einen wirklichen Grund dafür es einzusetzen. Und doch wollte ich es mal ausprobieren. Ich habe mich sehr von [Jemus](http://blog.jemu.name/tvshows/2015/04/so-cougar-town-ended/) inspirieren lassen. Da passiert natürlich viel viel mehr und ausführlicher. Ich habe erstmal das gemacht was ich auch verstehe :). Und zwar die Episoden Ratings darzustellen." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Als erstes importiere ich ein paar Sachen. Erstmal `choice` um per Zufall Farben aus einer Palette auszuwählen. Dann `pandas` für die `DataFrames`. Um die Daten aus der Trakt-API zu bekommen benutze ich [trakt.py](https://github.com/fuzeman/trakt.py). Wieso alles selber bauen wenn es dieses schöne Modul gibt? Dann benutze ich [Bokeh](http://bokeh.pydata.org/en/latest/) um das ganze darzustellen." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from random import choice\n", "\n", "import pandas as pd\n", "from trakt.tv import TVShow\n", "from bokeh.plotting import figure, ColumnDataSource, output_notebook, show\n", "from bokeh.models import HoverTool\n", "from bokeh.palettes import Spectral9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wir starten die Bokeh Ausgabe in einem jupyter-Notebook." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", "
\n", " \n", " BokehJS successfully loaded.\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hier ist die Funktion die die Daten besorgt, verarbeitet und darstellt." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def ratings(show_name):\n", " \n", " # Es wird die Show definiert\n", " tv_show = TVShow(show_name)\n", " \n", " # Um die Staffeln ausseinander zu halten, soll jede Episode eine unterschiedliche \n", " # Staffelfarbe haben. Bokeh hat ein paar Farbpaletten dabei. Ich benutze Spectral9.\n", " # Dazu brauchen wir noch eine liste um alle Episoden-Staffel-Farben zu speichern\n", " colormap = Spectral9\n", " colors = []\n", " \n", " # Wir brauchen eine Episoden Liste\n", " episodes = []\n", " \n", " # Damit die Episoden hintereinander auf der X-Achse dargestellt werden, brauchen sie\n", " # eine fortlaufende Nummer\n", " episode_number = 1\n", " \n", " # Dann arbeiten wir uns mal durch die Staffeln\n", " for season in tv_show.seasons:\n", " \n", " # Season 0 beinhaltet die Specials. Die werden ingnoriert\n", " if season.season == 0:\n", " continue\n", " \n", " # Eine Staffel-Farbe wird per Zufall ausgewaehlt. Wir schmeissen immer die letzte Farbe\n", " # aus einer Kopie der Farbenliste damit sie nicht nochmal gewaehlt wird\n", " if colors:\n", " new_colormap = colormap[:]\n", " new_colormap.remove(colors[-1])\n", " color = choice(new_colormap)\n", " \n", " else:\n", " color = choice(colormap)\n", " \n", " # Die Episoden \n", " for episode in season.episodes:\n", " \n", " # Wenn es eine Ausstrahlungsdatum gibt, wird der Zeit-Teil weggeschnitten\n", " if episode.first_aired:\n", " aired = episode.first_aired.split('T')[0]\n", " else:\n", " aired = None\n", " \n", " # Nun werden die gesammelten Daten als Tupel der Episodenliste angehangen\n", " episodes.append((episode_number,\n", " episode.season,\n", " '{}.{}'.format(episode.season,\n", " episode.number), \n", " episode.title, \n", " aired, \n", " episode.rating))\n", " \n", " # Die Episoden-Staffel-Farbe wird der Farbenliste angehangen\n", " colors.append(color)\n", " \n", " # Die Episodennummer wird erhoeht\n", " episode_number += 1\n", " \n", " # Es wird ein DataFrame erstellt\n", " df = pd.DataFrame(\n", " episodes, \n", " columns=['episode_number', 'season', 'episode', 'title', 'aired', 'rating'])\n", "\n", " # Es wird ein source-Objekt gebraucht damit die tooltips funktionieren.\n", " # Der DataFrame genuegt nicht um die Daten fuer die tooltips zu benutzen\n", " source = ColumnDataSource(data=df)\n", " \n", " # Wir erstellen in figure und belabeln die Achsen\n", " fig = figure(title=show_name)\n", " fig.xaxis.axis_label = 'Episodes'\n", " fig.yaxis.axis_label = 'Rating'\n", " \n", " # Hier bauen wir den Scatter-Plot. Wir uebergeben X und Y plus unser source-Objekt\n", " # und Style Geschichten. Unter anderem unsere Episoden-Farbenliste\n", " fig.scatter(df['episode_number'], df['rating'], \n", " source=source, name='main', \n", " fill_alpha=0.8, line_color='#000000', size=10, color=colors)\n", " \n", " # Ein HoverTool-Object in dem wir das Layout fuer die Tooltips festlegen\n", " hover = HoverTool(tooltips=[('Episode', '@episode'),\n", " ('Title', '@title'),\n", " ('Rating', '@rating'),\n", " ('Aired', '@aired')])\n", " \n", " # Das Tool wird hinzugefuegt\n", " fig.add_tools(hover)\n", " \n", " # Und nun angezeigt\n", " show(fig)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ich gebe eigentlich nicht viel auf die Ratings. Ich selber habe über Trakt noch nie etwas bewertet. Trotzdem handelt es sich um gute Daten um ein paar Sachen auszuprobieren.\n", "\n", "Hier ein paar Ratings von Serien die mit entweder viel bedeuten oder die ich gerade schaue." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Roswell" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ratings('Roswell')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die erste Serie bei der ich von einem persönlichen Fandom sprechen kann. Noch bevor ich wusste das es das Wort gibt. Ich habe damals sogar alle Bücher gelesen. Kurz hatte ich nachgedacht sie wegzuschmeissen. Leicht peinlich berührt meiner Serienliebe von damals. Habe mich doch dagegen entschieden. Die erste Staffel war grossartig. Der perfekte Mix aus Highschool und SciFi/Mystery. Danach nahm es für mich drastisch ab. Die dritte Staffel habe ich noch nicht einmal schauen können. Zu gross war die Angst vor dem Zerstören meiner Liebe zur Serie." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Veronica Mars" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ratings('Veronica Mars')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vielleicht meine absolute Lieblingsserie. Veronica Mars habe ich vielleicht 4 oder 5 mal durchgeschaut. Und ich glaube dabei wird es nicht bleiben. Es so eine Serie die immer herhalten muss wenn es mir mal nicht so gut geht. Ein paar Folgen Veronica Mars sind immer eine gute Ablenkung. Alle drei Staffeln haben ungefähr die gleiche Bewertung. Dies deckt sich auch mit meiner Meinung. Drei gleich starke Staffeln. Wieso nur wurde die Serie abgesetzt? Das College-Szenario hätte noch soviel zu bieten gehabt. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Akte X" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ratings('The X-Files')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mit einem Knall wurde auf einmal eine zehnte Staffel angekündigt und gestern lief davon die dritte Folge. Auch wenn ich nur ein wenig mit Akte X vertraut bin, die drei Episoden haben mir bis jetzt sehr gefallen. Anscheinend alle Staffeln mit gleichen Höhen und Tiefen." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Downton Abbey" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ratings('Downton Abbey')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ich hätte nicht gedacht das mich diese Geschichte so packt und emotional macht. Doch Downton Abbey wurde für mich zu einer Herzensangelegenheit. Jeden Staffeln mit viel Tränen. Den Abfall der Ratings nach hinten decken sich nicht mit meiner Meinung. Ich fand alle 6 ziemlich stark." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Californication" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ratings('Californication')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Eher so mal reingeschnuppert weil auf Netflix. Teilweise sehr unterhaltsam. Sonst kann ich nicht viel darüber sagen. Bin auch erst bei Staffel 4. Danach war ich wieder gesund und hatte keine Zeit mehr ;-)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Modern Family" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ratings('Modern Family')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Oft sage ich \"Alles was ich über Familie weiss habe ich aus Modern Family\". Viele Probleme kennt man selber und kann sie so doch mit sehr viel Humor von aussen betrachten. Mit das Beste was ich die letzten Jahre gesehen habe." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simpsons" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ratings('The Simpsons')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die erste Folge der ersten Deutschlandausstrahlung sogar als Kind gesehen. Bis dahin haben mich die Simpsons immer begleitet. Mal aktiver mal weniger aktiv. Mich wundert der geringe Ausschlag der Ratings. Nach hinten fand ich die Serie doch ziemlich schwach. Interessant ist, die schlechtesten Folgen sind die Clip-Folgen. Empfand ich auch immer so." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lilyhammer" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ratings('Lilyhammer')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Gerad erst angefangen zu schauen. Gefällt mir sehr gut bis jetzt. Bin in der Mitte von Staffel Zwei." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sopranos" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ratings('The Sopranos')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Denke ich an Lilyhammer muss ich natürlich auch an die Sopranos denken. Der gute Steven Van Zandt. Ich hätte nie gedacht das ich eine Serie über die Mafia so gut finden würde. Ich wurde eines besseren belehrt. Alles in mich aufgesogen. Hammer. Ist jetzt schon ein paar Jahre her und die Serie sitzt in DVD-Boxen in Schrank und wartet auf ein Wiedersehen." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Community" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ratings('Community')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ich liebe Community und ich bin mir sicher das ich bis zur vierten Staffel kaum etwas witzigeres gesehen habe. Voll mit Popkultur und das in einem \"College\"-Setting. Einer der Serien die ich mir immer wieder anschauen kann, und doch nicht alles entdecke was da so drin steckt." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Twin Peaks" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ratings('Twin Peaks')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Und nochmal ein Klassiker. Nach dem der Mord um Laura Palmer geklärt war, ging es gefühlt richtig Berg ab. Ich bin auf jeden Fall auf die neue Staffel gespannt. Eine Fortsetzung die die Erwartungen kaum erfüllen kann." ] } ], "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.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }