File size: 2,451 Bytes
101093d
 
 
b45152a
101093d
 
 
 
 
 
 
 
b45152a
101093d
 
 
 
 
b45152a
 
101093d
 
 
 
 
 
 
b45152a
101093d
 
 
 
 
 
b45152a
101093d
 
b45152a
 
101093d
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import numpy as np
import plotly.express as px

def plot_trace(df, col='emission', agg='mean', time_col='timestamp', ntop=10, hotkeys=None, hotkey_regex=None, abbrev=8, type='Miners'):
    
    if hotkeys is not None:
        df = df.loc[df.hotkey.isin(hotkeys)]
    if hotkey_regex is not None:
        df = df.loc[df.hotkey.str.contains(hotkey_regex)]
        
    top_miners = df.groupby('hotkey')[col].agg(agg).sort_values(ascending=False)
    
    stats = df.loc[df.hotkey.isin(top_miners.index[:ntop])].sort_values(by=time_col)
    
    stats['hotkey_abbrev'] = stats.hotkey.str[:abbrev]
    stats['coldkey_abbrev'] = stats.coldkey.str[:abbrev]
    stats['rank'] = stats.hotkey.map({k:i for i,k in enumerate(top_miners.index, start=1)})
    
    return px.line(stats.sort_values(by=[time_col,'rank']),
                    x=time_col, y=col, color='coldkey_abbrev', line_group='hotkey_abbrev',
                    hover_data=['hotkey','rank'],
                    labels={col:col.title(),'timestamp':'','coldkey_abbrev':f'Coldkey (first {abbrev} chars)','hotkey_abbrev':f'Hotkey (first {abbrev} chars)'},
                    title=f'Top {ntop} {type}, by {col.title()}',
                    template='plotly_white', width=800, height=600,
                    ).update_traces(opacity=0.7)
    
    
def plot_cabals(df, sel_col='coldkey', count_col='hotkey', time_col='timestamp', values=None, ntop=10, abbr=8):
    
    if values is None:
        values = df[sel_col].value_counts().sort_values(ascending=False).index[:ntop].tolist()
        print(f'Automatically selected {sel_col!r} = {values!r}')
        
    df = df.loc[df[sel_col].isin(values)]
    rates = df.groupby([time_col,sel_col])[count_col].nunique().reset_index()
    abbr_col = f'{sel_col} (first {abbr} chars)'
    rates[abbr_col] = rates[sel_col].str[:abbr]
    return px.line(rates.melt(id_vars=[time_col,sel_col,abbr_col]), 
            x=time_col, y='value', color=abbr_col,
            #facet_col='variable',  facet_col_wrap=1,
            labels={'value':f'Number of Unique {count_col.title()}s per {sel_col.title()}','timestamp':''}, 
            category_orders={abbr_col:[ v[:abbr] for v in values]},
            # title=f'Unique {count_col.title()}s Associated with Selected {sel_col.title()}s in Metagraph',
            title=f'Impact of Validators Update on Cabal',           
            width=800, height=600, template='plotly_white',
            )