a75ba5a288
It makes very little sense to do a format string for nothing but zeroes in case of unknown values. Simply return a set of 'NA' strings in place of usual stats. This makes the error cases consistent throughout Stats.py
859 lines
32 KiB
Python
Executable File
859 lines
32 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""Manage collecting and formatting of stats and tooltips.
|
|
"""
|
|
# Copyright 2008-2010, Ray E. Barker
|
|
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
########################################################################
|
|
|
|
# How to write a new stat:
|
|
# 0 Do not use a name like "xyz_2". Names ending in _ and a single digit are
|
|
# used to indicate the number of decimal places the user wants to see in the Hud.
|
|
# 1 You can see a listing of all the raw stats (e.g., from the HudCache table)
|
|
# by running Database.py as a stand along program. You need to combine
|
|
# those raw stats to get stats to present to the HUD. If you need more
|
|
# information than is in the HudCache table, then you have to write SQL.
|
|
# 2 The raw stats seen when you run Database.py are available in the Stats.py
|
|
# in the stat_dict dict. For example the number of vpips would be
|
|
# stat_dict[player]['vpip']. So the % vpip is
|
|
# float(stat_dict[player]['vpip'])/float(stat_dict[player]['n']). You can see how the
|
|
# keys of stat_dict relate to the column names in HudCache by inspecting
|
|
# the proper section of the SQL.py module.
|
|
# The stat_dict keys should be in lower case, i.e. vpip not VPIP, since
|
|
# postgres returns the column names in lower case.
|
|
# 3 You have to write a small function for each stat you want to add. See
|
|
# the vpip() function for example. This function has to be protected from
|
|
# exceptions, using something like the try:/except: paragraphs in vpip.
|
|
# 4 The name of the function has to be the same as the of the stat used
|
|
# in the config file.
|
|
# 5 The stat functions have a peculiar return value, which is outlined in
|
|
# the do_stat function. This format is useful for tool tips and maybe
|
|
# other stuff.
|
|
# 6 For each stat you make add a line to the __main__ function to test it.
|
|
|
|
# Standard Library modules
|
|
import sys
|
|
|
|
# pyGTK modules
|
|
import pygtk
|
|
import gtk
|
|
import re
|
|
|
|
import locale
|
|
lang=locale.getdefaultlocale()[0][0:2]
|
|
if lang=="en":
|
|
def _(string): return string
|
|
else:
|
|
import gettext
|
|
try:
|
|
trans = gettext.translation("fpdb", localedir="locale", languages=[lang])
|
|
trans.install()
|
|
except IOError:
|
|
def _(string): return string
|
|
|
|
# FreePokerTools modules
|
|
import Configuration
|
|
import Database
|
|
import Charset
|
|
|
|
import logging
|
|
# logging has been set up in fpdb.py or HUD_main.py, use their settings:
|
|
log = logging.getLogger("db")
|
|
|
|
|
|
re_Places = re.compile("_[0-9]$")
|
|
|
|
# String manipulation
|
|
import codecs
|
|
encoder = codecs.lookup(Configuration.LOCALE_ENCODING)
|
|
|
|
def do_tip(widget, tip):
|
|
_tip = Charset.to_utf8(tip)
|
|
widget.set_tooltip_text(_tip)
|
|
|
|
|
|
def do_stat(stat_dict, player = 24, stat = 'vpip'):
|
|
match = re_Places.search(stat)
|
|
result = eval("%(stat)s(stat_dict, %(player)d)" % {'stat': stat, 'player': player})
|
|
|
|
# If decimal places have been defined, override result[1]
|
|
if match:
|
|
base = stat[0:-2]
|
|
places = int(stat[-1:])
|
|
result[1] = '%.*f' % (places, 100.0*result[0])
|
|
return result
|
|
|
|
# OK, for reference the tuple returned by the stat is:
|
|
# 0 - The stat, raw, no formating, eg 0.33333333
|
|
# 1 - formatted stat with appropriate precision, eg. 33; shown in HUD
|
|
# 2 - formatted stat with appropriate precision, punctuation and a hint, eg v=33%
|
|
# 3 - same as #2 except name of stat instead of hint, eg vpip=33%
|
|
# 4 - the calculation that got the stat, eg 9/27
|
|
# 5 - the name of the stat, useful for a tooltip, eg vpip
|
|
|
|
###########################################
|
|
# functions that return individual stats
|
|
|
|
def totalprofit(stat_dict, player):
|
|
""" Total Profit."""
|
|
if stat_dict[player]['net'] != 0:
|
|
stat = float(stat_dict[player]['net']) / 100
|
|
return (stat, '$%.2f' % stat, 'tp=$%.2f' % stat, 'totalprofit=$%.2f' % stat, str(stat), _('Total Profit'))
|
|
return ('0', '$0.00', 'tp=0', 'totalprofit=0', '0', _('Total Profit'))
|
|
|
|
def playername(stat_dict, player):
|
|
""" Player Name."""
|
|
return (stat_dict[player]['screen_name'],
|
|
stat_dict[player]['screen_name'],
|
|
stat_dict[player]['screen_name'],
|
|
stat_dict[player]['screen_name'],
|
|
stat_dict[player]['screen_name'],
|
|
stat_dict[player]['screen_name'])
|
|
|
|
def vpip(stat_dict, player):
|
|
""" Voluntarily put $ in the pot pre-flop."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['vpip'])/float(stat_dict[player]['n'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'v=%3.1f%%' % (100.0*stat),
|
|
'vpip=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['vpip'], stat_dict[player]['n']),
|
|
_('Voluntarily Put In Pot Pre-Flop%')
|
|
)
|
|
except: return (stat,
|
|
'NA',
|
|
'v=NA',
|
|
'vpip=NA',
|
|
'(0/0)',
|
|
_('Voluntarily Put In Pot Pre-Flop%')
|
|
)
|
|
|
|
def pfr(stat_dict, player):
|
|
""" Preflop (3rd street) raise."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['pfr'])/float(stat_dict[player]['n'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'p=%3.1f%%' % (100.0*stat),
|
|
'pfr=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['pfr'], stat_dict[player]['n']),
|
|
_('Pre-Flop Raise %')
|
|
)
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'p=NA',
|
|
'pfr=NA',
|
|
'(0/0)',
|
|
_('Pre-Flop Raise %')
|
|
)
|
|
|
|
def wtsd(stat_dict, player):
|
|
""" Went to SD when saw flop/4th."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['sd'])/float(stat_dict[player]['saw_f'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'w=%3.1f%%' % (100.0*stat),
|
|
'wtsd=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['sd'], stat_dict[player]['saw_f']),
|
|
_('% went to showdown')
|
|
)
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'w=NA',
|
|
'wtsd=NA',
|
|
'(0/0)',
|
|
_('% went to showdown')
|
|
)
|
|
|
|
def wmsd(stat_dict, player):
|
|
""" Won $ at showdown."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['wmsd'])/float(stat_dict[player]['sd'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'w=%3.1f%%' % (100.0*stat),
|
|
'wmsd=%3.1f%%' % (100.0*stat),
|
|
'(%5.1f/%d)' % (float(stat_dict[player]['wmsd']), stat_dict[player]['sd']),
|
|
_('% won money at showdown')
|
|
)
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'w=NA',
|
|
'wmsd=NA',
|
|
'(0/0)',
|
|
_('% won money at showdown')
|
|
)
|
|
|
|
def profit100(stat_dict, player):
|
|
""" Profit won per 100 hands."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['net'])/float(stat_dict[player]['n'])
|
|
return (stat,
|
|
'%.0f' % (100.0*stat),
|
|
'p=%.0f' % (100.0*stat),
|
|
'p/100=%.0f' % (100.0*stat),
|
|
'%d/%d' % (stat_dict[player]['net'], stat_dict[player]['n']),
|
|
_('profit/100hands')
|
|
)
|
|
except:
|
|
print _("exception calcing p/100: 100 * %d / %d") % (stat_dict[player]['net'], stat_dict[player]['n'])
|
|
return (stat,
|
|
'NA',
|
|
'p=NA',
|
|
'p/100=NA',
|
|
'(0/0)',
|
|
_('profit/100hands')
|
|
)
|
|
|
|
def bbper100(stat_dict, player):
|
|
""" big blinds won per 100 hands."""
|
|
stat = 0.0
|
|
try:
|
|
stat = 100.0 * float(stat_dict[player]['net']) / float(stat_dict[player]['bigblind'])
|
|
return (stat,
|
|
'%5.3f' % (stat),
|
|
'bb100=%5.3f' % (stat),
|
|
'bb100=%5.3f' % (stat),
|
|
'(%d,%d)' % (100*stat_dict[player]['net'],stat_dict[player]['bigblind']),
|
|
_('big blinds/100 hands')
|
|
)
|
|
except:
|
|
log.info("exception calcing bb/100: "+str(stat_dict[player]))
|
|
return (stat,
|
|
'NA',
|
|
'bb100=NA',
|
|
'bb100=NA',
|
|
'(--)',
|
|
_('big blinds/100 hands')
|
|
)
|
|
|
|
def BBper100(stat_dict, player):
|
|
""" Big Bets won per 100 hands."""
|
|
stat = 0.0
|
|
try:
|
|
stat = 50 * float(stat_dict[player]['net']) / float(stat_dict[player]['bigblind'])
|
|
return (stat,
|
|
'%5.3f' % (stat),
|
|
'BB100=%5.3f' % (stat),
|
|
'BB100=%5.3f' % (stat),
|
|
'(%d,%d)' % (100*stat_dict[player]['net'],2*stat_dict[player]['bigblind']),
|
|
_('Big Bets/100 hands')
|
|
)
|
|
except:
|
|
log.info(_("exception calcing BB/100: ")+str(stat_dict[player]))
|
|
return (stat,
|
|
'NA',
|
|
'BB100=NA',
|
|
'BB100=NA',
|
|
'(--)',
|
|
_('Big Bets/100 hands')
|
|
)
|
|
|
|
def saw_f(stat_dict, player):
|
|
""" Saw flop/4th."""
|
|
try:
|
|
num = float(stat_dict[player]['saw_f'])
|
|
den = float(stat_dict[player]['n'])
|
|
stat = num/den
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'sf=%3.1f%%' % (100.0*stat),
|
|
'saw_f=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['saw_f'], stat_dict[player]['n']),
|
|
_('Flop Seen %')
|
|
)
|
|
except:
|
|
stat = 0.0
|
|
return (stat,
|
|
'NA',
|
|
'sf=NA',
|
|
'saw_f=NA',
|
|
'(0/0)',
|
|
_('Flop Seen %')
|
|
)
|
|
|
|
def n(stat_dict, player):
|
|
""" Number of hands played."""
|
|
try:
|
|
# If sample is large enough, use X.Yk notation instead
|
|
_n = stat_dict[player]['n']
|
|
fmt = '%d' % _n
|
|
if _n >= 10000:
|
|
k = _n / 1000
|
|
c = _n % 1000
|
|
_c = float(c) / 100.0
|
|
d = int(round(_c))
|
|
if d == 10:
|
|
k += 1
|
|
d = 0
|
|
fmt = '%d.%dk' % (k, d)
|
|
return (stat_dict[player]['n'],
|
|
'%s' % fmt,
|
|
'n=%d' % (stat_dict[player]['n']),
|
|
'n=%d' % (stat_dict[player]['n']),
|
|
'(%d)' % (stat_dict[player]['n']),
|
|
_('number hands seen')
|
|
)
|
|
except:
|
|
# Number of hands shouldn't ever be "NA"; zeroes are better here
|
|
return (0,
|
|
'%d' % (0),
|
|
'n=%d' % (0),
|
|
'n=%d' % (0),
|
|
'(%d)' % (0),
|
|
_('number hands seen')
|
|
)
|
|
|
|
def fold_f(stat_dict, player):
|
|
""" Folded flop/4th."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['fold_2'])/float(stat_dict[player]['saw_f'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'ff=%3.1f%%' % (100.0*stat),
|
|
'fold_f=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['fold_2'], stat_dict[player]['saw_f']),
|
|
_('folded flop/4th')
|
|
)
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'ff=NA',
|
|
'fold_f=NA',
|
|
'(0/0)',
|
|
_('folded flop/4th')
|
|
)
|
|
|
|
def steal(stat_dict, player):
|
|
""" Steal %."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['steal'])/float(stat_dict[player]['steal_opp'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'st=%3.1f%%' % (100.0*stat),
|
|
'steal=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['steal'], stat_dict[player]['steal_opp']),
|
|
_('% steal attempted')
|
|
)
|
|
except:
|
|
return (stat, 'NA', 'st=NA', 'steal=NA', '(0/0)', '% steal attempted')
|
|
|
|
def f_SB_steal(stat_dict, player):
|
|
""" Folded SB to steal."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['sbnotdef'])/float(stat_dict[player]['sbstolen'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'fSB=%3.1f%%' % (100.0*stat),
|
|
'fSB_s=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['sbnotdef'], stat_dict[player]['sbstolen']),
|
|
_('% folded SB to steal'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'fSB=NA',
|
|
'fSB_s=NA',
|
|
'(0/0)',
|
|
_('% folded SB to steal'))
|
|
|
|
def f_BB_steal(stat_dict, player):
|
|
""" Folded BB to steal."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['bbnotdef'])/float(stat_dict[player]['bbstolen'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'fBB=%3.1f%%' % (100.0*stat),
|
|
'fBB_s=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['bbnotdef'], stat_dict[player]['bbstolen']),
|
|
_('% folded BB to steal'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'fBB=NA',
|
|
'fBB_s=NA',
|
|
'(0/0)',
|
|
_('% folded BB to steal'))
|
|
|
|
def f_steal(stat_dict, player):
|
|
""" Folded blind to steal."""
|
|
stat = 0.0
|
|
try:
|
|
folded_blind = stat_dict[player]['sbnotdef'] + stat_dict[player]['bbnotdef']
|
|
blind_stolen = stat_dict[player]['sbstolen'] + stat_dict[player]['bbstolen']
|
|
|
|
stat = float(folded_blind)/float(blind_stolen)
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'fB=%3.1f%%' % (100.0*stat),
|
|
'fB_s=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (folded_blind, blind_stolen),
|
|
_('% folded blind to steal'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'fB=NA',
|
|
'fB_s=NA',
|
|
'(0/0)',
|
|
_('% folded blind to steal'))
|
|
|
|
def three_B(stat_dict, player):
|
|
""" Three bet preflop/3rd."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['tb_0'])/float(stat_dict[player]['tb_opp_0'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'3B=%3.1f%%' % (100.0*stat),
|
|
'3B_pf=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['tb_0'], stat_dict[player]['tb_opp_0']),
|
|
_('% 3/4 Bet preflop/3rd'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'3B=NA',
|
|
'3B_pf=NA',
|
|
'(0/0)',
|
|
_('% 3/4 Bet preflop/3rd'))
|
|
|
|
def WMsF(stat_dict, player):
|
|
""" Won $ when saw flop/4th."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['w_w_s_1'])/float(stat_dict[player]['saw_1'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'wf=%3.1f%%' % (100.0*stat),
|
|
'w_w_f=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['w_w_s_1'], stat_dict[player]['saw_f']),
|
|
_('% won$/saw flop/4th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'wf=NA',
|
|
'w_w_f=NA',
|
|
'(0/0)',
|
|
_('% won$/saw flop/4th'))
|
|
|
|
def a_freq1(stat_dict, player):
|
|
""" Flop/4th aggression frequency."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['aggr_1'])/float(stat_dict[player]['saw_f'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'a1=%3.1f%%' % (100.0*stat),
|
|
'a_fq_1=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['aggr_1'], stat_dict[player]['saw_f']),
|
|
_('Aggression Freq flop/4th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'a1=NA',
|
|
'a_fq_1=NA',
|
|
'(0/0)',
|
|
_('Aggression Freq flop/4th'))
|
|
|
|
def a_freq2(stat_dict, player):
|
|
""" Turn/5th aggression frequency."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['aggr_2'])/float(stat_dict[player]['saw_2'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'a2=%3.1f%%' % (100.0*stat),
|
|
'a_fq_2=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['aggr_2'], stat_dict[player]['saw_2']),
|
|
_('Aggression Freq turn/5th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'a2=NA',
|
|
'a_fq_2=NA',
|
|
'(0/0)',
|
|
_('Aggression Freq turn/5th'))
|
|
|
|
def a_freq3(stat_dict, player):
|
|
""" River/6th aggression frequency."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['aggr_3'])/float(stat_dict[player]['saw_3'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'a3=%3.1f%%' % (100.0*stat),
|
|
'a_fq_3=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['aggr_3'], stat_dict[player]['saw_3']),
|
|
_('Aggression Freq river/6th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'a3=NA',
|
|
'a_fq_3=NA',
|
|
'(0/0)',
|
|
_('Aggression Freq river/6th'))
|
|
|
|
def a_freq4(stat_dict, player):
|
|
""" 7th street aggression frequency."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['aggr_4'])/float(stat_dict[player]['saw_4'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'a4=%3.1f%%' % (100.0*stat),
|
|
'a_fq_4=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['aggr_4'], stat_dict[player]['saw_4']),
|
|
_('Aggression Freq 7th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'a4=NA',
|
|
'a_fq_4=NA',
|
|
'(0/0)',
|
|
_('Aggression Freq 7th'))
|
|
|
|
def a_freq_123(stat_dict, player):
|
|
""" Post-Flop aggression frequency."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float( stat_dict[player]['aggr_1'] + stat_dict[player]['aggr_2'] + stat_dict[player]['aggr_3']
|
|
) / float( stat_dict[player]['saw_1'] + stat_dict[player]['saw_2'] + stat_dict[player]['saw_3']);
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'afq=%3.1f%%' % (100.0*stat),
|
|
'postf_aggfq=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % ( stat_dict[player]['aggr_1']
|
|
+ stat_dict[player]['aggr_2']
|
|
+ stat_dict[player]['aggr_3']
|
|
, stat_dict[player]['saw_1']
|
|
+ stat_dict[player]['saw_2']
|
|
+ stat_dict[player]['saw_3']
|
|
),
|
|
_('Post-Flop Aggression Freq'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'a3=NA',
|
|
'a_fq_3=NA',
|
|
'(0/0)',
|
|
_('Post-Flop Aggression Freq'))
|
|
|
|
def agg_freq(stat_dict, player):
|
|
""" Post-Flop aggression frequency."""
|
|
""" Aggression frequency % = (times bet or raised post-flop) * 100 / (times bet, raised, called, or folded post-flop) """
|
|
stat = 0.0
|
|
try:
|
|
""" Agression on the flop and all streets """
|
|
bet_raise = stat_dict[player]['aggr_1'] + stat_dict[player]['aggr_2'] + stat_dict[player]['aggr_3'] + stat_dict[player]['aggr_4']
|
|
""" number post flop streets seen, this must be number of post-flop calls !! """
|
|
post_call = stat_dict[player]['call_1'] + stat_dict[player]['call_2'] + stat_dict[player]['call_3'] + stat_dict[player]['call_4']
|
|
""" Number of post flop folds this info is not yet in the database """
|
|
post_fold = stat_dict[player]['f_freq_1'] + stat_dict[player]['f_freq_2'] + stat_dict[player]['f_freq_3'] + stat_dict[player]['f_freq_4']
|
|
|
|
stat = float (bet_raise) / float(post_call + post_fold + bet_raise)
|
|
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'afr=%3.1f%%' % (100.0*stat),
|
|
'agg_fr=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (bet_raise, (post_call + post_fold + bet_raise)),
|
|
_('Aggression Freq'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'af=NA',
|
|
'agg_f=NA',
|
|
'(0/0)',
|
|
_('Aggression Freq'))
|
|
|
|
def agg_fact(stat_dict, player):
|
|
""" Post-Flop aggression frequency."""
|
|
""" Aggression factor = (times bet or raised post-flop) / (times called post-flop) """
|
|
stat = 0.0
|
|
try:
|
|
bet_raise = stat_dict[player]['aggr_1'] + stat_dict[player]['aggr_2'] + stat_dict[player]['aggr_3'] + stat_dict[player]['aggr_4']
|
|
post_call = stat_dict[player]['call_1'] + stat_dict[player]['call_2'] + stat_dict[player]['call_3'] + stat_dict[player]['call_4']
|
|
|
|
if post_call > 0:
|
|
stat = float (bet_raise) / float(post_call)
|
|
else:
|
|
stat = float (bet_raise)
|
|
return (stat,
|
|
'%2.2f' % (stat) ,
|
|
'afa=%2.2f' % (stat) ,
|
|
'agg_fa=%2.2f' % (stat) ,
|
|
'(%d/%d)' % (bet_raise, post_call),
|
|
_('Aggression Factor'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'afa=NA',
|
|
'agg_fa=NA',
|
|
'(0/0)',
|
|
_('Aggression Factor'))
|
|
|
|
def cbet(stat_dict, player):
|
|
|
|
""" Total continuation bet."""
|
|
""" Continuation bet % = (times made a continuation bet on any street) * 100 / (number of opportunities to make a continuation bet on any street) """
|
|
|
|
stat = 0.0
|
|
try:
|
|
cbets = stat_dict[player]['cb_1']+stat_dict[player]['cb_2']+stat_dict[player]['cb_3']+stat_dict[player]['cb_4']
|
|
oppt = stat_dict[player]['cb_opp_1']+stat_dict[player]['cb_opp_2']+stat_dict[player]['cb_opp_3']+stat_dict[player]['cb_opp_4']
|
|
stat = float(cbets)/float(oppt)
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'cbet=%3.1f%%' % (100.0*stat),
|
|
'cbet=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (cbets, oppt),
|
|
_('% continuation bet '))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'cbet=NA',
|
|
'cbet=NA',
|
|
'(0/0)',
|
|
_('% continuation bet '))
|
|
|
|
def cb1(stat_dict, player):
|
|
""" Flop continuation bet."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['cb_1'])/float(stat_dict[player]['cb_opp_1'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'cb1=%3.1f%%' % (100.0*stat),
|
|
'cb_1=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['cb_1'], stat_dict[player]['cb_opp_1']),
|
|
_('% continuation bet flop/4th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'cb1=NA',
|
|
'cb_1=NA',
|
|
'(0/0)',
|
|
_('% continuation bet flop/4th'))
|
|
|
|
def cb2(stat_dict, player):
|
|
""" Turn continuation bet."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['cb_2'])/float(stat_dict[player]['cb_opp_2'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'cb2=%3.1f%%' % (100.0*stat),
|
|
'cb_2=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['cb_2'], stat_dict[player]['cb_opp_2']),
|
|
_('% continuation bet turn/5th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'cb2=NA',
|
|
'cb_2=NA',
|
|
'(0/0)',
|
|
_('% continuation bet turn/5th'))
|
|
|
|
def cb3(stat_dict, player):
|
|
""" River continuation bet."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['cb_3'])/float(stat_dict[player]['cb_opp_3'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'cb3=%3.1f%%' % (100.0*stat),
|
|
'cb_3=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['cb_3'], stat_dict[player]['cb_opp_3']),
|
|
_('% continuation bet river/6th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'cb3=NA',
|
|
'cb_3=NA',
|
|
'(0/0)',
|
|
_('% continuation bet river/6th'))
|
|
|
|
def cb4(stat_dict, player):
|
|
""" 7th street continuation bet."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['cb_4'])/float(stat_dict[player]['cb_opp_4'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'cb4=%3.1f%%' % (100.0*stat),
|
|
'cb_4=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['cb_4'], stat_dict[player]['cb_opp_4']),
|
|
_('% continuation bet 7th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'cb4=NA',
|
|
'cb_4=NA',
|
|
'(0/0)',
|
|
_('% continuation bet 7th'))
|
|
|
|
def ffreq1(stat_dict, player):
|
|
""" Flop/4th fold frequency."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['f_freq_1'])/float(stat_dict[player]['was_raised_1'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'ff1=%3.1f%%' % (100.0*stat),
|
|
'ff_1=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['f_freq_1'], stat_dict[player]['was_raised_1']),
|
|
_('% fold frequency flop/4th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'ff1=NA',
|
|
'ff_1=NA',
|
|
'(0/0)',
|
|
_('% fold frequency flop/4th'))
|
|
|
|
def ffreq2(stat_dict, player):
|
|
""" Turn/5th fold frequency."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['f_freq_2'])/float(stat_dict[player]['was_raised_2'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'ff2=%3.1f%%' % (100.0*stat),
|
|
'ff_2=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['f_freq_2'], stat_dict[player]['was_raised_2']),
|
|
_('% fold frequency turn/5th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'ff2=NA',
|
|
'ff_2=NA',
|
|
'(0/0)',
|
|
_('% fold frequency turn/5th'))
|
|
|
|
def ffreq3(stat_dict, player):
|
|
""" River/6th fold frequency."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['f_freq_3'])/float(stat_dict[player]['was_raised_3'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'ff3=%3.1f%%' % (100.0*stat),
|
|
'ff_3=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['f_freq_3'], stat_dict[player]['was_raised_3']),
|
|
_('% fold frequency river/6th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'ff3=NA',
|
|
'ff_3=NA',
|
|
'(0/0)',
|
|
_('% fold frequency river/6th'))
|
|
|
|
def ffreq4(stat_dict, player):
|
|
""" 7th fold frequency."""
|
|
stat = 0.0
|
|
try:
|
|
stat = float(stat_dict[player]['f_freq_4'])/float(stat_dict[player]['was_raised_4'])
|
|
return (stat,
|
|
'%3.1f' % (100.0*stat),
|
|
'ff4=%3.1f%%' % (100.0*stat),
|
|
'ff_4=%3.1f%%' % (100.0*stat),
|
|
'(%d/%d)' % (stat_dict[player]['f_freq_4'], stat_dict[player]['was_raised_4']),
|
|
_('% fold frequency 7th'))
|
|
except:
|
|
return (stat,
|
|
'NA',
|
|
'ff4=NA',
|
|
'ff_4=NA',
|
|
'(0/0)',
|
|
_('% fold frequency 7th'))
|
|
|
|
if __name__== "__main__":
|
|
statlist = dir()
|
|
misslist = [ "Configuration", "Database", "Charset", "codecs", "encoder"
|
|
, "do_stat", "do_tip", "GInitiallyUnowned", "gtk", "pygtk"
|
|
, "re", "re_Places"
|
|
]
|
|
statlist = [ x for x in statlist if x not in dir(sys) ]
|
|
statlist = [ x for x in statlist if x not in dir(codecs) ]
|
|
statlist = [ x for x in statlist if x not in misslist ]
|
|
#print "statlist is", statlist
|
|
|
|
c = Configuration.Config()
|
|
#TODO: restore the below code. somehow it creates a version 119 DB but commenting this out makes it print a stat list
|
|
db_connection = Database.Database(c)
|
|
h = db_connection.get_last_hand()
|
|
stat_dict = db_connection.get_stats_from_hand(h, "ring")
|
|
|
|
for player in stat_dict.keys():
|
|
print (_("Example stats, player = %s hand = %s:") % (player, h))
|
|
for attr in statlist:
|
|
print " ", do_stat(stat_dict, player=player, stat=attr)
|
|
break
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'vpip')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'pfr')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'wtsd')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'profit100')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'saw_f')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'n')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'fold_f')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'wmsd')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'steal')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'f_SB_steal')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'f_BB_steal')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'f_steal')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'three_B')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'WMsF')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'a_freq1')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'a_freq2')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'a_freq3')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'a_freq4')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'a_freq_123')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'cb1')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'cb2')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'cb3')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'cb4')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'ffreq1')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'ffreq2')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'ffreq3')
|
|
#print "player = ", player, do_stat(stat_dict, player = player, stat = 'ffreq4')
|
|
#print "\n"
|
|
|
|
print _("\n\nLegal stats:")
|
|
print _("(add _0 to name to display with 0 decimal places, _1 to display with 1, etc)\n")
|
|
for attr in statlist:
|
|
print "%-14s %s" % (attr, eval("%s.__doc__" % (attr)))
|
|
# print " <pu_stat pu_stat_name = \"%s\"> </pu_stat>" % (attr)
|
|
print
|
|
|
|
#db_connection.close_connection
|
|
|