Steem-python na przykładach #1: analiza bloga

in #polish6 years ago (edited)

Wstęp

Biblioteka steem-python pozwala na komunikację z blockchain Steem za pomocą języka Python. Oznacza to, że możemy za jej pomocą wykonywać wszystkie operacje jakie można wykonać bezpośrednio z interfejsu webowego (np Steemit), a nawet więcej. Możemy np. uzyskać interesujące nas informacje odnośnie danego posta czy użytkownika. Poniższy artykuł ma na celu pokazać jak w prosty sposób można przeprowadzić analizę bloga danego użytkownika. W przykładach użyte zostanie konto @glodniwiedzy.

Zestawienie tagów

Poniższy kod pobiera wszystkie posty (bez komentarzy) wybranego użytkownika, a następnie zlicza użyte tagi. Co ciekawe pobranie analogicznych informacji z bazy danych (np SteemSQL) jest bardziej skomplikowane.

from steem.blog import Blog
from collections import Counter

tags_counter = Counter()
account = 'glodniwiedzy'

for post in Blog(account).all():
    tags_counter.update(post['tags'])

for tag, c in tags_counter.most_common(20):
    print('{0}|{1}'.format(tag, c))


TagLiczba użyć
pl-technologia16
pl-artykuly16
polish16
pl-kosmos13
pl-samochodyelektryczne9
pl-nauka8
pl-motoryzacja3
pl-spacex1
pl-tesla1

Najczęściej głosujący użytkownicy

Kod jest bardzo podobny do poprzedniego, jedyna różnica to zliczanie użytkowników zamiast tagów.

from steem.blog import Blog
from collections import Counter

votes_counter = Counter()
account = 'glodniwiedzy'

for post in Blog(account).all():
    votes = [v['voter'] for v in post['active_votes']]
    votes_counter.update(votes)

for vote, c in votes_counter.most_common(20):
    print('{0}|{1}'.format(vote, c))

OsobaLiczba głosów
ocisly16
fervi16
nicniezgrublem16
glodniwiedzy16
lukmarcus15
astromaniak15
rafaka15
bazimir13
jacekw13
koltci12
diosbot12
mys11
mustermark10
pattttti10
runningt9
hellobot9
aditor8
albakerki8
rafalski8
hsx127

Najczęściej resteemujący użytkownicy

W bardzo podobny sposób możemy uzyskać informację o tym, którzy użytkownicy najczęściej wykonali resteem.

from steem.blog import Blog
from steem.steem import Steem
from collections import Counter

steem = Steem()
resteemed_counter = Counter()
account = 'glodniwiedzy'

for post in Blog(account).all():
    resteemed = steem.get_reblogged_by(account, post['permlink'])
    resteemed_counter.update(resteemed)

del resteemed_counter[account]

for tag, c in resteemed_counter.most_common(20):
    print('{0}|{1}'.format(tag, c))

OsobaLiczba resteem
nicniezgrublem15
ocisly13
martwykotek2
informator1

Suma wartości głosów użytkowników

Tutaj sytuacja jest już nieco bardziej skomplikowana. Każdy post posiada wartość rshares na podstawie którego należy wyliczyć nagrodę. Do tego potrzebne są nam dodatkowe informacje tj:

  • reward_balance = 708456.791 STEEM
  • recent_claims = 432050845965919642
  • base_price = 3.424 SBD

Czyli innymi słowy wyznaczamy stosunek rshares danego posta do całkowitego rshares wszystkich postów, następnie mnożymy przez liczbę STEEM przeznaczonych na nagrody. I na koniec mnożymy przez cenę STEEM, żeby uwzględnić kurs.

Trzeba tylko pamiętać, że poniższe wyliczenia są przybliżone, gdyż biorą pod uwagę aktualne wartości (a nie dokładne wartości w momencie wypłaty).

from steem.amount import Amount
from steem.blog import Blog
from steem.steem import Steem
from collections import Counter

steem = Steem()
votes_counter = Counter()
account = 'glodniwiedzy'

reward_fund = steem.get_reward_fund()
reward_balance = reward_fund['reward_balance']
recent_claims = reward_fund['recent_claims']
base_price = steem.get_current_median_history_price()['base']

def get_payout_from_rshares(rshares, reward_balance, recent_claims, base_price):
    fund_per_share = Amount(reward_balance).amount / float(recent_claims)
    payout = float(rshares) * fund_per_share * Amount(base_price).amount
    return payout

for post in Blog(account).all():
    votes = [v for v in post['active_votes']]
    for v in post['active_votes']:
        rshares = float(v['rshares'])
        votes_counter[v['voter']] += get_payout_from_rshares(rshares, reward_balance, recent_claims, base_price)

for vote, c in votes_counter.most_common(20):
    print('{0}|{1:.3f}'.format(vote, c))

OsobaWartość głosów
albakerki71.313
noisy48.027
gtg19.876
nicniezgrublem6.285
lukmarcus3.620
ocisly2.677
diosbot2.222
fervi1.242
openart1.107
rafalski0.925
jacekw0.890
mys0.790
andzi760.502
alcik0.498
sisters0.444
astromaniak0.424
koltci0.327
hr10.293
bithubpl0.277
informator0.268

Suma wartości głosów użytkowników + wykres

Jeśli chcemy przedstawić wcześniejsze dane w graficznej formie, możemy użyć biblioteki matplotlib, za pomocą której można w prosty sposób wygenerować wykres (tutaj kołowy).

from steem.amount import Amount
from steem.blog import Blog
from steem.steem import Steem
from collections import Counter
import matplotlib.pyplot as plt
from operator import itemgetter

steem = Steem()
votes_counter = Counter()
account = 'glodniwiedzy'

reward_fund = steem.get_reward_fund()
reward_balance = reward_fund['reward_balance']
recent_claims = reward_fund['recent_claims']
base_price = steem.get_current_median_history_price()['base']

def get_payout_from_rshares(rshares, reward_balance, recent_claims, base_price):
    fund_per_share = Amount(reward_balance).amount / float(recent_claims)
    payout = float(rshares) * fund_per_share * Amount(base_price).amount
    return payout

for post in Blog(account).all():
    votes = [v for v in post['active_votes']]
    for v in post['active_votes']:
        rshares = float(v['rshares'])
        votes_counter[v['voter']] += get_payout_from_rshares(rshares, reward_balance, recent_claims, base_price)

labels = []
sizes = []
explode = []
other = 0
i = 0
n = 12

for i, (acc, value) in enumerate(sorted(votes_counter.items(), key=itemgetter(1), reverse=True)):
    if i < n:
        labels.append(acc)
        sizes.append(value)
        explode.append(0)
    else:
        other += value

labels.append('Pozostali')
sizes.append(other)
explode.append(0.1)

fig, ax = plt.subplots()
fig.set_size_inches(12, 12)
ax.pie(sizes, labels=labels, explode=explode, autopct='%1.1f%%', startangle=30)
fig.savefig('fig.png')

fig.png

To taki szybki pokaz możliwości biblioteki steem-python. Ale oczywiście można za jej pomocą osiągnąć o wiele więcej:

  • głosować, dodawać posty i komentarze
  • wykonywać transfery
  • automatycznie handlować na wewnętrznym markecie
  • wykrywać spam :)
Sort:  

Ok, dobry pomysł, dodam.

Bardzo ciekawe, w prosty i przejrzysty sposób, pokazanie możliwości biblioteki Steem-python.

Coin Marketplace

STEEM 0.29
TRX 0.12
JST 0.033
BTC 62934.09
ETH 3118.65
USDT 1.00
SBD 3.85