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

View this thread on steempeak.com
· @jacekw · (edited)
$5.83
Steem-python na przykładach #1: analiza bloga
# Wstęp

Biblioteka [steem-python](http://steem.readthedocs.io/en/latest/index.html) 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](https://steemsql.com/)) 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))

```
---
Tag|Liczba użyć
-|-
pl-technologia|16
pl-artykuly|16
polish|16
pl-kosmos|13
pl-samochodyelektryczne|9
pl-nauka|8
pl-motoryzacja|3
pl-spacex|1
pl-tesla|1


# 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))
```
---
Osoba|Liczba głosów
-|-
ocisly|16
fervi|16
nicniezgrublem|16
glodniwiedzy|16
lukmarcus|15
astromaniak|15
rafaka|15
bazimir|13
jacekw|13
koltci|12
diosbot|12
mys|11
mustermark|10
pattttti|10
runningt|9
hellobot|9
aditor|8
albakerki|8
rafalski|8
hsx12|7

# 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))
```
---
Osoba|Liczba resteem
-|-
nicniezgrublem|15
ocisly|13
martwykotek|2
informator|1

# 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))
```
---
Osoba|Wartość głosów
-|-
albakerki|71.313
noisy|48.027
gtg|19.876
nicniezgrublem|6.285
lukmarcus|3.620
ocisly|2.677
diosbot|2.222
fervi|1.242
openart|1.107
rafalski|0.925
jacekw|0.890
mys|0.790
andzi76|0.502
alcik|0.498
sisters|0.444
astromaniak|0.424
koltci|0.327
hr1|0.293
bithubpl|0.277
informator|0.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](https://steemitimages.com/DQmXyVP8JSzaPZpk1Xi7w96h8J1VFyt4hgb8xd8BsBut7Y6/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 :)
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
properties (23)
post_id37,111,097
authorjacekw
permlinksteem-python-na-przykladach-1-analiza-bloga
categorypolish
json_metadata"{"format": "markdown", "image": ["https://steemitimages.com/0x0/https://steemitimages.com/DQmXyVP8JSzaPZpk1Xi7w96h8J1VFyt4hgb8xd8BsBut7Y6/fig.png"], "links": ["http://steem.readthedocs.io/en/latest/index.html", "/@glodniwiedzy", "https://steemsql.com/"], "app": "busy/2.4.0", "tags": ["polish", "pl-artykuly", "pl-programowanie", "pl-python", "pl-steem-python"], "users": ["glodniwiedzy."], "community": "busy"}"
created2018-03-06 20:37:12
last_update2018-03-07 09:36:45
depth0
children3
net_rshares1,471,943,029,696
last_payout2018-03-13 20:37:12
cashout_time1969-12-31 23:59:59
total_payout_value4.572 SBD
curator_payout_value1.258 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length6,674
author_reputation26,034,878,518,689
root_title"Steem-python na przykładach #1: analiza bloga"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
author_curate_reward""
vote details (41)
@noisy ·
Proponuję byś dodał te przykłady do: 
https://steemprojects.com/projects/p/steemsnippets/
properties (22)
post_id37,127,401
authornoisy
permlinkre-jacekw-steem-python-na-przykladach-1-analiza-bloga-20180306t222035677z
categorypolish
json_metadata"{"app": "steemit/0.1", "links": ["https://steemprojects.com/projects/p/steemsnippets/"], "tags": ["polish"]}"
created2018-03-06 22:20:36
last_update2018-03-06 22:20:36
depth1
children1
net_rshares0
last_payout2018-03-13 22:20:36
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length89
author_reputation54,116,952,654,646
root_title"Steem-python na przykładach #1: analiza bloga"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
@jacekw ·
Ok, dobry pomysł, dodam.
properties (22)
post_id37,220,458
authorjacekw
permlinkre-noisy-re-jacekw-steem-python-na-przykladach-1-analiza-bloga-20180307t093959182z
categorypolish
json_metadata"{"app": "steemit/0.1", "tags": ["polish"]}"
created2018-03-07 09:40:06
last_update2018-03-07 09:40:06
depth2
children0
net_rshares0
last_payout2018-03-14 09:40:06
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length24
author_reputation26,034,878,518,689
root_title"Steem-python na przykładach #1: analiza bloga"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
@pjkober ·
Bardzo ciekawe, w prosty i przejrzysty sposób, pokazanie możliwości biblioteki Steem-python.
properties (22)
post_id37,327,920
authorpjkober
permlinkre-jacekw-steem-python-na-przykladach-1-analiza-bloga-20180307t204530190z
categorypolish
json_metadata"{"app": "steemit/0.1", "tags": ["polish"]}"
created2018-03-07 20:45:30
last_update2018-03-07 20:45:30
depth1
children0
net_rshares0
last_payout2018-03-14 20:45:30
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length92
author_reputation2,544,225,233
root_title"Steem-python na przykładach #1: analiza bloga"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000