├── .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 | }
--------------------------------------------------------------------------------