There has been a lot of talk about "raping the vote pool." I've gone so far as to say that there are actual manifest Whale Wars going on, that we are in the Age of Warlords – an era dominated by tribal strife led by strong men.
But what does that look like?
Here's what I want to know: if I take all of the votes that involve one of the strongmen in question for the last week, what do they look like? What is the nature of the beast we so observe?
Basically, I get to play with pretty pictures!
Cutting In
The first thing that we're going to need is access to the database in order to derive our voting patterns and access to our graphing systems but we can create the result.
Lucky for us, we have most of that code lying around in other notebooks.
# Setting up the imports for our basic query tools
from steemdata import SteemData
import datetime
from datetime import datetime as dt
from pprint import pprint
from collections import defaultdict as DD
# Init connection to database
db = SteemData()
# Let's put our account on interest here in a list. One day
# we might want to generalize to more than one.
intL =['haejin']
# We want only the vote transactions which have happened
# in the last week AND involve only our accounts of interest.
query = {
'type' : 'vote',
'timestamp' : {'$gte': dt.now() - datetime.timedelta(days=7)},
'$or': [{'author': {'$in': intL}}
# {'voter': {'$in': intL}}]
]}
proj = {'voter': 1, 'author': 1, 'weight': 1, '_id': 0}
%%time
result = db.Operations.find(query,
projection=proj)
voteHL = list(result)
Wall time: 1.4 s
len(voteHL)
29620
30,000 votes in the last week for which Haejin has been either the author or the target. That's pretty significant.
But I can see from the Robo RT window I have to do my probing database queries in that there are more than a few of those votes which are Haejin self voting. Now, I'm not against that kind of behavior – I encourage it if that's what you want to do – but I'm wondering how much of the activity in the last week is self voting.
matchCount = 0
for e in voteHL:
if e['voter'] == e['author']:
matchCount += 1
matchCount
88
Only just under 90 of those votes are self-voting, which comes as sort of a surprise to me, all told. For a guy accused of fiscal rape, he's terribly restrained. Well, 90 self-votes in two weeks is sort of self-involved.
So we have a good idea of what those votes contain. Is there anything more we can determine about the set?
Throwing Spaghetti
Sure! We know that votes fall into two categories, especially in dealing with this set. There are positive votes and there are flags/negative votes.
I think it would be terribly interesting to get an idea of how many votes go which direction for Haejin. Remember, these are just from the last week.
from graphviz import Digraph
dot = Digraph(comment="Haejin Vote Relations",
format="jpg",
engine="sfdp")
dot.attr('graph', overlap='false')
dot.attr('graph', ratio='auto')
dot.attr('graph', size='10000000,10000000')
dot.attr('graph', start='1.0')
dot.attr('graph', K='10')
dot.attr('graph', margin='5')
dot.attr('node', shape='square',
style='filled', color='black',
fillcolor='white')
# We'll add Haejin here right to the middle prominantly.
dot.node('haejin', 'haejin')
What we need here is to accumulate a list of edges, differentiating the ones which are up votes and the ones which are flags, because we will make them look different on the graph.
I'm sure that a lot of these votes involve differing posts, so it's probably in our best interest at this stage to build an accumulator which makes votes unique on a per transaction basis but gives them their cumulative vote value.
It's easier to do than to talk about.
# Initialize our accumulators to be zeros for uninitalized queries
upvotes = DD(int)
downvotes = DD(int)
for v in voteHL:
# We'll just use this tuple as a key for ease
VA = v['voter'], v['author']
if not VA[0] == VA[1]:
if v['weight'] >= 0:
upvotes[VA] += v['weight']/100
else:
downvotes[VA] += (-v['weight'])/100
Ultimately, how many of each kind of vote are we talking about here? This is unified by voter/author, remember.
It should be considerably less than the 29,000 votes in total, but how much less?
len(upvotes.keys()), len(downvotes.keys())
(4181, 132)
That I was not expecting.
In the last week there have been 4200 individual entities which have uploaded Haejin's content and only 140-so individual entities that have flagged it. Considering how much bullshit has been thrown around online about how big a deal this is, I was expecting some bigger numbers.
Now that we have some content, however – let's get it onto a graph.
We're definitely going to want to work with some sort of measure of what our total accumulated up-and-down votes are, so let's calculate those.
totUpvotes = sum([upvotes[e] for e in upvotes.keys()])
totUpvotes
2356194.9499999993
totDownvotes = sum([downvotes[e] for e in downvotes.keys()])
totDownvotes
209664.91
When working with some of the early versions of this, I noticed something odd – there were people who had both voted up and flagged Haejin's content. That looked very strange, to put it mildly, so I thought it would be useful to mark those people on the graph in some way.
In the last week, there were 28.
# Everyone who's both upvoted and downvoted @haejin will get a bright warning box.
dot.attr('node', shape='rectangle', fontcolor='white', fillcolor='purple')
uvL = [e[0] for e in upvotes.keys()]
dvL = [e[0] for e in downvotes.keys()]
for e in dvL:
if e in uvL:
dot.node(e, e)
bothS = set()
for e in dvL:
if e in uvL:
bothS.add(e)
print(bothS, len(bothS))
{'danknugs', 'thesloth', 'randomthoughts', 'williamcrypt97', 'hendrix22', 'steemservices', 'method8', 'speakyourmind', 'youareyourowngod', 'berniesanders', 'thebotkiller', 'engagement', 'saea', 'anondelegate', 'dev1993', 'theyeti', 'teamnz', 'yougotflagged', 'the.bot', 'ngc', 'morten', 'ozchartart', 'rewardpoolrape', 'thecyclist', 'nextgencrypto', 'rudcharts', 'ghmboyan', 'moeknows'} 28
for v in bothS:
print('Voter: @{:16}, Up: {:7.2f}, Down: {:9.2f}'.format(v, upvotes[(v, 'haejin')],
downvotes[v, 'haejin']))
Voter: @danknugs , Up: 125.00, Down: 364.00
Voter: @thesloth , Up: 125.00, Down: 364.00
Voter: @randomthoughts , Up: 125.00, Down: 364.00
Voter: @williamcrypt97 , Up: 200.00, Down: 4500.00
Voter: @hendrix22 , Up: 0.00, Down: 10304.00
Voter: @steemservices , Up: 200.00, Down: 364.00
Voter: @method8 , Up: 200.00, Down: 100.00
Voter: @speakyourmind , Up: 125.00, Down: 364.00
Voter: @youareyourowngod, Up: 75.00, Down: 100.00
Voter: @berniesanders , Up: 125.00, Down: 364.00
Voter: @thebotkiller , Up: 125.00, Down: 364.00
Voter: @engagement , Up: 125.00, Down: 364.00
Voter: @saea , Up: 0.00, Down: 100.00
Voter: @anondelegate , Up: 100.00, Down: 1100.00
Voter: @dev1993 , Up: 300.00, Down: 100.00
Voter: @theyeti , Up: 125.00, Down: 364.00
Voter: @teamnz , Up: 0.00, Down: 100.00
Voter: @yougotflagged , Up: 125.00, Down: 364.00
Voter: @the.bot , Up: 125.00, Down: 364.00
Voter: @ngc , Up: 125.00, Down: 364.00
Voter: @morten , Up: 200.00, Down: 2900.00
Voter: @ozchartart , Up: 125.00, Down: 364.00
Voter: @rewardpoolrape , Up: 125.00, Down: 364.00
Voter: @thecyclist , Up: 125.00, Down: 364.00
Voter: @nextgencrypto , Up: 125.00, Down: 364.00
Voter: @rudcharts , Up: 100.00, Down: 100.00
Voter: @ghmboyan , Up: 3500.00, Down: 200.00
Voter: @moeknows , Up: 100.00, Down: 800.00
This is an interesting list for a number of reasons.
Here I don't use the actual value of the vote to compare them. Instead, I use the accumulated percentage of the user's vote. That is, a 100 weight is equivalent to one full power vote, or 100 1% votes. For our consideration, it just doesn't matter (and calculating the value of a historical vote is a pain in the ass I don't need.)
Glancing down this list, something kind of amusing jumps out at me.
Bernie Sanders is on this list.
That's right, Bernie Sanders issued at least one up vote to Haejin in the last week. In fact, he had to issue more than one because there is 125% accumulated value and only 364% down voting.
What in the world did Bernie Sanders vote up by Haejin? Let's deal with that question a little bit later. For now, let's build the rest of the graph.
# Everyone upvoting Haelin will get to be blue.
dot.attr('node', shape='oval', fontcolor='black', fillcolor='lightblue')
u = Digraph(name='Upvotes')
for v in upvotes.keys():
u.edge(v[0], v[1],
color = 'green',
fontcolor = 'black',
len = str( ((totUpvotes / (upvotes[v]+0.0001)) + 1) * 100 ),
taillabel = str(upvotes[v]))
dot.subgraph(u)
# Everyone downvoting Haelin will get to be yellow.
dot.attr('node', shape='oval', fillcolor='yellow')
d = Digraph(name='Downvotes')
for v in downvotes.keys():
d.edge(v[0], v[1],
color = 'red',
fontcolor = 'red',
len = str( ((totDownvotes / (downvotes[v]+0.0001)) + 1) * 100 ),
taillabel = str(downvotes[v]))
dot.subgraph(d)
%time dot.render('haejinVotesWeek', view=True)
Wall time: 31.9 s
'haejinVotesWeek.jpg'
dot
And there it is.
Up votes for Haejin in the last week are green, down votes are red. Originally, I had all of Haejin's votes in here as well – but since everything that wasn't a down vote was a self vote, and all the down votes were for people that had down voted him, it seemed more sensible just to remove those in the first place. As a result, all of this activity are people engaging with Haejin.
You will notice the yellow cluster at the bottom made up of all of the people who have down voted Haejin's content and that the purple group to the northeast made up of people who have both flagged and up voted.
Keep in mind, this is just the activity from the last seven days.
If you look very closely (very closely), you'll note that beside each of the arrows coming away from one of the nodes is a red number or a black number (or both). These numbers represent the accumulated percentage of vote weights from each node. The vast majority of these? 100%. Interestingly, that suggests that most people who support Haejin give roughly one full 100% vote a week.
We have no idea how many of the entities represented here are bots. We have no way of even getting the slightest hint of the answer to that question, even though it would be really good to know. But it's safe to say that whatever flagging activity is going on, unless those in the yellow ovals are some serious whales, it can't be too effective.
But What About ... ?
But what about those up votes from accounts who had also flagged?
That's a good damn question.
Let's do another query and find out what those particular up votes were for.
# Init connection to database
db = SteemData()
# Let's put our account on interest here in a list. One day
# we might want to generalize to more than one.
intL =['haejin']
# We want only the vote transactions which have happened
# in the last week AND involve only our accounts of interest.
query = {
'type' : 'vote',
'timestamp' : {'$gte': dt.now() - datetime.timedelta(days=7)},
'author': 'haejin',
'voter': 'berniesanders',
'weight': {'$gte': 0}}
proj = {'weight': 1, 'permlink': 1, '_id': 0}
# sort = ('timestamp', -1)
%%time
result = db.Operations.find(query,
projection=proj)
voteBSL = list(result)
Wall time: 300 ms
len(voteBSL)
3
Wait, that's 3 up votes from Bernie Sanders to Haejin in the last week.
What in the world is he up voting?
for v in voteBSL:
print('Weight: {:>5.1f}, http://steemit.com/@haejin/{}\n'.format(v['weight']/100,
v['permlink']))
Weight: 50.0, http://steemit.com/@haejin/bitcoin-btc-evening-update-five-waves-abc
Weight: 50.0, http://steemit.com/@haejin/wabi-one-more-smaller-lower-low
Weight: 25.0, http://steemit.com/@haejin/districtox-dnt-fractals-point-higher-post-correction
That -- doesn't look different from the usual run of Haejin content at all. Not a bit.
So why do these up votes exist?
Okay, let's extend the scope of our vierw a bit. Let's look back a good, solid 90 days. That's a pretty hefty timeline of stuff to accumulate and examine. Surely if there's a pattern of behaviour, we'll see it there, right?
# Init connection to database
db = SteemData()
intL =['haejin']
# We want only the vote transactions which have happened
# in the last week AND involve only our accounts of interest.
query = {
'type' : 'vote',
'timestamp' : {'$gte': dt.now() - datetime.timedelta(days=90)},
'author': 'haejin',
'voter': 'berniesanders',
'weight': {'$gte': 0}}
proj = {'weight': 1, 'permlink': 1, '_id': 0}
# sort = ('timestamp', -1)
%%time
result = db.Operations.find(query,
projection=proj)
voteBSL = list(result)
Wall time: 2.41 s
len(voteBSL)
7
7?
Bernie Sanders has upvoted Haejin 7 times in the last three months. Okay, I'm game, what has he been voting up and how much?
for v in voteBSL:
print('Weight: {:>5.1f}, http://steemit.com/@haejin/{}\n'.format(v['weight']/100,
v['permlink']))
Weight: 0.0, http://steemit.com/@haejin/delegate-your-steem-power-to-haejin-here-is-an-easy-way-to-do-this
Weight: 0.0, http://steemit.com/@haejin/haejin-exceeds-10-000-followers-this-proves-people-follow-for-good-content-not-bad-content
Weight: 0.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-correction-bottom-date-projections
Weight: 0.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-awareness-of-big-picture-keeps-the-panic-away
Weight: 50.0, http://steemit.com/@haejin/bitcoin-btc-evening-update-five-waves-abc
Weight: 50.0, http://steemit.com/@haejin/wabi-one-more-smaller-lower-low
Weight: 25.0, http://steemit.com/@haejin/districtox-dnt-fractals-point-higher-post-correction
That doesn't make any sense. I mean that rather literally.
In the last three months, Bernie has up voted three of Haejin's posts. Before this week, those up votes were dust votes for things which make little sense but at least didn't carry any real value. They might even be dust flags.
Until literally this week.
Out of curiosity, let's use exactly the same code to derive flags from Bernie to Haejin from Bernie's account.
# Init connection to database
db = SteemData()
intL =['haejin']
# We want only the vote transactions which have happened
# in the last week AND involve only our accounts of interest.
query = {
'type' : 'vote',
'timestamp' : {'$gte': dt.now() - datetime.timedelta(days=90)},
'author': 'haejin',
'voter': 'berniesanders',
'weight': {'$lte': 0}}
proj = {'weight': 1, 'permlink': 1, '_id': 0}
sort = [('weight', 1)]
%%time
result = db.Operations.find(query,
projection=proj,
sort=sort)
voteBSL = list(result)
Wall time: 1.2 s
len(voteBSL)
212
for v in voteBSL:
print('Weight: {:>5.1f}, http://steemit.com/@haejin/{}\n'.format(v['weight']/100,
v['permlink']))
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-evening-update-a-pregnant-bullish-ascending-right-triangle-check-out-these-charts
Weight: -100.0, http://steemit.com/@haejin/ripple-xrp-bullish-explosion-out-of-an-a-b-c-d-e-triangle-what-does-this-mean-see-this-analysis
Weight: -100.0, http://steemit.com/@haejin/litecoin-ltc-revised-target-usd501
Weight: -100.0, http://steemit.com/@haejin/why-bitcoin-btc-is-not-topping
Weight: -100.0, http://steemit.com/@haejin/black-coin-analysis-the-basin-of-black-gold
Weight: -100.0, http://steemit.com/@haejin/mana-from-heaven
Weight: -100.0, http://steemit.com/@haejin/litecoin-ltc-revised-target-usd632-here-is-the-analysis-as-to-why
Weight: -100.0, http://steemit.com/@haejin/bitshares-bts-usd1-60-anyone
Weight: -100.0, http://steemit.com/@haejin/tierion-tnt-analysis-a-gift-horse-cometh-bearing-gifts-of-profits-profits-and-profits
Weight: -100.0, http://steemit.com/@haejin/elastic-xel-confluence-of-a-bull-storm-is-raging
Weight: -100.0, http://steemit.com/@haejin/expanse-exp-will-use-three-fractals-as-launch-pad-up
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-evening-update-alternate-count-was-executed-precisely
Weight: -100.0, http://steemit.com/@haejin/free-technical-analysis-for-anyone-by-a-15-year-veteran-of-elliott-waves-and-chart-pattern-recognition
Weight: -100.0, http://steemit.com/@haejin/tron-trx-is-not-done-rising-check-out-this-chart
Weight: -100.0, http://steemit.com/@haejin/bt2-coin-target-usd2-282
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-evening-update-overnight-price-action-expected-to-be-bullish
Weight: -100.0, http://steemit.com/@haejin/mana-is-exploding-up-a-whopping-29-profit-in-22-hours
Weight: -100.0, http://steemit.com/@haejin/how-to-help-haejin-add-steem-power-and-upvote
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-update-neck-line-support-breached-correction-likely
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-evening-when-is-the-best-time-to-buy
Weight: -100.0, http://steemit.com/@haejin/trx-tron-a-b-c-correction-in-progress
Weight: -100.0, http://steemit.com/@haejin/bt2-is-a-gift-horse-on-a-platter
Weight: -100.0, http://steemit.com/@haejin/verge-xvg-this-is-only-a-healthy-correction
Weight: -100.0, http://steemit.com/@haejin/re-clayop-3wvpq5-20171224t130700731z
Weight: -100.0, http://steemit.com/@haejin/re-berniesanders-re-haejin-help-haejin-from-these-sneaky-downvoters-steem-power-up-and-upvote-20171225t052022545z
Weight: -100.0, http://steemit.com/@haejin/help-haejin-from-these-sneaky-downvoters-steem-power-up-and-upvote
Weight: -100.0, http://steemit.com/@haejin/delegate-your-steem-power-to-haejin-here-is-an-easy-way-to-do-this
Weight: -100.0, http://steemit.com/@haejin/delegate-your-steem-power-to-haejin-here-is-an-easy-way-to-do-this
Weight: -100.0, http://steemit.com/@haejin/re-berniesanders-how-many-posts-will-ranchorelaxo-flag-before-he-realizes-he-s-wasting-precious-voting-power-20171227t044807499z
Weight: -100.0, http://steemit.com/@haejin/re-pawsdog-the-curious-case-of-the-errant-comma-haejin-berniesanders-20171227t035614072z
Weight: -100.0, http://steemit.com/@haejin/re-berniesanders-how-many-posts-will-ranchorelaxo-flag-before-he-realizes-he-s-wasting-precious-voting-power-20171227t045733686z
Weight: -100.0, http://steemit.com/@haejin/re-berniesanders-haejin-still-not-posting-advice-and-wasting-time-trying-to-troll-20171227t051135421z
Weight: -100.0, http://steemit.com/@haejin/re-berniesanders-how-many-posts-will-ranchorelaxo-flag-before-he-realizes-he-s-wasting-precious-voting-power-20171227t054112239z
Weight: -100.0, http://steemit.com/@haejin/re-berniesanders-why-did-haejin-stop-posting-20171227t135205959z
Weight: -100.0, http://steemit.com/@haejin/re-berniesanders-shall-i-start-countering-every-vote-from-haejin-20171228t015641026z
Weight: -100.0, http://steemit.com/@haejin/re-dan-proof-of-good-governance-20180101t042027702z
Weight: -100.0, http://steemit.com/@haejin/haejin-exceeds-10-000-followers-this-proves-people-follow-for-good-content-not-bad-content
Weight: -100.0, http://steemit.com/@haejin/haejin-exceeds-10-000-followers-this-proves-people-follow-for-good-content-not-bad-content
Weight: -100.0, http://steemit.com/@haejin/what-does-a-model-crypto-porfolio-look-like
Weight: -100.0, http://steemit.com/@haejin/tenx-pay-bullish-target-usd13-08-270-profit-potential
Weight: -100.0, http://steemit.com/@haejin/aggressive-etf-portfolio-weekly-update-19-22-profit-since-nov-3rd-start-date
Weight: -100.0, http://steemit.com/@haejin/monaco-mco-btc-could-fly-high-check-out-this-analysis
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-a-third-alternate-count
Weight: -100.0, http://steemit.com/@haejin/einsteinium-emc2-almost-the-correction-is-almost-done
Weight: -100.0, http://steemit.com/@haejin/geo-coin-expected-to-bottom-at-any-moment
Weight: -100.0, http://steemit.com/@haejin/steem-vs-sbd-do-not-underestimate-sbd
Weight: -100.0, http://steemit.com/@haejin/a3ozxhhu
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-this-correction-too-shall-pass
Weight: -100.0, http://steemit.com/@haejin/bitshares-bts-update-attractive-buying-opportunity-approaches
Weight: -100.0, http://steemit.com/@haejin/coindash-cdt-analysis-a-pre-breakout-setup-in-progress
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-landing-zones
Weight: -100.0, http://steemit.com/@haejin/viacoin-via-btc-could-be-an-attractive-buy-target-0-00198-btc
Weight: -100.0, http://steemit.com/@haejin/btc-morning-update-head-and-shoulders-spotted
Weight: -100.0, http://steemit.com/@haejin/ethereum-eth-head-and-shoulders-bounce-target-usd1-382
Weight: -100.0, http://steemit.com/@haejin/cv1e666q
Weight: -100.0, http://steemit.com/@haejin/ethereum-eth-head-and-shoulders-combo-with-ascending-right-triangle
Weight: -100.0, http://steemit.com/@haejin/zen-cash-zen-correction-could-need-more-time
Weight: -100.0, http://steemit.com/@haejin/aggressive-etf-portfolio-update-tqqq-is-still-winning-portfolio-is-up-23-14-since-nov-3-2017
Weight: -100.0, http://steemit.com/@haejin/zcoin-xzc-needs-to-breach-the-upper-white-line
Weight: -100.0, http://steemit.com/@haejin/p0zeumcp
Weight: -100.0, http://steemit.com/@haejin/solar-coin-slr-could-be-wedgey
Weight: -100.0, http://steemit.com/@haejin/qash-could-be-cash-rich-after-this-healthy-correction
Weight: -100.0, http://steemit.com/@haejin/verge-xvg-farming-for-cash-was-recommended
Weight: -100.0, http://steemit.com/@haejin/polybius-plbt-is-completing-a-sideways-correction
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-correction-likely-not-yet-over
Weight: -100.0, http://steemit.com/@haejin/v6yg3tru
Weight: -100.0, http://steemit.com/@haejin/syndicate-synx-btc-fractals-could-play-out
Weight: -100.0, http://steemit.com/@haejin/particl-part-what-happens-after-five-elliott-waves
Weight: -100.0, http://steemit.com/@haejin/steem-doesn-t-know-how-to-correct-quickly
Weight: -100.0, http://steemit.com/@haejin/kzusolpb
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-mid-day-update-alternation
Weight: -100.0, http://steemit.com/@haejin/omisego-omg-the-jaws-of-wealth-still-holding
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-correction-bottom-date-projections
Weight: -100.0, http://steemit.com/@haejin/indahash-idh-could-provide-a-good-start
Weight: -100.0, http://steemit.com/@haejin/bitcoin-cash-bch-is-not-inversely-correlated-with-bitcoin
Weight: -100.0, http://steemit.com/@haejin/neo-correction-pathways
Weight: -100.0, http://steemit.com/@haejin/ethereum-eth-btc-pair-expected-to-rise-higher-as-btc-corrects-lower
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-how-can-btc-got-to-six-figures
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-mid-day-update-micro-elliott-wave-counts-point-to-usd7-965
Weight: -100.0, http://steemit.com/@haejin/zec-btc-rising-target-is-0-3057-btc
Weight: -100.0, http://steemit.com/@haejin/4ag1k50q
Weight: -100.0, http://steemit.com/@haejin/music-usd-big-and-detailed-scores
Weight: -100.0, http://steemit.com/@haejin/link-btc-shows-a-pattern-setup-for-a-potential-trend-reversal
Weight: -100.0, http://steemit.com/@haejin/digixdao-dgd-btc-early-movements-for-a-new-coin
Weight: -100.0, http://steemit.com/@haejin/aggrressive-etf-portfolio
Weight: -100.0, http://steemit.com/@haejin/salt-btc-abc-is-too-quick-likely-more-sideways-price-action-post-bounce
Weight: -100.0, http://steemit.com/@haejin/reddcoin-rdd-btc-could-target-prior-wave-4-level
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-evening-update-micro-counts
Weight: -100.0, http://steemit.com/@haejin/walton-wtc-btc-target-hit-with-five-waves
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-awareness-of-big-picture-keeps-the-panic-away
Weight: -100.0, http://steemit.com/@haejin/nxt13748
Weight: -100.0, http://steemit.com/@haejin/lfa64gty
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-awareness-of-big-picture-keeps-the-panic-away
Weight: -100.0, http://steemit.com/@haejin/zen-cash-zen-is-it-still-the-zen-of-wealth
Weight: -100.0, http://steemit.com/@haejin/spread-coin-spr-downside-target-usd0-26
Weight: -100.0, http://steemit.com/@haejin/litecoin-ltc-impulse-up-and-now-correcting
Weight: -100.0, http://steemit.com/@haejin/neo-this-pattern-would-require-more-time
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-expect-bull-wicks
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-evening-update-mean-reversion
Weight: -100.0, http://steemit.com/@haejin/bitcoin-gold-btg-is-similar-to-verge
Weight: -100.0, http://steemit.com/@haejin/bitcoin-btc-evenining-update-the-right-shoulder-formation
Weight: -100.0, http://steemit.com/@haejin/iota-iot
Weight: -100.0, http://steemit.com/@haejin/litecoin-ltc-usd6-shy-of-usd258-target
Weight: -100.0, http://steemit.com/@haejin/bitshares-bts-is-more-mature-in-elliott-wave-progression
Weight: -88.0, http://steemit.com/@haejin/bitc-btc-morning-update-tree-count-vs-forest-count
Weight: -88.0, http://steemit.com/@haejin/gifto-broadening-pattern
Weight: -79.0, http://steemit.com/@haejin/behold-the-ark-of-wealth
Weight: -70.0, http://steemit.com/@haejin/re-zetetrahedron369-re-haejin-eos-could-have-sideways-price-action-20180126t114617741z
Weight: -61.0, http://steemit.com/@haejin/re-haejin-1st-blood-cup-and-handle-still-valid-20180206t191811284z
Weight: -60.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-why-a-completion-of-the-wedge-pattern-could-be-better
Weight: -60.0, http://steemit.com/@haejin/uxru4uh4
Weight: -59.0, http://steemit.com/@haejin/eos-a-higher-resolution-view
Weight: -59.0, http://steemit.com/@haejin/neo-two-potential-landing-zones
Weight: -57.0, http://steemit.com/@haejin/eos-a-genuine-breakout
Weight: -56.0, http://steemit.com/@haejin/basic-attention-token-bat-target-was-exceeded-and-currently-in-a-healthy-correction
Weight: -49.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-correction-bottom-date-projections
Weight: -49.0, http://steemit.com/@haejin/ripple-could-land-on-fib-0-618
Weight: -44.0, http://steemit.com/@haejin/doge-coin-shouldn-t-be-dodged
Weight: -40.0, http://steemit.com/@haejin/re-haejin-nem-xem-btc-is-on-the-second-round-of-correction-20180206t200610724z
Weight: -37.0, http://steemit.com/@haejin/re-ozchartart-usdbts-btc-poloniex-technical-analysis-market-report-update-112-july-11-2017-20171222t172111995z
Weight: -37.0, http://steemit.com/@haejin/re-thecyclist-another-sick-brumotti-video-20171222t170843410z
Weight: -37.0, http://steemit.com/@haejin/re-scorer-re-sfletcher62372-re-tonypeacock-re-haejin-bitshares-bts-correction-pathway-a-healthy-dose-20171222t114136156z
Weight: -35.0, http://steemit.com/@haejin/global-boost-y-bsty-could-be-breaking-out
Weight: -34.0, http://steemit.com/@haejin/re-transisto-re-haejin-bitcoin-btc-morning-update-landing-zones-20180118t184553835z
Weight: -33.0, http://steemit.com/@haejin/re-netuoso-re-haejin-bitcoin-btc-morning-update-how-to-remain-calm-in-a-correction-20180130t142634086z
Weight: -30.0, http://steemit.com/@haejin/nem-xem-usd-2018-expected-to-be-a-great-year
Weight: -30.0, http://steemit.com/@haejin/bitcoin-btc-mid-day-update-wedge-fractals
Weight: -29.0, http://steemit.com/@haejin/re-asbear-3qaxqr-20180102t191832040z
Weight: -22.0, http://steemit.com/@haejin/re-philakonecrypto-ethereum-eth-feb-20-long-term-technical-analysis-join-me-for-usd2-853-20180221t025232204z
Weight: -12.0, http://steemit.com/@haejin/re-daan-re-hitmeasap-re-daan-re-berniesanders-flagthedonkey-let-s-make-it-trend-20180224t010654406z
Weight: -11.0, http://steemit.com/@haejin/re-geggleto-re-haejin-bern-cash-bern-feel-the-bern-20180126t050746835z
Weight: -11.0, http://steemit.com/@haejin/re-icomment-25-000-followers-strong-tribute-to-steemit-s-most-successful-story-20180302t013820001z
Weight: -11.0, http://steemit.com/@haejin/re-transisto-re-haejin-expanse-exp-fractals-impulse-20180302t192009460z
Weight: -10.0, http://steemit.com/@haejin/re-littleboy-the-social-dilemma-of-steemit-20171226t195336780z
Weight: -10.0, http://steemit.com/@haejin/re-berniesanders-haejin-still-not-posting-advice-and-wasting-time-trying-to-troll-20171227t052121792z
Weight: -8.0, http://steemit.com/@haejin/re-miqdad-re-haejin-re-berniesanders-haejin-still-not-posting-advice-and-wasting-time-trying-to-troll-20171227t115906049z
Weight: -5.0, http://steemit.com/@haejin/re-ivmitko-re-haejin-re-moeknows-re-haejin-re-dan-proof-of-good-governance-20180101t150938705z
Weight: -5.0, http://steemit.com/@haejin/re-abhicrypto-re-haejin-tzanlfxc-20180125t210715664z
Weight: -5.0, http://steemit.com/@haejin/re-abhicrypto-re-haejin-tzanlfxc-20180125t180137454z
Weight: -5.0, http://steemit.com/@haejin/re-travelersmemoire-re-haejin-tzanlfxc-20180125t180034599z
Weight: -5.0, http://steemit.com/@haejin/re-skinnycat-re-haejin-tzanlfxc-20180125t180001283z
Weight: -5.0, http://steemit.com/@haejin/re-samexycool-re-haejin-bitcoin-btc-evening-update-macd-buy-signal-could-be-coming-20180125t173811870z
Weight: -5.0, http://steemit.com/@haejin/re-alejandrofz-re-haejin-bitcoin-btc-evening-update-macd-buy-signal-could-be-coming-20180125t173738223z
Weight: -5.0, http://steemit.com/@haejin/re-damss83-re-haejin-bitcoin-btc-evening-update-macd-buy-signal-could-be-coming-20180125t173510242z
Weight: -5.0, http://steemit.com/@haejin/re-sulev-re-haejin-bitcoin-btc-evening-update-macd-buy-signal-could-be-coming-20180125t173438383z
Weight: -5.0, http://steemit.com/@haejin/re-razibahmed-re-haejin-bitcoin-btc-evening-update-macd-buy-signal-could-be-coming-20180125t173413029z
Weight: -5.0, http://steemit.com/@haejin/re-nominchul-re-haejin-bitcoin-btc-evening-update-macd-buy-signal-could-be-coming-20180125t173334416z
Weight: -5.0, http://steemit.com/@haejin/re-sungbojus-re-haejin-bitcoin-btc-evening-update-macd-buy-signal-could-be-coming-20180125t173304123z
Weight: -5.0, http://steemit.com/@haejin/re-hendrix22-100-accurate-crypto-analysis-free-for-everyone-100-success-rate-20180202t053925131z
Weight: -5.0, http://steemit.com/@haejin/re-jahangirwifii-re-haejin-link-btc-shows-a-pattern-setup-for-a-potential-trend-reversal-20180202t112942450z
Weight: -5.0, http://steemit.com/@haejin/re-joelgonz1982-re-hendrix22-re-joelgonz1982-re-hendrix22-a-guru-practices-what-they-preach-so-why-not-haejin-20180202t053153642z
Weight: -5.0, http://steemit.com/@haejin/re-emma28-re-hendrix22-a-guru-practices-what-they-preach-so-why-not-haejin-20180202t050904622z
Weight: -5.0, http://steemit.com/@haejin/re-ynsdiary-re-hendrix22-a-guru-practices-what-they-preach-so-why-not-haejin-20180202t051827648z
Weight: -5.0, http://steemit.com/@haejin/re-hendrix22-a-guru-practices-what-they-preach-so-why-not-haejin-20180202t043634872z
Weight: -5.0, http://steemit.com/@haejin/re-justjessica-re-josediccus-re-hendrix22-a-guru-practices-what-they-preach-so-why-not-haejin-20180202t050643336z
Weight: -5.0, http://steemit.com/@haejin/re-rabeel-re-hendrix22-a-guru-practices-what-they-preach-so-why-not-haejin-20180202t050431790z
Weight: -5.0, http://steemit.com/@haejin/re-winstonalden-re-hendrix22-a-guru-practices-what-they-preach-so-why-not-haejin-20180202t050258267z
Weight: -5.0, http://steemit.com/@haejin/re-edith4angelseu-re-hendrix22-a-guru-practices-what-they-preach-so-why-not-haejin-20180202t045823495z
Weight: -2.0, http://steemit.com/@haejin/re-haejin-bitcoin-btc-morning-update-expect-bull-wicks-20180205t143037068z
Weight: -2.0, http://steemit.com/@haejin/re-haejin-litecoin-ltc-impulse-up-and-now-correcting-20180205t153150954z
Weight: -2.0, http://steemit.com/@haejin/re-haejin-steem-s-pattern-based-bottoming-20180205t163056164z
Weight: -2.0, http://steemit.com/@haejin/re-haejin-icon-icx-btc-in-putting-in-an-expanded-flat-20180205t170741375z
Weight: -2.0, http://steemit.com/@haejin/re-haejin-dash-correction-bottom-prospect-20180205t200121175z
Weight: -2.0, http://steemit.com/@haejin/re-haejin-bitcoin-btc-mid-day-update-bull-wick-20180205t203621872z
Weight: -2.0, http://steemit.com/@haejin/re-haejin-bitcoin-btc-mid-day-update-2-bottom-could-be-near-20180205t222658538z
Weight: -2.0, http://steemit.com/@haejin/re-haejin-bitcoin-btc-evening-update-mean-reversion-20180206t043540242z
Weight: -1.0, http://steemit.com/@haejin/re-tokeylokey-re-cryptoclick-re-starjuno-re-cryptoclick-re-haejin-eos-could-have-sideways-price-action-20180126t120305735z
Weight: -1.0, http://steemit.com/@haejin/re-i-know-that-re-haejin-eos-could-have-sideways-price-action-20180126t120051771z
Weight: -1.0, http://steemit.com/@haejin/re-daemmon-re-haejin-eos-could-have-sideways-price-action-20180126t120002174z
Weight: -1.0, http://steemit.com/@haejin/re-camilus-re-haejin-eos-could-have-sideways-price-action-20180126t115514781z
Weight: -1.0, http://steemit.com/@haejin/re-alpacho78-re-alpacho78-re-haejin-eos-could-have-sideways-price-action-20180126t115057645z
Weight: -1.0, http://steemit.com/@haejin/re-americanpoet-re-zetetrahedron369-re-haejin-eos-could-have-sideways-price-action-20180126t114925148z
Weight: -1.0, http://steemit.com/@haejin/re-projectenergy-re-haejin-eos-could-have-sideways-price-action-20180126t114506192z
Weight: -1.0, http://steemit.com/@haejin/re-teenovision-re-haejin-39fo794v-20180126t125306622z
Weight: -1.0, http://steemit.com/@haejin/re-vinyljunkie-re-wizely-re-teenovision-re-haejin-39fo794v-20180126t125410294z
Weight: -1.0, http://steemit.com/@haejin/re-tokyoin-re-haejin-39fo794v-20180126t125450435z
Weight: -1.0, http://steemit.com/@haejin/re-dacheeko-oi77alxdu-20180126t125535261z
Weight: -1.0, http://steemit.com/@haejin/re-tumtum01-re-dacheeko-oi77alxdu-20180126t125603711z
Weight: -1.0, http://steemit.com/@haejin/re-vinyljunkie-re-jcpython-re-haejin-39fo794v-20180126t125731990z
Weight: -1.0, http://steemit.com/@haejin/re-felixgarciap-re-haejin-39fo794v-20180126t125644016z
Weight: -1.0, http://steemit.com/@haejin/re-aledidenko-re-haejin-39fo794v-20180126t125920517z
Weight: -1.0, http://steemit.com/@haejin/re-piter123k-re-haejin-39fo794v-20180126t125951422z
Weight: -1.0, http://steemit.com/@haejin/re-netuoso-re-haejin-re-netuoso-re-haejin-bitcoin-btc-morning-update-how-to-remain-calm-in-a-correction-20180130t143147199z
Weight: -1.0, http://steemit.com/@haejin/re-missioncontrol-re-lyndsaybowes-re-sneak-technical-analysis-20180301t040245934z
Weight: -1.0, http://steemit.com/@haejin/re-sneak-re-haejin-re-sneak-re-haejin-re-sneak-re-janine-ariane-re-phlatattak-re-janine-ariane-re-phlatattak-re-janine-ariane-re-phlatattak-florida-school-shooting-hoax-comic-contest-20180301t041145764z
Weight: -1.0, http://steemit.com/@haejin/re-ikk200-re-haejin-vechain-ven-primary-and-alternat-both-bullish-20180301t162349003z
Weight: -1.0, http://steemit.com/@haejin/re-andrea91-re-haejin-vechain-ven-primary-and-alternat-both-bullish-20180301t162433340z
Weight: -1.0, http://steemit.com/@haejin/re-sneak-re-anglotrucker-re-thoughts-in-time-downvote-this-how-steemit-killed-itself-or-how-to-prevent-it-20180301t035258917z
Weight: -1.0, http://steemit.com/@haejin/re-sneak-re-sift666-re-thoughts-in-time-downvote-this-how-steemit-killed-itself-or-how-to-prevent-it-20180301t035128151z
Weight: -1.0, http://steemit.com/@haejin/re-sneak-re-mathiasian-re-thoughts-in-time-downvote-this-how-steemit-killed-itself-or-how-to-prevent-it-20180301t035350261z
Weight: -1.0, http://steemit.com/@haejin/re-okbuddy-re-haejin-bitcoin-btc-evening-update-wave-3-of-3-fireworks-20180302t005938330z
Weight: -1.0, http://steemit.com/@haejin/re-criptotrader-re-haejin-bitcoin-btc-evening-update-wave-3-of-3-fireworks-20180302t005911801z
Weight: -1.0, http://steemit.com/@haejin/re-patcic-re-haejin-steem-fractal-and-pattern-say-serious-breakout-potential-is-at-hand-20180303t003353954z
Weight: -1.0, http://steemit.com/@haejin/re-transisto-re-haejin-re-transisto-re-haejin-expanse-exp-fractals-impulse-20180302t235546192z
Weight: -1.0, http://steemit.com/@haejin/re-transisto-re-anchovy-re-haejin-re-transisto-re-haejin-expanse-exp-fractals-impulse-20180303t001026720z
Weight: -1.0, http://steemit.com/@haejin/re-danpaulson-re-haejin-steem-fractal-and-pattern-say-serious-breakout-potential-is-at-hand-20180303t002729271z
Weight: -1.0, http://steemit.com/@haejin/re-slider2990-re-haejin-steem-fractal-and-pattern-say-serious-breakout-potential-is-at-hand-20180303t011140850z
Weight: -1.0, http://steemit.com/@haejin/re-slider2990-re-haejin-steem-fractal-and-pattern-say-serious-breakout-potential-is-at-hand-20180303t011406084z
Weight: -1.0, http://steemit.com/@haejin/re-transisto-re-haejin-re-transisto-re-haejin-expanse-exp-fractals-impulse-20180303t033655094z
Weight: -1.0, http://steemit.com/@haejin/re-anchovy-re-transisto-re-anchovy-re-transisto-re-anchovy-re-haejin-re-transisto-re-haejin-expanse-exp-fractals-impulse-20180303t000211077z
Weight: -1.0, http://steemit.com/@haejin/re-kauaiq-re-haejin-re-ulfatron-re-monisnasir-re-haejin-expanse-exp-fractals-impulse-20180303t034831497z
Weight: -1.0, http://steemit.com/@haejin/re-born2crypto-re-haejin-aggressive-etf-performance-update-20180303t035153500z
Weight: -1.0, http://steemit.com/@haejin/re-born2crypto-re-antoniodpz-re-haejin-aggressive-etf-performance-update-20180303t035123973z
Weight: -1.0, http://steemit.com/@haejin/re-born2crypto-re-thetruth36-re-haejin-tron-trx-ascending-right-triangle-or-cup-and-handle-probably-both-20180303t035331944z
Weight: -1.0, http://steemit.com/@haejin/re-olivers-wilde-re-haejin-verge-xvg-awaiting-resumption-of-upward-impulse-20180303t052151500z
Weight: -1.0, http://steemit.com/@haejin/re-danpaulson-re-haejin-pillar-plr-btc-breakout-alert-20180303t160610838z
Weight: -1.0, http://steemit.com/@haejin/re-born2crypto-re-sola4boy-re-haejin-tron-trx-ascending-right-triangle-or-cup-and-handle-probably-both-20180303t035413406z
Weight: -1.0, http://steemit.com/@haejin/re-youareyourowngod-re-noternexto-re-youareyourowngod-re-haejin-2qmas8-essay-is-technical-analysis-a-quantum-event-20180304t033223721z
Weight: 0.0, http://steemit.com/@haejin/delegate-your-steem-power-to-haejin-here-is-an-easy-way-to-do-this
Weight: 0.0, http://steemit.com/@haejin/haejin-exceeds-10-000-followers-this-proves-people-follow-for-good-content-not-bad-content
Weight: 0.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-correction-bottom-date-projections
Weight: 0.0, http://steemit.com/@haejin/bitcoin-btc-morning-update-awareness-of-big-picture-keeps-the-panic-away
Only 212 flags in the last 90 days and they don't appear to be any different in terms of behavior, though there are a surprising number of them which are less than 100% votes. Particularly given the vehemence with which Bernie denounces and antagonizes Haejin publicly.
You know, what th'Hell. Let's look at a picture of the other side of this.
Feel the Bern
That pun was going to happen whether you like it or not.
Let's run through exactly the same code that we used when looking at Haejin's interactions. Upfront, let's be clear – I am perfectly aware that Bernie makes heavy use of automation and distributing the SP that he has access to across multiple accounts, meaning that locality means very little in terms of interaction on the blockchain when we are talking about him. I know this upfront, but for the sake of having a place to start, let's take this as our place to start.
# Init connection to database
db = SteemData()
# Let's put our account on interest here in a list. One day
# we might want to generalize to more than one.
intL =['berniesanders']
# We want only the vote transactions which have happened
# in the last week AND involve only our accounts of interest.
query = {
'type' : 'vote',
'timestamp' : {'$gte': dt.now() - datetime.timedelta(days=7)},
'$or': [{'author': {'$in': intL}}
# {'voter': {'$in': intL}}]
]}
proj = {'voter': 1, 'author': 1, 'weight': 1, '_id': 0}
%%time
result = db.Operations.find(query,
projection=proj)
voteBL = list(result)
len(voteBL)
3423
Already we've run into a significant difference. Where Haejin had nearly 30,000 votes one way or another in the last week, Bernie is only showing shy of 3500. That's an order of magnitude difference.
matchCount = 0
for e in voteBL:
if e['voter'] == e['author']:
matchCount += 1
matchCount
58
Something that's not all that different is the absolute number of self votes that both Bernie and Haejin show. Haejin has 88, Bernie has 58 – but they have vastly different amounts of SP and a whole different method of existence.
That's a lot of SP involved with self voting for somebody who calls out self voting as "raping the rewards pool."
Just saying.
dot = Digraph(comment="Bernie Vote Relations",
format="jpg",
engine="sfdp")
dot.attr('graph', overlap='false')
dot.attr('graph', ratio='auto')
dot.attr('graph', size='10000000,10000000')
dot.attr('graph', start='1.0')
dot.attr('graph', K='10')
dot.attr('graph', margin='5')
dot.attr('node', shape='square',
style='filled', color='black',
fillcolor='white')
# We'll add Haejin here right to the middle prominantly.
dot.node('berniesanders', 'berniesanders')
# Initialize our accumulators to be zeros for uninitalized queries
upvotes = DD(int)
downvotes = DD(int)
for v in voteBL:
# We'll just use this tuple as a key for ease
VA = v['voter'], v['author']
if not VA[0] == VA[1]:
if v['weight'] >= 0:
upvotes[VA] += v['weight']/100
else:
downvotes[VA] += (-v['weight'])/100
len(upvotes.keys()), len(downvotes.keys())
(759, 30)
In terms of overall interaction counts, the comparison continues to be somewhat strange and therefore interesting.
The number of different accounts involved in up voting Bernie is 800 while the number involved in flanking him is 30. In relative terms, Haejin has 3.1% of the unique voting accounts in the last week being flags while Bernie has 3.9% of the unique voting accounts in the last week targeting him being flags.
Again, not really all that different.
totUpvotes = sum([upvotes[e] for e in upvotes.keys()])
totUpvotes
241597.47999999998
totDownvotes = sum([downvotes[e] for e in downvotes.keys()])
totDownvotes
5623.0
# Everyone who's both upvoted and downvoted @haejin will get a bright warning box.
dot.attr('node', shape='rectangle', fontcolor='white', fillcolor='purple')
uvL = [e[0] for e in upvotes.keys()]
dvL = [e[0] for e in downvotes.keys()]
for e in dvL:
if e in uvL:
dot.node(e, e)
bothS = set()
for e in dvL:
if e in uvL:
bothS.add(e)
print(bothS, len(bothS))
{'qubes', 'morten', 'btu', 'ihsan19', 'jo3potato', 'voicefromfaraway', 'bcc'} 7
for v in bothS:
print('Voter: @{:16}, Up: {:7.2f}, Down: {:7.2f}'.format(v, upvotes[(v, 'berniesanders')],
downvotes[v, 'berniesanders']))
Voter: @qubes , Up: 200.00, Down: 300.00
Voter: @morten , Up: 100.00, Down: 100.00
Voter: @btu , Up: 14.00, Down: 400.00
Voter: @ihsan19 , Up: 0.00, Down: 100.00
Voter: @jo3potato , Up: 0.00, Down: 100.00
Voter: @voicefromfaraway, Up: 0.00, Down: 100.00
Voter: @bcc , Up: 200.00, Down: 431.00
Taking a look at the accounts that occur in both the up vote and flag lists, we find several, just as we did looking at the Haejin interactions.
If we're being strict, we can throw out the ones that show an up vote amount of zero. Those could just as easily be a dust amount of down vote; it's impossible to tell given the internal representation of valuation on the steem blockchain as it stands.
That still leaves some interesting results. In particular, appears on the overlap list for both Haejin and Bernie. He clearly dislikes Haejin more, but at least in terms of this particular week long examination, there appears to be some minor schizophrenia.
Something that troubles me about both of these lists (and the overall valuation of a lot of these voting percentages across the board) is that they come out to be very round numbers. That wouldn't be strange if Bernie and Haejin posted at a frequency which was consistently a multiple of five during the week, but that seems a little strange. In particular, we know that's not the case for Haejin.
Something about these numbers seems a little off and I can't put my finger on it. They are consistent in strange ways where I would not expect that kind of consistency.
# Everyone upvoting Haelin will get to be blue.
dot.attr('node', shape='oval', fontcolor='black', fillcolor='lightblue')
u = Digraph(name='Upvotes')
for v in upvotes.keys():
u.edge(v[0], v[1],
color = 'green',
fontcolor = 'black',
len = str( ((totUpvotes / (upvotes[v]+0.0001)) + 1) * 100 ),
taillabel = str(upvotes[v]))
dot.subgraph(u)
# Everyone downvoting Haelin will get to be yellow.
dot.attr('node', shape='oval', fillcolor='yellow')
d = Digraph(name='Downvotes')
for v in downvotes.keys():
d.edge(v[0], v[1],
color = 'red',
fontcolor = 'red',
len = str( ((totDownvotes / (downvotes[v]+0.0001)) + 1) * 100 ),
taillabel = str(downvotes[v]))
dot.subgraph(d)
%time dot.render('bernieVotesWeek', view=True)
Wall time: 2.56 s
'bernieVotesWeek.jpg'
dot
Obviously Bernie's graph is considerably smaller. There is almost an order of magnitude fewer edges to display, which makes it a lot easier.
Overall, though – we see the same sort of general shape. About the same amount of area is taken up by people who flag. The overlap list may be somewhat smaller in terms of percentage for Bernie but it's comparable.
From a relationship map point of view, there's a lot more in common here than there is different.
Squid in a Box
Because it's sensible and because we need some sort of baseline – even if it's a ridiculous baseline, I'm going to subject my own account to the exact same code analysis that I just used on Haejin and Bernie.
I won't recap the discussion unless something interesting comes up, so I'll see you on the other side.
# Init connection to database
db = SteemData()
# Let's put our account on interest here in a list. One day
# we might want to generalize to more than one.
intL =['lextenebris']
# We want only the vote transactions which have happened
# in the last week AND involve only our accounts of interest.
query = {
'type' : 'vote',
'timestamp' : {'$gte': dt.now() - datetime.timedelta(days=7)},
'$or': [{'author': {'$in': intL}}
# {'voter': {'$in': intL}}]
]}
proj = {'voter': 1, 'author': 1, 'weight': 1, '_id': 0}
%%time
result = db.Operations.find(query,
projection=proj)
voteLL = list(result)
Wall time: 215 ms
len(voteLL)
179
matchCount = 0
for e in voteLL:
if e['voter'] == e['author']:
matchCount += 1
matchCount
14
dot = Digraph(comment="Lex Vote Relations",
format="jpg",
engine="sfdp")
dot.attr('graph', overlap='false')
dot.attr('graph', ratio='auto')
dot.attr('graph', size='10000000,10000000')
dot.attr('graph', start='1.0')
dot.attr('graph', K='10')
dot.attr('graph', margin='5')
dot.attr('node', shape='square',
style='filled', color='black',
fillcolor='white')
# We'll add Haejin here right to the middle prominantly.
dot.node('lextenebris', 'lextenebris')
# Initialize our accumulators to be zeros for uninitalized queries
upvotes = DD(int)
downvotes = DD(int)
for v in voteLL:
# We'll just use this tuple as a key for ease
VA = v['voter'], v['author']
if not VA[0] == VA[1]:
if v['weight'] >= 0:
upvotes[VA] += v['weight']/100
else:
downvotes[VA] += (-v['weight'])/100
len(upvotes.keys()), len(downvotes.keys())
(78, 0)
totUpvotes = sum([upvotes[e] for e in upvotes.keys()])
totUpvotes
13393.6
totDownvotes = sum([downvotes[e] for e in downvotes.keys()])
totDownvotes
0
# Everyone who's both upvoted and downvoted @haejin will get a bright warning box.
dot.attr('node', shape='rectangle', fontcolor='white', fillcolor='purple')
uvL = [e[0] for e in upvotes.keys()]
dvL = [e[0] for e in downvotes.keys()]
for e in dvL:
if e in uvL:
dot.node(e, e)
bothS = set()
for e in dvL:
if e in uvL:
bothS.add(e)
print(bothS, len(bothS))
set() 0
for v in bothS:
print('Voter: @{:16}, Up: {:7.2f}, Down: {:7.2f}'.format(v, upvotes[(v, 'berniesanders')],
downvotes[v, 'berniesanders']))
# Everyone upvoting Haelin will get to be blue.
dot.attr('node', shape='oval', fontcolor='black', fillcolor='lightblue')
u = Digraph(name='Upvotes')
for v in upvotes.keys():
u.edge(v[0], v[1],
color = 'green',
fontcolor = 'black',
len = str( ((totUpvotes / (upvotes[v]+0.0001)) + 1) * 100 ),
taillabel = str(upvotes[v]))
dot.subgraph(u)
# Everyone downvoting Haelin will get to be yellow.
dot.attr('node', shape='oval', fillcolor='yellow')
d = Digraph(name='Downvotes')
for v in downvotes.keys():
d.edge(v[0], v[1],
color = 'red',
fontcolor = 'red',
len = str( ((totDownvotes / (downvotes[v]+0.0001)) + 1) * 100 ),
taillabel = str(downvotes[v]))
dot.subgraph(d)
%time dot.render('lexVotesWeek', view=True)
Wall time: 562 ms
'lexVotesWeek.jpg'
dot
Yes, I am really boring by comparison. Almost trivial to compute, given only a week of activity.
By the way, I would like to say thank you to everyone who has appeared on this graph for being good enough and kind enough to appreciate something I've done this week. I know it's been a weird week and I appreciate you sticking with me. Hopefully this post makes it all worthwhile.
You'll notice I have no flags (a fact which will probably change once this post goes live). I'm relatively proud of that.
What I really should do for normal people who interact on the platform and have normal human volumes of interaction is change the code so that votes are associated with whatever post or comment that they are made on. That will provide an automatic uniqueness measure because you can only vote once in one direction on any given post/comment. It won't provide as much of a feeling of aggregation, but it might be more useful.
Maybe I'll give that a try right now.
# Init connection to database
db = SteemData()
# Let's put our account on interest here in a list. One day
# we might want to generalize to more than one.
intL =['lextenebris']
# We want only the vote transactions which have happened
# in the last week AND involve only our accounts of interest.
query = {
'type' : 'vote',
'timestamp' : {'$gte': dt.now() - datetime.timedelta(days=7)},
'$or': [{'author': {'$in': intL}}
# {'voter': {'$in': intL}}]
]}
proj = {'voter': 1, 'author': 1, 'weight': 1, 'permlink': 1, '_id': 0}
%%time
result = db.Operations.find(query,
projection=proj)
voteLL = list(result)
Wall time: 314 ms
len(voteLL)
179
matchCount = 0
for e in voteLL:
if e['voter'] == e['author']:
matchCount += 1
matchCount
14
dot = Digraph(comment="Lex Vote Relations",
format="jpg",
engine="neato")
dot.attr('graph', overlap='false')
dot.attr('graph', ratio='auto')
dot.attr('graph', size='10000000,10000000')
dot.attr('graph', start='1.0')
dot.attr('graph', K='10')
dot.attr('graph', margin='5')
dot.attr('node', shape='square',
style='filled', color='black',
fillcolor='white')
dot.node('lextenebris', 'lextenebris')
# Set up for posts/comment nodes
dot.attr('node', shape='rectangle', fillcolor='lightgrey')
# dot.attr('edge', color='lightgrey', len='10')
dot.attr('edge', color='lightgrey')
pstS = set()
for e in voteLL:
pstS.add(e['permlink'])
for e in pstS:
dot.node(e)
dot.edge('lextenebris', e)
# Initialize our accumulators to be zeros for uninitalized queries
upvotes = DD(int)
downvotes = DD(int)
for v in voteLL:
# We'll just use this tuple as a key for ease
VA = v['voter'], v['author'], v['permlink']
if not VA[0] == VA[1]:
if v['weight'] >= 0:
upvotes[VA] += v['weight']/100
else:
downvotes[VA] += (-v['weight'])/100
len(upvotes.keys()), len(downvotes.keys())
(165, 0)
totUpvotes = sum([upvotes[e] for e in upvotes.keys()])
totUpvotes
13393.6
totDownvotes = sum([downvotes[e] for e in downvotes.keys()])
totDownvotes
0
# Everyone upvoting me will get to be blue.
dot.attr('node', shape='oval', fontcolor='black', fillcolor='lightblue')
u = Digraph(name='Upvotes')
for v in upvotes.keys():
u.edge(v[0], v[2],
color = 'green',
fontcolor = 'black',
# len = str( ((totUpvotes / (upvotes[v]+0.0001)) + 1) * 100 ),
taillabel = str(upvotes[v]))
dot.subgraph(u)
# Everyone downvoting Haelin will get to be yellow.
dot.attr('node', shape='oval', fillcolor='yellow')
d = Digraph(name='Downvotes')
for v in downvotes.keys():
d.edge(v[0], v[2],
color = 'red',
fontcolor = 'red',
# len = str( ((totDownvotes / (downvotes[v]+0.0001)) + 1) * 100 ),
taillabel = str(downvotes[v]))
dot.subgraph(d)
%time dot.render('lexVotesWeek', view=True)
Wall time: 1.62 s
'lexVotesWeek.jpg'
dot
Nothing really surprising here, truly. Well, except for a recognition that it is really hard to be able to show a proper link to a website in a readable, easily comprehensible form.
This graph is small enough that I could use one of the more fully featured graph renderers in graphviz and actually tweak the lengths of the paths – or more accurately, stop tweaking them to get a reasonable result. That's a particularly good thing.
What's there to say? I'm a lot less interesting than warring whales.
Epilogue
We've seen some interesting things, dug up some interesting data, but I'm not sure that we've actually managed to explain anything. We may have turned up more questions than we have answered.
What's going on with Bernie this week and why has he been up voting Haejin for the first time in months, not with small up votes but with significant ones? What's up with the people who have both up voted and flagged Haejin? When will Haejin notice that the terrifying amount of SP he wastes flagging Bernie could be far more effectively used in self-loading (or voting for me, which I would prefer quite frankly, but I'm being open-minded)? When will they get a room, spend some private time together, and finally announce the engagement?
Honestly, I have way more questions than I have answers.
But at least we have the tools to discover that we have questions! That alone may take us far.
Tools
- Python 3.6
- Jupyter Lab
- SteemData created by
- MongoDB
- Graphviz
And the support of viewers like you.