This is stressing me out. I am trying to build a contract bridge match point scoring system with an elasticsearch cluster and a python flask app. This is long and complicated, sorry.
The results of a given board are:
board_number,nsp, ewp, contract, by, tricks, nsscore, ewscore
1,1,8,3NT,N,10,430,0
1,2,9,3NT,S,10,430,0
1,3,10,4S,N,10,420,0
1,4,11,3NT,N,11,460,0
1,5,12,3NT,S,10,400,0
1,6,13,4S,S,11,480,0
1,7,14,3NT,S,8,0,50
Sorry not very well formatted above, I did not know how to insert a range from a spreadsheet. The north/south pair, column "nsscore" get 2 points for each score they beat and 1 point for each score they tie. So, nsp 6 get 12 points as they have the best score (480) and ewp 14 get 12 points for their score of 50 as they were the only east/west pair who had a plus score.
I want to loop through the results and score each n/s pair and each e/w pair by comparing their score with the other pair in the same direction (all n/s compared against each other and all e/w pairs against each other).
After multiple efforts the closest I can get is as follows:
@application.route('/go', methods=['GET', 'POST'])
def go():
resp = es.search(index="mitchell-index", body={"query": {"match_all": {}}})
pair_list = []
score_list = {}
ns_mp_score = 0
ew_mp_score = 0
for row in resp["hits"]["hits"]:
pair_list.append(row['_source']['nsp'])
for index in range(len(pair_list)):
nsp = pair_list[index]
query = {
"query": {
"bool": {
"must": [
{ "match": { "nsp": nsp }},
{ "match": {"board_number": "1" }}
]
}
}
}
query = json.dumps(query)
scores = es.search(index="match", body=query)
for row in scores["hits"]["hits"]:
nsscore = int(row['_source']['nsscore'])
if int(row['_source']['nsscore']) < nsscore:
ns_mp_score = ns_mp_score
#ew_mp_score = ew_mp_score + 2
elif int(row['_source']['nsscore']) > nsscore:
ns_mp_score = ns_mp_score + 2
#ew_mp_score = ew_mp_score
else:
ns_mp_score = ns_mp_score + 1
#ew_mp_score = ew_mp_score + 1
score_list.update({ 'board': row['_source']['board_number'], 'nsp': row['_source']['nsp'], 'ewp': row['_source']['ewp'], 'ns_mp_score': ns_mp_score, 'ew_mp_score': ew_mp_score})
which produces:
{'board': '1', 'nsp': '1', 'ewp': '8', 'ns_mp_score': 1, 'ew_mp_score': 0}
{'board': '1', 'nsp': '4', 'ewp': '11', 'ns_mp_score': 3, 'ew_mp_score': 0}
{'board': '1', 'nsp': '5', 'ewp': '12', 'ns_mp_score': 6, 'ew_mp_score': 0}
{'board': '1', 'nsp': '7', 'ewp': '14', 'ns_mp_score': 10, 'ew_mp_score': 0}
{'board': '1', 'nsp': '2', 'ewp': '9', 'ns_mp_score': 15, 'ew_mp_score': 0}
{'board': '1', 'nsp': '3', 'ewp': '10', 'ns_mp_score': 21, 'ew_mp_score': 0}
{'board': '1', 'nsp': '6', 'ewp': '13', 'ns_mp_score': 28, 'ew_mp_score': 0}
This matches the pairs together correctly but gets the score calculation wrong. For example in the last row nsp 6 against ewp 13 the mp scores should be 12 and 0 respectively.
Happy Holidays and help gratefully achieved to assist me in solving this problem!
from making a calculation with the elements of an elasticsearch json object, of a contract bridge score, using Python
No comments:
Post a Comment