Skip to content

Commit 0f461c6

Browse files
committed
model update
1 parent 21fa073 commit 0f461c6

File tree

3 files changed

+82
-50
lines changed

3 files changed

+82
-50
lines changed

egs/egs_ref.py

+71-31
Original file line numberDiff line numberDiff line change
@@ -432,13 +432,17 @@ def update_txblock(self, txpool_block, blockdata, predictiontable, gprecs):
432432
txpool_block = txpool_block.join(predictiontable.predictiondf, how='left', on='round_gp_10gwei')
433433
txpool_block['safelow'] = gprecs['safeLow']
434434
txpool_block['average'] = gprecs['average']
435+
txpool_block['nomine'] = gprecs['nomine']
435436
console.info("updating " + str(len(txpool_block)) + " transactions")
436437
self.df = self.df.combine_first(txpool_block)
437438

438439

439-
def write_to_sql(self):
440+
def write_to_sql(self, txpool):
440441
"""writes to sql, prevent buffer overflow errors"""
441442
console.info("writing to mysql....this can take awhile")
443+
prev_block = self.process_block-1
444+
txp = txpool.txpool_df.loc[txpool.txpool_df['block']==prev_block]
445+
self.df['txpool'] = self.df.index.isin(txp.index).astype(int)
442446
self.df.reset_index(inplace=True)
443447
length = len(self.df)
444448
chunks = int(np.ceil(length/1000))
@@ -481,6 +485,7 @@ def __init__(self, name, current_block, start_block, end_block, max_gas, alltx,
481485
self.alltx = alltx
482486
self.txpool = txpool
483487
self.safe = None
488+
self.nomine_gp = None
484489
self.init_df()
485490

486491
def init_df(self):
@@ -511,6 +516,8 @@ def init_df(self):
511516
self.print_length()
512517
self.df = pd.DataFrame()
513518
self.safe = None
519+
self.nomine_gp = None
520+
514521

515522
def get_txpool(self):
516523
df = self.df
@@ -521,7 +528,10 @@ def get_txpool(self):
521528
else:
522529
safe = df.loc[(df['total'] >= 2) & (df['mined'] >=1) & (df['pct_remaining'] < 10)]
523530
safe_gp = safe.index.min()
531+
nomine= df.loc[(df['mined'] == 0) & (df.index < safe_gp)]
532+
nomine_gp = nomine.index.max()
524533
self.safe = safe_gp
534+
self.nomine_gp = nomine_gp
525535

526536

527537
def print_length(self):
@@ -548,7 +558,6 @@ def init_predictiontable(self):
548558
"""makes prediction table for number of blocks to confirmation"""
549559
hashpower = self.blockdata.hashpower
550560
hpower = self.alltx.pctmined_gp_last100
551-
avg_timemined = self.blockdata.block_time
552561
txpool_by_gp = self.txpool.txpool_by_gp
553562
submitted_5mago = self.recentdf
554563
submitted_30mago = self.remotedf
@@ -568,9 +577,38 @@ def init_predictiontable(self):
568577
predictTable['pct_remaining30m'] = submitted_30mago['pct_remaining']
569578
predictTable['pct_mined_30m'] = submitted_30mago['pct_mined']
570579
predictTable['total_seen_30m'] = submitted_30mago['total']
580+
581+
self.predictiondf = predictTable
571582

572-
#to-do - fix
573-
predictTable['expectedWait'] = predictTable.apply(predict, axis=1)
583+
def get_predicted_wait(self, gpreport):
584+
"""make wait time based on the data"""
585+
predictTable = self.predictiondf
586+
avg_timemined = self.blockdata.block_time
587+
gprecs = gpreport.gprecs
588+
predictTable['average'] = gprecs['average']
589+
predictTable['safelow'] = gprecs['safeLow']
590+
predictTable['nomine'] = gprecs['nomine']
591+
predictTable['avgdiff'] = (predictTable.index >= predictTable['average']).astype(int)
592+
predictTable['intercept'] = INTERCEPT
593+
predictTable['hpa_coef'] = HPA_COEF
594+
predictTable['avgdiff_coef'] = AVGDIFF_COEF
595+
predictTable['tx_atabove_coef'] = TXATABOVE_COEF
596+
predictTable['int2'] = INTERCEPT2
597+
predictTable['hpa_coef2'] = HPA_COEF2
598+
599+
600+
601+
602+
if gprecs['nomine']:
603+
predictTable['sum'] = (predictTable['intercept'] + (predictTable['hashpower_accepting'] * predictTable['hpa_coef']) + (predictTable['avgdiff'] * predictTable['avgdiff_coef']) + (predictTable['tx_atabove'] * predictTable['tx_atabove_coef']))
604+
predictTable['expectedWait'] = predictTable['sum'].apply(lambda x: np.exp(x))
605+
predictTable.loc[predictTable.index <= gprecs['nomine'], 'expectedWait'] = 1000
606+
else:
607+
predictTable['sum'] = (predictTable['int2'] + (predictTable['hashpower_accepting'] * predictTable['hpa_coef2']))
608+
predictTable['expectedWait'] = predictTable['sum'].apply(lambda x: np.exp(x))
609+
predictTable['unsafe'] = predictTable['hashpower_accepting'].apply(lambda x: 1 if x < 30 else 0)
610+
predictTable.loc[predictTable['unsafe'] ==1, 'expectedWait'] = 1000
611+
predictTable['expectedWait'] = predictTable['expectedWait'].apply(lambda x: x if x>=2 else 2)
574612
predictTable['expectedTime'] = predictTable['expectedWait'].apply(lambda x: np.round((x * avg_timemined / 60), decimals=2))
575613
self.predictiondf = predictTable
576614

@@ -602,7 +640,6 @@ def __init__(self, predictiontable, blockdata, submitted_recent, submmited_remot
602640
self.array5m = array5m
603641
self.array30m = array30m
604642
self.gprecs = None
605-
self.minlow = 1
606643
self.make_gasprice_report()
607644

608645

@@ -613,7 +650,6 @@ def make_gasprice_report(self):
613650
speed = self.blockdata.speed
614651
array5m = self.array5m
615652
array30m = self.array30m
616-
minlow = self.minlow
617653
block = self.block
618654

619655
if self.submitted_remote.safe:
@@ -626,44 +662,35 @@ def make_gasprice_report(self):
626662
else:
627663
average = self.blockdata.avg
628664

629-
def get_wait(gasprice):
630-
try:
631-
wait = prediction_table.loc[prediction_table['gasprice']==gasprice, 'expectedTime'].values[0]
632-
except:
633-
wait = 0
634-
wait = round(wait, 1)
635-
return float(wait)
636-
637665
console.info('safelow: ' + str(safelow))
638666
console.info('avg: ' +str(average))
639-
if np.isnan(safelow):
640-
safelow = MAX_GP
641-
if np.isnan(average):
642-
average = MAX_GP
643-
array30m.append(safelow)
644-
array5m.append(average)
645667

646668
gprecs = {}
647-
gprecs['safeLow'] = np.percentile(array30m, 50)
648-
gprecs['average'] = np.percentile(array5m, 50)
649669
gprecs['fast'] = self.blockdata.fast
650-
if np.isnan(gprecs['fast']):
651-
gprecs['fast'] = MAX_GP
652670
gprecs['fastest'] = self.blockdata.fastest
653-
if np.isnan(gprecs['fastest']):
654-
gprecs['fastest'] = MAX_GP
671+
if self.submitted_remote.nomine_gp:
672+
gprecs['nomine'] = self.submitted_remote.nomine_gp.astype(float)
673+
else:
674+
gprecs['nomine'] = self.submitted_remote.nomine_gp
675+
676+
for rec in [safelow, average, gprecs['fast'], gprecs['fastest']]:
677+
if np.isnan(rec):
678+
rec = MAX_GP
679+
680+
681+
array30m.append(safelow)
682+
array5m.append(average)
655683

684+
685+
gprecs['safeLow'] = np.percentile(array30m, 50)
686+
gprecs['average'] = np.percentile(array5m, 50)
687+
656688
if (gprecs['fast'] < gprecs['average']):
657689
gprecs['fast'] = gprecs['average']
658690

659691
if (gprecs['safeLow'] > gprecs['average']):
660692
gprecs['safeLow'] = gprecs['average']
661693

662-
gprecs['safeLowWait'] = get_wait(gprecs['safeLow'])
663-
gprecs['avgWait'] = get_wait(gprecs['average'])
664-
665-
gprecs['fastWait'] = get_wait(gprecs['fast'])
666-
gprecs['fastestWait'] = get_wait(gprecs['fastest'])
667694
gprecs['block_time'] = block_time
668695
gprecs['blockNum'] = block
669696
gprecs['speed'] = speed
@@ -677,11 +704,24 @@ def get_wait(gasprice):
677704
self.array5m = array5m
678705
self.array30m = array30m
679706

707+
def get_wait(self, prediction_table):
708+
def lookup(gasprice):
709+
try:
710+
wait = prediction_table.at[prediction_table.index[gasprice], 'expectedTime']
711+
except Exception as e :
712+
print(e)
713+
wait = round(wait, 1)
714+
return float(wait)
715+
self.gprecs['safeLowWait'] = lookup(self.gprecs['safeLow'])
716+
self.gprecs['avgWait'] = lookup(self.gprecs['average'])
717+
self.gprecs['fastWait'] = lookup(self.gprecs['fast'])
718+
self.gprecs['fastestWait'] = lookup(self.gprecs['fastest'])
680719

681720
def write_to_json(self):
682721
"""write json data"""
683722
global exporter
684723
try:
724+
print(self.gprecs)
685725
exporter.write_json('ethgasAPI', self.gprecs)
686726
except Exception as e:
687727
console.error("write_to_json: Exception caught: " + str(e))

egs/main.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ def master_control(args):
5353
array5m = gaspricereport.array5m
5454
#hold recent safelow gp rec
5555
array30m = gaspricereport.array30m
56+
#make predicted wait times
57+
if txpool.got_txpool:
58+
predictiontable.get_predicted_wait(gaspricereport)
59+
gaspricereport.get_wait(predictiontable.predictiondf)
5660
#updates tx submitted at current block with data from predictiontable, gpreport- this is for storing in mysql for later optional stats models.
5761
alltx.update_txblock(txpool.txpool_block, blockdata, predictiontable, gaspricereport.gprecs)
5862

@@ -81,7 +85,7 @@ def master_control(args):
8185
#write to mysql
8286
response = input ("save transactions to mysql (y/n)?")
8387
if (response.lower() == 'y'):
84-
alltx.write_to_sql()
88+
alltx.write_to_sql(txpool)
8589
blockdata.write_to_sql()
8690
sys.exit()
8791
else:

egs/modelparams/constants.py

+6-18
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,13 @@
1111
#interaction term with highgas offered and hashpower. not currently using
1212
#highgas offefred coefficient
1313

14-
INTERCEPT = 7.5375
15-
HPA_COEF = -0.0801
16-
TXATABOVE_COEF = 0.0003
17-
INTERACT_COEF = 0
18-
HIGHGAS_COEF = 0.3532
14+
INTERCEPT = 4.4683
15+
HPA_COEF = -0.0136
16+
TXATABOVE_COEF = .0009
17+
AVGDIFF_COEF = -2.0235
1918

20-
21-
#a second model when data from past 5 min is available
22-
INT2 = 5.5751
23-
HPA2 = -0.0454
24-
TXATAB2 = 0
25-
HIGHGAS2 = 0.6658
26-
S5MAGO = 0.0176
27-
28-
#high gas offered is defined based as a percentage of the gas limit
29-
#highgas2 is the only one that matters right now
30-
31-
HIGHGAS1 = .037
32-
HIGHGAS2 = .15
19+
INTERCEPT2 = 6.9238
20+
HPA_COEF2 = -0.0670
3321

3422
# Highest gas price tracked
3523
MAX_GP = 5000

0 commit comments

Comments
 (0)