├── .gitignore ├── README.md ├── materials ├── answers │ └── lesson_answers.ipynb ├── client │ ├── README.md │ ├── batch.py │ ├── batch_input │ │ ├── input.txt │ │ ├── processed.batch1.txt │ │ └── processed.batch2.txt │ ├── client │ │ ├── __init__.py │ │ ├── config.py │ │ ├── data.py │ │ ├── run.py │ │ └── twitter.py │ ├── edgelist.txt │ ├── edgelist_save.py │ ├── graph.py │ ├── json_to_edgelist.py │ ├── pairs.py │ ├── retweet_relationships │ │ └── potential_retweets.txt │ ├── sample.py │ └── t.py ├── data │ ├── friend_relationships │ │ ├── pairs_1.json │ │ ├── pairs_10.json │ │ ├── pairs_2.json │ │ ├── pairs_3.json │ │ ├── pairs_4.json │ │ ├── pairs_5.json │ │ ├── pairs_6.json │ │ ├── pairs_7.json │ │ ├── pairs_8.json │ │ └── pairs_9.json │ ├── friends │ │ └── list.PyTennessee.json │ ├── retweets.txt │ └── statuses │ │ ├── retweets │ │ ├── 542750678498938880.TheBritelist.json │ │ ├── 542776475007471617.graphstoryco.json │ │ ├── 542785335290515456.PyTennessee.json │ │ ├── 542873085415018496.fwiles.json │ │ ├── 543068968991600641.PyTennessee.json │ │ ├── 543147745843093504.PyTennessee.json │ │ ├── 543492435100581889.PyTennessee.json │ │ ├── 543493859578494976.PyTennessee.json │ │ ├── 543495949998645248.PyTennessee.json │ │ ├── 543511336588566528.DerbyPy.json │ │ ├── 543797379455913984.WillingCarol.json │ │ ├── 543836847760109568.RealPython.json │ │ ├── 544331486271262721.CaretWCaret.json │ │ ├── 544493789050834944.PyTennessee.json │ │ ├── 544518559729479680.PyTennessee.json │ │ ├── 544522908052504579.LampPostGroup.json │ │ ├── 544549977478152192.PyTennessee.json │ │ ├── 544553237358333952.PyTennessee.json │ │ ├── 544556686615543809.acedrew.json │ │ ├── 544575934011953152.AmyFlatt1.json │ │ ├── 544594948671418369.evbeng.json │ │ ├── 544597263558127616.PyTennessee.json │ │ ├── 544839263138095104.jasonamyers.json │ │ ├── 544857732055326720.elliewix.json │ │ ├── 544928569500385281.adriennefriend.json │ │ ├── 545025952632143873.SimplyAubs.json │ │ ├── 545322040920924160.PyTennessee.json │ │ ├── 545698659120472064.michaelnugent.json │ │ ├── 545954460842070016.PyTennessee.json │ │ ├── 545963682648563712.PyTennessee.json │ │ ├── 545968130762477568.PyTennessee.json │ │ ├── 546046877297557504.PyTennessee.json │ │ ├── 546503413563801600.asheeshlaroia.json │ │ ├── 547055215019835394.PyTennessee.json │ │ ├── 547393173505728512.PyTennessee.json │ │ ├── 547496390205919232.PyTennessee.json │ │ ├── 547528147189915649.PyTennessee.json │ │ ├── 547578967700418560.2braids.json │ │ ├── 547780052059172864.PyTennessee.json │ │ ├── 547807399948460032.planetpython.json │ │ ├── 547858753773928448.PyTennessee.json │ │ ├── 548142453371719680.PyTennessee.json │ │ ├── 548581934189015040.PyTennessee.json │ │ ├── 548938180612087810.PyTennessee.json │ │ ├── 549604181644816384.PyTennessee.json │ │ ├── 549944171021479936.PyTennessee.json │ │ ├── 549966645461286912.PyTennessee.json │ │ ├── 550033096125734912.PyTennessee.json │ │ ├── 550342769919946752.jasonamyers.json │ │ ├── 550729200244502529.sigmavirus24.json │ │ ├── 550793670312873984.PyTennessee.json │ │ ├── 551019011086254080.CalEvans.json │ │ ├── 551041326515761153.PyTennessee.json │ │ ├── 551410537905811456.PyTennessee.json │ │ ├── 551808976694702080.planetpython.json │ │ ├── 552521973184860160.PyTennessee.json │ │ ├── 552534725618065409.PyTennessee.json │ │ ├── 552543782164774913.PyTennessee.json │ │ ├── 552560684241006593.PyTennessee.json │ │ ├── 552606442596073472.kcunning.json │ │ ├── 552626568791859201.PyTennessee.json │ │ ├── 552645618632388608.kylewm2.json │ │ ├── 552836468973273088.PyTennessee.json │ │ ├── 552855993768751104.PyTennessee.json │ │ ├── 552903120377110529.PyTennessee.json │ │ ├── 553024769172733952.PyTennessee.json │ │ ├── 553252685328441344.PyTennessee.json │ │ ├── 553387525558259713.PyTennessee.json │ │ ├── 553389670974111744.egdelwonk.json │ │ ├── 553559740840546304.PyTennessee.json │ │ ├── 553615900796928000.jasonamyers.json │ │ ├── 553955415323836416.PyTennessee.json │ │ ├── 554673408932196353.lisafrench.json │ │ ├── 554683627389591553.PyTennessee.json │ │ ├── 554703206891421698.Authy.json │ │ ├── 554758513906708481.PyTennessee.json │ │ ├── 554758874495209474.jasonamyers.json │ │ ├── 554760321802723328.PyTennessee.json │ │ ├── 555035407641870336.graphstoryco.json │ │ ├── 555044743093039104.planetpython.json │ │ ├── 555375921964646401.PyTennessee.json │ │ ├── 555421576242278400.PyTennessee.json │ │ ├── 555424929299308544.OssAnna16.json │ │ ├── 555445586422677505.PyTennessee.json │ │ ├── 556388198184927233.paltman.json │ │ ├── 557263855211253760.indypy.json │ │ ├── 557265960949002242.PyTennessee.json │ │ ├── 557273052296540160.poweredbyaltnet.json │ │ ├── 557293335413395456.elegant_stitch.json │ │ ├── 557304540891217920._gignosko_.json │ │ ├── 557305342351007745.elegant_stitch.json │ │ ├── 557684780092125184.elegant_stitch.json │ │ ├── 558051333744652290.elegant_stitch.json │ │ ├── 558278307058573312.indypy.json │ │ ├── 558418364226629633.jacqueswoodcock.json │ │ ├── 558420527069798400.poweredbyaltnet.json │ │ ├── 558439611660120064.elegant_stitch.json │ │ ├── 559126165093642242.PyTennessee.json │ │ ├── 559129039945076736.PyTennessee.json │ │ ├── 559153617291476992.poweredbyaltnet.json │ │ ├── 559770882550550528.adriennefriend.json │ │ ├── 559897970624049152.sigmavirus24.json │ │ ├── 560137369924284416.adamfblahblah.json │ │ ├── 560821963057557504.PyTennessee.json │ │ ├── 561161749223964672.PyTennessee.json │ │ ├── 561198982555533313.PyTennessee.json │ │ ├── 561214240300609536.PyTennessee.json │ │ ├── 561599837049999361.tsclausing.json │ │ ├── 561903108717289473.OReillyMedia.json │ │ ├── 561927149016596481.sarah_guido.json │ │ ├── 561928329716985857.muhkayoh.json │ │ ├── 561932303115771905.jessejiryudavis.json │ │ ├── 561942855854592000.PyTennessee.json │ │ ├── 561943130606690305.PyTennessee.json │ │ └── 561944713054269440.2braids.json │ │ ├── user_timeline.PyTennessee.390463416378601471.json │ │ ├── user_timeline.PyTennessee.410042659773104127.json │ │ ├── user_timeline.PyTennessee.424559108960694271.json │ │ ├── user_timeline.PyTennessee.436177971154792447.json │ │ ├── user_timeline.PyTennessee.437272085027893247.json │ │ ├── user_timeline.PyTennessee.437665926797066240.json │ │ ├── user_timeline.PyTennessee.475684968908472320.json │ │ ├── user_timeline.PyTennessee.542159199476916223.json │ │ └── user_timeline.PyTennessee.json ├── images │ ├── centrality1.png │ ├── centrality2.png │ ├── circular.png │ ├── fr.png │ ├── graph-paths.png │ ├── graph.png │ ├── random.png │ ├── shell.png │ ├── spectral.png │ ├── spring.png │ └── twitter-tokens.png ├── networkx │ ├── NetworkX (not used) -- Importing and Exporting data.ipynb │ ├── NetworkX - Visualizations.ipynb │ ├── NetworkX, Part 1 -- nodes, edges, attributes - ANSWER KEY.ipynb │ ├── NetworkX, Part 1 -- nodes, edges, attributes.ipynb │ ├── files │ │ └── simple_path.png │ └── spring.png ├── tutorial │ └── config.json └── twitter │ ├── Step 1 -- Obtaining Twitter API Tokens.ipynb │ ├── Step 2 -- Calling the Twitter API.ipynb │ ├── config.py │ └── files │ ├── image1.png │ └── image2.png └── notebooks ├── lesson.ipynb └── tutorial.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints 2 | *.pyc 3 | .DS_Store 4 | .idea 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Slides can be found here: [Network theory slides](http://www.slideshare.net/SarahGuido/network-theory-pycon) 2 | 3 | # Options for installation 4 | 5 | ### Option 1: Install Anaconda. 6 | 7 | If you haven't installed Anaconda, go here: https://store.continuum.io/cshop/anaconda/ This will install everything that you need. 8 | 9 | ### Option 2: pip 10 | 11 | If you don't want to install Anaconda, open the terminal and run the following commands: 12 | 13 | - pip install networkx 14 | - pip install matplotlib 15 | - pip install "ipython[all]" 16 | - pip install oauth2 17 | 18 | # Options for running 19 | 20 | ### Option 1: IPython Notebook 21 | 22 | If you have installed a distribution like Anaconda or Enthought, or if you pip installed from above, you have IPython notebook. To run IPython notebook and to follow along: 23 | 24 | - git clone this repo OR download it as a zip and unzip it to your Desktop 25 | - open the terminal/command line and cd into networkx-tutorial/notebooks 26 | - in your terminal, type: ipython notebook 27 | 28 | ### Option 2: Wakari.io 29 | 30 | Wakari.io is a platform for web-based Python data analysis. It also allows you to host IPython Notebooks online and share them so people can run IPython Notebook in the browser. 31 | 32 | The caveat with this option is that Wakari doesn't work with the newest version of IPython notebook, so we were not able to upload the updated material. The material on Wakari, however, should be fairly similar to the current tutorial, minus a few small sections. 33 | 34 | To sign up for Wakari: 35 | 36 | - go here https://www.wakari.io/ 37 | - when you register, it might give you a message that "we're at capacity for this plan" or something. Ignore it and click on the Wakari logo in the top left corner. 38 | - Then, click this link: https://wakari.io/sharing/bundle/sarguido89/twitter-networkx 39 | - Click on "run/edit this notebook" 40 | - It might say "404: Not Found". That's okay! On the left, double click on "notebooks", and then on the notebook you want to open. 41 | - You might have to open, close, and reopen files several times to get them to open. 42 | 43 | ### Option 3: Follow along on the web 44 | 45 | If none of these options work, or you just want to watch now and code later, you can follow along below. It's not interactive, but you'll be able to see what's happening. 46 | 47 | - For the tutorial section: http://nbviewer.ipython.org/github/sarguido/networkx-tutorial/blob/master/notebooks/tutorial.ipynb 48 | - For the lesson section: http://nbviewer.ipython.org/github/sarguido/networkx-tutorial/blob/master/notebooks/lesson.ipynb 49 | -------------------------------------------------------------------------------- /materials/client/README.md: -------------------------------------------------------------------------------- 1 | Created TwitterAPI and DataAPI to help retrieve and view Twitter data. 2 | 3 | to run: 4 | python t.py [get|summary] [resource] 5 | 6 | You will need these os environment params set: 7 | 8 | export CONSUMER_KEY="[==Consumer Key (API Key)==]" 9 | export CONSUMER_SECRET="[==Consumer Secret (API Secret)==]" 10 | export ACCESS_TOKEN="[==Access Token==]" 11 | export ACCESS_SECRET="[==Access Token Secret==]" 12 | -------------------------------------------------------------------------------- /materials/client/batch.py: -------------------------------------------------------------------------------- 1 | from sys import argv 2 | from client import run 3 | import time 4 | 5 | filename = 'batch_input/input.txt' 6 | command_template = 'get retweets id={id}' 7 | pace_requests = True 8 | 9 | # filename = 'batch_input/processed.batch1.txt' 10 | # command_template = 'summary retweets id={id}' 11 | # pace_requests = False 12 | 13 | 14 | def get_id(data): 15 | if data['retweeted_count'] > 0: 16 | print "not original tweet. user_mentions:", data['user_mentions'] 17 | return data['retweeted_id'] 18 | 19 | elif data['retweets'] > 0: 20 | return data['id'] 21 | 22 | return None 23 | 24 | 25 | # get input data 26 | header, lines = run.get_file_actions(filename) 27 | 28 | columns = { 29 | 'id': 1, 30 | 'user_mentions': 2, 31 | 'retweets': 5, 32 | 'retweeted_id': 6, 33 | 'retweeted_count': 8 34 | } 35 | 36 | # do we just want to run a single line? 37 | args = argv[1:] 38 | if len(args): 39 | line_number = int(args[0]) 40 | lines = [lines[line_number]] 41 | 42 | for line in lines: 43 | 44 | #extract relevant data from line 45 | data = {} 46 | for c in columns: 47 | if columns[c] < len(line): 48 | value = line[columns[c]] 49 | if run.is_numeric(value): 50 | value = int(value) 51 | data[c] = value 52 | else: 53 | data[c] = '' 54 | 55 | 56 | #construct command 57 | print "****** id", data['id'], ", retweets", data['retweets'] 58 | id = get_id(data) 59 | 60 | if id: 61 | command = command_template.format(id=id) 62 | run.run_action(command.split(' ')) 63 | 64 | #sleep for 1 second to comply with rate limits 65 | if pace_requests: 66 | time.sleep(1.5) 67 | -------------------------------------------------------------------------------- /materials/client/client/__init__.py: -------------------------------------------------------------------------------- 1 | import twitter as c 2 | from data import DataAPI 3 | 4 | tapi = c.TwitterAPI() 5 | dapi = DataAPI 6 | -------------------------------------------------------------------------------- /materials/client/client/config.py: -------------------------------------------------------------------------------- 1 | PARENT_DATA_FOLDER = 'data' # folder where twitter json results will be saved 2 | TWITTER_BASE_URL = 'https://api.twitter.com/1.1/{resource}.json?count=5000&' 3 | EXCLUDED_FIELDS_FILENAME = 'excluded.txt' 4 | 5 | RESOURCE = { 6 | 'followers': { 7 | 'url': 'followers/list', 8 | 'filename_fields': ['screen_name', 'cursor'], 9 | 'summary_fields': ['next_cursor'], 10 | 'next': {'cursor': 'next_cursor'}, 11 | 'data_field': 'users', 12 | 'summarize': 'screen_name favourites_count followers_count friends_count name description'.split() 13 | }, 14 | 15 | 'friends': { 16 | 'url': 'friends/list', 17 | 'filename_fields': ['screen_name', 'cursor'], 18 | 'summary_fields': ['next_cursor'], 19 | 'next': {'cursor': 'next_cursor'}, 20 | 'data_field': 'users', 21 | 'summarize': 'screen_name favourites_count followers_count friends_count name description'.split() 22 | }, 23 | 24 | 'statuses': { 25 | 'url': 'statuses/user_timeline', 26 | 'filename_fields': ['screen_name', 'max_id'], 27 | 'summary_fields': ['created_at', 'id_str'], 28 | 'next': {'max_id': 'id_str'}, 29 | 'data_field': None, 30 | 'desc': True, 31 | 'summarize': [ 32 | 'created_at', 33 | 'id', 34 | 'entities|user_mentions|screen_name', 35 | 'entities|media|type', 36 | 'favorite_count', 37 | 'retweet_count', 38 | 'retweeted_status|id', 39 | 'retweeted_status|favorite_count', 40 | 'retweeted_status|retweet_count', 41 | 'retweeted_status|created_at', 42 | 'entities|media|url', 43 | 'text' 44 | ] 45 | }, 46 | 47 | 'retweeters': { 48 | 'url': 'statuses/retweeters/ids', 49 | 'filename_fields': ['id', 'cursor'], 50 | 'summary_fields': ['next_cursor'], 51 | 'next': {'cursor': 'next_cursor'}, 52 | 'data_field': 'ids', 53 | 'summarize': ['ids'] 54 | }, 55 | 56 | 'retweets': { 57 | 'url': 'statuses/retweets/%(id)s', 58 | 'filename_fields': ['retweeted_status|user|screen_name'], 59 | 'summarize_filename_prefix': ['retweeted_status|user|screen_name'], 60 | 'resource_param': 'id', 61 | 'summarize': [ 62 | # These values are all the same: 63 | # 'retweeted_status|id', 64 | 'retweeted_status|favorite_count', 65 | # 'retweeted_status|retweet_count', 66 | 'favorite_count', 67 | 'favorited', 68 | 'user|follower_count', 69 | 'created_at', 70 | 'id', 71 | 'user|screen_name', 72 | 'user|statuses_count', 73 | 'user|favourites_count', 74 | 'entities|user_mentions|screen_name', 75 | # 'entities|user_mentions|id_str', 76 | 'entities|hashtags|text' 77 | ] 78 | } 79 | } 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /materials/client/client/data.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | 4 | import config 5 | 6 | class DataAPI(object): 7 | 8 | @staticmethod 9 | def get_item(resource, screen_name, index, data_field=None): 10 | file_paths = DataAPI.get_filenames(resource, screen_name) 11 | for path in file_paths: 12 | search_result = None 13 | with open(path, 'r') as f: 14 | if data_field: 15 | item_list = json.loads(f.read())[data_field] 16 | else: 17 | item_list = json.loads(f.read()) 18 | if index < len(item_list): 19 | return item_list[index] 20 | else: 21 | # index is in a subsequent file 22 | # decrement index by the number of items in this file 23 | index -= len(item_list) 24 | return None 25 | 26 | @staticmethod 27 | def find_user(resource, screen_name, search_for): 28 | file_paths = DataAPI.get_filenames(resource, screen_name) 29 | for path in file_paths: 30 | search_result = None 31 | with open(path, 'r') as f: 32 | search_result = [u for u in json.loads(f.read())['users'] if u['screen_name'] == search_for] 33 | if search_result: 34 | return search_result[0] 35 | return None 36 | 37 | @staticmethod 38 | def summarize_items(resource, params, summary=True, details=False): 39 | 40 | properties = None 41 | data_field=None 42 | if 'summarize' in resource: 43 | properties = resource['summarize'] 44 | if 'data_field' in resource: 45 | data_field = resource['data_field'] 46 | 47 | file_paths = DataAPI.get_filenames(resource, params) 48 | 49 | if 'desc' in resource and resource['desc']: 50 | file_paths.reverse() 51 | 52 | lines, endpoints = DataAPI.get_summaries(file_paths, data_field, resource, params, properties) 53 | 54 | file_prefix = DataAPI._file_prefix(resource, params) 55 | 56 | with open(file_prefix + 'summary-summary.txt', 'w') as f: 57 | f.write('count\tfilename\t' + '\t'.join(properties) + '\n') 58 | f.write('\n'.join(endpoints)) 59 | 60 | with open(file_prefix + 'summary.txt', 'w') as f: 61 | f.write('\t'.join(properties) + '\n') 62 | f.write('\n'.join(lines)) 63 | 64 | if summary: 65 | print 'count\tfilename\t' + '\t'.join(properties) + '\n' 66 | print '\n'.join(endpoints) 67 | 68 | if details: 69 | print '\t'.join(properties) + '\n' 70 | print '\n'.join(lines) 71 | 72 | @staticmethod 73 | def adjust_inputs(resource, params): 74 | #if resource url contains string formatting, do that first 75 | if 'resource_param' in resource: 76 | resource_param = resource['resource_param'] 77 | resource['url'] = resource['url'] % {resource_param: params[resource_param]} 78 | del params[resource['resource_param']] 79 | 80 | @staticmethod 81 | def get_summaries(file_paths, data_field, resource, params, properties): 82 | 83 | lines = [] 84 | endpoints = [] 85 | for path in file_paths: 86 | with open(path, 'r') as f: 87 | if data_field: 88 | data = json.loads(f.read())[data_field] 89 | else: 90 | data = json.loads(f.read()) 91 | 92 | if properties is None: 93 | excluded_fields = DataAPI.get_excluded_fields() 94 | properties = [x for x in data[0].keys() if x not in excluded_fields] 95 | 96 | expected_prefix = DataAPI._file_prefix(resource, params) 97 | file_id = path[(len(expected_prefix)):-5] 98 | 99 | count = str(len(data)) 100 | if type(data) is list: 101 | endpoints.append(count + '\t' + file_id + '\t' + DataAPI.summarize_item(data[0], properties)) 102 | endpoints.append(count + '\t' + file_id + '\t' + DataAPI.summarize_item(data[-1], properties)) 103 | 104 | for u in data: 105 | if 'limit' in params: 106 | params['limit'] -= 1 107 | if params['limit'] < 0: 108 | return lines, endpoints 109 | lines.append(DataAPI.summarize_item(u, properties)) 110 | 111 | return lines, endpoints 112 | 113 | @staticmethod 114 | def summarize_item(item, properties): 115 | x = [] 116 | for p in properties: 117 | keys = p.split("|") 118 | value = DataAPI.find_key(item, keys) 119 | if not value: 120 | value = 0 121 | x.append(DataAPI.cleanup_value(value)) 122 | return '\t'.join(x) 123 | 124 | @staticmethod 125 | def find_key(value, keys): 126 | if not keys: 127 | return None 128 | if type(value) is list: 129 | results = [DataAPI.find_key(v, keys) for v in value] 130 | results = [r for r in results if r is not None] 131 | return '|'.join(results) 132 | if keys[0] not in value: 133 | return None 134 | if len(keys) == 1: 135 | return value[keys[0]] 136 | return DataAPI.find_key(value[keys[0]], keys[1:]) 137 | 138 | @staticmethod 139 | def cleanup_value(item): 140 | if type(item) is str or type(item) is unicode: 141 | value = item.encode('utf-8') 142 | if value: 143 | value = value.replace('\n', '|') 144 | return value 145 | else: 146 | return str(item) 147 | 148 | @staticmethod 149 | def get_filenames(resource, params): 150 | file_paths = [] 151 | for (dir_path, dir_names, file_names) in os.walk(config.PARENT_DATA_FOLDER): 152 | expected_prefix = DataAPI._file_prefix(resource, params) 153 | for f in file_names: 154 | file_path = os.path.join(dir_path, f) 155 | if file_path.startswith(expected_prefix) and file_path.endswith('.json') and '.last.' not in file_path: 156 | file_paths.append(file_path) 157 | return file_paths 158 | 159 | @staticmethod 160 | def _file_prefix(resource, params): 161 | 162 | prefix_params = resource['filename_fields'][:-1] 163 | 164 | filename_parts = [resource['url']] 165 | filename_parts.extend([params[p] for p in prefix_params]) 166 | 167 | return os.path.join(config.PARENT_DATA_FOLDER, '.'.join(filename_parts) + '.') 168 | 169 | @staticmethod 170 | def get_excluded_fields(exclusion_list_filename=None): 171 | if not exclusion_list_filename: 172 | exclusion_list_filename = config.EXCLUDED_FIELDS_FILENAME 173 | path = os.path.join(config.PARENT_DATA_FOLDER, exclusion_list_filename) 174 | with open(path, 'r') as f: 175 | return f.read().split("\n") 176 | 177 | # ---- helper methods for viewing user json; separating key/values by dicts (nested) and non-dicts (simple) 178 | @staticmethod 179 | def print_item(obj, print_fields=False, exclude=None, caption=None): 180 | children = [] 181 | x = {} 182 | for k in obj: 183 | if exclude is None or k not in exclude: 184 | if type(obj[k]) is not dict: 185 | k_list = [] 186 | if type(obj[k]) is list: 187 | for y in obj[k]: 188 | if type(y) is dict: 189 | y_include = {y_key: y[y_key] for y_key in y if exclude is None or y_key not in exclude} 190 | k_list.append(y_include) 191 | else: 192 | k_list.append(y) 193 | x[k] = k_list 194 | else: 195 | x[k] = obj[k] 196 | else: 197 | x[k] = '==dict==' 198 | if caption: 199 | child_caption = caption + " > " + k 200 | else: 201 | child_caption = k 202 | children.append((child_caption, obj[k])) 203 | # print results 204 | if print_fields: 205 | print '\n'.join(sorted(x.keys())) 206 | if caption: 207 | print "========", caption, "========" 208 | print json.dumps(x, indent=4, sort_keys=True) 209 | for child in children: 210 | DataAPI.print_item(obj=child[1], caption=child[0], exclude=exclude) -------------------------------------------------------------------------------- /materials/client/client/run.py: -------------------------------------------------------------------------------- 1 | from client import tapi, dapi 2 | from client import config 3 | 4 | 5 | def is_numeric(s): 6 | try: 7 | float(s) 8 | return True 9 | except ValueError: 10 | return False 11 | 12 | def get_file_actions(filename): 13 | with open(filename, 'r') as f: 14 | lines = [line.split('\t') for line in f.read().split('\n')] 15 | return lines[0], lines[1:] 16 | 17 | def run_action(args): 18 | print args 19 | 20 | actions = ['get','summary'] 21 | 22 | if len(args) < 2 or args[0] not in actions or args[1] not in config.RESOURCE: 23 | print 'action options:', actions 24 | print 'resource options:', config.RESOURCE.keys() 25 | exit(1) 26 | 27 | action = args[0] 28 | resource = dict(config.RESOURCE[args[1]]) 29 | 30 | resource_params = args[2:] 31 | params = {} 32 | if resource_params: 33 | params 34 | for p in resource_params: 35 | pair = p.split("=") 36 | value = pair[1] 37 | if value == 'None': 38 | value = None 39 | params[pair[0]] = value 40 | 41 | # if 'last' in params: 42 | # params = tapi.get_next_params(resource, params) 43 | 44 | # check fields 45 | 46 | missing_fields = [field for field in resource['filename_fields'] 47 | if field not in params 48 | and 'summarize_filename_prefix' in resource 49 | and field not in resource['summarize_filename_prefix']] 50 | 51 | if missing_fields: 52 | print "required resource params:", ','.join(missing_fields) 53 | exit(1) 54 | 55 | dapi.adjust_inputs(resource, params) 56 | 57 | if action == 'get': 58 | summary, data = tapi.get_resource(resource=resource, params=params) 59 | elif action == 'summary': 60 | dapi.summarize_items(resource=resource, params=params) 61 | -------------------------------------------------------------------------------- /materials/client/client/twitter.py: -------------------------------------------------------------------------------- 1 | import config 2 | import json 3 | import os 4 | import oauth2 as oauth 5 | import urllib 6 | from data import DataAPI 7 | 8 | HTTP_STATUS_OKAY = '200' 9 | HTTP_RATE_LIMIT_EXCEEDED = '429' 10 | 11 | class TwitterAPI(object): 12 | 13 | def __init__(self): 14 | consumer_key = os.environ['CONSUMER_KEY'] 15 | consumer_secret = os.environ['CONSUMER_SECRET'] 16 | access_token = os.environ['ACCESS_TOKEN'] 17 | access_secret = os.environ['ACCESS_SECRET'] 18 | 19 | consumer = oauth.Consumer(key=consumer_key, secret=consumer_secret) 20 | token = oauth.Token(key=access_token, secret=access_secret) 21 | 22 | self.client = oauth.Client(consumer, token) 23 | 24 | # ------- GENERIC RESOURCE METHOD ------- 25 | 26 | def get_resource(self, resource, params): 27 | """ 28 | :param resource: the twitter api resource, eg "followers/list" 29 | :param params: resource params, eg { "screen_name": "foo", "cursor": "-1"} 30 | :param data_field: what field actually contains the data results, eg data["users"] 31 | :return: a tuple of next_cursor, data. next_cursor can be None. 32 | """ 33 | 34 | url = TwitterAPI.get_url(resource, params) 35 | print url 36 | data = self.get_response(url) 37 | summary = None 38 | if data: 39 | other_params = data 40 | if type(data) is list: 41 | other_params = data[0] 42 | if 'summarize_filename_prefix' in resource: 43 | for field in resource['summarize_filename_prefix']: 44 | keys = field.split("|") 45 | value = DataAPI.find_key(other_params, keys) 46 | if value: 47 | params[field] = value 48 | else: 49 | resource['filename_fields'].remove(field) 50 | 51 | file_path = TwitterAPI.get_filename(resource['url'], params, resource['filename_fields']) 52 | TwitterAPI.save_resource(data, file_path) 53 | summary = TwitterAPI.get_summary(data, params, resource) 54 | 55 | return summary, data 56 | 57 | @staticmethod 58 | def get_next_params(resource, params): 59 | summary_path = os.path.join(config.PARENT_DATA_FOLDER, TwitterAPI.get_summary_path(resource['url'], params)) 60 | if not os.path.exists(summary_path): 61 | print "no file at", summary_path 62 | return {} 63 | 64 | with open(summary_path, 'r') as f: 65 | summary = json.loads(f.read()) 66 | params = summary['params'] 67 | for key in resource['next']: 68 | result_key = resource['next'][key] 69 | params[key] = str(summary['result'][result_key]) 70 | return params 71 | 72 | @staticmethod 73 | def get_summary_path(resource_url, params): 74 | 75 | last_params = {'x': 'last'} 76 | if 'screen_name' in params: 77 | last_params['screen_name'] = params['screen_name'] 78 | elif 'last' in params: 79 | last_params['screen_name'] = params['last'] 80 | 81 | return TwitterAPI.get_filename(resource_url, last_params, last_params.keys()) 82 | 83 | @staticmethod 84 | def get_summary(data, params, resource): 85 | summary_path = TwitterAPI.get_summary_path(resource['url'], params) 86 | summary_fields = [] 87 | if 'summary_fields' in resource: 88 | summary_fields = resource['summary_fields'] 89 | num_items = None 90 | 91 | summary = {} 92 | summary['params'] = {f: params[f] for f in resource['filename_fields'] if f in params} 93 | summary['result'] = {} 94 | 95 | if 'data_field' in resource and resource['data_field']: 96 | for field in summary_fields: 97 | if field in data: 98 | summary['result'][field] = data[field] 99 | data = data[resource['data_field']] 100 | 101 | if type(data) is list and data: 102 | num_items = len(data) 103 | data = data[-1] 104 | 105 | if type(data) is dict: 106 | for field in summary_fields: 107 | if field in data: 108 | summary['result'][field] = data[field] 109 | summary['result']['num_items'] = num_items 110 | 111 | TwitterAPI.save_resource(summary, summary_path) 112 | 113 | print "summary", summary 114 | return summary 115 | 116 | def get_response(self, url): 117 | header, response = self.client.request(url, method="GET") 118 | 119 | if header['status'] <> HTTP_STATUS_OKAY: 120 | print header['status'], response 121 | 122 | if header['status'] == HTTP_RATE_LIMIT_EXCEEDED: 123 | exit(1) 124 | 125 | return None 126 | else: 127 | return json.loads(response) 128 | 129 | @staticmethod 130 | def get_url(resource, params): 131 | url_params = {p: params[p] for p in params if params[p]} 132 | return config.TWITTER_BASE_URL.format(resource=resource['url']) + urllib.urlencode(url_params) 133 | 134 | @staticmethod 135 | def save_resource(data, filename): 136 | full_path = os.path.join(config.PARENT_DATA_FOLDER, filename) 137 | parent_directory = os.path.dirname(full_path) 138 | if not os.path.exists(parent_directory): 139 | os.makedirs(parent_directory) 140 | with open(full_path, 'w') as f: 141 | f.write(json.dumps(data, indent=4)) 142 | 143 | @staticmethod 144 | def get_filename(resource, params, filename_fields): 145 | 146 | filename_parts = [resource] 147 | filename_parts.extend([str(params[f]) for f in filename_fields if f in params and params[f]]) 148 | filename_parts.append("json") 149 | print filename_parts 150 | return '.'.join(filename_parts) 151 | -------------------------------------------------------------------------------- /materials/client/edgelist.txt: -------------------------------------------------------------------------------- 1 | 1 2 {'weight': 3} 2 | 1 3 {'weight': 1} 3 | 2 4 {'weight': 67} 4 | 2 5 {'weight': 1} -------------------------------------------------------------------------------- /materials/client/edgelist_save.py: -------------------------------------------------------------------------------- 1 | import networkx as nx 2 | import networkx.readwrite as rw 3 | 4 | g = nx.Graph() 5 | g.add_edge(1,2, weight=3) 6 | g.add_edge(1,3, weight=1) 7 | g.add_edge(2,4, weight=67) 8 | g.add_edge(2,5, weight=1) 9 | 10 | with open('edgelist.txt', 'w') as f: 11 | f.write('\n'.join(list(nx.generate_edgelist(g, data=True)))) 12 | -------------------------------------------------------------------------------- /materials/client/graph.py: -------------------------------------------------------------------------------- 1 | import networkx as nx 2 | #import networkx.readwrite as rw 3 | #from networkx.readwrite import json_graph 4 | import json 5 | 6 | edgelist_txt = 'retweet_relationships/retweets.txt' 7 | 8 | # json_filename = 'graph.json' 9 | 10 | ge = nx.read_edgelist(edgelist_txt, create_using=nx.DiGraph()) 11 | # tree = nx.read_edgelist('tree_edges.txt', create_using=nx.DiGraph()) 12 | # 13 | # jsongraph.adjacency_data(ge) 14 | -------------------------------------------------------------------------------- /materials/client/json_to_edgelist.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | from client.data import DataAPI 4 | from collections import defaultdict 5 | 6 | RETWEET_DATA_PATH = 'data/statuses/retweets' 7 | RETWEETS_OUTPUT = 'retweet_relationships/retweets.txt' 8 | POTENTIAL_RETWEETS_OUTPUT = 'retweet_relationships/potential_retweets.txt' 9 | 10 | SATELLITE_SCREEN_NAME = 'PyTennessee' # the main twitter handle that we're interested in analyzing 11 | 12 | fields = [ 13 | 'created_at', #when was it retweeted? 14 | 'user|screen_name' #who retweeted? 15 | ] 16 | 17 | class Relationships(object): 18 | 19 | def __init__(self, satellite_screen_name): 20 | self.satellite_screen_name = satellite_screen_name 21 | 22 | # these will be a dict of dicts: [original_tweeter][retweeter] = num_retweets 23 | self.retweets = {} 24 | 25 | # even though SATELLITE_SCREEN_NAME may not be the original tweeter, for those that tweeted afterwards, 26 | # they could have potentially seen the tweet from SATELLITE_SCREEN_NAME 27 | self.possible_satellite_retweeter = defaultdict(int) # will be dict of [retweeter] = num_retweets 28 | 29 | def add(self, filename): 30 | 31 | file_parts = filename.split('.') 32 | tweet_source = file_parts[1] 33 | 34 | if tweet_source not in self.retweets: 35 | self.retweets[tweet_source] = defaultdict(int) 36 | 37 | with open(filename, 'r') as f: 38 | retweets = json.loads(f.read()) 39 | 40 | #tweets are most recent first; let's reverse it into chronological order 41 | retweets.reverse() 42 | 43 | is_possible_retweeter = False 44 | for retweet in retweets: 45 | relevant_data = Relationships._get_relevant_data(retweet) 46 | if relevant_data: 47 | retweeter = relevant_data['screen_name'] 48 | self.retweets[tweet_source][retweeter] += 1 49 | 50 | if is_possible_retweeter: 51 | self.possible_satellite_retweeter[retweeter] += 1 52 | elif retweeter == self.satellite_screen_name: 53 | is_possible_retweeter = True 54 | 55 | def save_retweets(self, filename): 56 | Relationships._save_relationships(self.retweets, filename) 57 | 58 | def save_potential_retweets(self, filename): 59 | satellite_relationships = { 60 | self.satellite_screen_name: self.possible_satellite_retweeter 61 | } 62 | Relationships._save_relationships(satellite_relationships, filename) 63 | 64 | @staticmethod 65 | def _create_parent_dirs(file_path): 66 | parent_directory = os.path.dirname(file_path) 67 | if not os.path.exists(parent_directory): 68 | os.makedirs(parent_directory) 69 | 70 | @staticmethod 71 | def _save_relationships(relationships, filename): 72 | flat_relationships = [] 73 | for source in relationships: 74 | for retweeter in relationships[source]: 75 | flat_relationships.append("%s %s {'weight': %s}" % ( 76 | source, 77 | retweeter, 78 | relationships[source][retweeter])) 79 | 80 | Relationships._create_parent_dirs(filename) 81 | with open(filename, 'w') as f: 82 | f.write('\n'.join(flat_relationships)) 83 | 84 | 85 | @staticmethod 86 | def _get_relevant_data(retweet): 87 | relevant_data = {} 88 | for field in fields: 89 | keys = field.split('|') 90 | value = DataAPI.find_key(retweet, keys) 91 | if not value: 92 | #can't add relationship to the graph if we don't have all the relevant info 93 | return None 94 | relevant_data[keys[-1]] = value 95 | return relevant_data 96 | 97 | 98 | def get_retweet_json_filenames(path): 99 | filenames = [] 100 | for (dir_path, dir_names, file_names) in os.walk(path): 101 | if dir_path == path: 102 | for filename in file_names: 103 | if '.summary' not in filename and '.last' not in filename: 104 | filenames.append(os.path.join(dir_path, filename)) 105 | return filenames 106 | 107 | 108 | def run(): 109 | filenames = get_retweet_json_filenames(RETWEET_DATA_PATH) 110 | relationships = Relationships(SATELLITE_SCREEN_NAME) 111 | for filename in filenames: 112 | relationships.add(filename) 113 | relationships.save_retweets(RETWEETS_OUTPUT) 114 | relationships.save_potential_retweets(POTENTIAL_RETWEETS_OUTPUT) 115 | 116 | 117 | def test(filename): 118 | relationships = Relationships(SATELLITE_SCREEN_NAME) 119 | relationships.add(filename) 120 | # print json.dumps(relationships.retweets, indent=2) 121 | relationships.save_retweets(RETWEETS_OUTPUT) 122 | # for source in relationships.retweets: 123 | # for retweeter in relationships.retweets[source]: 124 | # print source, retweeter, relationships.retweets[source][retweeter] 125 | 126 | 127 | run() 128 | 129 | # test('data/statuses/retweets/552606442596073472.kcunning.json') 130 | -------------------------------------------------------------------------------- /materials/client/pairs.py: -------------------------------------------------------------------------------- 1 | # Get relationships between followers 2 | 3 | import os 4 | import oauth2 as oauth 5 | 6 | from itertools import combinations, islice 7 | from json import load, dump, dumps 8 | from client import tapi, dapi 9 | from time import sleep 10 | import csv 11 | 12 | f = open('../client/data/friends/list.PyTennessee.json') 13 | 14 | data = load(f) 15 | 16 | pytn_friends = [item['screen_name'] for item in data['users']] 17 | 18 | combos = combinations(pytn_friends, 2) 19 | 20 | item = islice(combos, 700) 21 | item1 = islice(combos, 701, 1400) 22 | item2 = islice(combos, 1401, 2100) 23 | item3 = islice(combos, 2101, 2800) 24 | item4 = islice(combos, 2801, 3500) 25 | item5 = islice(combos, 3501, 4200) 26 | item6 = islice(combos, 4201, 4900) 27 | item7 = islice(combos, 4901, 5600) 28 | item8 = islice(combos, 5601, 6300) 29 | item9 = islice(combos, 6301, None) 30 | 31 | itemlist = [item4, item5, item6, item7, item8, item9] 32 | 33 | i = 4 34 | for combo_item in itemlist: 35 | combos_data = {} 36 | 37 | for combo in combo_item: 38 | print 'Combo:', combo 39 | print 'Sleeping...' 40 | sleep(6.5) 41 | url = 'https://api.twitter.com/1.1/friendships/show.json?source_screen_name=%s&target_screen_name=%s' % (combo[0], combo[1]) 42 | 43 | data = tapi.get_response(url) 44 | 45 | combo_str = str(combo[0]) + ' ' + str(combo[1]) 46 | combos_data[combo_str] = data 47 | 48 | i += 1 49 | filename = 'pairs_%d.json' % i 50 | with open(filename, 'w') as fp: 51 | dump(combos_data, fp) 52 | print 'Next file' 53 | -------------------------------------------------------------------------------- /materials/client/retweet_relationships/potential_retweets.txt: -------------------------------------------------------------------------------- 1 | PyTennessee sarah_guido {'weight': 1} 2 | PyTennessee harisibrahimkv {'weight': 1} 3 | PyTennessee eduardo_dx {'weight': 1} 4 | PyTennessee mj_langford {'weight': 2} 5 | PyTennessee ForecastWatch {'weight': 2} 6 | PyTennessee Patjouk {'weight': 1} 7 | PyTennessee UziUx {'weight': 1} 8 | PyTennessee byeliad {'weight': 3} 9 | PyTennessee zyegfryed {'weight': 1} 10 | PyTennessee paulbarden {'weight': 1} 11 | PyTennessee charlesupjohn {'weight': 2} 12 | PyTennessee imbilltucker {'weight': 1} 13 | PyTennessee WuShell {'weight': 1} 14 | PyTennessee davelowe {'weight': 1} 15 | PyTennessee leetrout {'weight': 1} 16 | PyTennessee pynash {'weight': 1} 17 | PyTennessee k_wade_a {'weight': 2} 18 | PyTennessee Greg_Ricker {'weight': 1} 19 | PyTennessee oscartaracena {'weight': 1} 20 | PyTennessee poweredbyaltnet {'weight': 4} 21 | PyTennessee NoSQLDigest {'weight': 1} 22 | PyTennessee waynejwerner {'weight': 1} 23 | PyTennessee pbrumm {'weight': 1} 24 | PyTennessee acedrew {'weight': 1} 25 | PyTennessee bkmontgomery {'weight': 1} 26 | PyTennessee jasonamyers {'weight': 4} 27 | PyTennessee Jeff88Ho {'weight': 2} 28 | PyTennessee _phred {'weight': 1} 29 | PyTennessee StephenPiment {'weight': 1} 30 | PyTennessee _ashfall_ {'weight': 1} 31 | PyTennessee celiala {'weight': 1} 32 | PyTennessee sigmavirus24 {'weight': 2} 33 | PyTennessee egdelwonk {'weight': 2} 34 | PyTennessee WillingCarol {'weight': 1} 35 | PyTennessee pyrsonwho {'weight': 1} 36 | PyTennessee ptynecki {'weight': 1} 37 | PyTennessee cmheisel {'weight': 1} 38 | PyTennessee CalEvans {'weight': 1} 39 | PyTennessee chrisveigt {'weight': 1} 40 | PyTennessee neonige {'weight': 1} 41 | PyTennessee dartdog {'weight': 2} 42 | PyTennessee dmhalejr {'weight': 1} 43 | PyTennessee neo4j {'weight': 1} 44 | PyTennessee djekl {'weight': 1} 45 | PyTennessee PatrickW462 {'weight': 1} 46 | PyTennessee dontusethiscode {'weight': 3} 47 | PyTennessee mwgass {'weight': 1} 48 | PyTennessee underwearninja {'weight': 1} 49 | PyTennessee jacobwegner {'weight': 1} 50 | PyTennessee kieczkowska {'weight': 2} 51 | PyTennessee vongrippen {'weight': 1} 52 | PyTennessee kivyframework {'weight': 1} 53 | PyTennessee mtrier {'weight': 1} 54 | PyTennessee eldarion {'weight': 1} 55 | PyTennessee scottsburns {'weight': 2} 56 | PyTennessee Coopsess {'weight': 1} 57 | PyTennessee dougwt {'weight': 1} 58 | PyTennessee SimonSolutions {'weight': 1} 59 | PyTennessee corbinbs {'weight': 1} 60 | PyTennessee TattdCodeMonkey {'weight': 1} 61 | PyTennessee Kroberrtsonn {'weight': 1} 62 | PyTennessee nevesytrof {'weight': 1} 63 | PyTennessee mindweather {'weight': 1} 64 | PyTennessee gizmomathboy {'weight': 1} 65 | PyTennessee robertlay {'weight': 1} 66 | PyTennessee MarkOnTheBluffs {'weight': 1} 67 | PyTennessee excsc {'weight': 1} 68 | PyTennessee TFConsult {'weight': 1} 69 | PyTennessee spamsch {'weight': 1} 70 | PyTennessee twbennett {'weight': 1} 71 | PyTennessee lotusr00t {'weight': 1} 72 | PyTennessee tskynet {'weight': 1} 73 | PyTennessee electrobarn {'weight': 1} 74 | PyTennessee 901analytics {'weight': 1} 75 | PyTennessee bfaludi {'weight': 1} 76 | PyTennessee IndySecNorth {'weight': 1} 77 | PyTennessee CalebSmithNC {'weight': 1} 78 | PyTennessee lgw4 {'weight': 1} 79 | PyTennessee _bwmaker {'weight': 1} 80 | PyTennessee datagrok {'weight': 1} -------------------------------------------------------------------------------- /materials/client/sample.py: -------------------------------------------------------------------------------- 1 | import client as c 2 | 3 | # CODE SAMPLE 1 4 | # get the followers for @CuteEmergency, save to file 5 | 6 | SCREEN_NAME = 'CuteEmergency' 7 | 8 | params = { 9 | 'screen_name': SCREEN_NAME, 10 | 'cursor': '-1' 11 | } 12 | # make twitter call; save to data folder (specified in config.py) 13 | next_cursor = c.tapi.get_and_save_resource(resource='followers/list', params=params, data_field='users') 14 | 15 | # cursor was not 0, so set cursor and make another call 16 | params['cursor'] = next_cursor 17 | next_cursor = c.tapi.get_and_save_resource(resource='followers/list', params=params, data_field='users') 18 | 19 | # CODE SAMPLE 2 20 | # get first follower for @CuteEmergency, save into x 21 | nth_element = 0 22 | x = c.dapi.get_item(resource='followers/list', screen_name=SCREEN_NAME, index=nth_element, data_field='users') 23 | 24 | # twitter results a lot of data that we don't care about; we have a list of fields to ignore in excluded.txt (set in config) 25 | excluded_fields = c.dapi.get_excluded_fields() 26 | 27 | # view data for first follower 28 | c.dapi.print_item(x, exclude=excluded_fields) 29 | 30 | # view data for next follower 31 | nth_element = 1 32 | x = c.dapi.get_item(resource='followers/list', screen_name=SCREEN_NAME, index=nth_element, data_field='users') 33 | c.dapi.print_item(x, exclude=excluded_fields) 34 | 35 | -------------------------------------------------------------------------------- /materials/client/t.py: -------------------------------------------------------------------------------- 1 | from sys import argv 2 | from client import run 3 | 4 | run.run_action(argv[1:]) -------------------------------------------------------------------------------- /materials/data/statuses/retweets/542776475007471617.graphstoryco.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @graphstoryco: @pytennessee You're more than welcome. Thanks for giving us an opportunity to support the awesome work you're doing!", 6 | "in_reply_to_status_id": null, 7 | "id": 542779309724020736, 8 | "favorite_count": 0, 9 | "source": "TweetDeck", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 2184457256, 17 | "indices": [ 18 | 3, 19 | 16 20 | ], 21 | "id_str": "2184457256", 22 | "screen_name": "graphstoryco", 23 | "name": "Graph Story" 24 | }, 25 | { 26 | "id": 1616492725, 27 | "indices": [ 28 | 18, 29 | 30 30 | ], 31 | "id_str": "1616492725", 32 | "screen_name": "PyTennessee", 33 | "name": "PyTN" 34 | } 35 | ], 36 | "hashtags": [], 37 | "urls": [] 38 | }, 39 | "in_reply_to_screen_name": null, 40 | "id_str": "542779309724020736", 41 | "retweet_count": 1, 42 | "in_reply_to_user_id": null, 43 | "favorited": false, 44 | "retweeted_status": { 45 | "contributors": null, 46 | "truncated": false, 47 | "text": "@pytennessee You're more than welcome. Thanks for giving us an opportunity to support the awesome work you're doing!", 48 | "in_reply_to_status_id": 542774632672411649, 49 | "id": 542776475007471617, 50 | "favorite_count": 1, 51 | "source": "Twitter for Mac", 52 | "retweeted": false, 53 | "coordinates": null, 54 | "entities": { 55 | "symbols": [], 56 | "user_mentions": [ 57 | { 58 | "id": 1616492725, 59 | "indices": [ 60 | 0, 61 | 12 62 | ], 63 | "id_str": "1616492725", 64 | "screen_name": "PyTennessee", 65 | "name": "PyTN" 66 | } 67 | ], 68 | "hashtags": [], 69 | "urls": [] 70 | }, 71 | "in_reply_to_screen_name": "PyTennessee", 72 | "id_str": "542776475007471617", 73 | "retweet_count": 1, 74 | "in_reply_to_user_id": 1616492725, 75 | "favorited": false, 76 | "user": { 77 | "follow_request_sent": false, 78 | "profile_use_background_image": false, 79 | "profile_text_color": "333333", 80 | "default_profile_image": false, 81 | "id": 2184457256, 82 | "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/451844128968437760/dfHzZ90C.png", 83 | "verified": false, 84 | "profile_location": null, 85 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/553200112332054528/eadE8Y7c_normal.png", 86 | "profile_sidebar_fill_color": "DDEEF6", 87 | "entities": { 88 | "url": { 89 | "urls": [ 90 | { 91 | "url": "http://t.co/UUvtcuk5S1", 92 | "indices": [ 93 | 0, 94 | 22 95 | ], 96 | "expanded_url": "http://www.graphstory.com", 97 | "display_url": "graphstory.com" 98 | } 99 | ] 100 | }, 101 | "description": { 102 | "urls": [ 103 | { 104 | "url": "http://t.co/eri0MVqBpi", 105 | "indices": [ 106 | 114, 107 | 136 108 | ], 109 | "expanded_url": "http://graphstory.com/twitter", 110 | "display_url": "graphstory.com/twitter" 111 | } 112 | ] 113 | } 114 | }, 115 | "followers_count": 272, 116 | "profile_sidebar_border_color": "FFFFFF", 117 | "id_str": "2184457256", 118 | "profile_background_color": "FFFFFF", 119 | "listed_count": 16, 120 | "is_translation_enabled": false, 121 | "utc_offset": -21600, 122 | "statuses_count": 185, 123 | "description": "      Want to try a graph database?     \r\n\r\nFree trials at http://t.co/eri0MVqBpi", 124 | "friends_count": 189, 125 | "location": "Memphis, TN", 126 | "profile_link_color": "0084B4", 127 | "profile_image_url": "http://pbs.twimg.com/profile_images/553200112332054528/eadE8Y7c_normal.png", 128 | "following": false, 129 | "geo_enabled": false, 130 | "profile_banner_url": "https://pbs.twimg.com/profile_banners/2184457256/1400960269", 131 | "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/451844128968437760/dfHzZ90C.png", 132 | "name": "Graph Story", 133 | "lang": "en", 134 | "profile_background_tile": false, 135 | "favourites_count": 423, 136 | "screen_name": "graphstoryco", 137 | "notifications": false, 138 | "url": "http://t.co/UUvtcuk5S1", 139 | "created_at": "Sat Nov 09 14:42:04 +0000 2013", 140 | "contributors_enabled": false, 141 | "time_zone": "Central Time (US & Canada)", 142 | "protected": false, 143 | "default_profile": false, 144 | "is_translator": false 145 | }, 146 | "geo": null, 147 | "in_reply_to_user_id_str": "1616492725", 148 | "lang": "en", 149 | "created_at": "Wed Dec 10 20:22:50 +0000 2014", 150 | "in_reply_to_status_id_str": "542774632672411649", 151 | "place": null 152 | }, 153 | "user": { 154 | "follow_request_sent": false, 155 | "profile_use_background_image": false, 156 | "profile_text_color": "333333", 157 | "default_profile_image": false, 158 | "id": 1616492725, 159 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 160 | "verified": false, 161 | "profile_location": null, 162 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 163 | "profile_sidebar_fill_color": "DDEEF6", 164 | "entities": { 165 | "url": { 166 | "urls": [ 167 | { 168 | "url": "http://t.co/NbO1HIEfBu", 169 | "indices": [ 170 | 0, 171 | 22 172 | ], 173 | "expanded_url": "http://www.pytennessee.org", 174 | "display_url": "pytennessee.org" 175 | } 176 | ] 177 | }, 178 | "description": { 179 | "urls": [] 180 | } 181 | }, 182 | "followers_count": 624, 183 | "profile_sidebar_border_color": "FFFFFF", 184 | "id_str": "1616492725", 185 | "profile_background_color": "F5F6F6", 186 | "listed_count": 39, 187 | "is_translation_enabled": false, 188 | "utc_offset": null, 189 | "statuses_count": 1741, 190 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 191 | "friends_count": 116, 192 | "location": "Nashville, TN", 193 | "profile_link_color": "2FC2EF", 194 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 195 | "following": false, 196 | "geo_enabled": false, 197 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 198 | "name": "PyTN", 199 | "lang": "en", 200 | "profile_background_tile": false, 201 | "favourites_count": 503, 202 | "screen_name": "PyTennessee", 203 | "notifications": false, 204 | "url": "http://t.co/NbO1HIEfBu", 205 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 206 | "contributors_enabled": false, 207 | "time_zone": null, 208 | "protected": false, 209 | "default_profile": false, 210 | "is_translator": false 211 | }, 212 | "geo": null, 213 | "in_reply_to_user_id_str": null, 214 | "lang": "en", 215 | "created_at": "Wed Dec 10 20:34:06 +0000 2014", 216 | "in_reply_to_status_id_str": null, 217 | "place": null 218 | } 219 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/542785335290515456.PyTennessee.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @PyTennessee: Less than 110 tickets left! http://t.co/agTBHVXg8l #python #pytn2015", 6 | "in_reply_to_status_id": null, 7 | "id": 542785536612524033, 8 | "favorite_count": 0, 9 | "source": "Twitter Web Client", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 1616492725, 17 | "indices": [ 18 | 3, 19 | 15 20 | ], 21 | "id_str": "1616492725", 22 | "screen_name": "PyTennessee", 23 | "name": "PyTN" 24 | } 25 | ], 26 | "hashtags": [ 27 | { 28 | "indices": [ 29 | 68, 30 | 75 31 | ], 32 | "text": "python" 33 | }, 34 | { 35 | "indices": [ 36 | 76, 37 | 85 38 | ], 39 | "text": "pytn2015" 40 | } 41 | ], 42 | "urls": [ 43 | { 44 | "url": "http://t.co/agTBHVXg8l", 45 | "indices": [ 46 | 45, 47 | 67 48 | ], 49 | "expanded_url": "http://buff.ly/1qnFYQb", 50 | "display_url": "buff.ly/1qnFYQb" 51 | } 52 | ] 53 | }, 54 | "in_reply_to_screen_name": null, 55 | "id_str": "542785536612524033", 56 | "retweet_count": 1, 57 | "in_reply_to_user_id": null, 58 | "favorited": false, 59 | "retweeted_status": { 60 | "contributors": null, 61 | "truncated": false, 62 | "text": "Less than 110 tickets left! http://t.co/agTBHVXg8l #python #pytn2015", 63 | "in_reply_to_status_id": null, 64 | "id": 542785335290515456, 65 | "favorite_count": 0, 66 | "source": "Buffer", 67 | "retweeted": false, 68 | "coordinates": null, 69 | "entities": { 70 | "symbols": [], 71 | "user_mentions": [], 72 | "hashtags": [ 73 | { 74 | "indices": [ 75 | 51, 76 | 58 77 | ], 78 | "text": "python" 79 | }, 80 | { 81 | "indices": [ 82 | 59, 83 | 68 84 | ], 85 | "text": "pytn2015" 86 | } 87 | ], 88 | "urls": [ 89 | { 90 | "url": "http://t.co/agTBHVXg8l", 91 | "indices": [ 92 | 28, 93 | 50 94 | ], 95 | "expanded_url": "http://buff.ly/1qnFYQb", 96 | "display_url": "buff.ly/1qnFYQb" 97 | } 98 | ] 99 | }, 100 | "in_reply_to_screen_name": null, 101 | "id_str": "542785335290515456", 102 | "retweet_count": 1, 103 | "in_reply_to_user_id": null, 104 | "favorited": false, 105 | "user": { 106 | "follow_request_sent": false, 107 | "profile_use_background_image": false, 108 | "profile_text_color": "333333", 109 | "default_profile_image": false, 110 | "id": 1616492725, 111 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 112 | "verified": false, 113 | "profile_location": null, 114 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 115 | "profile_sidebar_fill_color": "DDEEF6", 116 | "entities": { 117 | "url": { 118 | "urls": [ 119 | { 120 | "url": "http://t.co/NbO1HIEfBu", 121 | "indices": [ 122 | 0, 123 | 22 124 | ], 125 | "expanded_url": "http://www.pytennessee.org", 126 | "display_url": "pytennessee.org" 127 | } 128 | ] 129 | }, 130 | "description": { 131 | "urls": [] 132 | } 133 | }, 134 | "followers_count": 624, 135 | "profile_sidebar_border_color": "FFFFFF", 136 | "id_str": "1616492725", 137 | "profile_background_color": "F5F6F6", 138 | "listed_count": 39, 139 | "is_translation_enabled": false, 140 | "utc_offset": null, 141 | "statuses_count": 1741, 142 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 143 | "friends_count": 116, 144 | "location": "Nashville, TN", 145 | "profile_link_color": "2FC2EF", 146 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 147 | "following": false, 148 | "geo_enabled": false, 149 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 150 | "name": "PyTN", 151 | "lang": "en", 152 | "profile_background_tile": false, 153 | "favourites_count": 503, 154 | "screen_name": "PyTennessee", 155 | "notifications": false, 156 | "url": "http://t.co/NbO1HIEfBu", 157 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 158 | "contributors_enabled": false, 159 | "time_zone": null, 160 | "protected": false, 161 | "default_profile": false, 162 | "is_translator": false 163 | }, 164 | "geo": null, 165 | "in_reply_to_user_id_str": null, 166 | "possibly_sensitive": false, 167 | "lang": "en", 168 | "created_at": "Wed Dec 10 20:58:03 +0000 2014", 169 | "in_reply_to_status_id_str": null, 170 | "place": null 171 | }, 172 | "user": { 173 | "follow_request_sent": false, 174 | "profile_use_background_image": false, 175 | "profile_text_color": "000000", 176 | "default_profile_image": false, 177 | "id": 274782693, 178 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", 179 | "verified": false, 180 | "profile_location": null, 181 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/535421339301994496/JLXQsk2A_normal.jpeg", 182 | "profile_sidebar_fill_color": "000000", 183 | "entities": { 184 | "description": { 185 | "urls": [] 186 | } 187 | }, 188 | "followers_count": 53, 189 | "profile_sidebar_border_color": "000000", 190 | "id_str": "274782693", 191 | "profile_background_color": "000000", 192 | "listed_count": 7, 193 | "is_translation_enabled": false, 194 | "utc_offset": null, 195 | "statuses_count": 303, 196 | "description": "Father, husband, dev-ops wanna-be, running legacy code from the late 70's and has yet to require a full system reboot. Uptime: 12821 Days 6 Hours, 3 min", 197 | "friends_count": 230, 198 | "location": "Somewhere in Extended memory", 199 | "profile_link_color": "4A913C", 200 | "profile_image_url": "http://pbs.twimg.com/profile_images/535421339301994496/JLXQsk2A_normal.jpeg", 201 | "following": false, 202 | "geo_enabled": true, 203 | "profile_banner_url": "https://pbs.twimg.com/profile_banners/274782693/1417560265", 204 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", 205 | "name": "Harold Smith", 206 | "lang": "en", 207 | "profile_background_tile": false, 208 | "favourites_count": 21, 209 | "screen_name": "Zanderfain", 210 | "notifications": false, 211 | "url": null, 212 | "created_at": "Thu Mar 31 01:07:22 +0000 2011", 213 | "contributors_enabled": false, 214 | "time_zone": null, 215 | "protected": false, 216 | "default_profile": false, 217 | "is_translator": false 218 | }, 219 | "geo": null, 220 | "in_reply_to_user_id_str": null, 221 | "possibly_sensitive": false, 222 | "lang": "en", 223 | "created_at": "Wed Dec 10 20:58:51 +0000 2014", 224 | "in_reply_to_status_id_str": null, 225 | "place": null 226 | } 227 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/543495949998645248.PyTennessee.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @PyTennessee: Only 100 tickets left! #Whoa", 6 | "in_reply_to_status_id": null, 7 | "id": 543496044366299136, 8 | "favorite_count": 0, 9 | "source": "Twitter Web Client", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 1616492725, 17 | "indices": [ 18 | 3, 19 | 15 20 | ], 21 | "id_str": "1616492725", 22 | "screen_name": "PyTennessee", 23 | "name": "PyTN" 24 | } 25 | ], 26 | "hashtags": [ 27 | { 28 | "indices": [ 29 | 40, 30 | 45 31 | ], 32 | "text": "Whoa" 33 | } 34 | ], 35 | "urls": [] 36 | }, 37 | "in_reply_to_screen_name": null, 38 | "id_str": "543496044366299136", 39 | "retweet_count": 1, 40 | "in_reply_to_user_id": null, 41 | "favorited": false, 42 | "retweeted_status": { 43 | "contributors": null, 44 | "truncated": false, 45 | "text": "Only 100 tickets left! #Whoa", 46 | "in_reply_to_status_id": null, 47 | "id": 543495949998645248, 48 | "favorite_count": 1, 49 | "source": "TweetDeck", 50 | "retweeted": false, 51 | "coordinates": null, 52 | "entities": { 53 | "symbols": [], 54 | "user_mentions": [], 55 | "hashtags": [ 56 | { 57 | "indices": [ 58 | 23, 59 | 28 60 | ], 61 | "text": "Whoa" 62 | } 63 | ], 64 | "urls": [] 65 | }, 66 | "in_reply_to_screen_name": null, 67 | "id_str": "543495949998645248", 68 | "retweet_count": 1, 69 | "in_reply_to_user_id": null, 70 | "favorited": false, 71 | "user": { 72 | "follow_request_sent": false, 73 | "profile_use_background_image": false, 74 | "profile_text_color": "333333", 75 | "default_profile_image": false, 76 | "id": 1616492725, 77 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 78 | "verified": false, 79 | "profile_location": null, 80 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 81 | "profile_sidebar_fill_color": "DDEEF6", 82 | "entities": { 83 | "url": { 84 | "urls": [ 85 | { 86 | "url": "http://t.co/NbO1HIEfBu", 87 | "indices": [ 88 | 0, 89 | 22 90 | ], 91 | "expanded_url": "http://www.pytennessee.org", 92 | "display_url": "pytennessee.org" 93 | } 94 | ] 95 | }, 96 | "description": { 97 | "urls": [] 98 | } 99 | }, 100 | "followers_count": 624, 101 | "profile_sidebar_border_color": "FFFFFF", 102 | "id_str": "1616492725", 103 | "profile_background_color": "F5F6F6", 104 | "listed_count": 39, 105 | "is_translation_enabled": false, 106 | "utc_offset": null, 107 | "statuses_count": 1741, 108 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 109 | "friends_count": 116, 110 | "location": "Nashville, TN", 111 | "profile_link_color": "2FC2EF", 112 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 113 | "following": false, 114 | "geo_enabled": false, 115 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 116 | "name": "PyTN", 117 | "lang": "en", 118 | "profile_background_tile": false, 119 | "favourites_count": 503, 120 | "screen_name": "PyTennessee", 121 | "notifications": false, 122 | "url": "http://t.co/NbO1HIEfBu", 123 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 124 | "contributors_enabled": false, 125 | "time_zone": null, 126 | "protected": false, 127 | "default_profile": false, 128 | "is_translator": false 129 | }, 130 | "geo": null, 131 | "in_reply_to_user_id_str": null, 132 | "lang": "en", 133 | "created_at": "Fri Dec 12 20:01:46 +0000 2014", 134 | "in_reply_to_status_id_str": null, 135 | "place": null 136 | }, 137 | "user": { 138 | "follow_request_sent": false, 139 | "profile_use_background_image": true, 140 | "profile_text_color": "333333", 141 | "default_profile_image": false, 142 | "id": 17213939, 143 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", 144 | "verified": false, 145 | "profile_location": null, 146 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/558647162817347586/XIszwA1a_normal.jpeg", 147 | "profile_sidebar_fill_color": "DDEEF6", 148 | "entities": { 149 | "url": { 150 | "urls": [ 151 | { 152 | "url": "http://t.co/IdipgXcfeg", 153 | "indices": [ 154 | 0, 155 | 22 156 | ], 157 | "expanded_url": "http://codingwithkniv.es", 158 | "display_url": "codingwithkniv.es" 159 | } 160 | ] 161 | }, 162 | "description": { 163 | "urls": [ 164 | { 165 | "url": "http://t.co/0uPbdjwUzB", 166 | "indices": [ 167 | 46, 168 | 68 169 | ], 170 | "expanded_url": "http://codingwithkniv.es", 171 | "display_url": "codingwithkniv.es" 172 | }, 173 | { 174 | "url": "http://t.co/Jk9kP7zPSq", 175 | "indices": [ 176 | 116, 177 | 138 178 | ], 179 | "expanded_url": "http://AtlantaVeganGuide.com", 180 | "display_url": "AtlantaVeganGuide.com" 181 | } 182 | ] 183 | } 184 | }, 185 | "followers_count": 570, 186 | "profile_sidebar_border_color": "C0DEED", 187 | "id_str": "17213939", 188 | "profile_background_color": "C0DEED", 189 | "listed_count": 42, 190 | "is_translation_enabled": false, 191 | "utc_offset": -18000, 192 | "statuses_count": 12277, 193 | "description": "cooking, coding, cats... and knives. blogs at http://t.co/0uPbdjwUzB. author of Atlanta's restaurant/resource guide http://t.co/Jk9kP7zPSq", 194 | "friends_count": 440, 195 | "location": "Atlanta GA", 196 | "profile_link_color": "0084B4", 197 | "profile_image_url": "http://pbs.twimg.com/profile_images/558647162817347586/XIszwA1a_normal.jpeg", 198 | "following": false, 199 | "geo_enabled": true, 200 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", 201 | "name": "adriennefriend", 202 | "lang": "en", 203 | "profile_background_tile": false, 204 | "favourites_count": 1338, 205 | "screen_name": "adriennefriend", 206 | "notifications": false, 207 | "url": "http://t.co/IdipgXcfeg", 208 | "created_at": "Thu Nov 06 16:30:15 +0000 2008", 209 | "contributors_enabled": false, 210 | "time_zone": "Quito", 211 | "protected": false, 212 | "default_profile": true, 213 | "is_translator": false 214 | }, 215 | "geo": null, 216 | "in_reply_to_user_id_str": null, 217 | "lang": "en", 218 | "created_at": "Fri Dec 12 20:02:09 +0000 2014", 219 | "in_reply_to_status_id_str": null, 220 | "place": null 221 | } 222 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/543797379455913984.WillingCarol.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @WillingCarol: Looking forward to attending @PyTennessee. Very strong lineup of speakers and keynotes. Sprints and Young Coders :-)", 6 | "in_reply_to_status_id": null, 7 | "id": 543805109273391104, 8 | "favorite_count": 0, 9 | "source": "Twitter for Android", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 1167122150, 17 | "indices": [ 18 | 3, 19 | 16 20 | ], 21 | "id_str": "1167122150", 22 | "screen_name": "WillingCarol", 23 | "name": "Carol Willing" 24 | }, 25 | { 26 | "id": 1616492725, 27 | "indices": [ 28 | 47, 29 | 59 30 | ], 31 | "id_str": "1616492725", 32 | "screen_name": "PyTennessee", 33 | "name": "PyTN" 34 | } 35 | ], 36 | "hashtags": [], 37 | "urls": [] 38 | }, 39 | "in_reply_to_screen_name": null, 40 | "id_str": "543805109273391104", 41 | "retweet_count": 1, 42 | "in_reply_to_user_id": null, 43 | "favorited": false, 44 | "retweeted_status": { 45 | "contributors": null, 46 | "truncated": false, 47 | "text": "Looking forward to attending @PyTennessee. Very strong lineup of speakers and keynotes. Sprints and Young Coders :-)", 48 | "in_reply_to_status_id": null, 49 | "id": 543797379455913984, 50 | "favorite_count": 4, 51 | "source": "Twitter Web Client", 52 | "retweeted": false, 53 | "coordinates": null, 54 | "entities": { 55 | "symbols": [], 56 | "user_mentions": [ 57 | { 58 | "id": 1616492725, 59 | "indices": [ 60 | 29, 61 | 41 62 | ], 63 | "id_str": "1616492725", 64 | "screen_name": "PyTennessee", 65 | "name": "PyTN" 66 | } 67 | ], 68 | "hashtags": [], 69 | "urls": [] 70 | }, 71 | "in_reply_to_screen_name": null, 72 | "id_str": "543797379455913984", 73 | "retweet_count": 1, 74 | "in_reply_to_user_id": null, 75 | "favorited": false, 76 | "user": { 77 | "follow_request_sent": false, 78 | "profile_use_background_image": true, 79 | "profile_text_color": "663B12", 80 | "default_profile_image": false, 81 | "id": 1167122150, 82 | "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/469987670198722560/n7wY9UQC.jpeg", 83 | "verified": false, 84 | "profile_location": null, 85 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/3505309243/ac95abef52375b120e6efe195ebe109b_normal.jpeg", 86 | "profile_sidebar_fill_color": "DAECF4", 87 | "entities": { 88 | "url": { 89 | "urls": [ 90 | { 91 | "url": "http://t.co/MfSMps9A6P", 92 | "indices": [ 93 | 0, 94 | 22 95 | ], 96 | "expanded_url": "http://willingconsulting.com", 97 | "display_url": "willingconsulting.com" 98 | } 99 | ] 100 | }, 101 | "description": { 102 | "urls": [ 103 | { 104 | "url": "http://t.co/SLT2NYWh24", 105 | "indices": [ 106 | 116, 107 | 138 108 | ], 109 | "expanded_url": "http://gentlecodegarden.com", 110 | "display_url": "gentlecodegarden.com" 111 | } 112 | ] 113 | } 114 | }, 115 | "followers_count": 787, 116 | "profile_sidebar_border_color": "FFFFFF", 117 | "id_str": "1167122150", 118 | "profile_background_color": "EDECE9", 119 | "listed_count": 47, 120 | "is_translation_enabled": false, 121 | "utc_offset": -28800, 122 | "statuses_count": 2163, 123 | "description": "Learn. Build. Share. Open Source software and hardware developer. FabLab San Diego Geek. Gentle tech learning at http://t.co/SLT2NYWh24", 124 | "friends_count": 1940, 125 | "location": "San Diego", 126 | "profile_link_color": "088253", 127 | "profile_image_url": "http://pbs.twimg.com/profile_images/3505309243/ac95abef52375b120e6efe195ebe109b_normal.jpeg", 128 | "following": false, 129 | "geo_enabled": false, 130 | "profile_banner_url": "https://pbs.twimg.com/profile_banners/1167122150/1365661184", 131 | "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/469987670198722560/n7wY9UQC.jpeg", 132 | "name": "Carol Willing", 133 | "lang": "en", 134 | "profile_background_tile": true, 135 | "favourites_count": 3870, 136 | "screen_name": "WillingCarol", 137 | "notifications": false, 138 | "url": "http://t.co/MfSMps9A6P", 139 | "created_at": "Sun Feb 10 21:44:44 +0000 2013", 140 | "contributors_enabled": false, 141 | "time_zone": "Pacific Time (US & Canada)", 142 | "protected": false, 143 | "default_profile": false, 144 | "is_translator": false 145 | }, 146 | "geo": null, 147 | "in_reply_to_user_id_str": null, 148 | "lang": "en", 149 | "created_at": "Sat Dec 13 15:59:33 +0000 2014", 150 | "in_reply_to_status_id_str": null, 151 | "place": null 152 | }, 153 | "user": { 154 | "follow_request_sent": false, 155 | "profile_use_background_image": false, 156 | "profile_text_color": "333333", 157 | "default_profile_image": false, 158 | "id": 1616492725, 159 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 160 | "verified": false, 161 | "profile_location": null, 162 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 163 | "profile_sidebar_fill_color": "DDEEF6", 164 | "entities": { 165 | "url": { 166 | "urls": [ 167 | { 168 | "url": "http://t.co/NbO1HIEfBu", 169 | "indices": [ 170 | 0, 171 | 22 172 | ], 173 | "expanded_url": "http://www.pytennessee.org", 174 | "display_url": "pytennessee.org" 175 | } 176 | ] 177 | }, 178 | "description": { 179 | "urls": [] 180 | } 181 | }, 182 | "followers_count": 624, 183 | "profile_sidebar_border_color": "FFFFFF", 184 | "id_str": "1616492725", 185 | "profile_background_color": "F5F6F6", 186 | "listed_count": 39, 187 | "is_translation_enabled": false, 188 | "utc_offset": null, 189 | "statuses_count": 1741, 190 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 191 | "friends_count": 116, 192 | "location": "Nashville, TN", 193 | "profile_link_color": "2FC2EF", 194 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 195 | "following": false, 196 | "geo_enabled": false, 197 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 198 | "name": "PyTN", 199 | "lang": "en", 200 | "profile_background_tile": false, 201 | "favourites_count": 503, 202 | "screen_name": "PyTennessee", 203 | "notifications": false, 204 | "url": "http://t.co/NbO1HIEfBu", 205 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 206 | "contributors_enabled": false, 207 | "time_zone": null, 208 | "protected": false, 209 | "default_profile": false, 210 | "is_translator": false 211 | }, 212 | "geo": null, 213 | "in_reply_to_user_id_str": null, 214 | "lang": "en", 215 | "created_at": "Sat Dec 13 16:30:16 +0000 2014", 216 | "in_reply_to_status_id_str": null, 217 | "place": null 218 | } 219 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/544522908052504579.LampPostGroup.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @LampPostGroup: @PyTennessee we're stoked!", 6 | "in_reply_to_status_id": null, 7 | "id": 544523008376053760, 8 | "favorite_count": 0, 9 | "source": "TweetDeck", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 296227599, 17 | "indices": [ 18 | 3, 19 | 17 20 | ], 21 | "id_str": "296227599", 22 | "screen_name": "LampPostGroup", 23 | "name": "Lamp Post Group" 24 | }, 25 | { 26 | "id": 1616492725, 27 | "indices": [ 28 | 19, 29 | 31 30 | ], 31 | "id_str": "1616492725", 32 | "screen_name": "PyTennessee", 33 | "name": "PyTN" 34 | } 35 | ], 36 | "hashtags": [], 37 | "urls": [] 38 | }, 39 | "in_reply_to_screen_name": null, 40 | "id_str": "544523008376053760", 41 | "retweet_count": 1, 42 | "in_reply_to_user_id": null, 43 | "favorited": false, 44 | "retweeted_status": { 45 | "contributors": null, 46 | "truncated": false, 47 | "text": "@PyTennessee we're stoked!", 48 | "in_reply_to_status_id": 544518559729479680, 49 | "id": 544522908052504579, 50 | "favorite_count": 1, 51 | "source": "Twitter for iPhone", 52 | "retweeted": false, 53 | "coordinates": null, 54 | "entities": { 55 | "symbols": [], 56 | "user_mentions": [ 57 | { 58 | "id": 1616492725, 59 | "indices": [ 60 | 0, 61 | 12 62 | ], 63 | "id_str": "1616492725", 64 | "screen_name": "PyTennessee", 65 | "name": "PyTN" 66 | } 67 | ], 68 | "hashtags": [], 69 | "urls": [] 70 | }, 71 | "in_reply_to_screen_name": "PyTennessee", 72 | "id_str": "544522908052504579", 73 | "retweet_count": 1, 74 | "in_reply_to_user_id": 1616492725, 75 | "favorited": false, 76 | "user": { 77 | "follow_request_sent": false, 78 | "profile_use_background_image": true, 79 | "profile_text_color": "333333", 80 | "default_profile_image": false, 81 | "id": 296227599, 82 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", 83 | "verified": false, 84 | "profile_location": null, 85 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/559794944446300161/fTseZjyJ_normal.jpeg", 86 | "profile_sidebar_fill_color": "DDEEF6", 87 | "entities": { 88 | "url": { 89 | "urls": [ 90 | { 91 | "url": "http://t.co/PRndbFLtxi", 92 | "indices": [ 93 | 0, 94 | 22 95 | ], 96 | "expanded_url": "http://lamppostgroup.com", 97 | "display_url": "lamppostgroup.com" 98 | } 99 | ] 100 | }, 101 | "description": { 102 | "urls": [] 103 | } 104 | }, 105 | "followers_count": 3128, 106 | "profile_sidebar_border_color": "C0DEED", 107 | "id_str": "296227599", 108 | "profile_background_color": "C0DEED", 109 | "listed_count": 79, 110 | "is_translation_enabled": false, 111 | "utc_offset": -18000, 112 | "statuses_count": 2247, 113 | "description": "Venture incubator in Southeast TN", 114 | "friends_count": 520, 115 | "location": "Chattanooga, TN", 116 | "profile_link_color": "0084B4", 117 | "profile_image_url": "http://pbs.twimg.com/profile_images/559794944446300161/fTseZjyJ_normal.jpeg", 118 | "following": false, 119 | "geo_enabled": true, 120 | "profile_banner_url": "https://pbs.twimg.com/profile_banners/296227599/1414697733", 121 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", 122 | "name": "Lamp Post Group", 123 | "lang": "en", 124 | "profile_background_tile": false, 125 | "favourites_count": 478, 126 | "screen_name": "LampPostGroup", 127 | "notifications": false, 128 | "url": "http://t.co/PRndbFLtxi", 129 | "created_at": "Tue May 10 12:12:12 +0000 2011", 130 | "contributors_enabled": false, 131 | "time_zone": "Eastern Time (US & Canada)", 132 | "protected": false, 133 | "default_profile": true, 134 | "is_translator": false 135 | }, 136 | "geo": null, 137 | "in_reply_to_user_id_str": "1616492725", 138 | "lang": "en", 139 | "created_at": "Mon Dec 15 16:02:32 +0000 2014", 140 | "in_reply_to_status_id_str": "544518559729479680", 141 | "place": null 142 | }, 143 | "user": { 144 | "follow_request_sent": false, 145 | "profile_use_background_image": false, 146 | "profile_text_color": "333333", 147 | "default_profile_image": false, 148 | "id": 1616492725, 149 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 150 | "verified": false, 151 | "profile_location": null, 152 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 153 | "profile_sidebar_fill_color": "DDEEF6", 154 | "entities": { 155 | "url": { 156 | "urls": [ 157 | { 158 | "url": "http://t.co/NbO1HIEfBu", 159 | "indices": [ 160 | 0, 161 | 22 162 | ], 163 | "expanded_url": "http://www.pytennessee.org", 164 | "display_url": "pytennessee.org" 165 | } 166 | ] 167 | }, 168 | "description": { 169 | "urls": [] 170 | } 171 | }, 172 | "followers_count": 624, 173 | "profile_sidebar_border_color": "FFFFFF", 174 | "id_str": "1616492725", 175 | "profile_background_color": "F5F6F6", 176 | "listed_count": 39, 177 | "is_translation_enabled": false, 178 | "utc_offset": null, 179 | "statuses_count": 1741, 180 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 181 | "friends_count": 116, 182 | "location": "Nashville, TN", 183 | "profile_link_color": "2FC2EF", 184 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 185 | "following": false, 186 | "geo_enabled": false, 187 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 188 | "name": "PyTN", 189 | "lang": "en", 190 | "profile_background_tile": false, 191 | "favourites_count": 503, 192 | "screen_name": "PyTennessee", 193 | "notifications": false, 194 | "url": "http://t.co/NbO1HIEfBu", 195 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 196 | "contributors_enabled": false, 197 | "time_zone": null, 198 | "protected": false, 199 | "default_profile": false, 200 | "is_translator": false 201 | }, 202 | "geo": null, 203 | "in_reply_to_user_id_str": null, 204 | "lang": "en", 205 | "created_at": "Mon Dec 15 16:02:56 +0000 2014", 206 | "in_reply_to_status_id_str": null, 207 | "place": null 208 | } 209 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/544575934011953152.AmyFlatt1.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @AmyFlatt1: @PyTennessee We are looking forward to PyTenn!", 6 | "in_reply_to_status_id": null, 7 | "id": 544578216263180288, 8 | "favorite_count": 0, 9 | "source": "TweetDeck", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 1480537237, 17 | "indices": [ 18 | 3, 19 | 13 20 | ], 21 | "id_str": "1480537237", 22 | "screen_name": "AmyFlatt1", 23 | "name": "Amy Flatt" 24 | }, 25 | { 26 | "id": 1616492725, 27 | "indices": [ 28 | 15, 29 | 27 30 | ], 31 | "id_str": "1616492725", 32 | "screen_name": "PyTennessee", 33 | "name": "PyTN" 34 | } 35 | ], 36 | "hashtags": [], 37 | "urls": [] 38 | }, 39 | "in_reply_to_screen_name": null, 40 | "id_str": "544578216263180288", 41 | "retweet_count": 1, 42 | "in_reply_to_user_id": null, 43 | "favorited": false, 44 | "retweeted_status": { 45 | "contributors": null, 46 | "truncated": false, 47 | "text": "@PyTennessee We are looking forward to PyTenn!", 48 | "in_reply_to_status_id": null, 49 | "id": 544575934011953152, 50 | "favorite_count": 0, 51 | "source": "Twitter for Websites", 52 | "retweeted": false, 53 | "coordinates": null, 54 | "entities": { 55 | "symbols": [], 56 | "user_mentions": [ 57 | { 58 | "id": 1616492725, 59 | "indices": [ 60 | 0, 61 | 12 62 | ], 63 | "id_str": "1616492725", 64 | "screen_name": "PyTennessee", 65 | "name": "PyTN" 66 | } 67 | ], 68 | "hashtags": [], 69 | "urls": [] 70 | }, 71 | "in_reply_to_screen_name": "PyTennessee", 72 | "id_str": "544575934011953152", 73 | "retweet_count": 1, 74 | "in_reply_to_user_id": 1616492725, 75 | "favorited": false, 76 | "user": { 77 | "follow_request_sent": false, 78 | "profile_use_background_image": false, 79 | "profile_text_color": "000000", 80 | "default_profile_image": false, 81 | "id": 1480537237, 82 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", 83 | "verified": false, 84 | "profile_location": null, 85 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/3751589847/c9ceb0fef5e869f7538c9b0740ccebbf_normal.jpeg", 86 | "profile_sidebar_fill_color": "000000", 87 | "entities": { 88 | "url": { 89 | "urls": [ 90 | { 91 | "url": "http://t.co/reX3BCpfbm", 92 | "indices": [ 93 | 0, 94 | 22 95 | ], 96 | "expanded_url": "http://TeachersandCompany.Blogspot.com", 97 | "display_url": "TeachersandCompany.Blogspot.com" 98 | } 99 | ] 100 | }, 101 | "description": { 102 | "urls": [] 103 | } 104 | }, 105 | "followers_count": 452, 106 | "profile_sidebar_border_color": "000000", 107 | "id_str": "1480537237", 108 | "profile_background_color": "000000", 109 | "listed_count": 18, 110 | "is_translation_enabled": false, 111 | "utc_offset": -21600, 112 | "statuses_count": 4272, 113 | "description": "Teacher and voluntary blog contributer", 114 | "friends_count": 423, 115 | "location": "Middle Tennessee", 116 | "profile_link_color": "3B94D9", 117 | "profile_image_url": "http://pbs.twimg.com/profile_images/3751589847/c9ceb0fef5e869f7538c9b0740ccebbf_normal.jpeg", 118 | "following": false, 119 | "geo_enabled": false, 120 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", 121 | "name": "Amy Flatt", 122 | "lang": "en", 123 | "profile_background_tile": false, 124 | "favourites_count": 1395, 125 | "screen_name": "AmyFlatt1", 126 | "notifications": false, 127 | "url": "http://t.co/reX3BCpfbm", 128 | "created_at": "Mon Jun 03 19:52:41 +0000 2013", 129 | "contributors_enabled": false, 130 | "time_zone": "Central Time (US & Canada)", 131 | "protected": false, 132 | "default_profile": false, 133 | "is_translator": false 134 | }, 135 | "geo": null, 136 | "in_reply_to_user_id_str": "1616492725", 137 | "lang": "en", 138 | "created_at": "Mon Dec 15 19:33:15 +0000 2014", 139 | "in_reply_to_status_id_str": null, 140 | "place": null 141 | }, 142 | "user": { 143 | "follow_request_sent": false, 144 | "profile_use_background_image": false, 145 | "profile_text_color": "333333", 146 | "default_profile_image": false, 147 | "id": 1616492725, 148 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 149 | "verified": false, 150 | "profile_location": null, 151 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 152 | "profile_sidebar_fill_color": "DDEEF6", 153 | "entities": { 154 | "url": { 155 | "urls": [ 156 | { 157 | "url": "http://t.co/NbO1HIEfBu", 158 | "indices": [ 159 | 0, 160 | 22 161 | ], 162 | "expanded_url": "http://www.pytennessee.org", 163 | "display_url": "pytennessee.org" 164 | } 165 | ] 166 | }, 167 | "description": { 168 | "urls": [] 169 | } 170 | }, 171 | "followers_count": 624, 172 | "profile_sidebar_border_color": "FFFFFF", 173 | "id_str": "1616492725", 174 | "profile_background_color": "F5F6F6", 175 | "listed_count": 39, 176 | "is_translation_enabled": false, 177 | "utc_offset": null, 178 | "statuses_count": 1741, 179 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 180 | "friends_count": 116, 181 | "location": "Nashville, TN", 182 | "profile_link_color": "2FC2EF", 183 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 184 | "following": false, 185 | "geo_enabled": false, 186 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 187 | "name": "PyTN", 188 | "lang": "en", 189 | "profile_background_tile": false, 190 | "favourites_count": 503, 191 | "screen_name": "PyTennessee", 192 | "notifications": false, 193 | "url": "http://t.co/NbO1HIEfBu", 194 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 195 | "contributors_enabled": false, 196 | "time_zone": null, 197 | "protected": false, 198 | "default_profile": false, 199 | "is_translator": false 200 | }, 201 | "geo": null, 202 | "in_reply_to_user_id_str": null, 203 | "lang": "en", 204 | "created_at": "Mon Dec 15 19:42:19 +0000 2014", 205 | "in_reply_to_status_id_str": null, 206 | "place": null 207 | } 208 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/544857732055326720.elliewix.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @elliewix: I just registered for @PyTennessee! While I loved @pycon 2014, I'm looking forward to a smaller regional audience.", 6 | "in_reply_to_status_id": null, 7 | "id": 544864312763117568, 8 | "favorite_count": 0, 9 | "source": "TweetDeck", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 33540571, 17 | "indices": [ 18 | 3, 19 | 12 20 | ], 21 | "id_str": "33540571", 22 | "screen_name": "elliewix", 23 | "name": "Elizabeth Wickes" 24 | }, 25 | { 26 | "id": 1616492725, 27 | "indices": [ 28 | 36, 29 | 48 30 | ], 31 | "id_str": "1616492725", 32 | "screen_name": "PyTennessee", 33 | "name": "PyTN" 34 | }, 35 | { 36 | "id": 9475182, 37 | "indices": [ 38 | 65, 39 | 71 40 | ], 41 | "id_str": "9475182", 42 | "screen_name": "pycon", 43 | "name": "PyCon" 44 | } 45 | ], 46 | "hashtags": [], 47 | "urls": [] 48 | }, 49 | "in_reply_to_screen_name": null, 50 | "id_str": "544864312763117568", 51 | "retweet_count": 1, 52 | "in_reply_to_user_id": null, 53 | "favorited": false, 54 | "retweeted_status": { 55 | "contributors": null, 56 | "truncated": false, 57 | "text": "I just registered for @PyTennessee! While I loved @pycon 2014, I'm looking forward to a smaller regional audience.", 58 | "in_reply_to_status_id": null, 59 | "id": 544857732055326720, 60 | "favorite_count": 3, 61 | "source": "Twitter Web Client", 62 | "retweeted": false, 63 | "coordinates": null, 64 | "entities": { 65 | "symbols": [], 66 | "user_mentions": [ 67 | { 68 | "id": 1616492725, 69 | "indices": [ 70 | 22, 71 | 34 72 | ], 73 | "id_str": "1616492725", 74 | "screen_name": "PyTennessee", 75 | "name": "PyTN" 76 | }, 77 | { 78 | "id": 9475182, 79 | "indices": [ 80 | 51, 81 | 57 82 | ], 83 | "id_str": "9475182", 84 | "screen_name": "pycon", 85 | "name": "PyCon" 86 | } 87 | ], 88 | "hashtags": [], 89 | "urls": [] 90 | }, 91 | "in_reply_to_screen_name": null, 92 | "id_str": "544857732055326720", 93 | "retweet_count": 1, 94 | "in_reply_to_user_id": null, 95 | "favorited": false, 96 | "user": { 97 | "follow_request_sent": false, 98 | "profile_use_background_image": true, 99 | "profile_text_color": "333333", 100 | "default_profile_image": false, 101 | "id": 33540571, 102 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", 103 | "verified": false, 104 | "profile_location": null, 105 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/425984692723003392/SrocfJWp_normal.png", 106 | "profile_sidebar_fill_color": "DDEEF6", 107 | "entities": { 108 | "url": { 109 | "urls": [ 110 | { 111 | "url": "http://t.co/JNd1N6a6hF", 112 | "indices": [ 113 | 0, 114 | 22 115 | ], 116 | "expanded_url": "http://www.elizabethwickes.com", 117 | "display_url": "elizabethwickes.com" 118 | } 119 | ] 120 | }, 121 | "description": { 122 | "urls": [] 123 | } 124 | }, 125 | "followers_count": 150, 126 | "profile_sidebar_border_color": "C0DEED", 127 | "id_str": "33540571", 128 | "profile_background_color": "C0DEED", 129 | "listed_count": 12, 130 | "is_translation_enabled": false, 131 | "utc_offset": null, 132 | "statuses_count": 588, 133 | "description": "@PythonCU co-organizer, UIUC GSLIS student (MS '15), data geek, programming evangelist, eager to import your CSVs. Looking for FT library jobs.", 134 | "friends_count": 146, 135 | "location": "Urbana, Illinois", 136 | "profile_link_color": "0084B4", 137 | "profile_image_url": "http://pbs.twimg.com/profile_images/425984692723003392/SrocfJWp_normal.png", 138 | "following": false, 139 | "geo_enabled": true, 140 | "profile_banner_url": "https://pbs.twimg.com/profile_banners/33540571/1403567725", 141 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", 142 | "name": "Elizabeth Wickes", 143 | "lang": "en", 144 | "profile_background_tile": false, 145 | "favourites_count": 7, 146 | "screen_name": "elliewix", 147 | "notifications": false, 148 | "url": "http://t.co/JNd1N6a6hF", 149 | "created_at": "Mon Apr 20 15:08:17 +0000 2009", 150 | "contributors_enabled": false, 151 | "time_zone": null, 152 | "protected": false, 153 | "default_profile": false, 154 | "is_translator": false 155 | }, 156 | "geo": null, 157 | "in_reply_to_user_id_str": null, 158 | "lang": "en", 159 | "created_at": "Tue Dec 16 14:13:00 +0000 2014", 160 | "in_reply_to_status_id_str": null, 161 | "place": null 162 | }, 163 | "user": { 164 | "follow_request_sent": false, 165 | "profile_use_background_image": false, 166 | "profile_text_color": "333333", 167 | "default_profile_image": false, 168 | "id": 1616492725, 169 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 170 | "verified": false, 171 | "profile_location": null, 172 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 173 | "profile_sidebar_fill_color": "DDEEF6", 174 | "entities": { 175 | "url": { 176 | "urls": [ 177 | { 178 | "url": "http://t.co/NbO1HIEfBu", 179 | "indices": [ 180 | 0, 181 | 22 182 | ], 183 | "expanded_url": "http://www.pytennessee.org", 184 | "display_url": "pytennessee.org" 185 | } 186 | ] 187 | }, 188 | "description": { 189 | "urls": [] 190 | } 191 | }, 192 | "followers_count": 624, 193 | "profile_sidebar_border_color": "FFFFFF", 194 | "id_str": "1616492725", 195 | "profile_background_color": "F5F6F6", 196 | "listed_count": 39, 197 | "is_translation_enabled": false, 198 | "utc_offset": null, 199 | "statuses_count": 1741, 200 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 201 | "friends_count": 116, 202 | "location": "Nashville, TN", 203 | "profile_link_color": "2FC2EF", 204 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 205 | "following": false, 206 | "geo_enabled": false, 207 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 208 | "name": "PyTN", 209 | "lang": "en", 210 | "profile_background_tile": false, 211 | "favourites_count": 503, 212 | "screen_name": "PyTennessee", 213 | "notifications": false, 214 | "url": "http://t.co/NbO1HIEfBu", 215 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 216 | "contributors_enabled": false, 217 | "time_zone": null, 218 | "protected": false, 219 | "default_profile": false, 220 | "is_translator": false 221 | }, 222 | "geo": null, 223 | "in_reply_to_user_id_str": null, 224 | "lang": "en", 225 | "created_at": "Tue Dec 16 14:39:09 +0000 2014", 226 | "in_reply_to_status_id_str": null, 227 | "place": null 228 | } 229 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/545954460842070016.PyTennessee.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @PyTennessee: If you are looking to get a shirt or be on the shirt, you need your ticket or sponsorship in by Jan 6th! #python #pytn2015", 6 | "in_reply_to_status_id": null, 7 | "id": 545954495768068096, 8 | "favorite_count": 0, 9 | "source": "TweetDeck", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 1616492725, 17 | "indices": [ 18 | 3, 19 | 15 20 | ], 21 | "id_str": "1616492725", 22 | "screen_name": "PyTennessee", 23 | "name": "PyTN" 24 | } 25 | ], 26 | "hashtags": [ 27 | { 28 | "indices": [ 29 | 122, 30 | 129 31 | ], 32 | "text": "python" 33 | }, 34 | { 35 | "indices": [ 36 | 130, 37 | 139 38 | ], 39 | "text": "pytn2015" 40 | } 41 | ], 42 | "urls": [] 43 | }, 44 | "in_reply_to_screen_name": null, 45 | "id_str": "545954495768068096", 46 | "retweet_count": 1, 47 | "in_reply_to_user_id": null, 48 | "favorited": false, 49 | "retweeted_status": { 50 | "contributors": null, 51 | "truncated": false, 52 | "text": "If you are looking to get a shirt or be on the shirt, you need your ticket or sponsorship in by Jan 6th! #python #pytn2015", 53 | "in_reply_to_status_id": null, 54 | "id": 545954460842070016, 55 | "favorite_count": 1, 56 | "source": "TweetDeck", 57 | "retweeted": false, 58 | "coordinates": null, 59 | "entities": { 60 | "symbols": [], 61 | "user_mentions": [], 62 | "hashtags": [ 63 | { 64 | "indices": [ 65 | 105, 66 | 112 67 | ], 68 | "text": "python" 69 | }, 70 | { 71 | "indices": [ 72 | 113, 73 | 122 74 | ], 75 | "text": "pytn2015" 76 | } 77 | ], 78 | "urls": [] 79 | }, 80 | "in_reply_to_screen_name": null, 81 | "id_str": "545954460842070016", 82 | "retweet_count": 1, 83 | "in_reply_to_user_id": null, 84 | "favorited": false, 85 | "user": { 86 | "follow_request_sent": false, 87 | "profile_use_background_image": false, 88 | "profile_text_color": "333333", 89 | "default_profile_image": false, 90 | "id": 1616492725, 91 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 92 | "verified": false, 93 | "profile_location": null, 94 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 95 | "profile_sidebar_fill_color": "DDEEF6", 96 | "entities": { 97 | "url": { 98 | "urls": [ 99 | { 100 | "url": "http://t.co/NbO1HIEfBu", 101 | "indices": [ 102 | 0, 103 | 22 104 | ], 105 | "expanded_url": "http://www.pytennessee.org", 106 | "display_url": "pytennessee.org" 107 | } 108 | ] 109 | }, 110 | "description": { 111 | "urls": [] 112 | } 113 | }, 114 | "followers_count": 624, 115 | "profile_sidebar_border_color": "FFFFFF", 116 | "id_str": "1616492725", 117 | "profile_background_color": "F5F6F6", 118 | "listed_count": 39, 119 | "is_translation_enabled": false, 120 | "utc_offset": null, 121 | "statuses_count": 1741, 122 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 123 | "friends_count": 116, 124 | "location": "Nashville, TN", 125 | "profile_link_color": "2FC2EF", 126 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 127 | "following": false, 128 | "geo_enabled": false, 129 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 130 | "name": "PyTN", 131 | "lang": "en", 132 | "profile_background_tile": false, 133 | "favourites_count": 503, 134 | "screen_name": "PyTennessee", 135 | "notifications": false, 136 | "url": "http://t.co/NbO1HIEfBu", 137 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 138 | "contributors_enabled": false, 139 | "time_zone": null, 140 | "protected": false, 141 | "default_profile": false, 142 | "is_translator": false 143 | }, 144 | "geo": null, 145 | "in_reply_to_user_id_str": null, 146 | "lang": "en", 147 | "created_at": "Fri Dec 19 14:51:01 +0000 2014", 148 | "in_reply_to_status_id_str": null, 149 | "place": null 150 | }, 151 | "user": { 152 | "follow_request_sent": false, 153 | "profile_use_background_image": true, 154 | "profile_text_color": "333333", 155 | "default_profile_image": false, 156 | "id": 13553, 157 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme14/bg.gif", 158 | "verified": false, 159 | "profile_location": null, 160 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/556977228610035712/S733x3v9_normal.jpeg", 161 | "profile_sidebar_fill_color": "EFEFEF", 162 | "entities": { 163 | "url": { 164 | "urls": [ 165 | { 166 | "url": "http://t.co/xROdKIC4Sd", 167 | "indices": [ 168 | 0, 169 | 22 170 | ], 171 | "expanded_url": "http://www.jasonamyers.com", 172 | "display_url": "jasonamyers.com" 173 | } 174 | ] 175 | }, 176 | "description": { 177 | "urls": [] 178 | } 179 | }, 180 | "followers_count": 1035, 181 | "profile_sidebar_border_color": "EEEEEE", 182 | "id_str": "13553", 183 | "profile_background_color": "131516", 184 | "listed_count": 72, 185 | "is_translation_enabled": false, 186 | "utc_offset": null, 187 | "statuses_count": 9884, 188 | "description": "Openstack @Cisco Software Engineer, O'Reilly Author; Book, Coffee, and Cookie Lover; @PyTennessee @Nodevember and @PyNash Co-Organizer", 189 | "friends_count": 165, 190 | "location": "35.727614,-86.338707", 191 | "profile_link_color": "232626", 192 | "profile_image_url": "http://pbs.twimg.com/profile_images/556977228610035712/S733x3v9_normal.jpeg", 193 | "following": false, 194 | "geo_enabled": true, 195 | "profile_banner_url": "https://pbs.twimg.com/profile_banners/13553/1398258739", 196 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme14/bg.gif", 197 | "name": "Jason A Myers", 198 | "lang": "en", 199 | "profile_background_tile": true, 200 | "favourites_count": 2625, 201 | "screen_name": "jasonamyers", 202 | "notifications": false, 203 | "url": "http://t.co/xROdKIC4Sd", 204 | "created_at": "Tue Nov 21 16:20:38 +0000 2006", 205 | "contributors_enabled": false, 206 | "time_zone": null, 207 | "protected": false, 208 | "default_profile": false, 209 | "is_translator": false 210 | }, 211 | "geo": null, 212 | "in_reply_to_user_id_str": null, 213 | "lang": "en", 214 | "created_at": "Fri Dec 19 14:51:09 +0000 2014", 215 | "in_reply_to_status_id_str": null, 216 | "place": null 217 | } 218 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/546503413563801600.asheeshlaroia.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @asheeshlaroia: @_ashfall_ @PyTennessee YIPEEE!!!!!!!!", 6 | "in_reply_to_status_id": null, 7 | "id": 546514894217302016, 8 | "favorite_count": 0, 9 | "source": "Tweetbot for i\u039fS", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 35121912, 17 | "indices": [ 18 | 3, 19 | 17 20 | ], 21 | "id_str": "35121912", 22 | "screen_name": "asheeshlaroia", 23 | "name": "Asheesh Laroia" 24 | }, 25 | { 26 | "id": 636831107, 27 | "indices": [ 28 | 19, 29 | 29 30 | ], 31 | "id_str": "636831107", 32 | "screen_name": "_ashfall_", 33 | "name": "ashfall" 34 | }, 35 | { 36 | "id": 1616492725, 37 | "indices": [ 38 | 30, 39 | 42 40 | ], 41 | "id_str": "1616492725", 42 | "screen_name": "PyTennessee", 43 | "name": "PyTN" 44 | } 45 | ], 46 | "hashtags": [], 47 | "urls": [] 48 | }, 49 | "in_reply_to_screen_name": null, 50 | "id_str": "546514894217302016", 51 | "retweet_count": 1, 52 | "in_reply_to_user_id": null, 53 | "favorited": false, 54 | "retweeted_status": { 55 | "contributors": null, 56 | "truncated": false, 57 | "text": "@_ashfall_ @PyTennessee YIPEEE!!!!!!!!", 58 | "in_reply_to_status_id": 542186956638011392, 59 | "id": 546503413563801600, 60 | "favorite_count": 1, 61 | "source": "Twitter Web Client", 62 | "retweeted": false, 63 | "coordinates": null, 64 | "entities": { 65 | "symbols": [], 66 | "user_mentions": [ 67 | { 68 | "id": 636831107, 69 | "indices": [ 70 | 0, 71 | 10 72 | ], 73 | "id_str": "636831107", 74 | "screen_name": "_ashfall_", 75 | "name": "ashfall" 76 | }, 77 | { 78 | "id": 1616492725, 79 | "indices": [ 80 | 11, 81 | 23 82 | ], 83 | "id_str": "1616492725", 84 | "screen_name": "PyTennessee", 85 | "name": "PyTN" 86 | } 87 | ], 88 | "hashtags": [], 89 | "urls": [] 90 | }, 91 | "in_reply_to_screen_name": "_ashfall_", 92 | "id_str": "546503413563801600", 93 | "retweet_count": 1, 94 | "in_reply_to_user_id": 636831107, 95 | "favorited": false, 96 | "user": { 97 | "follow_request_sent": false, 98 | "profile_use_background_image": true, 99 | "profile_text_color": "333333", 100 | "default_profile_image": false, 101 | "id": 35121912, 102 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", 103 | "verified": false, 104 | "profile_location": null, 105 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/356702369/13560-96-20090606203856_normal.png", 106 | "profile_sidebar_fill_color": "DDEEF6", 107 | "entities": { 108 | "url": { 109 | "urls": [ 110 | { 111 | "url": "http://t.co/O51pEnI0nz", 112 | "indices": [ 113 | 0, 114 | 22 115 | ], 116 | "expanded_url": "http://www.asheesh.org/", 117 | "display_url": "asheesh.org" 118 | } 119 | ] 120 | }, 121 | "description": { 122 | "urls": [] 123 | } 124 | }, 125 | "followers_count": 728, 126 | "profile_sidebar_border_color": "C0DEED", 127 | "id_str": "35121912", 128 | "profile_background_color": "C0DEED", 129 | "listed_count": 64, 130 | "is_translation_enabled": false, 131 | "utc_offset": -18000, 132 | "statuses_count": 1027, 133 | "description": "", 134 | "friends_count": 315, 135 | "location": "Philadelphia, PA", 136 | "profile_link_color": "0084B4", 137 | "profile_image_url": "http://pbs.twimg.com/profile_images/356702369/13560-96-20090606203856_normal.png", 138 | "following": false, 139 | "geo_enabled": false, 140 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", 141 | "name": "Asheesh Laroia", 142 | "lang": "en", 143 | "profile_background_tile": false, 144 | "favourites_count": 39, 145 | "screen_name": "asheeshlaroia", 146 | "notifications": false, 147 | "url": "http://t.co/O51pEnI0nz", 148 | "created_at": "Sat Apr 25 02:39:45 +0000 2009", 149 | "contributors_enabled": false, 150 | "time_zone": "Eastern Time (US & Canada)", 151 | "protected": false, 152 | "default_profile": true, 153 | "is_translator": false 154 | }, 155 | "geo": null, 156 | "in_reply_to_user_id_str": "636831107", 157 | "lang": "tr", 158 | "created_at": "Sun Dec 21 03:12:21 +0000 2014", 159 | "in_reply_to_status_id_str": "542186956638011392", 160 | "place": null 161 | }, 162 | "user": { 163 | "follow_request_sent": false, 164 | "profile_use_background_image": false, 165 | "profile_text_color": "333333", 166 | "default_profile_image": false, 167 | "id": 1616492725, 168 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 169 | "verified": false, 170 | "profile_location": null, 171 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 172 | "profile_sidebar_fill_color": "DDEEF6", 173 | "entities": { 174 | "url": { 175 | "urls": [ 176 | { 177 | "url": "http://t.co/NbO1HIEfBu", 178 | "indices": [ 179 | 0, 180 | 22 181 | ], 182 | "expanded_url": "http://www.pytennessee.org", 183 | "display_url": "pytennessee.org" 184 | } 185 | ] 186 | }, 187 | "description": { 188 | "urls": [] 189 | } 190 | }, 191 | "followers_count": 624, 192 | "profile_sidebar_border_color": "FFFFFF", 193 | "id_str": "1616492725", 194 | "profile_background_color": "F5F6F6", 195 | "listed_count": 39, 196 | "is_translation_enabled": false, 197 | "utc_offset": null, 198 | "statuses_count": 1741, 199 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 200 | "friends_count": 116, 201 | "location": "Nashville, TN", 202 | "profile_link_color": "2FC2EF", 203 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 204 | "following": false, 205 | "geo_enabled": false, 206 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 207 | "name": "PyTN", 208 | "lang": "en", 209 | "profile_background_tile": false, 210 | "favourites_count": 503, 211 | "screen_name": "PyTennessee", 212 | "notifications": false, 213 | "url": "http://t.co/NbO1HIEfBu", 214 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 215 | "contributors_enabled": false, 216 | "time_zone": null, 217 | "protected": false, 218 | "default_profile": false, 219 | "is_translator": false 220 | }, 221 | "geo": null, 222 | "in_reply_to_user_id_str": null, 223 | "lang": "tr", 224 | "created_at": "Sun Dec 21 03:57:59 +0000 2014", 225 | "in_reply_to_status_id_str": null, 226 | "place": null 227 | } 228 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/552903120377110529.PyTennessee.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @PyTennessee: PyTN Profiles: Clayton Parker and Kite Web Consulting http://t.co/bjpGAOFGHb #python #pytn2015", 6 | "in_reply_to_status_id": null, 7 | "id": 552903436648198144, 8 | "favorite_count": 0, 9 | "source": "Cookie-Bot", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 1616492725, 17 | "indices": [ 18 | 3, 19 | 15 20 | ], 21 | "id_str": "1616492725", 22 | "screen_name": "PyTennessee", 23 | "name": "PyTN" 24 | } 25 | ], 26 | "hashtags": [ 27 | { 28 | "indices": [ 29 | 94, 30 | 101 31 | ], 32 | "text": "python" 33 | }, 34 | { 35 | "indices": [ 36 | 102, 37 | 111 38 | ], 39 | "text": "pytn2015" 40 | } 41 | ], 42 | "urls": [ 43 | { 44 | "url": "http://t.co/bjpGAOFGHb", 45 | "indices": [ 46 | 71, 47 | 93 48 | ], 49 | "expanded_url": "http://pytennessee.tumblr.com/post/107412412614/pytn-profiles-clayton-parker-and-kite-web", 50 | "display_url": "pytennessee.tumblr.com/post/107412412\u2026" 51 | } 52 | ] 53 | }, 54 | "in_reply_to_screen_name": null, 55 | "id_str": "552903436648198144", 56 | "retweet_count": 1, 57 | "in_reply_to_user_id": null, 58 | "favorited": false, 59 | "retweeted_status": { 60 | "contributors": null, 61 | "truncated": false, 62 | "text": "PyTN Profiles: Clayton Parker and Kite Web Consulting http://t.co/bjpGAOFGHb #python #pytn2015", 63 | "in_reply_to_status_id": null, 64 | "id": 552903120377110529, 65 | "favorite_count": 0, 66 | "source": "TweetDeck", 67 | "retweeted": false, 68 | "coordinates": null, 69 | "entities": { 70 | "symbols": [], 71 | "user_mentions": [], 72 | "hashtags": [ 73 | { 74 | "indices": [ 75 | 77, 76 | 84 77 | ], 78 | "text": "python" 79 | }, 80 | { 81 | "indices": [ 82 | 85, 83 | 94 84 | ], 85 | "text": "pytn2015" 86 | } 87 | ], 88 | "urls": [ 89 | { 90 | "url": "http://t.co/bjpGAOFGHb", 91 | "indices": [ 92 | 54, 93 | 76 94 | ], 95 | "expanded_url": "http://pytennessee.tumblr.com/post/107412412614/pytn-profiles-clayton-parker-and-kite-web", 96 | "display_url": "pytennessee.tumblr.com/post/107412412\u2026" 97 | } 98 | ] 99 | }, 100 | "in_reply_to_screen_name": null, 101 | "id_str": "552903120377110529", 102 | "retweet_count": 1, 103 | "in_reply_to_user_id": null, 104 | "favorited": false, 105 | "user": { 106 | "follow_request_sent": false, 107 | "profile_use_background_image": false, 108 | "profile_text_color": "333333", 109 | "default_profile_image": false, 110 | "id": 1616492725, 111 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 112 | "verified": false, 113 | "profile_location": null, 114 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 115 | "profile_sidebar_fill_color": "DDEEF6", 116 | "entities": { 117 | "url": { 118 | "urls": [ 119 | { 120 | "url": "http://t.co/NbO1HIEfBu", 121 | "indices": [ 122 | 0, 123 | 22 124 | ], 125 | "expanded_url": "http://www.pytennessee.org", 126 | "display_url": "pytennessee.org" 127 | } 128 | ] 129 | }, 130 | "description": { 131 | "urls": [] 132 | } 133 | }, 134 | "followers_count": 623, 135 | "profile_sidebar_border_color": "FFFFFF", 136 | "id_str": "1616492725", 137 | "profile_background_color": "F5F6F6", 138 | "listed_count": 39, 139 | "is_translation_enabled": false, 140 | "utc_offset": null, 141 | "statuses_count": 1740, 142 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 143 | "friends_count": 116, 144 | "location": "Nashville, TN", 145 | "profile_link_color": "2FC2EF", 146 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 147 | "following": false, 148 | "geo_enabled": false, 149 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 150 | "name": "PyTN", 151 | "lang": "en", 152 | "profile_background_tile": false, 153 | "favourites_count": 503, 154 | "screen_name": "PyTennessee", 155 | "notifications": false, 156 | "url": "http://t.co/NbO1HIEfBu", 157 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 158 | "contributors_enabled": false, 159 | "time_zone": null, 160 | "protected": false, 161 | "default_profile": false, 162 | "is_translator": false 163 | }, 164 | "geo": null, 165 | "in_reply_to_user_id_str": null, 166 | "possibly_sensitive": false, 167 | "lang": "da", 168 | "created_at": "Wed Jan 07 19:02:30 +0000 2015", 169 | "in_reply_to_status_id_str": null, 170 | "place": null 171 | }, 172 | "user": { 173 | "follow_request_sent": false, 174 | "profile_use_background_image": false, 175 | "profile_text_color": "000000", 176 | "default_profile_image": false, 177 | "id": 2905182930, 178 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", 179 | "verified": false, 180 | "profile_location": null, 181 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/552926905943347200/sSiI_hy3_normal.jpeg", 182 | "profile_sidebar_fill_color": "000000", 183 | "entities": { 184 | "description": { 185 | "urls": [] 186 | } 187 | }, 188 | "followers_count": 118, 189 | "profile_sidebar_border_color": "000000", 190 | "id_str": "2905182930", 191 | "profile_background_color": "000000", 192 | "listed_count": 42, 193 | "is_translation_enabled": false, 194 | "utc_offset": 19800, 195 | "statuses_count": 6878, 196 | "description": ":)", 197 | "friends_count": 0, 198 | "location": "Negombo, Sri Lanka", 199 | "profile_link_color": "4A913C", 200 | "profile_image_url": "http://pbs.twimg.com/profile_images/552926905943347200/sSiI_hy3_normal.jpeg", 201 | "following": false, 202 | "geo_enabled": false, 203 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", 204 | "name": "Cookie Bot", 205 | "lang": "en", 206 | "profile_background_tile": false, 207 | "favourites_count": 0, 208 | "screen_name": "cookie__bot", 209 | "notifications": false, 210 | "url": null, 211 | "created_at": "Thu Nov 20 14:19:14 +0000 2014", 212 | "contributors_enabled": false, 213 | "time_zone": "Sri Jayawardenepura", 214 | "protected": false, 215 | "default_profile": false, 216 | "is_translator": false 217 | }, 218 | "geo": null, 219 | "in_reply_to_user_id_str": null, 220 | "possibly_sensitive": false, 221 | "lang": "da", 222 | "created_at": "Wed Jan 07 19:03:46 +0000 2015", 223 | "in_reply_to_status_id_str": null, 224 | "place": null 225 | } 226 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/553559740840546304.PyTennessee.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @PyTennessee: Ordering stuff for young coders... yeah we got some of each color https://t.co/zEoltim8fW #WeAreThreeYearOld", 6 | "in_reply_to_status_id": null, 7 | "id": 553578372287062016, 8 | "favorite_count": 0, 9 | "source": "Twitter Web Client", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 1616492725, 17 | "indices": [ 18 | 3, 19 | 15 20 | ], 21 | "id_str": "1616492725", 22 | "screen_name": "PyTennessee", 23 | "name": "PyTN" 24 | } 25 | ], 26 | "hashtags": [ 27 | { 28 | "indices": [ 29 | 107, 30 | 125 31 | ], 32 | "text": "WeAreThreeYearOld" 33 | } 34 | ], 35 | "urls": [ 36 | { 37 | "url": "https://t.co/zEoltim8fW", 38 | "indices": [ 39 | 83, 40 | 106 41 | ], 42 | "expanded_url": "https://www.adafruit.com/images/970x728/2285-01.jpg", 43 | "display_url": "adafruit.com/images/970x728\u2026" 44 | } 45 | ] 46 | }, 47 | "in_reply_to_screen_name": null, 48 | "id_str": "553578372287062016", 49 | "retweet_count": 1, 50 | "in_reply_to_user_id": null, 51 | "favorited": false, 52 | "retweeted_status": { 53 | "contributors": null, 54 | "truncated": false, 55 | "text": "Ordering stuff for young coders... yeah we got some of each color https://t.co/zEoltim8fW #WeAreThreeYearOld", 56 | "in_reply_to_status_id": null, 57 | "id": 553559740840546304, 58 | "favorite_count": 4, 59 | "source": "TweetDeck", 60 | "retweeted": false, 61 | "coordinates": null, 62 | "entities": { 63 | "symbols": [], 64 | "user_mentions": [], 65 | "hashtags": [ 66 | { 67 | "indices": [ 68 | 90, 69 | 108 70 | ], 71 | "text": "WeAreThreeYearOld" 72 | } 73 | ], 74 | "urls": [ 75 | { 76 | "url": "https://t.co/zEoltim8fW", 77 | "indices": [ 78 | 66, 79 | 89 80 | ], 81 | "expanded_url": "https://www.adafruit.com/images/970x728/2285-01.jpg", 82 | "display_url": "adafruit.com/images/970x728\u2026" 83 | } 84 | ] 85 | }, 86 | "in_reply_to_screen_name": null, 87 | "id_str": "553559740840546304", 88 | "retweet_count": 1, 89 | "in_reply_to_user_id": null, 90 | "favorited": false, 91 | "user": { 92 | "follow_request_sent": false, 93 | "profile_use_background_image": false, 94 | "profile_text_color": "333333", 95 | "default_profile_image": false, 96 | "id": 1616492725, 97 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 98 | "verified": false, 99 | "profile_location": null, 100 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 101 | "profile_sidebar_fill_color": "DDEEF6", 102 | "entities": { 103 | "url": { 104 | "urls": [ 105 | { 106 | "url": "http://t.co/NbO1HIEfBu", 107 | "indices": [ 108 | 0, 109 | 22 110 | ], 111 | "expanded_url": "http://www.pytennessee.org", 112 | "display_url": "pytennessee.org" 113 | } 114 | ] 115 | }, 116 | "description": { 117 | "urls": [] 118 | } 119 | }, 120 | "followers_count": 623, 121 | "profile_sidebar_border_color": "FFFFFF", 122 | "id_str": "1616492725", 123 | "profile_background_color": "F5F6F6", 124 | "listed_count": 39, 125 | "is_translation_enabled": false, 126 | "utc_offset": null, 127 | "statuses_count": 1740, 128 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 129 | "friends_count": 116, 130 | "location": "Nashville, TN", 131 | "profile_link_color": "2FC2EF", 132 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 133 | "following": false, 134 | "geo_enabled": false, 135 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 136 | "name": "PyTN", 137 | "lang": "en", 138 | "profile_background_tile": false, 139 | "favourites_count": 503, 140 | "screen_name": "PyTennessee", 141 | "notifications": false, 142 | "url": "http://t.co/NbO1HIEfBu", 143 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 144 | "contributors_enabled": false, 145 | "time_zone": null, 146 | "protected": false, 147 | "default_profile": false, 148 | "is_translator": false 149 | }, 150 | "geo": null, 151 | "in_reply_to_user_id_str": null, 152 | "possibly_sensitive": false, 153 | "lang": "en", 154 | "created_at": "Fri Jan 09 14:31:41 +0000 2015", 155 | "in_reply_to_status_id_str": null, 156 | "place": null 157 | }, 158 | "user": { 159 | "follow_request_sent": false, 160 | "profile_use_background_image": true, 161 | "profile_text_color": "333333", 162 | "default_profile_image": false, 163 | "id": 16026261, 164 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme13/bg.gif", 165 | "verified": false, 166 | "profile_location": null, 167 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/532617273232461824/Cb8uaLp9_normal.jpeg", 168 | "profile_sidebar_fill_color": "FFFFFF", 169 | "entities": { 170 | "url": { 171 | "urls": [ 172 | { 173 | "url": "http://t.co/Bw8qLV7T8i", 174 | "indices": [ 175 | 0, 176 | 22 177 | ], 178 | "expanded_url": "http://bradmontgomery.net", 179 | "display_url": "bradmontgomery.net" 180 | } 181 | ] 182 | }, 183 | "description": { 184 | "urls": [] 185 | } 186 | }, 187 | "followers_count": 1352, 188 | "profile_sidebar_border_color": "EEEEEE", 189 | "id_str": "16026261", 190 | "profile_background_color": "B2DFDA", 191 | "listed_count": 93, 192 | "is_translation_enabled": false, 193 | "utc_offset": -21600, 194 | "statuses_count": 21129, 195 | "description": "Tech Lead at TN Data Commons. Trying to make a difference.", 196 | "friends_count": 903, 197 | "location": "Memphis, TN", 198 | "profile_link_color": "4A913C", 199 | "profile_image_url": "http://pbs.twimg.com/profile_images/532617273232461824/Cb8uaLp9_normal.jpeg", 200 | "following": false, 201 | "geo_enabled": true, 202 | "profile_banner_url": "https://pbs.twimg.com/profile_banners/16026261/1418080883", 203 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme13/bg.gif", 204 | "name": "Brad Montgomery", 205 | "lang": "en", 206 | "profile_background_tile": false, 207 | "favourites_count": 5089, 208 | "screen_name": "bkmontgomery", 209 | "notifications": false, 210 | "url": "http://t.co/Bw8qLV7T8i", 211 | "created_at": "Thu Aug 28 12:50:23 +0000 2008", 212 | "contributors_enabled": false, 213 | "time_zone": "Central Time (US & Canada)", 214 | "protected": false, 215 | "default_profile": false, 216 | "is_translator": false 217 | }, 218 | "geo": null, 219 | "in_reply_to_user_id_str": null, 220 | "possibly_sensitive": false, 221 | "lang": "en", 222 | "created_at": "Fri Jan 09 15:45:43 +0000 2015", 223 | "in_reply_to_status_id_str": null, 224 | "place": null 225 | } 226 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/557304540891217920._gignosko_.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @_gignosko_: @elegant_stitch I'm digging the Port Authority in charcoal/black. XL seems like a comfy fit. @PyTennessee", 6 | "in_reply_to_status_id": null, 7 | "id": 557307186653954050, 8 | "favorite_count": 0, 9 | "source": "Tweetbot for i\u039fS", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 2310830701, 17 | "indices": [ 18 | 3, 19 | 14 20 | ], 21 | "id_str": "2310830701", 22 | "screen_name": "_gignosko_", 23 | "name": "Immutable Hair" 24 | }, 25 | { 26 | "id": 516177826, 27 | "indices": [ 28 | 16, 29 | 31 30 | ], 31 | "id_str": "516177826", 32 | "screen_name": "elegant_stitch", 33 | "name": "Elegant Stitches" 34 | }, 35 | { 36 | "id": 1616492725, 37 | "indices": [ 38 | 109, 39 | 121 40 | ], 41 | "id_str": "1616492725", 42 | "screen_name": "PyTennessee", 43 | "name": "PyTN" 44 | } 45 | ], 46 | "hashtags": [], 47 | "urls": [] 48 | }, 49 | "in_reply_to_screen_name": null, 50 | "id_str": "557307186653954050", 51 | "retweet_count": 1, 52 | "in_reply_to_user_id": null, 53 | "favorited": false, 54 | "retweeted_status": { 55 | "contributors": null, 56 | "truncated": false, 57 | "text": "@elegant_stitch I'm digging the Port Authority in charcoal/black. XL seems like a comfy fit. @PyTennessee", 58 | "in_reply_to_status_id": null, 59 | "id": 557304540891217920, 60 | "favorite_count": 0, 61 | "source": "Twitter Web Client", 62 | "retweeted": false, 63 | "coordinates": null, 64 | "entities": { 65 | "symbols": [], 66 | "user_mentions": [ 67 | { 68 | "id": 516177826, 69 | "indices": [ 70 | 0, 71 | 15 72 | ], 73 | "id_str": "516177826", 74 | "screen_name": "elegant_stitch", 75 | "name": "Elegant Stitches" 76 | }, 77 | { 78 | "id": 1616492725, 79 | "indices": [ 80 | 93, 81 | 105 82 | ], 83 | "id_str": "1616492725", 84 | "screen_name": "PyTennessee", 85 | "name": "PyTN" 86 | } 87 | ], 88 | "hashtags": [], 89 | "urls": [] 90 | }, 91 | "in_reply_to_screen_name": "elegant_stitch", 92 | "id_str": "557304540891217920", 93 | "retweet_count": 1, 94 | "in_reply_to_user_id": 516177826, 95 | "favorited": false, 96 | "user": { 97 | "follow_request_sent": false, 98 | "profile_use_background_image": true, 99 | "profile_text_color": "333333", 100 | "default_profile_image": false, 101 | "id": 2310830701, 102 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", 103 | "verified": false, 104 | "profile_location": null, 105 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/466676527162089472/siWso4Rm_normal.jpeg", 106 | "profile_sidebar_fill_color": "DDEEF6", 107 | "entities": { 108 | "description": { 109 | "urls": [] 110 | } 111 | }, 112 | "followers_count": 46, 113 | "profile_sidebar_border_color": "C0DEED", 114 | "id_str": "2310830701", 115 | "profile_background_color": "C0DEED", 116 | "listed_count": 7, 117 | "is_translation_enabled": false, 118 | "utc_offset": -21600, 119 | "statuses_count": 274, 120 | "description": "Geek with passable social skills. python at Emma, clojure where I can.", 121 | "friends_count": 195, 122 | "location": "Nashville", 123 | "profile_link_color": "0084B4", 124 | "profile_image_url": "http://pbs.twimg.com/profile_images/466676527162089472/siWso4Rm_normal.jpeg", 125 | "following": false, 126 | "geo_enabled": false, 127 | "profile_banner_url": "https://pbs.twimg.com/profile_banners/2310830701/1400102565", 128 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", 129 | "name": "Immutable Hair", 130 | "lang": "en", 131 | "profile_background_tile": false, 132 | "favourites_count": 122, 133 | "screen_name": "_gignosko_", 134 | "notifications": false, 135 | "url": null, 136 | "created_at": "Sat Jan 25 22:50:58 +0000 2014", 137 | "contributors_enabled": false, 138 | "time_zone": "Central Time (US & Canada)", 139 | "protected": false, 140 | "default_profile": true, 141 | "is_translator": false 142 | }, 143 | "geo": null, 144 | "in_reply_to_user_id_str": "516177826", 145 | "lang": "en", 146 | "created_at": "Mon Jan 19 22:32:11 +0000 2015", 147 | "in_reply_to_status_id_str": null, 148 | "place": null 149 | }, 150 | "user": { 151 | "follow_request_sent": false, 152 | "profile_use_background_image": false, 153 | "profile_text_color": "333333", 154 | "default_profile_image": false, 155 | "id": 1616492725, 156 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 157 | "verified": false, 158 | "profile_location": null, 159 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 160 | "profile_sidebar_fill_color": "DDEEF6", 161 | "entities": { 162 | "url": { 163 | "urls": [ 164 | { 165 | "url": "http://t.co/NbO1HIEfBu", 166 | "indices": [ 167 | 0, 168 | 22 169 | ], 170 | "expanded_url": "http://www.pytennessee.org", 171 | "display_url": "pytennessee.org" 172 | } 173 | ] 174 | }, 175 | "description": { 176 | "urls": [] 177 | } 178 | }, 179 | "followers_count": 623, 180 | "profile_sidebar_border_color": "FFFFFF", 181 | "id_str": "1616492725", 182 | "profile_background_color": "F5F6F6", 183 | "listed_count": 39, 184 | "is_translation_enabled": false, 185 | "utc_offset": null, 186 | "statuses_count": 1740, 187 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 188 | "friends_count": 116, 189 | "location": "Nashville, TN", 190 | "profile_link_color": "2FC2EF", 191 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 192 | "following": false, 193 | "geo_enabled": false, 194 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 195 | "name": "PyTN", 196 | "lang": "en", 197 | "profile_background_tile": false, 198 | "favourites_count": 503, 199 | "screen_name": "PyTennessee", 200 | "notifications": false, 201 | "url": "http://t.co/NbO1HIEfBu", 202 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 203 | "contributors_enabled": false, 204 | "time_zone": null, 205 | "protected": false, 206 | "default_profile": false, 207 | "is_translator": false 208 | }, 209 | "geo": null, 210 | "in_reply_to_user_id_str": null, 211 | "lang": "en", 212 | "created_at": "Mon Jan 19 22:42:42 +0000 2015", 213 | "in_reply_to_status_id_str": null, 214 | "place": null 215 | } 216 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/557305342351007745.elegant_stitch.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @elegant_stitch: @byeliad Brian gets 3 entries, thanks Brian! @PyTennessee", 6 | "in_reply_to_status_id": null, 7 | "id": 557305429861351425, 8 | "favorite_count": 0, 9 | "source": "Tweetbot for i\u039fS", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 516177826, 17 | "indices": [ 18 | 3, 19 | 18 20 | ], 21 | "id_str": "516177826", 22 | "screen_name": "elegant_stitch", 23 | "name": "Elegant Stitches" 24 | }, 25 | { 26 | "id": 14881451, 27 | "indices": [ 28 | 20, 29 | 28 30 | ], 31 | "id_str": "14881451", 32 | "screen_name": "byeliad", 33 | "name": "\u0432\u044f\u03b9\u03b1\u03b7 \u2202. " 34 | }, 35 | { 36 | "id": 1616492725, 37 | "indices": [ 38 | 65, 39 | 77 40 | ], 41 | "id_str": "1616492725", 42 | "screen_name": "PyTennessee", 43 | "name": "PyTN" 44 | } 45 | ], 46 | "hashtags": [], 47 | "urls": [] 48 | }, 49 | "in_reply_to_screen_name": null, 50 | "id_str": "557305429861351425", 51 | "retweet_count": 1, 52 | "in_reply_to_user_id": null, 53 | "favorited": false, 54 | "retweeted_status": { 55 | "contributors": null, 56 | "truncated": false, 57 | "text": "@byeliad Brian gets 3 entries, thanks Brian! @PyTennessee", 58 | "in_reply_to_status_id": null, 59 | "id": 557305342351007745, 60 | "favorite_count": 1, 61 | "source": "Twitter Web Client", 62 | "retweeted": false, 63 | "coordinates": null, 64 | "entities": { 65 | "symbols": [], 66 | "user_mentions": [ 67 | { 68 | "id": 14881451, 69 | "indices": [ 70 | 0, 71 | 8 72 | ], 73 | "id_str": "14881451", 74 | "screen_name": "byeliad", 75 | "name": "\u0432\u044f\u03b9\u03b1\u03b7 \u2202. " 76 | }, 77 | { 78 | "id": 1616492725, 79 | "indices": [ 80 | 45, 81 | 57 82 | ], 83 | "id_str": "1616492725", 84 | "screen_name": "PyTennessee", 85 | "name": "PyTN" 86 | } 87 | ], 88 | "hashtags": [], 89 | "urls": [] 90 | }, 91 | "in_reply_to_screen_name": "byeliad", 92 | "id_str": "557305342351007745", 93 | "retweet_count": 1, 94 | "in_reply_to_user_id": 14881451, 95 | "favorited": false, 96 | "user": { 97 | "follow_request_sent": false, 98 | "profile_use_background_image": true, 99 | "profile_text_color": "333333", 100 | "default_profile_image": false, 101 | "id": 516177826, 102 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", 103 | "verified": false, 104 | "profile_location": null, 105 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/1876174386/PythonApplique_normal.png", 106 | "profile_sidebar_fill_color": "DDEEF6", 107 | "entities": { 108 | "description": { 109 | "urls": [ 110 | { 111 | "url": "https://t.co/oUbVnj1gnk", 112 | "indices": [ 113 | 111, 114 | 134 115 | ], 116 | "expanded_url": "https://www.etsy.com/shop/WearPython1", 117 | "display_url": "etsy.com/shop/WearPytho\u2026" 118 | } 119 | ] 120 | } 121 | }, 122 | "followers_count": 120, 123 | "profile_sidebar_border_color": "C0DEED", 124 | "id_str": "516177826", 125 | "profile_background_color": "C0DEED", 126 | "listed_count": 0, 127 | "is_translation_enabled": false, 128 | "utc_offset": null, 129 | "statuses_count": 78, 130 | "description": "Elegant Stitches offers quality embroidered apparel and gifts. Check out our Python merchandise store on Etsy. https://t.co/oUbVnj1gnk", 131 | "friends_count": 86, 132 | "location": "Conway, AR", 133 | "profile_link_color": "0084B4", 134 | "profile_image_url": "http://pbs.twimg.com/profile_images/1876174386/PythonApplique_normal.png", 135 | "following": false, 136 | "geo_enabled": false, 137 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", 138 | "name": "Elegant Stitches", 139 | "lang": "en", 140 | "profile_background_tile": false, 141 | "favourites_count": 7, 142 | "screen_name": "elegant_stitch", 143 | "notifications": false, 144 | "url": null, 145 | "created_at": "Tue Mar 06 04:17:21 +0000 2012", 146 | "contributors_enabled": false, 147 | "time_zone": null, 148 | "protected": false, 149 | "default_profile": true, 150 | "is_translator": false 151 | }, 152 | "geo": null, 153 | "in_reply_to_user_id_str": "14881451", 154 | "lang": "en", 155 | "created_at": "Mon Jan 19 22:35:22 +0000 2015", 156 | "in_reply_to_status_id_str": null, 157 | "place": null 158 | }, 159 | "user": { 160 | "follow_request_sent": false, 161 | "profile_use_background_image": false, 162 | "profile_text_color": "333333", 163 | "default_profile_image": false, 164 | "id": 1616492725, 165 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 166 | "verified": false, 167 | "profile_location": null, 168 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 169 | "profile_sidebar_fill_color": "DDEEF6", 170 | "entities": { 171 | "url": { 172 | "urls": [ 173 | { 174 | "url": "http://t.co/NbO1HIEfBu", 175 | "indices": [ 176 | 0, 177 | 22 178 | ], 179 | "expanded_url": "http://www.pytennessee.org", 180 | "display_url": "pytennessee.org" 181 | } 182 | ] 183 | }, 184 | "description": { 185 | "urls": [] 186 | } 187 | }, 188 | "followers_count": 623, 189 | "profile_sidebar_border_color": "FFFFFF", 190 | "id_str": "1616492725", 191 | "profile_background_color": "F5F6F6", 192 | "listed_count": 39, 193 | "is_translation_enabled": false, 194 | "utc_offset": null, 195 | "statuses_count": 1740, 196 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 197 | "friends_count": 116, 198 | "location": "Nashville, TN", 199 | "profile_link_color": "2FC2EF", 200 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 201 | "following": false, 202 | "geo_enabled": false, 203 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 204 | "name": "PyTN", 205 | "lang": "en", 206 | "profile_background_tile": false, 207 | "favourites_count": 503, 208 | "screen_name": "PyTennessee", 209 | "notifications": false, 210 | "url": "http://t.co/NbO1HIEfBu", 211 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 212 | "contributors_enabled": false, 213 | "time_zone": null, 214 | "protected": false, 215 | "default_profile": false, 216 | "is_translator": false 217 | }, 218 | "geo": null, 219 | "in_reply_to_user_id_str": null, 220 | "lang": "en", 221 | "created_at": "Mon Jan 19 22:35:43 +0000 2015", 222 | "in_reply_to_status_id_str": null, 223 | "place": null 224 | } 225 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/559126165093642242.PyTennessee.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @PyTennessee: Gist of today PyTN attendees update email\u2026 FOOD FOOD EVERYWHERE", 6 | "in_reply_to_status_id": null, 7 | "id": 559129526568226816, 8 | "favorite_count": 0, 9 | "source": "Tweetbot for i\u039fS", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 1616492725, 17 | "indices": [ 18 | 3, 19 | 15 20 | ], 21 | "id_str": "1616492725", 22 | "screen_name": "PyTennessee", 23 | "name": "PyTN" 24 | } 25 | ], 26 | "hashtags": [], 27 | "urls": [] 28 | }, 29 | "in_reply_to_screen_name": null, 30 | "id_str": "559129526568226816", 31 | "retweet_count": 1, 32 | "in_reply_to_user_id": null, 33 | "favorited": false, 34 | "retweeted_status": { 35 | "contributors": null, 36 | "truncated": false, 37 | "text": "Gist of today PyTN attendees update email\u2026 FOOD FOOD EVERYWHERE", 38 | "in_reply_to_status_id": null, 39 | "id": 559126165093642242, 40 | "favorite_count": 4, 41 | "source": "Tweetbot for i\u039fS", 42 | "retweeted": false, 43 | "coordinates": null, 44 | "entities": { 45 | "symbols": [], 46 | "user_mentions": [], 47 | "hashtags": [], 48 | "urls": [] 49 | }, 50 | "in_reply_to_screen_name": null, 51 | "id_str": "559126165093642242", 52 | "retweet_count": 1, 53 | "in_reply_to_user_id": null, 54 | "favorited": false, 55 | "user": { 56 | "follow_request_sent": false, 57 | "profile_use_background_image": false, 58 | "profile_text_color": "333333", 59 | "default_profile_image": false, 60 | "id": 1616492725, 61 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 62 | "verified": false, 63 | "profile_location": null, 64 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 65 | "profile_sidebar_fill_color": "DDEEF6", 66 | "entities": { 67 | "url": { 68 | "urls": [ 69 | { 70 | "url": "http://t.co/NbO1HIEfBu", 71 | "indices": [ 72 | 0, 73 | 22 74 | ], 75 | "expanded_url": "http://www.pytennessee.org", 76 | "display_url": "pytennessee.org" 77 | } 78 | ] 79 | }, 80 | "description": { 81 | "urls": [] 82 | } 83 | }, 84 | "followers_count": 623, 85 | "profile_sidebar_border_color": "FFFFFF", 86 | "id_str": "1616492725", 87 | "profile_background_color": "F5F6F6", 88 | "listed_count": 39, 89 | "is_translation_enabled": false, 90 | "utc_offset": null, 91 | "statuses_count": 1740, 92 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 93 | "friends_count": 116, 94 | "location": "Nashville, TN", 95 | "profile_link_color": "2FC2EF", 96 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 97 | "following": false, 98 | "geo_enabled": false, 99 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 100 | "name": "PyTN", 101 | "lang": "en", 102 | "profile_background_tile": false, 103 | "favourites_count": 503, 104 | "screen_name": "PyTennessee", 105 | "notifications": false, 106 | "url": "http://t.co/NbO1HIEfBu", 107 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 108 | "contributors_enabled": false, 109 | "time_zone": null, 110 | "protected": false, 111 | "default_profile": false, 112 | "is_translator": false 113 | }, 114 | "geo": null, 115 | "in_reply_to_user_id_str": null, 116 | "lang": "en", 117 | "created_at": "Sat Jan 24 23:10:40 +0000 2015", 118 | "in_reply_to_status_id_str": null, 119 | "place": null 120 | }, 121 | "user": { 122 | "follow_request_sent": false, 123 | "profile_use_background_image": true, 124 | "profile_text_color": "333333", 125 | "default_profile_image": false, 126 | "id": 13553, 127 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme14/bg.gif", 128 | "verified": false, 129 | "profile_location": null, 130 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/556977228610035712/S733x3v9_normal.jpeg", 131 | "profile_sidebar_fill_color": "EFEFEF", 132 | "entities": { 133 | "url": { 134 | "urls": [ 135 | { 136 | "url": "http://t.co/xROdKIC4Sd", 137 | "indices": [ 138 | 0, 139 | 22 140 | ], 141 | "expanded_url": "http://www.jasonamyers.com", 142 | "display_url": "jasonamyers.com" 143 | } 144 | ] 145 | }, 146 | "description": { 147 | "urls": [] 148 | } 149 | }, 150 | "followers_count": 1035, 151 | "profile_sidebar_border_color": "EEEEEE", 152 | "id_str": "13553", 153 | "profile_background_color": "131516", 154 | "listed_count": 72, 155 | "is_translation_enabled": false, 156 | "utc_offset": null, 157 | "statuses_count": 9883, 158 | "description": "Openstack @Cisco Software Engineer, O'Reilly Author; Book, Coffee, and Cookie Lover; @PyTennessee @Nodevember and @PyNash Co-Organizer", 159 | "friends_count": 165, 160 | "location": "35.727614,-86.338707", 161 | "profile_link_color": "232626", 162 | "profile_image_url": "http://pbs.twimg.com/profile_images/556977228610035712/S733x3v9_normal.jpeg", 163 | "following": false, 164 | "geo_enabled": true, 165 | "profile_banner_url": "https://pbs.twimg.com/profile_banners/13553/1398258739", 166 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme14/bg.gif", 167 | "name": "Jason A Myers", 168 | "lang": "en", 169 | "profile_background_tile": true, 170 | "favourites_count": 2625, 171 | "screen_name": "jasonamyers", 172 | "notifications": false, 173 | "url": "http://t.co/xROdKIC4Sd", 174 | "created_at": "Tue Nov 21 16:20:38 +0000 2006", 175 | "contributors_enabled": false, 176 | "time_zone": null, 177 | "protected": false, 178 | "default_profile": false, 179 | "is_translator": false 180 | }, 181 | "geo": null, 182 | "in_reply_to_user_id_str": null, 183 | "lang": "en", 184 | "created_at": "Sat Jan 24 23:24:01 +0000 2015", 185 | "in_reply_to_status_id_str": null, 186 | "place": null 187 | } 188 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/561198982555533313.PyTennessee.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @PyTennessee: Placing order for speakers dinner... \"Can you just bring me all your hot chicken and banana pudding?\"", 6 | "in_reply_to_status_id": null, 7 | "id": 561201115904368640, 8 | "favorite_count": 0, 9 | "source": "Tweetbot for Mac", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 1616492725, 17 | "indices": [ 18 | 3, 19 | 15 20 | ], 21 | "id_str": "1616492725", 22 | "screen_name": "PyTennessee", 23 | "name": "PyTN" 24 | } 25 | ], 26 | "hashtags": [], 27 | "urls": [] 28 | }, 29 | "in_reply_to_screen_name": null, 30 | "id_str": "561201115904368640", 31 | "retweet_count": 1, 32 | "in_reply_to_user_id": null, 33 | "favorited": false, 34 | "retweeted_status": { 35 | "contributors": null, 36 | "truncated": false, 37 | "text": "Placing order for speakers dinner... \"Can you just bring me all your hot chicken and banana pudding?\"", 38 | "in_reply_to_status_id": null, 39 | "id": 561198982555533313, 40 | "favorite_count": 5, 41 | "source": "Tweetbot for Mac", 42 | "retweeted": false, 43 | "coordinates": null, 44 | "entities": { 45 | "symbols": [], 46 | "user_mentions": [], 47 | "hashtags": [], 48 | "urls": [] 49 | }, 50 | "in_reply_to_screen_name": null, 51 | "id_str": "561198982555533313", 52 | "retweet_count": 1, 53 | "in_reply_to_user_id": null, 54 | "favorited": false, 55 | "user": { 56 | "follow_request_sent": false, 57 | "profile_use_background_image": false, 58 | "profile_text_color": "333333", 59 | "default_profile_image": false, 60 | "id": 1616492725, 61 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 62 | "verified": false, 63 | "profile_location": null, 64 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 65 | "profile_sidebar_fill_color": "DDEEF6", 66 | "entities": { 67 | "url": { 68 | "urls": [ 69 | { 70 | "url": "http://t.co/NbO1HIEfBu", 71 | "indices": [ 72 | 0, 73 | 22 74 | ], 75 | "expanded_url": "http://www.pytennessee.org", 76 | "display_url": "pytennessee.org" 77 | } 78 | ] 79 | }, 80 | "description": { 81 | "urls": [] 82 | } 83 | }, 84 | "followers_count": 623, 85 | "profile_sidebar_border_color": "FFFFFF", 86 | "id_str": "1616492725", 87 | "profile_background_color": "F5F6F6", 88 | "listed_count": 39, 89 | "is_translation_enabled": false, 90 | "utc_offset": null, 91 | "statuses_count": 1740, 92 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 93 | "friends_count": 116, 94 | "location": "Nashville, TN", 95 | "profile_link_color": "2FC2EF", 96 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 97 | "following": false, 98 | "geo_enabled": false, 99 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 100 | "name": "PyTN", 101 | "lang": "en", 102 | "profile_background_tile": false, 103 | "favourites_count": 503, 104 | "screen_name": "PyTennessee", 105 | "notifications": false, 106 | "url": "http://t.co/NbO1HIEfBu", 107 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 108 | "contributors_enabled": false, 109 | "time_zone": null, 110 | "protected": false, 111 | "default_profile": false, 112 | "is_translator": false 113 | }, 114 | "geo": null, 115 | "in_reply_to_user_id_str": null, 116 | "lang": "en", 117 | "created_at": "Fri Jan 30 16:27:18 +0000 2015", 118 | "in_reply_to_status_id_str": null, 119 | "place": null 120 | }, 121 | "user": { 122 | "follow_request_sent": false, 123 | "profile_use_background_image": true, 124 | "profile_text_color": "333333", 125 | "default_profile_image": false, 126 | "id": 13553, 127 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme14/bg.gif", 128 | "verified": false, 129 | "profile_location": null, 130 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/556977228610035712/S733x3v9_normal.jpeg", 131 | "profile_sidebar_fill_color": "EFEFEF", 132 | "entities": { 133 | "url": { 134 | "urls": [ 135 | { 136 | "url": "http://t.co/xROdKIC4Sd", 137 | "indices": [ 138 | 0, 139 | 22 140 | ], 141 | "expanded_url": "http://www.jasonamyers.com", 142 | "display_url": "jasonamyers.com" 143 | } 144 | ] 145 | }, 146 | "description": { 147 | "urls": [] 148 | } 149 | }, 150 | "followers_count": 1035, 151 | "profile_sidebar_border_color": "EEEEEE", 152 | "id_str": "13553", 153 | "profile_background_color": "131516", 154 | "listed_count": 72, 155 | "is_translation_enabled": false, 156 | "utc_offset": null, 157 | "statuses_count": 9883, 158 | "description": "Openstack @Cisco Software Engineer, O'Reilly Author; Book, Coffee, and Cookie Lover; @PyTennessee @Nodevember and @PyNash Co-Organizer", 159 | "friends_count": 165, 160 | "location": "35.727614,-86.338707", 161 | "profile_link_color": "232626", 162 | "profile_image_url": "http://pbs.twimg.com/profile_images/556977228610035712/S733x3v9_normal.jpeg", 163 | "following": false, 164 | "geo_enabled": true, 165 | "profile_banner_url": "https://pbs.twimg.com/profile_banners/13553/1398258739", 166 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme14/bg.gif", 167 | "name": "Jason A Myers", 168 | "lang": "en", 169 | "profile_background_tile": true, 170 | "favourites_count": 2625, 171 | "screen_name": "jasonamyers", 172 | "notifications": false, 173 | "url": "http://t.co/xROdKIC4Sd", 174 | "created_at": "Tue Nov 21 16:20:38 +0000 2006", 175 | "contributors_enabled": false, 176 | "time_zone": null, 177 | "protected": false, 178 | "default_profile": false, 179 | "is_translator": false 180 | }, 181 | "geo": null, 182 | "in_reply_to_user_id_str": null, 183 | "lang": "en", 184 | "created_at": "Fri Jan 30 16:35:47 +0000 2015", 185 | "in_reply_to_status_id_str": null, 186 | "place": null 187 | } 188 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/561942855854592000.PyTennessee.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @PyTennessee: Before you show up next week make sure you understand our code of conduct! https://t.co/f6KU5SU97R", 6 | "in_reply_to_status_id": null, 7 | "id": 561943031641690112, 8 | "favorite_count": 0, 9 | "source": "Twitter Web Client", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 1616492725, 17 | "indices": [ 18 | 3, 19 | 15 20 | ], 21 | "id_str": "1616492725", 22 | "screen_name": "PyTennessee", 23 | "name": "PyTN" 24 | } 25 | ], 26 | "hashtags": [], 27 | "urls": [ 28 | { 29 | "url": "https://t.co/f6KU5SU97R", 30 | "indices": [ 31 | 92, 32 | 115 33 | ], 34 | "expanded_url": "https://www.pytennessee.org/about/conduct/", 35 | "display_url": "pytennessee.org/about/conduct/" 36 | } 37 | ] 38 | }, 39 | "in_reply_to_screen_name": null, 40 | "id_str": "561943031641690112", 41 | "retweet_count": 1, 42 | "in_reply_to_user_id": null, 43 | "favorited": false, 44 | "retweeted_status": { 45 | "contributors": null, 46 | "truncated": false, 47 | "text": "Before you show up next week make sure you understand our code of conduct! https://t.co/f6KU5SU97R", 48 | "in_reply_to_status_id": null, 49 | "id": 561942855854592000, 50 | "favorite_count": 2, 51 | "source": "Tweetbot for i\u039fS", 52 | "retweeted": false, 53 | "coordinates": null, 54 | "entities": { 55 | "symbols": [], 56 | "user_mentions": [], 57 | "hashtags": [], 58 | "urls": [ 59 | { 60 | "url": "https://t.co/f6KU5SU97R", 61 | "indices": [ 62 | 75, 63 | 98 64 | ], 65 | "expanded_url": "https://www.pytennessee.org/about/conduct/", 66 | "display_url": "pytennessee.org/about/conduct/" 67 | } 68 | ] 69 | }, 70 | "in_reply_to_screen_name": null, 71 | "id_str": "561942855854592000", 72 | "retweet_count": 1, 73 | "in_reply_to_user_id": null, 74 | "favorited": false, 75 | "user": { 76 | "follow_request_sent": false, 77 | "profile_use_background_image": false, 78 | "profile_text_color": "333333", 79 | "default_profile_image": false, 80 | "id": 1616492725, 81 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 82 | "verified": false, 83 | "profile_location": null, 84 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 85 | "profile_sidebar_fill_color": "DDEEF6", 86 | "entities": { 87 | "url": { 88 | "urls": [ 89 | { 90 | "url": "http://t.co/NbO1HIEfBu", 91 | "indices": [ 92 | 0, 93 | 22 94 | ], 95 | "expanded_url": "http://www.pytennessee.org", 96 | "display_url": "pytennessee.org" 97 | } 98 | ] 99 | }, 100 | "description": { 101 | "urls": [] 102 | } 103 | }, 104 | "followers_count": 623, 105 | "profile_sidebar_border_color": "FFFFFF", 106 | "id_str": "1616492725", 107 | "profile_background_color": "F5F6F6", 108 | "listed_count": 39, 109 | "is_translation_enabled": false, 110 | "utc_offset": null, 111 | "statuses_count": 1740, 112 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 113 | "friends_count": 116, 114 | "location": "Nashville, TN", 115 | "profile_link_color": "2FC2EF", 116 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 117 | "following": false, 118 | "geo_enabled": false, 119 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 120 | "name": "PyTN", 121 | "lang": "en", 122 | "profile_background_tile": false, 123 | "favourites_count": 503, 124 | "screen_name": "PyTennessee", 125 | "notifications": false, 126 | "url": "http://t.co/NbO1HIEfBu", 127 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 128 | "contributors_enabled": false, 129 | "time_zone": null, 130 | "protected": false, 131 | "default_profile": false, 132 | "is_translator": false 133 | }, 134 | "geo": null, 135 | "in_reply_to_user_id_str": null, 136 | "possibly_sensitive": false, 137 | "lang": "en", 138 | "created_at": "Sun Feb 01 17:43:11 +0000 2015", 139 | "in_reply_to_status_id_str": null, 140 | "place": null 141 | }, 142 | "user": { 143 | "follow_request_sent": false, 144 | "profile_use_background_image": true, 145 | "profile_text_color": "333333", 146 | "default_profile_image": false, 147 | "id": 14816130, 148 | "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/378800000180690916/g7l1hNSj.jpeg", 149 | "verified": false, 150 | "profile_location": null, 151 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000335592270/41d3de80d46968656b92414a5d4230ba_normal.jpeg", 152 | "profile_sidebar_fill_color": "F6FFD1", 153 | "entities": { 154 | "url": { 155 | "urls": [ 156 | { 157 | "url": "http://t.co/YCTYjT13Qs", 158 | "indices": [ 159 | 0, 160 | 22 161 | ], 162 | "expanded_url": "http://about.me/chrislaco", 163 | "display_url": "about.me/chrislaco" 164 | } 165 | ] 166 | }, 167 | "description": { 168 | "urls": [] 169 | } 170 | }, 171 | "followers_count": 755, 172 | "profile_sidebar_border_color": "000000", 173 | "id_str": "14816130", 174 | "profile_background_color": "FFF04D", 175 | "listed_count": 73, 176 | "is_translation_enabled": false, 177 | "utc_offset": -18000, 178 | "statuses_count": 31735, 179 | "description": "Racker. Private Cloud Engineering. Rails lover. Perl dude. Python victim. Pushing OpenStack into the brain. StartupBus Three Timer!", 180 | "friends_count": 449, 181 | "location": "Tallmadge, OH", 182 | "profile_link_color": "0099CC", 183 | "profile_image_url": "http://pbs.twimg.com/profile_images/378800000335592270/41d3de80d46968656b92414a5d4230ba_normal.jpeg", 184 | "following": false, 185 | "geo_enabled": true, 186 | "profile_banner_url": "https://pbs.twimg.com/profile_banners/14816130/1399520630", 187 | "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/378800000180690916/g7l1hNSj.jpeg", 188 | "name": "Nerd Lump", 189 | "lang": "en", 190 | "profile_background_tile": false, 191 | "favourites_count": 474, 192 | "screen_name": "claco", 193 | "notifications": false, 194 | "url": "http://t.co/YCTYjT13Qs", 195 | "created_at": "Sun May 18 00:24:31 +0000 2008", 196 | "contributors_enabled": false, 197 | "time_zone": "Eastern Time (US & Canada)", 198 | "protected": false, 199 | "default_profile": false, 200 | "is_translator": false 201 | }, 202 | "geo": null, 203 | "in_reply_to_user_id_str": null, 204 | "possibly_sensitive": false, 205 | "lang": "en", 206 | "created_at": "Sun Feb 01 17:43:53 +0000 2015", 207 | "in_reply_to_status_id_str": null, 208 | "place": null 209 | } 210 | ] -------------------------------------------------------------------------------- /materials/data/statuses/retweets/561944713054269440.2braids.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "contributors": null, 4 | "truncated": false, 5 | "text": "RT @2braids: Excited to see the #PyTN2015 speakers tweet & blog about their upcoming talks: next weekend will be a fantastic experience for\u2026", 6 | "in_reply_to_status_id": null, 7 | "id": 561946195804033024, 8 | "favorite_count": 0, 9 | "source": "Tweetbot for i\u039fS", 10 | "retweeted": false, 11 | "coordinates": null, 12 | "entities": { 13 | "symbols": [], 14 | "user_mentions": [ 15 | { 16 | "id": 11607452, 17 | "indices": [ 18 | 3, 19 | 11 20 | ], 21 | "id_str": "11607452", 22 | "screen_name": "2braids", 23 | "name": "K Lars Lohn" 24 | } 25 | ], 26 | "hashtags": [ 27 | { 28 | "indices": [ 29 | 32, 30 | 41 31 | ], 32 | "text": "PyTN2015" 33 | } 34 | ], 35 | "urls": [] 36 | }, 37 | "in_reply_to_screen_name": null, 38 | "id_str": "561946195804033024", 39 | "retweet_count": 1, 40 | "in_reply_to_user_id": null, 41 | "favorited": false, 42 | "retweeted_status": { 43 | "contributors": null, 44 | "truncated": false, 45 | "text": "Excited to see the #PyTN2015 speakers tweet & blog about their upcoming talks: next weekend will be a fantastic experience for all of us", 46 | "in_reply_to_status_id": null, 47 | "id": 561944713054269440, 48 | "favorite_count": 4, 49 | "source": "Twitter Web Client", 50 | "retweeted": false, 51 | "coordinates": null, 52 | "entities": { 53 | "symbols": [], 54 | "user_mentions": [], 55 | "hashtags": [ 56 | { 57 | "indices": [ 58 | 19, 59 | 28 60 | ], 61 | "text": "PyTN2015" 62 | } 63 | ], 64 | "urls": [] 65 | }, 66 | "in_reply_to_screen_name": null, 67 | "id_str": "561944713054269440", 68 | "retweet_count": 1, 69 | "in_reply_to_user_id": null, 70 | "favorited": false, 71 | "user": { 72 | "follow_request_sent": false, 73 | "profile_use_background_image": false, 74 | "profile_text_color": "0C3E53", 75 | "default_profile_image": false, 76 | "id": 11607452, 77 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", 78 | "verified": false, 79 | "profile_location": null, 80 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/443907827443044352/n4Oh_JS0_normal.jpeg", 81 | "profile_sidebar_fill_color": "DCF1C6", 82 | "entities": { 83 | "url": { 84 | "urls": [ 85 | { 86 | "url": "http://t.co/e0nZyNFAqD", 87 | "indices": [ 88 | 0, 89 | 22 90 | ], 91 | "expanded_url": "http://twobraids.com", 92 | "display_url": "twobraids.com" 93 | } 94 | ] 95 | }, 96 | "description": { 97 | "urls": [] 98 | } 99 | }, 100 | "followers_count": 487, 101 | "profile_sidebar_border_color": "43423D", 102 | "id_str": "11607452", 103 | "profile_background_color": "ADD8A6", 104 | "listed_count": 46, 105 | "is_translation_enabled": false, 106 | "utc_offset": -28800, 107 | "statuses_count": 1816, 108 | "description": "Torn between being an organic hippie freak and a biker, I live in a yurt on an organic farm in Oregon and work for Mozilla.", 109 | "friends_count": 70, 110 | "location": "", 111 | "profile_link_color": "D25151", 112 | "profile_image_url": "http://pbs.twimg.com/profile_images/443907827443044352/n4Oh_JS0_normal.jpeg", 113 | "following": false, 114 | "geo_enabled": false, 115 | "profile_banner_url": "https://pbs.twimg.com/profile_banners/11607452/1394670944", 116 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", 117 | "name": "K Lars Lohn", 118 | "lang": "en", 119 | "profile_background_tile": false, 120 | "favourites_count": 74, 121 | "screen_name": "2braids", 122 | "notifications": false, 123 | "url": "http://t.co/e0nZyNFAqD", 124 | "created_at": "Fri Dec 28 16:23:33 +0000 2007", 125 | "contributors_enabled": false, 126 | "time_zone": "Pacific Time (US & Canada)", 127 | "protected": false, 128 | "default_profile": false, 129 | "is_translator": false 130 | }, 131 | "geo": null, 132 | "in_reply_to_user_id_str": null, 133 | "lang": "en", 134 | "created_at": "Sun Feb 01 17:50:34 +0000 2015", 135 | "in_reply_to_status_id_str": null, 136 | "place": null 137 | }, 138 | "user": { 139 | "follow_request_sent": false, 140 | "profile_use_background_image": false, 141 | "profile_text_color": "333333", 142 | "default_profile_image": false, 143 | "id": 1616492725, 144 | "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif", 145 | "verified": false, 146 | "profile_location": null, 147 | "profile_image_url_https": "https://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 148 | "profile_sidebar_fill_color": "DDEEF6", 149 | "entities": { 150 | "url": { 151 | "urls": [ 152 | { 153 | "url": "http://t.co/NbO1HIEfBu", 154 | "indices": [ 155 | 0, 156 | 22 157 | ], 158 | "expanded_url": "http://www.pytennessee.org", 159 | "display_url": "pytennessee.org" 160 | } 161 | ] 162 | }, 163 | "description": { 164 | "urls": [] 165 | } 166 | }, 167 | "followers_count": 623, 168 | "profile_sidebar_border_color": "FFFFFF", 169 | "id_str": "1616492725", 170 | "profile_background_color": "F5F6F6", 171 | "listed_count": 39, 172 | "is_translation_enabled": false, 173 | "utc_offset": null, 174 | "statuses_count": 1740, 175 | "description": "A regional Python conference being held in Nashville, TN February 6th-8th, 2015", 176 | "friends_count": 116, 177 | "location": "Nashville, TN", 178 | "profile_link_color": "2FC2EF", 179 | "profile_image_url": "http://pbs.twimg.com/profile_images/460579028949159936/acN-FmRD_normal.jpeg", 180 | "following": false, 181 | "geo_enabled": false, 182 | "profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif", 183 | "name": "PyTN", 184 | "lang": "en", 185 | "profile_background_tile": false, 186 | "favourites_count": 503, 187 | "screen_name": "PyTennessee", 188 | "notifications": false, 189 | "url": "http://t.co/NbO1HIEfBu", 190 | "created_at": "Wed Jul 24 01:02:21 +0000 2013", 191 | "contributors_enabled": false, 192 | "time_zone": null, 193 | "protected": false, 194 | "default_profile": false, 195 | "is_translator": false 196 | }, 197 | "geo": null, 198 | "in_reply_to_user_id_str": null, 199 | "lang": "en", 200 | "created_at": "Sun Feb 01 17:56:28 +0000 2015", 201 | "in_reply_to_status_id_str": null, 202 | "place": null 203 | } 204 | ] -------------------------------------------------------------------------------- /materials/images/centrality1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/images/centrality1.png -------------------------------------------------------------------------------- /materials/images/centrality2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/images/centrality2.png -------------------------------------------------------------------------------- /materials/images/circular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/images/circular.png -------------------------------------------------------------------------------- /materials/images/fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/images/fr.png -------------------------------------------------------------------------------- /materials/images/graph-paths.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/images/graph-paths.png -------------------------------------------------------------------------------- /materials/images/graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/images/graph.png -------------------------------------------------------------------------------- /materials/images/random.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/images/random.png -------------------------------------------------------------------------------- /materials/images/shell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/images/shell.png -------------------------------------------------------------------------------- /materials/images/spectral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/images/spectral.png -------------------------------------------------------------------------------- /materials/images/spring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/images/spring.png -------------------------------------------------------------------------------- /materials/images/twitter-tokens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/images/twitter-tokens.png -------------------------------------------------------------------------------- /materials/networkx/NetworkX (not used) -- Importing and Exporting data.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "name": "", 4 | "signature": "sha256:3f3a03f34a66e47363f613301150c1856a886399d7ca97c45edcdb324e22838b" 5 | }, 6 | "nbformat": 3, 7 | "nbformat_minor": 0, 8 | "worksheets": [ 9 | { 10 | "cells": [ 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "## Part 2 -- Importing and Exporting a Graph\n", 16 | "\n", 17 | "Let's first export a graph so that we can see what kind of file format NetworkX imports and exports to.\n", 18 | "\n", 19 | "So, let's generate the same graph that we used from the previous exercise:" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "collapsed": false, 25 | "input": [ 26 | "import networkx as nx\n", 27 | "\n", 28 | "# create a new graph\n", 29 | "g = nx.Graph()\n", 30 | "\n", 31 | "# let's attach a size attribute to each node to describe how big we want the node to be\n", 32 | "g.add_node(1, {'size': 100})\n", 33 | "g.add_node(2, {'size': 200})\n", 34 | "g.add_node(4, {'size': 400})\n", 35 | "\n", 36 | "# let's use the edge attribute to describe how thick we want that edge to be\n", 37 | "g.add_edge(1,2, { 'thickness': 1})\n", 38 | "g.add_edge(2,4, { 'thickness': 10})\n", 39 | "\n", 40 | "def plot_graph(g):\n", 41 | " # let's iterate through the nodes and edges and extract the list of node & edge sizes\n", 42 | " node_size = [attribs['size'] for (node, attribs) in g.nodes(data=True)]\n", 43 | " edge_thickness = [attribs['thickness'] for (v_from, v_to, attribs) in g.edges(data=True)]\n", 44 | "\n", 45 | " LIGHT_BLUE = '#A0CBE2'\n", 46 | "\n", 47 | " nx.draw(g, \n", 48 | " node_size = node_size, # node_size can either take a single value (where all nodes will be size N),\n", 49 | " # or a list of values, where Nth list value will be the size for the Nth node\n", 50 | " with_labels = True,\n", 51 | " width = edge_thickness, # similarly, the Nth value corresponds to the width for edge N\n", 52 | " node_color = LIGHT_BLUE,\n", 53 | " edge_color = LIGHT_BLUE,\n", 54 | " font_size = 15\n", 55 | " )\n", 56 | " \n", 57 | "plot_graph(g)" 58 | ], 59 | "language": "python", 60 | "metadata": {}, 61 | "outputs": [] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "metadata": {}, 66 | "source": [ 67 | "### Exporting to a file\n", 68 | "\n", 69 | "We can use NetworkX's json_graph module to save the graph as a JSON file:" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "collapsed": false, 75 | "input": [ 76 | "edgelist_txt = 'retweet_relationships/retweets.txt'\n", 77 | "G = nx.read_edgelist(edgelist_txt, create_using=nx.DiGraph())" 78 | ], 79 | "language": "python", 80 | "metadata": {}, 81 | "outputs": [] 82 | }, 83 | { 84 | "cell_type": "markdown", 85 | "metadata": {}, 86 | "source": [ 87 | "If you want to attach attributes to nodes and edges, you'll need a file format that can save that info. The JSON formatter can do this:" 88 | ] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "collapsed": false, 93 | "input": [ 94 | "from networkx.readwrite import json_graph\n", 95 | "string_result = json_graph.dumps(g, indent=4)\n", 96 | "\n", 97 | "#let's see what it looks like\n", 98 | "print string_result\n", 99 | "\n", 100 | "#and then let's also save it into a file\n", 101 | "with open('test_graph.json', 'w') as f:\n", 102 | " f.write(string_result)" 103 | ], 104 | "language": "python", 105 | "metadata": {}, 106 | "outputs": [] 107 | }, 108 | { 109 | "cell_type": "markdown", 110 | "metadata": {}, 111 | "source": [ 112 | "### Importing from a file\n", 113 | "\n", 114 | "Similarly, we can use json_graph to generate a graph from JSON:" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "collapsed": false, 120 | "input": [ 121 | "with open('test_graph.json', 'r') as f:\n", 122 | " H = json_graph.loads(f.read())\n", 123 | "\n", 124 | "plot_graph(H)" 125 | ], 126 | "language": "python", 127 | "metadata": {}, 128 | "outputs": [] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": {}, 133 | "source": [ 134 | "### Quiz 1: Try modifying the JSON file to create a graph that looks like this:\n", 135 | "\n", 136 | "" 137 | ] 138 | }, 139 | { 140 | "cell_type": "code", 141 | "collapsed": false, 142 | "input": [ 143 | "# use this to test your json file:\n", 144 | "\n", 145 | "with open('test_graph.json', 'r') as f:\n", 146 | " H = json_graph.loads(f.read())\n", 147 | "\n", 148 | "plot_graph(H)" 149 | ], 150 | "language": "python", 151 | "metadata": {}, 152 | "outputs": [] 153 | }, 154 | { 155 | "cell_type": "markdown", 156 | "metadata": {}, 157 | "source": [ 158 | "### Question: What happens if you change \"directed\" from false to true?" 159 | ] 160 | } 161 | ], 162 | "metadata": {} 163 | } 164 | ] 165 | } -------------------------------------------------------------------------------- /materials/networkx/NetworkX, Part 1 -- nodes, edges, attributes - ANSWER KEY.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "name": "", 4 | "signature": "sha256:5ef87bdceb1ba36f203971836cd39d686ee6f68a57ac3b9664c2d95c31a5215d" 5 | }, 6 | "nbformat": 3, 7 | "nbformat_minor": 0, 8 | "worksheets": [ 9 | { 10 | "cells": [ 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### Quiz 1: How would you draw the following graph?\n", 16 | "\n", 17 | "" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "collapsed": false, 23 | "input": [ 24 | "# One possible answer\n", 25 | "import networkx as nx\n", 26 | "\n", 27 | "LIGHT_BLUE = '#A0CBE2'\n", 28 | "\n", 29 | "g = nx.Graph()\n", 30 | "g.add_edge('A', 'B')\n", 31 | "g.add_edge('B', 'D')\n", 32 | "g.add_edge('D', 'C')\n", 33 | "g.add_edge('D', 'E')\n", 34 | "g.add_edge('D', 'F')\n", 35 | "\n", 36 | "nx.draw(g, node_color = LIGHT_BLUE)" 37 | ], 38 | "language": "python", 39 | "metadata": {}, 40 | "outputs": [] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "#### Quiz 2: How would you make the following graph?\n", 47 | "\n", 48 | "" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "collapsed": false, 54 | "input": [ 55 | "# One possible answer\n", 56 | "\n", 57 | "g = nx.Graph()\n", 58 | "g.add_node(1, {'size': 800})\n", 59 | "g.add_node(2, {'size': 200})\n", 60 | "g.add_node(3, {'size': 200})\n", 61 | "g.add_node(4, {'size': 200})\n", 62 | "g.add_node(5, {'size': 200})\n", 63 | "\n", 64 | "g.add_edge(1,2, { 'thickness': 20})\n", 65 | "g.add_edge(1,3, { 'thickness': 20})\n", 66 | "g.add_edge(1,4, { 'thickness': 20})\n", 67 | "g.add_edge(1,5, { 'thickness': 20})\n", 68 | "g.add_edge(2,3, { 'thickness': 5})\n", 69 | "g.add_edge(3,4, { 'thickness': 5})\n", 70 | "g.add_edge(4,5, { 'thickness': 5})\n", 71 | "g.add_edge(5,2, { 'thickness': 5})\n", 72 | "\n", 73 | "node_size = [attribs['size'] for (v, attribs) in g.nodes(data=True)]\n", 74 | "edge_thickness = [attribs['thickness'] for (v_from, v_to, attribs) in g.edges(data=True)]\n", 75 | "\n", 76 | "nx.draw(g, \n", 77 | " node_size = node_size, # Nth value in node_size corresponds to Nth node\n", 78 | " with_labels = True,\n", 79 | " width = edge_thickness, # Nth value in width corresponds to Nth edge\n", 80 | " node_color = LIGHT_BLUE,\n", 81 | " edge_color = LIGHT_BLUE,\n", 82 | " font_size = 15\n", 83 | ")" 84 | ], 85 | "language": "python", 86 | "metadata": {}, 87 | "outputs": [] 88 | } 89 | ], 90 | "metadata": {} 91 | } 92 | ] 93 | } -------------------------------------------------------------------------------- /materials/networkx/files/simple_path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/networkx/files/simple_path.png -------------------------------------------------------------------------------- /materials/networkx/spring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/networkx/spring.png -------------------------------------------------------------------------------- /materials/tutorial/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "CONSUMER_KEY": "[Consumer Key (API Key)]", 3 | "CONSUMER_SECRET": "[Consumer Secret (API Secret)]", 4 | "ACCESS_TOKEN": "[Access Token]", 5 | "ACCESS_SECRET": "[Access Token Secret]" 6 | } -------------------------------------------------------------------------------- /materials/twitter/Step 1 -- Obtaining Twitter API Tokens.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "name": "", 4 | "signature": "sha256:b2b26dd3138bcfa9e1c592f4a0ba9247c897342f5e428a2d96e732e120d873b4" 5 | }, 6 | "nbformat": 3, 7 | "nbformat_minor": 0, 8 | "worksheets": [ 9 | { 10 | "cells": [ 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "## Obtaining Twitter API Tokens\n", 16 | "\n", 17 | "This notebook explains how to obtain Consumer and Access Tokens, which you'll need to use the Twitter API using OAuth2.\n", 18 | "\n", 19 | "### Create a new Twitter App\n", 20 | "\n", 21 | "Twitter assumes that someone using the Twitter API is most likely creating an app. So, in order to obtain API tokens, we'll have to go through their interface and create a dummy app:\n", 22 | "\n", 23 | "\n", 24 | "\n", 25 | "* Go to (https://apps.twitter.com/) and click **\"Create New App\"**\n", 26 | "* You'll need to fill in:\n", 27 | " * **Name, Description and Website**. For my website, I entered my github page, but you can enter any URL that belongs to you\n", 28 | " * You can leave Callback URL empty\n", 29 | " * Check that you **agree to the Developer Agreement**\n", 30 | " * Click **\"Create your Twitter Application\"**" 31 | ] 32 | }, 33 | { 34 | "cell_type": "markdown", 35 | "metadata": {}, 36 | "source": [ 37 | "### Generate an Access Token & Secret\n", 38 | "\n", 39 | "You should now be on the management page for your new app. Click on the **Keys and Access Tokens** tab:\n", 40 | "\n", 41 | "" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": {}, 47 | "source": [ 48 | "Under **Application Settings**, you'll see **Consumer Key and Consumer Secret**, which you want. But you also need an **Access Token & Secret**, which you'll have to generate:\n", 49 | "\n", 50 | "* Scroll to the bottom of the page, and click on **\"Create my access token\"** (under Your Access Token, Token Actions)\n", 51 | "* Under **Your Access Token** you should now see your **Access Token and Access Token Secret**" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "Now that you have these four values:\n", 59 | " \n", 60 | "* Consumer Key (API Key)\n", 61 | "* Consumer Secret (API Secret)\n", 62 | "* Access Token\n", 63 | "* Access Token Secret\n", 64 | "\n", 65 | "...copy them somewhere: You'll need them in Step 2, where we make the API calls to Twitter." 66 | ] 67 | } 68 | ], 69 | "metadata": {} 70 | } 71 | ] 72 | } -------------------------------------------------------------------------------- /materials/twitter/config.py: -------------------------------------------------------------------------------- 1 | # These are the tokens obtained from https://apps.twitter.com/ 2 | 3 | CONSUMER_KEY = "" # Consumer Key (API Key) 4 | CONSUMER_SECRET = "" # Consumer Secret (API Secret) 5 | ACCESS_TOKEN = "" # Access Token 6 | ACCESS_SECRET = "" # Access Token Secret 7 | -------------------------------------------------------------------------------- /materials/twitter/files/image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/twitter/files/image1.png -------------------------------------------------------------------------------- /materials/twitter/files/image2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarguido/networkx-tutorial/8a15bfcded69415936c81055b429dd22348f481a/materials/twitter/files/image2.png -------------------------------------------------------------------------------- /notebooks/lesson.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "name": "", 4 | "signature": "sha256:fc1b874e6f7052dfd5fba2c45e75d57c0226f6e985abcbaa2759a79fc43488fb" 5 | }, 6 | "nbformat": 3, 7 | "nbformat_minor": 0, 8 | "worksheets": [ 9 | { 10 | "cells": [ 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "# Making networks with Twitter data\n", 16 | "\n", 17 | "This notebook will walk you through how to create and analyze networks using Twitter data.\n", 18 | "\n", 19 | "## Data preprocessing: getting data into NetworkX\n", 20 | "\n", 21 | "To make a network in NetworkX using external data, the nodes and the connections between them must be represented by pairs of tuples. In this first section, we'll walk through some data preprocessing techniques together to get our data ready for analysis.\n", 22 | "\n", 23 | "Let's take a look at the data we're working with." 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "collapsed": false, 29 | "input": [ 30 | "import json\n", 31 | "f = open('../materials/data/friends/list.PyTennessee.json')\n", 32 | "\n", 33 | "data = json.load(f)\n", 34 | "pairs = []\n", 35 | "\n", 36 | "for user in data['users']:\n", 37 | " pairs.append(('PyTennessee', str(user['screen_name'])))\n", 38 | "\n", 39 | "pairs[:10]" 40 | ], 41 | "language": "python", 42 | "metadata": {}, 43 | "outputs": [] 44 | }, 45 | { 46 | "cell_type": "markdown", 47 | "metadata": {}, 48 | "source": [ 49 | "If you run the section below, we'll end up with all of the friend and follower pairs across all of the files. You should end up with 1286 pairs." 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "collapsed": false, 55 | "input": [ 56 | "# Because the relationship data is split across files, we need to\n", 57 | "# walk through all of them to get the data.\n", 58 | "import os\n", 59 | "\n", 60 | "for (dir_path, dir_names, file_names) in os.walk('../materials/data/friend_relationships/'):\n", 61 | " files = file_names\n", 62 | " \n", 63 | "for file_name in files:\n", 64 | " with open('../materials/data/friend_relationships/' + file_name) as p:\n", 65 | " pair_data = json.load(p)\n", 66 | " for k in pair_data.keys():\n", 67 | " twitter_pair = k.split()\n", 68 | " if pair_data[k]['relationship']['source']['following'] is True:\n", 69 | " pairs.append((str(twitter_pair[0]), str(twitter_pair[1])))\n", 70 | " elif pair_data[k]['relationship']['source']['followed_by'] is True:\n", 71 | " pairs.append((str(twitter_pair[1]), str(twitter_pair[0])))\n", 72 | " \n", 73 | "len(pairs)" 74 | ], 75 | "language": "python", 76 | "metadata": {}, 77 | "outputs": [] 78 | }, 79 | { 80 | "cell_type": "markdown", 81 | "metadata": {}, 82 | "source": [ 83 | "## Make networks with Twitter data\n", 84 | "\n", 85 | "Using the NetworkX methods we've learned before, let's do some network analysis on PyTennessee's Twitter friends. We're going to look at the Twitter handles that PyTennessee follows, as well as the relationships between those handles.\n", 86 | "\n", 87 | "### Undirected graph" 88 | ] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "collapsed": false, 93 | "input": [ 94 | "%matplotlib inline\n", 95 | "import networkx as nx\n", 96 | "\n", 97 | "# Build an undirected graph." 98 | ], 99 | "language": "python", 100 | "metadata": {}, 101 | "outputs": [] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "collapsed": false, 106 | "input": [ 107 | "# Just from looking at it, is this network connected or unconnected?\n" 108 | ], 109 | "language": "python", 110 | "metadata": {}, 111 | "outputs": [] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "collapsed": false, 116 | "input": [ 117 | "# Hint: if you want to sort a dictionary to easily \n", 118 | "# find the highest and lowest values, use this function \n", 119 | "# on the output of the centrality measures like degree_centrality():\n", 120 | "\n", 121 | "import operator\n", 122 | "\n", 123 | "def centrality_sort(centrality_dict):\n", 124 | " return sorted(centrality_dict.iteritems(), key=operator.itemgetter(1))\n", 125 | "\n", 126 | "# ex. degree_sorted = centrality_sort(degree_vals)" 127 | ], 128 | "language": "python", 129 | "metadata": {}, 130 | "outputs": [] 131 | }, 132 | { 133 | "cell_type": "code", 134 | "collapsed": false, 135 | "input": [ 136 | "# Which nodes have the highest/lowest degree centrality?\n" 137 | ], 138 | "language": "python", 139 | "metadata": {}, 140 | "outputs": [] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "collapsed": false, 145 | "input": [ 146 | "# Which nodes have the highest/lowest betweenness centrality?\n" 147 | ], 148 | "language": "python", 149 | "metadata": {}, 150 | "outputs": [] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "collapsed": false, 155 | "input": [ 156 | "# Which nodes have the highest/lowest closeness centrality?\n" 157 | ], 158 | "language": "python", 159 | "metadata": {}, 160 | "outputs": [] 161 | }, 162 | { 163 | "cell_type": "code", 164 | "collapsed": false, 165 | "input": [ 166 | "# Let's look at subsections of the graph. We'll do this together.\n" 167 | ], 168 | "language": "python", 169 | "metadata": {}, 170 | "outputs": [] 171 | }, 172 | { 173 | "cell_type": "markdown", 174 | "metadata": {}, 175 | "source": [ 176 | "### Directed graph\n", 177 | "\n", 178 | "Let's add some direction to the graph. When we processed our data, we ordered the pairs so that the first handle in the pair is a follower of the second handle. We're not worrying about pairs that mutually follow each other right now." 179 | ] 180 | }, 181 | { 182 | "cell_type": "code", 183 | "collapsed": false, 184 | "input": [ 185 | "# Build a directed graph.\n" 186 | ], 187 | "language": "python", 188 | "metadata": {}, 189 | "outputs": [] 190 | }, 191 | { 192 | "cell_type": "code", 193 | "collapsed": false, 194 | "input": [ 195 | "# Run some degree centrality measures for directed graphs:\n", 196 | "# in_degree_centrality(): number of incoming connections (number of people following you)\n", 197 | "# out_degree_centrality(): number of outgoing connections (number of people you follow)\n" 198 | ], 199 | "language": "python", 200 | "metadata": {}, 201 | "outputs": [] 202 | }, 203 | { 204 | "cell_type": "code", 205 | "collapsed": false, 206 | "input": [ 207 | "# Let's look at subsections of the graph. Just like we did above.\n", 208 | "\n", 209 | "# Top 20 highest in-degree centrality scores:\n" 210 | ], 211 | "language": "python", 212 | "metadata": {}, 213 | "outputs": [] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "collapsed": false, 218 | "input": [ 219 | "# Top 20 highest out-degree centrality scores:\n" 220 | ], 221 | "language": "python", 222 | "metadata": {}, 223 | "outputs": [] 224 | }, 225 | { 226 | "cell_type": "markdown", 227 | "metadata": {}, 228 | "source": [ 229 | "### Network models\n", 230 | "\n", 231 | "Does our network match any of the network models we discussed earlier?" 232 | ] 233 | }, 234 | { 235 | "cell_type": "code", 236 | "collapsed": false, 237 | "input": [ 238 | "# Analyze the models here.\n" 239 | ], 240 | "language": "python", 241 | "metadata": {}, 242 | "outputs": [] 243 | }, 244 | { 245 | "cell_type": "markdown", 246 | "metadata": {}, 247 | "source": [ 248 | "# Back to [tutorial.ipynb](http://localhost:8888/notebooks/notebooks/tutorial.ipynb#visual) for Visualizations!" 249 | ] 250 | } 251 | ], 252 | "metadata": {} 253 | } 254 | ] 255 | } --------------------------------------------------------------------------------