Skip to content

Instantly share code, notes, and snippets.

@j9ac9k
Created September 5, 2018 21:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save j9ac9k/b2ba080920184dd108a3426e285bc61c to your computer and use it in GitHub Desktop.
Save j9ac9k/b2ba080920184dd108a3426e285bc61c to your computer and use it in GitHub Desktop.
Homework Submission For Distributed Computing Class
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# CS524 - Homework 2 \n",
"## Ogi Moore"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Notes\n",
"I found this assignment rather difficult, not because of the complexity of the operations involved, but due to the use of an unfamiliar framework, and the time it would take to make an attempt and see the result. \n",
"\n",
"\n",
"Due to the extended period of time granted to the homework assignment after the original due date, I made a lot of modifications to my existing code, not only to make it cleaner and easier to read, but to execute far faster.\n",
"\n",
"\n",
"A note, to save dataframes as CSV files, the spark instance needs to be started with the ```--packages com.databricks:spark-csv_2.10:1.2.0``` argument."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part 1\n",
"\n",
"\n",
"### Retrieving Counts\n",
"For the first part of the assignment, I decided to utilize the dataframe functionality offered by the sqlContext. The runtime for 80 executors is approximately 14 minutes. Major speedups were found by implementing the `schema` option when import the data as a DataFrame, as well as using the PySpark built-in functionality to extract the week-of-year from the unix timestamp. Furthermore, realizing that I didn't need a separate CSV for each subreddit, and that I could separate out that data in Pandas sped things up immensely, as I no longer had to go through all the reddit data, filtering for the one subreddit of interest n times (n being the number of subreddits I was looking for).\n",
"\n",
"The code I used to generate the CSV files containing the count information is as follows:"
]
},
{
"cell_type": "code",
"execution_count": 249,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"# spark-submit --packages com.databricks:spark-csv_2.10:1.2.0 --master yarn --num-executors 80 prob-1.py\r\n",
"from pyspark.sql.functions import from_unixtime, weekofyear\r\n",
"from pyspark.sql.types import StructType, StructField, StringType\r\n",
"from pyspark import SparkContext, SparkConf\r\n",
"from pyspark.sql import SQLContext\r\n",
"\r\n",
"conf = SparkConf().setAppName(\"Reddit Weekly Activity\")\r\n",
"sc = SparkContext(conf=conf)\r\n",
"sqlContext = SQLContext(sc)\r\n",
"\r\n",
"# read in data - only take the relevant portion of the json via defining the schema\r\n",
"df = sqlContext.read.json(\"/data/reddit/\", schema=StructType([StructField('created_utc', StringType(), True),\r\n",
" StructField('subreddit', StringType(), True)]))\r\n",
"\r\n",
"# convert created_utc to week-of-year\r\n",
"df = df.withColumn('created_utc', weekofyear(from_unixtime(df.created_utc, format='yyyy-MM-dd')))\\\r\n",
" .withColumnRenamed('created_utc', 'week')\r\n",
"\r\n",
"# save the total weekly activity\r\n",
"df.groupBy('week').count()\\\r\n",
" .write.format('com.databricks.spark.csv').save('week_counts_total')\r\n",
"\r\n",
"# subreddits I want weekly comment data for\r\n",
"subreddits = set(['Portland', 'Seattle', 'nyc'])\r\n",
"\r\n",
"# filter out the subreddits I'm interested in and save to csv\r\n",
"df[df.subreddit.isin(subreddits)].groupby(['subreddit', 'week']).count()\\\r\n",
" .write.format('com.databricks.spark.csv').save('week_counts')\r\n"
]
}
],
"source": [
"!cat ./prob-1/prob-1.py"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"2 CSV files were generated, one of which contained just a column of weeks combined with the number of comments, the second CSV file contained weeks, subreddit and number of comments.\n",
"\n",
"Once the CSV files were retrieved, plotting is a breeze with pandas"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generating Plots"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import matplotlib\n",
"matplotlib.use('agg')\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns # just importing changes the matplotlib defaults to be much nicer\n",
"import pandas as pd\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"df_total = pd.read_csv('./prob-1/week_counts_total.csv',\n",
" names=['week', 'comments'],\n",
" index_col=0).sort_index()\n",
"\n",
"df_subs = pd.read_csv('./prob-1/week_counts.csv',\n",
" names=['subreddit', 'week', 'comments'])\\\n",
" .set_index(['subreddit', 'week'])\\\n",
" .sort_index()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The Pandas dataframe looks as follows:"
]
},
{
"cell_type": "code",
"execution_count": 254,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>comments</th>\n",
" </tr>\n",
" <tr>\n",
" <th>subreddit</th>\n",
" <th>week</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">Portland</th>\n",
" <th>1</th>\n",
" <td>3115</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>7093</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5643</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>6833</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>7316</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" comments\n",
"subreddit week \n",
"Portland 1 3115\n",
" 2 7093\n",
" 3 5643\n",
" 4 6833\n",
" 5 7316"
]
},
"execution_count": 254,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_subs.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Again, once the data is in a Pandas dataframe, generating the plots is a piece of cake."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd088510470>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, (ax1, ax2) = plt.subplots(1,2, figsize=(12,5))\n",
"df_total.plot(y='comments', ax=ax1, legend=False)\n",
"ax1.set_ylabel('Total Comments')\n",
"ax1.set_xlabel('Week of Year')\n",
"ax1.set_title('All Reddit Comments per Week')\n",
"df_subs.unstack(level=0).plot(y='comments', ax=ax2)\n",
"ax2.set_xlabel('Week of Year')\n",
"ax2.set_ylabel('Subreddit Comments')\n",
"ax2.set_title('Subreddit Comment Posts per Week')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Notes\n",
"\n",
"\n",
"1. Some of the subreddits in the JSON data are capitalized; unfortunately I thought my mistake was in the filtering process, so I spent significant time troubleshooting that prior to attempting to check the capitalization.\n",
"2. Strangely enough, there is no native way to save to CSV file currently in PySpark. A plugin from databricks allows for that functionality, but when running spark-submit, the link to the plugin must be passed along as part of the command.\n",
"3. While I initially used a user-defined-function to convert from the time-stamp to the week of year, that functionality was actually within PySpark itself, so a later version of this assignment addressed that issue.\n",
"4. Initially I was saving a separate CSV file for each subreddit, while attempting to find a speedup in time, I implemented created a dataframe that had the weekly comment counts for all the subreddits I was looking in, the idea being that I would sort out the subreddits in the post processing phase with Pandas.\n",
"5. Using the 'schema' argument in the JSON loads, I saved significant time by loading only the content from the JSON line that I wanted. Extracting only the 'created_utc' and 'subreddit' data saved approximately 30% of time.\n",
"6. My first implementation of this program took approximately 1 hour to complete with 80 executors. The version linked above last ran in just under 14 minutes."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part 2\n",
"\n",
"### Data Retrieval\n",
"\n",
"The following code was run through spark-submit, while I initially wanted to use a SQL DataFrame, given the amount of work I would be doing using the 'body' segment, working with the regular RDD turned out to be the way to go. Given the nice and clean way that the DataFrame can be saved as a CSV file, I took the final resulting information, transformed it to a DataFrame and saved as a CSV."
]
},
{
"cell_type": "code",
"execution_count": 250,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"import json\r\n",
"from datetime import datetime\r\n",
"from nltk.tokenize.casual import casual_tokenize\r\n",
"from nltk.corpus import stopwords\r\n",
"import re\r\n",
"from operator import add\r\n",
"from pyspark import SparkContext, SparkConf\r\n",
"from pyspark.sql import SQLContext\r\n",
"\r\n",
"def f(x):\r\n",
" return x\r\n",
"\r\n",
"subreddits = ['Portland', 'Seattle', 'nyc']\r\n",
"conf = SparkConf().setAppName(\"LLR Calc\")\r\n",
"sc = SparkContext(conf=conf)\r\n",
"sqlContext = SQLContext(sc)\r\n",
"\r\n",
"stop_words = set(stopwords.words('english'))\r\n",
"reddit = sc.textFile('/data/reddit/')\r\n",
"comments = reddit.map(lambda l: json.loads(l)).map(lambda l: (l['created_utc'], [l['subreddit'], l['body']]))\r\n",
"\r\n",
"#trimming down the total dataset (no trim = 41:50 runtime)\r\n",
"comments = comments.filter(lambda (t, (s, c)): s in set(subreddits))\r\n",
"\r\n",
"for subreddit in subreddits:\r\n",
" sub_comments = comments.filter(lambda (t, (s, c)): s == subreddit)\\\r\n",
" .map(lambda (t, (s, c)): (datetime.fromtimestamp(int(t)), (s, c)))\\\r\n",
" .map(lambda (w, (s, c)): (w, c))\\\r\n",
" .map(lambda (w, c): (w, [word.lower() for word in casual_tokenize(c)\r\n",
" if word.lower() not in stop_words and\r\n",
" re.search('^[a-zA-Z]+$', word)])) # process text\r\n",
"\r\n",
" highest_week = sorted(sub_comments.countByKey().iteritems(), key=lambda(k, v): v, reverse=True)[0][0]\r\n",
" weekly_comments = sub_comments.flatMapValues(f)\\\r\n",
" .groupByKey()\\\r\n",
" .mapValues(list)\r\n",
"\r\n",
"\r\n",
" highest_week_wc = sqlContext.createDataFrame(weekly_comments.filter(lambda (week, words): week == highest_week)\\\r\n",
" .map(lambda (week, words): (' '.join(words)))\\\r\n",
" .flatMap(lambda w: w.split())\\\r\n",
" .map(lambda w: (str(w), 1))\\\r\n",
" .reduceByKey(add))\\\r\n",
" .write.format('com.databricks.spark.csv')\\\r\n",
" .save('{}_week_wc'.format(subreddit))\r\n",
"\r\n",
" total_wc = sqlContext.createDataFrame(weekly_comments.map(lambda (week, words): (' '.join(words)))\\\r\n",
" .flatMap(lambda w: w.split())\\\r\n",
" .map(lambda w: (str(w), 1))\\\r\n",
" .reduceByKey(add))\\\r\n",
" .write.format('com.databricks.spark.csv')\\\r\n",
" .save('{}_total_wc'.format(subreddit))\r\n"
]
}
],
"source": [
"!cat ./prob-2/prob-2.py"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This code is not very parallelization friendly. The runtime is approximately 40 minutes.\n",
"\n",
"Determining the log-likelihood ratio was simple enough with Python, as well as displaying the output."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from collections import defaultdict\n",
"from math import log\n",
"\n",
"def build_corpus(fname):\n",
" wc = defaultdict(int)\n",
" problems = 0\n",
" with open(fname) as rawfile:\n",
" for line in rawfile:\n",
" try:\n",
" word, freq = line.split(',')\n",
" while word.startswith(\"'\"):\n",
" word = word[1:]\n",
" except ValueError:\n",
" continue\n",
" problems += 1\n",
" wc[word] += int(freq)\n",
" if problems > 0:\n",
" print('Ran into {} problems'.format(problems))\n",
" return wc\n",
"\n",
"def compute_llr(file_corpus_a, file_corpus_b):\n",
" corpus_a = build_corpus(file_corpus_a)\n",
" corpus_b = build_corpus(file_corpus_b)\n",
" N1 = sum(corpus_a.values())\n",
" N2 = sum(corpus_b.values())\n",
" log_likelihood = defaultdict(int)\n",
" for word, freq in corpus_b.items():\n",
" a = corpus_a[word]\n",
" b = corpus_b[word]\n",
" E1 = N1 * (a + b) / (N1 + N2)\n",
" E2 = N2 * (a + b) / (N1 + N2)\n",
" log_likelihood[word] = 2 * ((a * log(a / E1)) + (b * log(b / E2))) \n",
" top_10 = sorted(log_likelihood, key=log_likelihood.get, reverse=True)[:10]\n",
" print('Top 10 Highest LLR Words for {}'.format(file_corpus_a.split('/')[2].split('_')[0]))\n",
" for word in top_10:\n",
" print('Word: {}\\t LLR: {}'.format(word, log_likelihood[word]))\n",
" print('\\n')\n",
" return log_likelihood"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Top 10 Highest LLR Words for portland\n",
"Word: mod\t LLR: 663.4075445017677\n",
"Word: mods\t LLR: 294.7678163978628\n",
"Word: codeoregon\t LLR: 247.72513910384384\n",
"Word: removed\t LLR: 241.64284520266784\n",
"Word: jwg\t LLR: 202.6118057433577\n",
"Word: rules\t LLR: 186.3220402748734\n",
"Word: drama\t LLR: 155.42627871257346\n",
"Word: artist\t LLR: 148.70621734328262\n",
"Word: moderator\t LLR: 135.3796267813401\n",
"Word: sub\t LLR: 127.29411622359069\n",
"\n",
"\n",
"Top 10 Highest LLR Words for seattle\n",
"Word: blm\t LLR: 1173.1597361105605\n",
"Word: bernie\t LLR: 1063.0356290524915\n",
"Word: sanders\t LLR: 990.6767607937195\n",
"Word: movement\t LLR: 574.3941201203777\n",
"Word: penis\t LLR: 566.3998032584449\n",
"Word: rally\t LLR: 435.1953623323693\n",
"Word: candidate\t LLR: 373.890025711641\n",
"Word: white\t LLR: 324.6389536387151\n",
"Word: black\t LLR: 316.4639748642686\n",
"Word: stage\t LLR: 302.8022182312467\n",
"\n",
"\n",
"Top 10 Highest LLR Words for nyc\n",
"Word: snow\t LLR: 1247.179027165284\n",
"Word: storm\t LLR: 848.3834708523594\n",
"Word: blizzard\t LLR: 457.63210734628734\n",
"Word: weather\t LLR: 387.9497759770402\n",
"Word: inches\t LLR: 326.7287610973588\n",
"Word: tip\t LLR: 308.9170847545239\n",
"Word: sandy\t LLR: 174.87683439247985\n",
"Word: shut\t LLR: 169.5701013206417\n",
"Word: tomorrow\t LLR: 151.09820820990504\n",
"Word: map\t LLR: 138.6885797943807\n",
"\n",
"\n"
]
}
],
"source": [
"pdx_llr = compute_llr('./prob-2/portland_total_wc.csv', './prob-2/portland_week_wc.csv')\n",
"sea_llr = compute_llr('./prob-2/seattle_total_wc.csv', './prob-2/seattle_week_wc.csv')\n",
"nyc_llr = compute_llr('./prob-2/nyc_total_wc.csv', './prob-2/nyc_week_wc.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"### Analyzing the Results\n",
"\n",
"From the results, it's clear that in the nyc subreddit, that weather, specifically hurricane Sandy was a major topic of discussion. In the Portland subreddit, many of the top 10 LLR words seem to be relative to the subreddit itself, indicating there was some issue involving moderators and the administration of the subreddit that lead to a lot of activity. For the Seattle subreddit, Bernie Sanders seems to be the topic of conversation. I would assume that he held a political rally during the week that contained the highest comment-count of the year.\n",
"\n",
"### Questions\n",
"\n",
"My main question here is how can I implement the code that ran on PySpark to be more parallelization friendly. Given that I need to find the week of maximum activity for each subreddit, that process seems to break any kind of attempts at parallelization.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part 3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Part 3, like the other parts was a love-hate relationship for me. I ran into a variety of issues, but I did learn a lot, not just about PySpark and cluster memory management, but also about Pandas. The runtime on the cluster is approximately 14 minutes with 80 executors.\n",
"\n",
"First, the code that I submitted to the cluster:"
]
},
{
"cell_type": "code",
"execution_count": 251,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\"\"\"prob-3.py\"\"\"\r\n",
"# spark-submit --packages com.databricks:spark-csv_2.10:1.2.0 --master yarn --num-executors 50 prob-3v2.py\r\n",
"from pyspark import SparkContext, SparkConf\r\n",
"from pyspark.sql.types import StructType, StructField, StringType\r\n",
"from pyspark.sql import SQLContext\r\n",
"from pyspark.sql.functions import from_unixtime, month\r\n",
"import json\r\n",
"\r\n",
"conf = SparkConf().setAppName(\"Retreive Monthly Subreddit Post Counts\")\r\n",
"sc = SparkContext(conf=conf)\r\n",
"sqlContext = SQLContext(sc)\r\n",
"\r\n",
"df = sqlContext.read.json(\"/data/reddit/\", schema=StructType([StructField('created_utc', StringType(), True),\r\n",
" StructField('subreddit', StringType(), True)]))\r\n",
"df = df.withColumn('created_utc', month(from_unixtime(df.created_utc, format='yyyy-MM-dd')))\\\r\n",
" .withColumnRenamed('created_utc', 'month')\r\n",
"\r\n",
"subs = df.groupby('subreddit').count().filter('count > 250')\r\n",
"\r\n",
"subs_list = set(subs.map(lambda p: p.subreddit).collect())\r\n",
"\r\n",
"df[df.subreddit.isin(subs_list)].groupby(['subreddit', 'month']).count()\\\r\n",
" .write.format('com.databricks.spark.csv').save('monthly_sub_activity')\r\n"
]
}
],
"source": [
"!cat ./prob-3/prob-3.py"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The order of operators goes as follows.\n",
"\n",
"1. From the reddit data, I only extract the part of the schema I'm interested in and import the remainder as a DataFrame.\n",
"2. I use the built-in PySpark functionality to convert the timestamp to a yyyy-MM-dd string, which I then extract the month, renaming my `created_utc` column to `month`.\n",
"3. I then determine the subreddits that have at least 250 posts annually, and create a set of those subreddits.\n",
"4. Lastly, I filter my original dataframe for the rows that have a matching subreddit to the set I determined earlier.\n",
"\n",
"\n",
"With my first implementation of this, using a standard RDD instead of DataFrames, I ran into issues involving having my keys not be sparse enough, and thus running out of memory for a given executor. This issue was eventually addressed by not moving a subreddit only key in any RDD until I had determined what the monthly subreddit activity was.\n",
"\n",
"On second consideration, I figured the code was cleaner and ran faster when using the DataFrame functionality."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Main Portion of the Problem\n",
"\n",
"Below is the post-processing code I wrote to extract the relevant information the problem asked for."
]
},
{
"cell_type": "code",
"execution_count": 237,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Top 10 relative growing activity subreddits for each month with 250 minimum annual posts\n",
"month subreddit \n",
"2 IronThronePowers 2735.000000\n",
" canis 2318.000000\n",
" soulseeker 1466.000000\n",
" BestOfVidzi 215.000000\n",
" shill 203.000000\n",
" EliteRacers 199.500000\n",
" FlipnoteStudio3D 193.500000\n",
" didntgetmygjallarhorn 175.000000\n",
" Empyreus 154.000000\n",
" blop 133.000000\n",
"3 StreetFighter 2774.000000\n",
" Helldivers 2708.750000\n",
" KimmySchmidt 1904.500000\n",
" FFRecordKeeper 1360.000000\n",
" nsw 1041.500000\n",
" iZombie 686.000000\n",
" FGC 575.000000\n",
" FuckableFaces 504.000000\n",
" dnbhl 435.000000\n",
" Bloodline 350.500000\n",
"4 blackops3 9998.000000\n",
" digimonrp 2171.000000\n",
" GetFairShare 1851.900000\n",
" AskLE 1349.000000\n",
" rpdrcirclejerk 777.000000\n",
" fnafcringe 629.000000\n",
" RubyBarracks 557.000000\n",
" amibeingdetained 517.400000\n",
" PodemosVigo 416.000000\n",
" hockeyball 416.000000\n",
" ... \n",
"10 TumblrPls 4021.500000\n",
" sodadungeon 1407.000000\n",
" f16 1117.000000\n",
" FNaFBFangames 1076.000000\n",
" ffx 1003.666667\n",
" features 998.000000\n",
" Haters 941.500000\n",
" YXAYXA 858.000000\n",
" Teach 836.000000\n",
" FXX 610.000000\n",
"11 Crush 2844.000000\n",
" gamers 2061.000000\n",
" annualkpopawards 1367.000000\n",
" AquamarineVI 1240.000000\n",
" tgrp 1122.714286\n",
" politicalpartypowers 1026.000000\n",
" JapaneseWatches 874.000000\n",
" iolanguage 566.000000\n",
" speedruncelebrities 472.000000\n",
" DCSStourney 454.000000\n",
"12 GlobalOffensiveTrade 99767.000000\n",
" bitcoin_devlist 2852.000000\n",
" OYAB 1607.000000\n",
" TheSmarkees 1399.000000\n",
" ResearchVendors 1076.500000\n",
" EFHL 933.000000\n",
" GrimmEclipse 789.000000\n",
" pleasewatchme 610.000000\n",
" MBAGMAT 563.000000\n",
" AMagesGame 558.500000\n",
"Name: comments, dtype: float64\n",
"\n",
"Top 10 relative declining activity subreddits for each month with 250 minimum annual posts\n",
"month subreddit \n",
"2 WeAreBitcoin -0.997980\n",
" Site13RP -0.997833\n",
" WorldWarWii -0.997050\n",
" TotalDramaAndDragons -0.997015\n",
" NoBeautyWithoutPain -0.996942\n",
" playstrandeddeep -0.996745\n",
" foreverkailyn -0.995853\n",
" mysteryhunt -0.995392\n",
" MetaAnime -0.995327\n",
" InverselanPowers -0.994849\n",
"3 ioshaf -0.999778\n",
" HeroRP -0.999743\n",
" MUTCoinSelling -0.999228\n",
" InsulaRP -0.998578\n",
" InsideGaming -0.996625\n",
" easternncnews -0.996516\n",
" PbPDnD5e -0.996474\n",
" bloodbornethegame -0.995961\n",
" LaserTagLeague -0.992519\n",
" ELIActually5 -0.991667\n",
"4 PaxPassExchange -0.999387\n",
" WastelandPowers2 -0.999291\n",
" NoSillySuffix -0.999063\n",
" TheSmarkees -0.998965\n",
" Policy2015 -0.998609\n",
" CCSurvivor -0.998590\n",
" Combine -0.998413\n",
" FIFA15WC -0.997738\n",
" SWRRP -0.997455\n",
" SAORP -0.997415\n",
" ... \n",
"10 testingsometing -0.999767\n",
" GoneGoneGoneGoneTron3 -0.999036\n",
" SpringAwakening -0.998339\n",
" Skinnypeoplepraise -0.998258\n",
" ThisIsAThing -0.997537\n",
" FacebookMurderMystery -0.996815\n",
" BrosOnToes -0.996753\n",
" earlyPowers -0.996743\n",
" Sky -0.996540\n",
" dota2loungebets -0.996094\n",
"11 GlobalOffensiveTrade -0.999667\n",
" DnDBattles -0.999420\n",
" austincipher -0.999214\n",
" MHOCGE4VERIFY -0.999211\n",
" ModelUSGovVerifyOct -0.999125\n",
" LighthouseSherpas -0.998633\n",
" SearchfortheSleeper -0.998227\n",
" mango -0.997890\n",
" NYCC -0.997138\n",
" moneyboy -0.997054\n",
"12 MHoCWorldPowers -0.999481\n",
" blizzcon -0.998675\n",
" AntiPOZi -0.998606\n",
" Pomf -0.998551\n",
" woiafpowers -0.998514\n",
" SexWithDogs -0.998311\n",
" rustfactions -0.997883\n",
" DCSStourney -0.997802\n",
" SwedenYes -0.997455\n",
" WowThisSubExistsNSFW -0.997382\n",
"Name: comments, dtype: float64\n"
]
}
],
"source": [
"def display_active(fname, growing=True):\n",
" df = pd.read_csv(fname,\n",
" names = ['subreddit', 'month', 'comments'])\\\n",
" .set_index(['month', 'subreddit'])\\\n",
" .sort_index()\n",
" df = df.drop([7], level=0) # removing July data\n",
" df = df.groupby(level='subreddit').pct_change() #pct_change handles the relative change calculation\n",
" if growing:\n",
" print('\\nTop 10 relative growing activity subreddits for each month with 250 minimum annual posts')\n",
" print(df['comments']\\\n",
" .groupby(level='month')\\\n",
" .nlargest(10)\\\n",
" .reset_index(level=0)['comments'])\n",
" else:\n",
" print('\\nTop 10 relative declining activity subreddits for each month with 250 minimum annual posts')\n",
" print(df['comments']\\\n",
" .groupby(level='month')\\\n",
" .nsmallest(10)\\\n",
" .reset_index(level=0)['comments'])\n",
" return None\n",
"\n",
"display_active('./prob-3/monthly_sub_activity.csv', growing=True)\n",
"display_active('./prob-3/monthly_sub_activity.csv', growing=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The code above took me a few hours to develop, mostly because I wanted to implement this in Pandas, as I am trying to become more familiar with that library. The functions to note here are the df.pct_change(), which calculated the relative changes from value to value, and since I can groupby subreddit, it one line of code, it does all the calculation for me.\n",
"\n",
"The other function that was convinient is the series.groupby.nlargest() and series.groupby.nsmallest(). These functions were instrumental to extracting the top 10 growing/declining activity subreddits."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Findings\n",
"\n",
"It's clear that with a minimum activity of 250 annual comments, that threshold is too low, all the subreddits with the biggest drop off in activity are in excess of 99% (essentially no posts for an entire month), and growing subreddits show growth in the millions of percent."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Extra Credit\n",
"\n",
"I could work on this problem for days, how do I determine the best minimum annual post activity to show the appropriate trends in month-to-month subreddit activity. While I didn't come up with a solid answer, I did determine the number is significantly higher than 250, and more on the order of 100,000. Below is the code I wrote to help evaluate the growth for various minimum levels of annual activity"
]
},
{
"cell_type": "code",
"execution_count": 144,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"df_monthly = pd.read_csv('./prob-3/monthly_sub_activity.csv',\n",
" names=['subreddit', 'month', 'comments'])\\\n",
" .set_index(['month', 'subreddit'])\\\n",
" .sort_index()\n",
"df_monthly = df_monthly.drop([7], level=0) # remove the July data\n",
"\n",
"annual_activity = df_monthly.unstack('subreddit')\\\n",
" .sum()\\\n",
" .reset_index(level=0, drop=True)\n",
" \n",
"df_monthly['pct_change'] = df_monthly.groupby(level='subreddit')\\\n",
" .pct_change()"
]
},
{
"cell_type": "code",
"execution_count": 242,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"min_annual_comments = 100000\n",
"subs = annual_activity[annual_activity > min_annual_comments].index.tolist()\n",
"top_subs = df_monthly.loc[pd.IndexSlice[:, subs], ['pct_change']]['pct_change']\\\n",
" .groupby(level='month')\\\n",
" .nlargest(10)\\\n",
" .reset_index(level=0)['pct_change']\\"
]
},
{
"cell_type": "code",
"execution_count": 243,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"month subreddit \n",
"2 betterCallSaul 61.726141\n",
" CitiesSkylines 17.017600\n",
" AmiiboCanada 4.651557\n",
" amiiboSwap 4.552309\n",
" thewalkingdead 3.622138\n",
" twitchplayspokemon 3.389029\n",
" SupersRP 3.206390\n",
" bloodborne 2.899392\n",
" DFO 2.572375\n",
" NASCAR 2.423230\n",
"3 StreetFighter 2774.000000\n",
" FFRecordKeeper 1360.000000\n",
" WorldOfWarships 35.101167\n",
" bloodborne 26.032554\n",
" CitiesSkylines 10.866086\n",
" AppleWatch 8.021459\n",
" lifeisstrange 8.008658\n",
" Rainbow6 7.757720\n",
" BigBrother 6.431080\n",
" DFO 5.952331\n",
"4 blackops3 9998.000000\n",
" KCRoyals 41.029208\n",
" CHICubs 21.656548\n",
" FFRecordKeeper 21.192506\n",
" RocketLeague 17.222222\n",
" StarWarsBattlefront 14.255363\n",
" GrandTheftAutoV_PC 13.179609\n",
" AppleWatch 12.514986\n",
" NYYankees 11.247116\n",
" SandersForPresident 11.081839\n",
" ... \n",
"10 Nexus6P 83.199495\n",
" Undertale 7.954729\n",
" LAClippers 6.362734\n",
" fantasybball 4.991209\n",
" thewalkingdead 4.202616\n",
" StarWarsBattlefront 3.674082\n",
" bostonceltics 3.301948\n",
" Overwatch 3.234581\n",
" clevelandcavs 3.198347\n",
" chicagobulls 3.089084\n",
"11 fo4 6.558419\n",
" blackops3 5.070089\n",
" PercyJacksonRP 4.298858\n",
" CollegeBasketball 2.827295\n",
" CODZombies 2.358544\n",
" warriors 2.289033\n",
" bindingofisaac 1.919011\n",
" Cricket 1.842442\n",
" Fallout 1.718097\n",
" LAClippers 1.687032\n",
"12 GlobalOffensiveTrade 99767.000000\n",
" XMenRP 4.376336\n",
" Maplestory 3.635749\n",
" CampHalfBloodRP 3.411035\n",
" StarWars 2.824912\n",
" spacex 2.512957\n",
" StarWarsLeaks 2.262311\n",
" Rainbow6 1.807259\n",
" ElectricForest 1.588738\n",
" FinalFantasy 1.468180\n",
"Name: pct_change, dtype: float64"
]
},
"execution_count": 243,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"top_subs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"However looking at numbers like this isn't that helpful, what we need is a plot!"
]
},
{
"cell_type": "code",
"execution_count": 253,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n/fv3ezwcAABovxZLPi8vT++9957i4uK8kQcAAFwmLe5z79mzJwUPAEAAanZLfuPGjZKkHj16aPbs\n2Ro0aJDs9v9/khkuFgMAgH9rtuQ//vhj988hISHavXt3o/speQAA/FuzJb9s2TJJ0l//+lfddttt\nje7785//7NlUAACgw5ot+f3792vfvn1au3at+8h6Saqvr9eLL76oiRMneiUgAABon2ZLPiQkRCdP\nnlRVVVWjXfc2m01ZWVleCQcAANqv2ZLv3bu3evfurQsXLmjKlCmcUhYAgADT4vfkS0tLNX78eHXp\n0kVDhw51XzzGZrN5Ix8AAGinFkv+sccekySVlZVp586deumll7R792599NFHHg8HAADar8WS/+qr\nr1RUVKSioiIdOnRITqdT06ZN80Y2AADQAS2WfGpqqn76058qMzNTQ4YM8UYmAABwGbRY8n/5y19U\nVFSkN954Q88995z69OmjwYMHX/TdeQAA4F9aLPk+ffqoT58+Gjt2rD7++GO9+eabWrBgASUPAICf\na7Hkn3zySf373//W+fPnNWTIEE2YMEHPPvusN7IBAIAOaNWW/L333suV6AAACDAtXmr2hhtu0Ny5\nczVgwAANHDhQmZmZOnr0qDeyAQCADmix5B9//HFNnTpVH374of75z39qwoQJWrJkiReiAQCAjmix\n5C3L0i233KKwsDCFh4drxIgRamho8EY2AADQAS2WfF1dnfbt2+e+/cknn1DyAAAEgBYPvJs3b55m\nz56tU6dOSZJiY2P11FNPeTwYAADomBZL/oc//KE2b96sqqoq2Ww2rkYHAECAaHF3/Zw5cyRJkZGR\nFDwAAAGkxS35Xr16KSsrS4mJiQoODnYvT0tL82gwAADQMS2WfF1dnex2uz755JNGyyl5AAD8W4sl\nv2zZMm/kAAAAl9klP5PfsmWL++eZM2dq0qRJyszMVGVlpceDAQCAjmm25NetW6fnn39e9fX1kqSv\nvvpKjzzyiPr376/Vq1d7LSAAAGifZnfXb9q0Sa+88oocjm9WCQkJ0aBBg5SYmKgJEyZ4LSAAAGif\nZrfkw8LCFBMT4759++23S5KCg4MVFhbm+WQAAKBDmi35mpqaRrfT09PdP1dVVXkuEQAAuCyaLfm+\nfftqw4YNFy1fs2aNBg8e7NFQAACg45r9TH7OnDmaNm2a8vLy1L9/fzU0NKikpERRUVF66aWXvJkR\n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\nAwBgqP8L9wl9fATu0bQAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd07bb05c50>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"means = top_subs.groupby(level='month').mean()\n",
"errors = top_subs.groupby(level='month').std()\n",
"\n",
"fig, ax = plt.subplots()\n",
"means.plot.bar(yerr=errors, ax=ax)\n",
"ax.set_ylabel('Pct Growth')\n",
"ax.set_ylim([0, 1000])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Findings\n",
"\n",
"\n",
"The results show that even with arbitrarily high minimum annual comments thresholds, you still see some incredibly fast growing subreddits. This indicates to me that looking at the relative month to month change in activity is probably not a great way to measure popular subreddits, and that using the minimum annual posts is also not a good filtering scheme, that or the highest growing subreddit should be discarded as even if you look attempt to take an average, that one outlier wrecks havok.\n",
"\n",
"If I was to implement this as a larger project, I would use a larger moving average window (not just 1 month), and exclude the first two months of a subreddits existence.\n",
"\n",
"The other interesting thing to note is that when looking at subreddits that are slowing down in activity, they are all nearly 100%. This is probably due a subreddit going private, or something to that effect. The minimum annual activity cutoff seems to be a good filter in this area, and 50,000 annual posts seem to reflect a good place to cut off. The top least active subreddit (with 50,000 minimum annual posts) seems to be a subreddit that has effectively shutdown, however the rest of the top 10 seem to show subreddits that are only halfing their activity."
]
}
],
"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"
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment