Created
December 12, 2013 23:50
-
-
Save Who8MyLunch/7937720 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"metadata": { | |
"name": "" | |
}, | |
"nbformat": 3, | |
"nbformat_minor": 0, | |
"worksheets": [ | |
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Work Notes\n", | |
"==========\n", | |
"\n", | |
"Objective\n", | |
"---------\n", | |
"\n", | |
"My objective for this effort is to demonstrate my data processing and analysis capabilities outside of my tradiational hyperspectral remote sensing work. I have played in that arena for a long time and picked up a good number of modeling and analysis skills. This present effort is meant to be a quick example of processing unfamiliar data using new tools and protocols. This work needs to be quick, efficient, and have a clear punch line.\n", | |
"\n", | |
"I made a statement a few days ago that I would like to solve new types of problems. Foe example, I\n", | |
"might treat a new movie as a collection of word feature vectors pulled out of a Twitter feed. I\n", | |
"would then make statistical associations with other movies having known performance characteristics\n", | |
"such as viewer retention and engagement. The validity of the association process could be verified\n", | |
"by testing with lablled data. Results from such a process might be useful for someones planning\n", | |
"efforts.\n", | |
"\n", | |
"Early Morning Thinking\n", | |
"----------------------\n", | |
"\n", | |
"Very early this morning I could not sleep as I kept thinking about this effort. I kept reviewing\n", | |
"in my head details of the objective in the section above. I need a way to make sense of text\n", | |
"describing a movie. A quick search on Github turned up this great Python package:\n", | |
"[TextBlob](https://github.com/sloria/TextBlob). The text from the website says:\n", | |
"\n", | |
" A library for processing textual data. It provides a simple API for diving into common natural\n", | |
" language processing (NLP) tasks such as part-of-speech tagging, noun phrase extraction,\n", | |
" sentiment analysis, classification, translation, and more.\n", | |
"\n", | |
"Behind the scenes it uses [NLTK](http://www.nltk.org/) and\n", | |
"[patterns](http://www.clips.ua.ac.be/pages/pattern-en). I've have not done much with natural\n", | |
"language text processing. This tools will be a great place to start!\n", | |
"\n", | |
"I found a nice web API for querrying information from IMDb and RottenTomatoes:\n", | |
"[The OMDb API](http://www.omdbapi.com/). For example, this query for information about the movie\n", | |
"Star Wars, `http://www.omdbapi.com/?s=Star%20Wars` yields this JSON response:\n", | |
"\n", | |
" {\"Search\": [{\"Title\": \"Star Wars\", \"Year\": \"1977\",\n", | |
" \"imdbID\": \"tt0076759\", \"Type\": \"movie\"},\n", | |
" {\"Title\": \"Star Wars: Episode V - The Empire Strikes Back\", \"Year\": \"1980\",\n", | |
" \"imdbID\": \"tt0080684\", \"Type\": \"movie\"},\n", | |
" {\"Title\": \"Star Wars: Episode VI - Return of the Jedi\", \"Year\": \"1983\",\n", | |
" \"imdbID\": \"tt0086190\", \"Type\": \"movie\"},\n", | |
" {\"Title\": \"Star Wars: Episode I - The Phantom Menace\", \"Year\": \"1999\",\n", | |
" \"imdbID\": \"tt0120915\", \"Type\": \"movie\"},\n", | |
" {\"Title\": \"Star Wars: Episode III - Revenge of the Sith\", \"Year\": \"2005\",\n", | |
" \"imdbID\": \"tt0121766\", \"Type\": \"movie\"},\n", | |
" {\"Title\": \"Star Wars: Episode II - Attack of the Clones\", \"Year\": \"2002\",\n", | |
" \"imdbID\": \"tt0121765\", \"Type\": \"movie\"},\n", | |
" {\"Title\": \"Star Wars: The Clone Wars\", \"Year\": \"2008\",\n", | |
" \"imdbID\": \"tt1185834\", \"Type\": \"movie\"},\n", | |
" {\"Title\": \"Star Wars: The Clone Wars\", \"Year\": \"2008\",\n", | |
" \"imdbID\": \"tt0458290\", \"Type\": \"series\"},\n", | |
" {\"Title\": \"Star Wars: Clone Wars\", \"Year\": \"2003\",\n", | |
" \"imdbID\": \"tt0361243\", \"Type\": \"series\"},\n", | |
" {\"Title\": \"The Star Wars Holiday Special\", \"Year\": \"1978\",\n", | |
" \"imdbID\": \"tt0193524\", \"Type\": \"movie\"}]}\n", | |
"\n", | |
"Its just a bit more work to also retrieve information from RottenTomatoes using the imdbID as a\n", | |
"reference number.\n", | |
"\n", | |
"I found two nice Python packages on Github for Twitter's API service: https://github.com/geduldig/TwitterAPI and https://github.com/ryanmcgrath/twython. They are both activey maintained, but just from reading over each package, I really like Twython's minimalistic interface. I will probably go with that.\n", | |
"\n", | |
"Next I wanted a list of interesting movies to play with. I found this list of titles from 2012 for\n", | |
"sequels of popular movies: [Sequel Movies 2012](http://www.movieinsider.com/movies/sequel/2012). I\n", | |
"figure I'll need to manipulate some of that data by hand just to get it done quickly. I would\n", | |
"normally write some code to automate this step, but right now this is a one-time deal.\n", | |
"\n", | |
"Once the data is all assembled into a useable form, then I plan to compare words using the [Bag-of-Words](http://en.wikipedia.org/wiki/Bag-of-words_model) approach. This involves computing histograms of word frequencies for some ensemble of words (e.g. words collected from Tweets). There are several ways to compare histograms with the goal of computing a similarity metric. My favorite is the [Earth-Mover distance](http://en.wikipedia.org/wiki/Earth_mover's_distance). It's like this: given two diffrent histograms with the same bins, think of the two distributions as two piles of dirt. Then the EMD metric is the minimum amount of work a bulldozer have to do in order to make one pile of counts look like the other. Last year I wrapped up this [Fast C++ EMD](http://www.seas.upenn.edu/~ofirpele/FastEMD/code/) implementation as a Python extension for another project. In this other project the distance between bins was simple: just the [Euclidean distance](http://en.wikipedia.org/wiki/Euclidean_distance) between them in bin space.\n", | |
"\n", | |
"Now in this task I am dealing with words as labels for each bin. There is no physical meaning associated with which word is handled in the adjacent bin. The words might be sorted alphabetically, or by size, or just at random. About ten years ago I implemented the [Levenshtein Distance](http://en.wikipedia.org/wiki/Levenshtein_distance) in [IDL](http://www.exelisvis.com/ProductsServices/IDL.aspx), way before I started using Python. I could translate that version over to Python, but it was actually easier to just go Googling for a Python implementation. One of the first results on my page was: [py-editdist](https://code.google.com/p/py-editdist/). This package has a single easy-to-use function:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"import editdist\n", | |
"\n", | |
"d1 = editdist.distance('abcd', 'abcd')\n", | |
"d2 = editdist.distance('abcd', 'abcf')\n", | |
"d3 = editdist.distance('abcd', 'ah!')\n", | |
"d4 = editdist.distance('abcd', 'eh!')\n", | |
"d5 = editdist.distance('abcd', 'trampoline')\n", | |
"\n", | |
"print(d1, d2, d3, d4, d5)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"(0, 1, 3, 4, 9)\n" | |
] | |
} | |
], | |
"prompt_number": 29 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"The idea here is to compute a cost metric between all pairs of words used in this analysis. So let's says my complete list of words is this:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"words = ['apple', 'pear', 'peach', 'banana', 'raspberry']" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 30 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"I can next compute the edit distance between all word pairs as:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"N = len(words)\n", | |
"cost = np.zeros((N, N))\n", | |
"\n", | |
"for i in range(N):\n", | |
" w_i = words[i]\n", | |
" for j in range(N):\n", | |
" w_j = words[j]\n", | |
" \n", | |
" dist_ij = editdist.distance(w_i, w_j)\n", | |
" cost[i, j] = dist_ij" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 41 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"cost" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 42, | |
"text": [ | |
"array([[ 0., 4., 5., 5., 6.],\n", | |
" [ 4., 0., 2., 5., 6.],\n", | |
" [ 5., 2., 0., 5., 7.],\n", | |
" [ 5., 5., 5., 0., 8.],\n", | |
" [ 6., 6., 7., 8., 0.]])" | |
] | |
} | |
], | |
"prompt_number": 42 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"The symmetric array above shows the number of character edits it will take to make the $i^{th}$ word in my set look like the $j^{th}$ word. For example, it takes 4 edits to make the word `\"pear\"` ($i=1$) look like `\"apple\"` ($j=0$)." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Work Plan\n", | |
"---------\n", | |
"\n", | |
"Focus on acquiring data from various sources and aggregate into a form suitable for visualization and analysis. I don't think I'll have today for any exhaustive analysis. The most I want to get done today is a nice visualization that will make it clear something smart can be done with the data.\n", | |
"\n", | |
"1. Install necesary packages.\n", | |
"2. Get Twitter feed connected and running: Oauth2, API key, etc.\n", | |
"3. Browse through the Sequel Movies 2012 web site and make a list of interesting movies to play with.\n", | |
"4. Automate looking up movie details from OMDb site. I want information about IMDbID, plus RottenTomatoes user feedback.\n", | |
"5. Work with Twitter API. I want to search for each of these movies over two time periods: a few months prior to release data, and a few months just after release date.\n", | |
"6. Apply TextBlob methods to text data pulled from RottenTomatoes and from Twitter search results. TextBlob will return two metrics describing the sentiment of a chunk of text: **Polarity** and **Subjectivity**. Those two numbers will be a great starting point for visualizing this stuff.\n", | |
"7. Aggregate Twitter text for each movie (keeping before and after sets separate). Compute histograms of occurance of each word as basis for [Bag-of-Words](http://en.wikipedia.org/wiki/Bag-of-words_model) style model for cross-comparing multiple sets of words. \n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%matplotlib inline" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 3 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"plt.plot(np.arange(50))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 4, | |
"text": [ | |
"[<matplotlib.lines.Line2D at 0x4279390>]" | |
] | |
}, | |
{ | |
"metadata": {}, | |
"output_type": "display_data", | |
"png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAEACAYAAACuzv3DAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAE9JJREFUeJzt3V9MlfUDx/HPQ7K5ArUsHijdcBUqQnIW062LgvDAhWmQ\nm+maO7O68KJp3Qh2E1dyzDaH1lXTxvyZ5RUhmmXJcalzNCfaH4u2ssjBWQanUnMlPr8LAw4KnD+c\nw3n+vF+bG3AOD999p9+9ffg+z2NYlmUJAOBYWZkeAABgcljIAcDhWMgBwOFYyAHA4VjIAcDhWMgB\nwOGmxfOmwsJCzZgxQ3fddZeys7PV2dmp/v5+Pf/88/r5559VWFioAwcOaNasWekeLwDgNnEVuWEY\nCoVCOnv2rDo7OyVJwWBQfr9f3d3dqqqqUjAYTOtAAQBji/vUyu3XDbW1tSkQCEiSAoGAWltbUzsy\nAEBc4i7yZcuWqby8XO+++64kKRwOyzRNSZJpmgqHw+kbJQBgXHGdIz958qQKCgr022+/ye/3a8GC\nBaNeNwxDhmGkZYAAgInFtZAXFBRIkh544AHV1dWps7NTpmmqr69P+fn56u3tVV5e3h3fx+IOAMlJ\n5DZYMU+tXLt2TX/99Zck6erVq/r0009VWlqqlStXqqWlRZLU0tKi2tracQfDH0tvvPFGxsdglz/M\nBXPBXEz8J1ExizwcDquurk6SdOPGDb3wwguqrq5WeXm5Vq9erd27dw9vPwQATL2YC/m8efPU1dV1\nx9fvu+8+ffbZZ2kZFAC4WXu7tHCh9PDDqTkeV3ZOkYqKikwPwTaYixHMxQgvzMXAgBQISBs3Sv39\nqTuuYSVzQibegxtGUud7AMBt2tulDRukujqpqUnKyRn/vYmunXHtWgEAJGdgQHr1VenECel//5PS\n8R8PTq0AQJocOiSVlkozZkjnzqVnEZcocgBIuamo8GgUOQCkUHv71FR4NIocAFJgqMK/+GJqKjwa\nRQ4Ak3Tw4EiFnz8/tYu4RJEDQNIGBqRNm6STJ6V9+6SnnsrMOChyAEjCwYNSSYk0c+atCs/UIi5R\n5ACQkOgdKe+/n9kFfAhFDgBxit6RkukKj0aRA0AM0RWeyXPh46HIAWAC0Vdn2qnCo1HkADCGqb46\nczIocgC4TSauzpwMihwA/pPJqzMngyIHAN25I8Upi7hEkQPwOKdWeDSKHIBnObnCo1HkADzHDRUe\njSIH4CluqfBoFDkAT3BbhUejyAG43u1XZ7ppEZcocgAu5qSrMyeDIgfgSlP1BHs7oMgBuIpXKjwa\nRQ7ANYYqPDfX/RUejSIH4HherPBoFDkAR3PanQrTgSIH4Ehu3heeKIocgOMMVXhurjv3hSeKIgfg\nGHZ/dmamUOQAHMGuT7C3A4ocgK1R4bFR5ABsiwqPT1wL+eDgoHw+n1asWCFJ6u/vl9/vV1FRkaqr\nqxWJRNI6SADeMjAgBQLSpk23KnzXLumeezI9KvuKayFvbm5WcXGxDMOQJAWDQfn9fnV3d6uqqkrB\nYDCtgwTgHVR44mIu5L/++qsOHz6sl19+WZZlSZLa2toUCAQkSYFAQK2trekdJQDXo8KTF3Mhf+21\n17R9+3ZlZY28NRwOyzRNSZJpmgqHw+kbIQDXo8InZ8JdK+3t7crLy5PP51MoFBrzPYZhDJ9yGUtj\nY+PwxxUVFarw+s59AMO4OvOWUCg07hobD8MaOl8yhtdff1179+7VtGnTdP36df3555967rnn9OWX\nXyoUCik/P1+9vb2qrKzUd999d+fBDUMTHB6Ah7W3Sxs2SHV1UlOTlJOT6RHZR6Jr54QLebTjx4/r\nrbfe0sGDB7V582bNnj1b9fX1CgaDikQiY/7Ck4UcwO2iK3zPHu9W+EQSXTsT2kc+dAqloaFBR48e\nVVFRkY4dO6aGhobERgnAk9z4BHs7iLvIkzo4RQ5AVHii0lrkAJAotz/B3g641wqAtPD6U3umEkUO\nIOW89AR7O6DIAaQMFZ4ZFDmAlPDqE+ztgCIHMClUeOZR5ACSxhPs7YEiB5Aw7pFiLxQ5gIRwdab9\nUOQA4kKF2xdFDiAmKtzeKHIA46LCnYEiBzAmKtw5KHIAo1DhzkORAxhGhTsTRQ6ACnc4ihzwOCrc\n+ShywKOocPegyAEPosLdhSIHPIQKdyeKHPAIKty9KHLA5ahw96PIARcbqvDcXCrczShywIWocG+h\nyAGX4Vy491DkgEtEPztz3z7pqacyPSJMFYoccIHbK5xF3FsocsDBqHBIFDngWFQ4hlDkgMNQ4bgd\nRQ44CBWOsVDkgAOwLxwTocgBm2NfOGKhyAGbosIRL4ocsCEqHImYcCG/fv26li5dqrKyMhUXF2vL\nli2SpP7+fvn9fhUVFam6ulqRSGRKBgu43cCAFAhIGzfeqvBdu6ScnEyPCnY34UI+ffp0dXR0qKur\nS+fPn1dHR4dOnDihYDAov9+v7u5uVVVVKRgMTtV4AdeiwpGsmKdW7r77bknSP//8o8HBQd17771q\na2tTIBCQJAUCAbW2tqZ3lICLUeGYrJgL+c2bN1VWVibTNFVZWalFixYpHA7LNE1JkmmaCofDaR8o\n4EZUOFIh5q6VrKwsdXV16Y8//lBNTY06OjpGvW4YhgzDSNsAATdiRwpSKe7thzNnztTy5ct15swZ\nmaapvr4+5efnq7e3V3l5eeN+X2Nj4/DHFRUVquBvLDyuvV3asEGqrb1V4ZxGQSgUUigUSvr7Dcuy\nrPFevHz5sqZNm6ZZs2bp77//Vk1Njd544w198sknmj17turr6xUMBhWJRMb8hadhGJrg8ICnRFf4\nnj1UOMaX6No5YZH39vYqEAjo5s2bunnzptatW6eqqir5fD6tXr1au3fvVmFhoQ4cODDpgQNuNlTh\ndXVUOFJvwiKf9MEpcngcFY5kJLp2cmUnkCY8wR5ThXutACnGjhRMNYocSCH2hSMTKHIgBXhqDzKJ\nIgcmiaf2INMociBJVDjsgiIHkkCFw04ociABVDjsiCIH4kSFw64ociAG9oXD7ihyYALsC4cTUOTA\nGKhwOAlFDtyGCofTUOTAf6hwOBVFDkg6dIgKh3NR5PC06H3hVDiciiKHZ0VX+LlzLOJwLoocnkOF\nw20ocnhK9FN7qHC4BUUOT2BHCtyMIofrsS8cbkeRw7UGBqRNm6STJ7lTIdyNIocrHTwolZRIM2dy\np0K4H0UOV4mu8PffZwGHN1DkcA0qHF5FkcPxqHB4HUUORxvakUKFw8socjgSV2cCIyhyOA77woHR\nKHI4Bk+wB8ZGkcMReII9MD6KHLZGhQOxUeSwregKP3eORRwYD0UO2+FOhUBiKHLYCjtSgMRR5LAF\nKhxIXswi7+npUWVlpRYtWqSSkhLt3LlTktTf3y+/36+ioiJVV1crEomkfbBwp6FnZ+bmUuFAMgzL\nsqyJ3tDX16e+vj6VlZXpypUrevzxx9Xa2qr33ntP999/vzZv3qxt27ZpYGBAwWBw9MENQzEODw+L\n3pGyezcLODAk0bUzZpHn5+errKxMkpSTk6OFCxfq0qVLamtrUyAQkCQFAgG1trYmOWR4EU+wB1In\noXPkFy9e1NmzZ7V06VKFw2GZpilJMk1T4XA4LQOEu3CPFCD14t61cuXKFa1atUrNzc3Kzc0d9Zph\nGDIMI+WDg7tEnwunwoHUiavI//33X61atUrr1q1TbW2tpFsV3tfXp/z8fPX29iovL2/M721sbBz+\nuKKiQhX86/UcKhyYWCgUUigUSvr7Y/6y07IsBQIBzZ49Wzt27Bj++ubNmzV79mzV19crGAwqEonw\ny07cob1d2rBBqquTmpqknJxMjwiwv0TXzpgL+YkTJ/Tkk0/qscceGz590tTUpCVLlmj16tX65Zdf\nVFhYqAMHDmjWrFmTGgzcI3pf+J49VDiQiJQv5FM5GLgDFQ5MTqJrJ1d2ImU4Fw5kBvdaQUpwjxQg\ncyhyTAr3CwcyjyJH0nhqD2APFDkSRoUD9kKRIyFUOGA/FDniQoUD9kWRIyYqHLA3ihzjosIBZ6DI\nMSYqHHAOihyj8OxMwHkocgzj6kzAmShyUOGAw1HkHscT7AHno8g9ijsVAu5BkXsQT7AH3IUi9xAq\nHHAnitwjqHDAvShyl6PCAfejyF0sel84FQ64F0XuQuwLB7yFIncZrs4EvIcidwnOhQPeRZG7ABUO\neBtF7mDcLxyARJE7FvcLBzCEIncYKhzA7ShyB7l9XziLOACJIncEKhzARChym+NcOIBYKHKbosIB\nxIsityEqHEAiKHIb4R4pAJJBkdsEV2cCSBZFnmFUOIDJosgziAoHkAoxF/IXX3xRpmmqtLR0+Gv9\n/f3y+/0qKipSdXW1IpFIWgfpNgMDUiAgbdx4q8J37ZJycjI9KgBOFXMhX79+vY4cOTLqa8FgUH6/\nX93d3aqqqlIwGEzbAN2GCgeQaoZlWVasN128eFErVqzQV199JUlasGCBjh8/LtM01dfXp4qKCn33\n3Xd3HtwwFMfhPSF6X/ju3SzgAMaX6NqZ1DnycDgs0zQlSaZpKhwOJ3MYz6DCAaTTpHetGIYhwzDG\nfb2xsXH444qKClV4aBXjqT0A4hEKhRQKhZL+/qRPrYRCIeXn56u3t1eVlZWcWrlNe7u0YYNUVycF\ng9I992R6RACcYkpOraxcuVItLS2SpJaWFtXW1iZzGFca2pGyadOte6Ts2sUiDiC9Yi7ka9eu1RNP\nPKHvv/9ec+fO1XvvvaeGhgYdPXpURUVFOnbsmBoaGqZirLbHPVIAZEJcp1aSPrhHTq1Enwvfs4cF\nHMDkTMmpFYzgqT0AMo17rSSJe6QAsAuKPAnsCwdgJxR5AqhwAHZEkcdpqMJzc6lwAPZCkcdAhQOw\nO4p8ApwLB+AEFPkYqHAATkKR34YKB+A0FPl/qHAATkWRiwoH4GyeLnIqHIAbeLbIqXAAbuG5IqfC\nAbiNp4qcCgfgRp4ocp6dCcDNXF/kVDgAt3NtkUdX+L59PPABgHu5ssh5diYAL3FVkVPhALzINUVO\nhQPwKscXORUOwOscXeRUOAA4tMi5OhMARjiuyNkXDgCjOabIqXAAGJsjivzQIZ5gDwDjsXWRc48U\nAIjNtkU+VOEzZkjnzrGIA8B4bFfkVDgAJMZWRU6FA0DibFHkVDgAJC/jRU6FA8DkZKzIqXAASI2M\nFHn01ZlUOABMzqQW8iNHjmjBggV69NFHtW3btpjvHxiQAgFp48ZbFb5rl5STM5kRAACSXsgHBwf1\nyiuv6MiRI/r222+1f/9+XbhwYdz3e/0eKaFQKNNDsA3mYgRzMYK5SF7SC3lnZ6ceeeQRFRYWKjs7\nW2vWrNFHH310x/uo8Fv4SzqCuRjBXIxgLpKX9EJ+6dIlzZ07d/jzOXPm6NKlS3e8z8sVDgBTIeld\nK4ZhxPU+dqQAQHoZlmVZyXzj6dOn1djYqCNHjkiSmpqalJWVpfr6+pGDx7nYAwBGS2RpTnohv3Hj\nhubPn6/PP/9cDz74oJYsWaL9+/dr4cKFyRwOAJCkpE+tTJs2TW+//bZqamo0ODiol156iUUcADIg\n6SIHANhDWq7sTPRCITd58cUXZZqmSktLh7/W398vv9+voqIiVVdXKxKJZHCEU6enp0eVlZVatGiR\nSkpKtHPnTknenI/r169r6dKlKisrU3FxsbZs2SLJm3MxZHBwUD6fTytWrJDk3bkoLCzUY489Jp/P\npyVLlkhKfC5SvpAneqGQ26xfv374F8BDgsGg/H6/uru7VVVVpWAwmKHRTa3s7Gzt2LFD33zzjU6f\nPq133nlHFy5c8OR8TJ8+XR0dHerq6tL58+fV0dGhEydOeHIuhjQ3N6u4uHh4U4RX58IwDIVCIZ09\ne1adnZ2SkpgLK8VOnTpl1dTUDH/e1NRkNTU1pfrH2NpPP/1klZSUDH8+f/58q6+vz7Isy+rt7bXm\nz5+fqaFl1LPPPmsdPXrU8/Nx9epVq7y83Pr66689Oxc9PT1WVVWVdezYMeuZZ56xLMu7/04KCwut\ny5cvj/paonOR8iKP90IhLwmHwzJNU5JkmqbC4XCGRzT1Ll68qLNnz2rp0qWenY+bN2+qrKxMpmkO\nn3Ly6ly89tpr2r59u7KyRpYgr86FYRhatmyZysvL9e6770pKfC5Sfhtb9o5PzDAMz83RlStXtGrV\nKjU3Nys3N3fUa16aj6ysLHV1demPP/5QTU2NOjo6Rr3ulblob29XXl6efD7fuJfle2UuJOnkyZMq\nKCjQb7/9Jr/frwULFox6PZ65SHmRP/TQQ+rp6Rn+vKenR3PmzEn1j3EU0zTV19cnSert7VVeXl6G\nRzR1/v33X61atUrr1q1TbW2tJG/PhyTNnDlTy5cv15kzZzw5F6dOnVJbW5vmzZuntWvX6tixY1q3\nbp0n50KSCgoKJEkPPPCA6urq1NnZmfBcpHwhLy8v1w8//KCLFy/qn3/+0YcffqiVK1em+sc4ysqV\nK9XS0iJJamlpGV7Q3M6yLL300ksqLi7Wq6++Ovx1L87H5cuXh3ce/P333zp69Kh8Pp8n52Lr1q3q\n6enRTz/9pA8++EBPP/209u7d68m5uHbtmv766y9J0tWrV/Xpp5+qtLQ08blIx8n7w4cPW0VFRdbD\nDz9sbd26NR0/wrbWrFljFRQUWNnZ2dacOXOsPXv2WL///rtVVVVlPfroo5bf77cGBgYyPcwp8cUX\nX1iGYViLFy+2ysrKrLKyMuvjjz/25HycP3/e8vl81uLFi63S0lLrzTfftCzL8uRcRAuFQtaKFSss\ny/LmXPz444/W4sWLrcWLF1uLFi0aXi8TnQsuCAIAh8v4w5cBAJPDQg4ADsdCDgAOx0IOAA7HQg4A\nDsdCDgAOx0IOAA7HQg4ADvd/Kk18t9q/PkYAAAAASUVORK5CYII=\n", | |
"text": [ | |
"<matplotlib.figure.Figure at 0x3f25f50>" | |
] | |
} | |
], | |
"prompt_number": 4 | |
} | |
], | |
"metadata": {} | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment