2023-09-09, 12:43
  #193
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Mysadname
ingen skillnad, samma felmeddelande
Kolla min redigerade post angående chunk_size, också.
Citera
2023-09-09, 12:45
  #194
Medlem
Enterprises avatar
Shout out, kan någon annan pröva att köra denna kod på sin burk och rapportera felmeddelanden eller framgång?
När det körs ange följande input:
Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff 3
Önskad summa (t.ex. 200.0) ? 200
Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? 0.01
Tryck 1 för text-fil och 2 för CSV-fil: 1

Kod:
import requests
import re
import json
import itertools
import os
import time

from concurrent.futures import ProcessPoolExecutor

def process_chunk(start, end, rowlist, pmin, pmax):
	 
	try:
		sub_gen = itertools.islice(itertools.product(*[enumerate(row) for row in rowlist]), start, end)
	except:
		print(f"Itertools failed at {start} - {end}")
		quit() 
	valid_combinations = []
	tss = 0
	for comb in sub_gen:
		tss += 1
		try:
			indices, values = zip(*comb)
		except:
			print("zip failed, with comb of:",len(comb))
			quit()
		s = sum(values)
		if pmin <= s <= pmax:
			valid_combinations.append(indices + (s,))
	return valid_combinations, tss

def main():
	
	max_num_of_workers = 8 # ändras för att ändra antalet parallella processer
	
	gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))

	if not gamemode in [1,2,3]:	
		print("Endast 1-2 möjliga val. Avbryter.")
		quit()

	pgoal = float(input("Önskad summa (t.ex. 200.0) ? "))
	pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
	pmin = pgoal - pdev
	pmax = pgoal + pdev

	mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))

	if not mde in [1,2]:
		print("Endast 1 eller 2 möjliga val. Avbryter.")
		quit()

	urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset", "https://spela.svenskaspel.se/fulltraff"]
	url = urls[gamemode]

	outfiles = ["", "tips.txt", "tips.csv"]
	outfile = outfiles[mde]

	try: 
		response = requests.get(url)
		html_content = response.text

	except:
		print(f"Kan inte komma hämta data från: {url}. Avbryter.")
		quit()

	pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'

	try:
		match = re.search(pattern, html_content)
		json_str = match.group(1)
		json_obj = json.loads(json_str)
		gameDict = json_obj["EventTypeStatistic"]
		gameKeys = list(dict.keys(gameDict))

	except:
		print(f"Kunde inte extrahera data")
		quit()

	signlists = []
	rowlist = []

	if gamemode == 3:  # om fullträff, sätt upp lista utifrån 13 rader
		draws=json_obj["Draws"]["entities"]
	
		try:
			drawsKey = list(dict.keys(draws))[0]
		except IndexError:
			print("Inte möjligt att hämta Fullträff-omgång. Avbryter.")
			quit()
	
		omg=draws[drawsKey]["drawNumber"] # hämta omgångsnr
		print(f"Fullträff omgång {omg}:")	
	
	else:   # annars sätt upp lista utifrån 3 tecken
		for _ in range(0,3):
			signlists.append([])

	for gameKey in gameKeys: # iterera över alla 13 matcher
	
		numAlts=3
		if gamemode==3:  # Fullträff
			numAlts=6
	
		game = gameDict[gameKey]["odds"]["current"]["value"]  # hämtar odds-värden från Fullträff-sidan
		gamesum = 0.0
		
		floats = []
		fgame = []
		
		for i in range(0,numAlts):
			if game[i] == None:
				print ("None-error",gameDict[gameKey])
				quit()
			f = 100.0/float(game[i]) # konvertera oddset 100/o
			floats.append(f)
		
		gamesum = sum(floats)
	
		for ix,o in enumerate(floats):
			newo = 100.0 * o / gamesum  # normalfördela fullträff-oddsen så att summan blir 100.0
			if ix<numAlts:
				fgame.append(newo)

		if gamemode==3:
			rowlist.append(fgame)
		
		else:
			for ix,perc in enumerate(fgame):
				signlists[ix].append(perc)

	if gamemode<3:
	
		P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] } 
		rows = itertools.product(*(['1X2'] * 13))

		cn = 0

		with open(outfile, 'w') as f:  
			for row in rows:
				percentage = sum(P[result][n] for (n, result) in enumerate(row))
		
				if  pmin <= percentage <= pmax:
					cn += 1
					if mde==1:
						f.write("E,"+','.join(row)+"\n")
					if mde==2:
						f.write(','.join(row + (str(percentage),))+"\n")
	else:
		maxcoupons = 10000
		cn = 0
		tsts = 0
		valid_combinations = []
		
		default_workers = os.cpu_count()
		print(f"Default number of workers: {default_workers}")

		chunk_size = 500000  # You can adjust the chunk size
		total_size = 6 ** 13  # 6^13 combinations
		chunks = [(i, min(i + chunk_size, total_size)) for i in range(0, total_size, chunk_size)]
	
		print ("Length of chunks:",len(chunks))
		
		start_time = time.time()
	
		with ProcessPoolExecutor(max_workers=max_num_of_workers) as executor:
			print(f"Executor is using {executor._max_workers} workers")
			
			for chunk_result, chunk_tsts in executor.map(process_chunk, [start for start, end in chunks], [end for start, end in chunks], itertools.repeat(rowlist), itertools.repeat(pmin), itertools.repeat(pmax)):
   
				tsts += chunk_tsts
				valid_combinations.extend(chunk_result)
				cn += len(chunk_result)

				if tsts % 1000000 == 0:
					print(int(tsts / 1000000), "million iterations,", cn, "rows found")

				if cn >= maxcoupons:
					break
	
		end_time = time.time()
		taken_time = round(end_time - start_time,2)
		ave_time = round(taken_time/(tsts/1000000),4)
		print(f"Time taken: {taken_time} seconds")
		print(f"Avg. time: {ave_time} sec/million iterations")
		
		
		with open(outfile, 'w') as f:
		
			f.write(f"Fulltraff,Omg={omg}\n") # första raden 
		
			for ix,comb in enumerate(valid_combinations):
			
				if mde == 1 and ix<maxcoupons: # TXT-läge
					comb=list(comb)
					comb.pop() # ta bort summa som inte används i TXT-läge
					f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
				
				elif mde == 2 and ix<maxcoupons: # CSV-läge
					f.write(','.join(str(nm) for nm in comb)+"\n")

	cn=min(cn,maxcoupons)
	
	print(f"{outfile} skapad med {cn} rader!")

if __name__ == '__main__':
    main()
Citera
2023-09-09, 18:07
  #195
Medlem
Enterprises avatar
By the way, jag råkade se utfallet på förra Fullträff omgången:

Omsättning: 747 428 kr

8 rätt = 52 st * 3 234 kr = 168 168 kr
7 rätt = 523 st * 192 kr = 100 416 kr
6 rätt = 5155 st * 23 kr = 118 565 kr
Summa utdelning: 387 149 kr
Utdelning / omsättning = 51,7 %

Fy helvete vilken snål utdelning! Staten behåller hälften av insatsen cirka. Funkar det här fortfarande med all internationell konkurrens som finns?

Nu är oddsen på Fullträff nere igen, får kolla igen på torsdag.
Citera
2023-09-09, 18:44
  #196
Medlem
Citat:
Ursprungligen postat av Enterprise
By the way, jag råkade se utfallet på förra Fullträff omgången:

Omsättning: 747 428 kr

8 rätt = 52 st * 3 234 kr = 168 168 kr
7 rätt = 523 st * 192 kr = 100 416 kr
6 rätt = 5155 st * 23 kr = 118 565 kr
Summa utdelning: 387 149 kr
Utdelning / omsättning = 51,7 %

Fy helvete vilken snål utdelning! Staten behåller hälften av insatsen cirka. Funkar det här fortfarande med all internationell konkurrens som finns?

Nu är oddsen på Fullträff nere igen, får kolla igen på torsdag.

Jo, återbetalningen blir dålig när ingen får 13 rätt, nu vet jag inte inbördes fördelningen mellan de 4 potter som finns att vinna bland, 13 rätt + de 3 med mest antal rätt, totalt sett så är det 75% återbetalning, vilket är det högsta som svenskaspel har.

Hur som helst, för dig som kan köra scriptet, så kanske det går att ändra Url till denna så får du dagens sista odds:

https://spela.svenskaspel.se/fulltraff/resultat

Edit: hittade fördelningen:

Antal rätt Utdelning
13 rätt: 30% (garanti på 50 miljoner kr)
Flest rätt: 30%
Nästflest rätt: 18%
Tredje flest rätt: 22%
__________________
Senast redigerad av Mysadname 2023-09-09 kl. 18:47.
Citera
2023-09-10, 10:27
  #197
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Mysadname
Hur som helst, för dig som kan köra scriptet, så kanske det går att ändra Url till denna så får du dagens sista odds:

https://spela.svenskaspel.se/fulltraff/resultat
Efter lite grävande hittade jag rakt in i Svenska spels API.
Genom denna URL får man alla odds från valfri historisk omgång (här omgång 50 som är förra veckans):
https://api.spela.svenskaspel.se/multifetch?urls=/draw/1/fulltraff/draws/50

Jag ska försöka lägga in en fallback-lösning som hämtar en gammal omgång (och frågar användare om detta är OK) för testberäkning.
Citera
2023-09-10, 11:09
  #198
Medlem
Enterprises avatar
Tror detta ska funka för att också kunna hämta historisk fullträff-omgång:
Kod:
import requests
import re
import json
import itertools
import os
import time

from concurrent.futures import ProcessPoolExecutor

# konstanter och definitioner

max_num_of_workers = 8 # ändras för olika antal parallella processer
outfiles = ["", "tips.txt", "tips.csv"] # ändras för andra filnamn
urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset", "https://spela.svenskaspel.se/fulltraff"]

fallback_omg = "50";
fallback_url = f"https://api.spela.svenskaspel.se/multifetch?urls=/draw/1/fulltraff/draws/{fallback_omg}" 

def fetchFallbackGames(furl):
	
	try: 
		response = requests.get(furl)
		html_content = response.text
	
	except:
		print(f"Kan inte komma hämta data från: {furl}. Avbryter.")
		quit()
	
	try:
		json_obj = json.loads(html_content)
		gd = json_obj["responses"][0]["draw"]["drawEvents"]

	except:
		print(f"Kunde inte extrahera data, från:")
		print (json_obj)
		quit()
	
	return gd
	

def process_chunk(start, end, rowlist, pmin, pmax):
	 
	try:
		sub_gen = itertools.islice(itertools.product(*[enumerate(row) for row in rowlist]), start, end)
	except:
		print(f"Itertools failed at {start} - {end}")
		quit() 
	valid_combinations = []
	tss = 0
	for comb in sub_gen:
		tss += 1
		try:
			indices, values = zip(*comb)
		except:
			print("zip failed, with comb of:",len(comb))
			quit()
		s = sum(values)
		if pmin <= s <= pmax:
			valid_combinations.append(indices + (s,))
	return valid_combinations, tss

def main():
	

	gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))

	if not gamemode in [1,2,3]:	
		print("Endast 1-2 möjliga val. Avbryter.")
		quit()

	pgoal = float(input("Önskad summa (t.ex. 200.0) ? "))
	pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
	pmin = pgoal - pdev
	pmax = pgoal + pdev

	mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))

	if not mde in [1,2]:
		print("Endast 1 eller 2 möjliga val. Avbryter.")
		quit()

	
	url = urls[gamemode]
	
	outfile = outfiles[mde]

	try: 
		response = requests.get(url)
		html_content = response.text

	except:
		print(f"Kan inte komma hämta data från: {url}. Avbryter.")
		quit()

	pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'

	try:
		match = re.search(pattern, html_content)
		json_str = match.group(1)
		json_obj = json.loads(json_str)
		gameDict = json_obj["EventTypeStatistic"]
		gameKeys = list(dict.keys(gameDict))

	except:
		print(f"Kunde inte extrahera data")
		quit()

	signlists = []
	rowlist = []
	fallback_mode = False

	if gamemode == 3:  # om fullträff, sätt upp lista utifrån 13 rader
		draws=json_obj["Draws"]["entities"]
	
		try:
			drawsKey = list(dict.keys(draws))[0]
			omg=draws[drawsKey]["drawNumber"] # hämta omgångsnr
		except IndexError:
			print("Inte möjligt att hämta Fullträff-omgång.")
			jn = input("Tryck J för att hämta historiska data för testberäkning: ").lower()
			if not "j" == jn:
				quit()
			omg = fallback_omg
			fallback_mode = True
			gameDict = fetchFallbackGames(fallback_url)
			gameKeys = list(range(0,13))			
			
		print(f"Fullträff omgång {omg}:")	
	
	else:   # annars sätt upp lista utifrån 3 tecken
		for _ in range(0,3):
			signlists.append([])

	for gameKey in gameKeys: # iterera över alla 13 matcher
	
		numAlts=3
		if gamemode==3:  # Fullträff
			numAlts=6
	
		if fallback_mode == False:
			game = gameDict[gameKey]["odds"]["current"]["value"]  # hämtar odds-värden från Fullträff-sidan
		else:
			game = gameDict[gameKey]
		
		gamesum = 0.0
		
		floats = []
		fgame = []
		
		for i in range(0,numAlts):
			if fallback_mode == False:
				t = game[i]
			else:
				t = game["betMetrics"]["values"][i]["odds"]["odds"].replace(",",".")
			if t == None:
				print ("None-error",gameDict[gameKey])
				quit()
			#print(t)
			f = 100.0/float(t) # konvertera oddset 100/o
			floats.append(f)
		
		gamesum = sum(floats)
	
		for ix,o in enumerate(floats):
			newo = 100.0 * o / gamesum  # normalfördela fullträff-oddsen så att summan blir 100.0
			if ix<numAlts:
				fgame.append(newo)

		if gamemode==3:
			rowlist.append(fgame)
		
		else:
			for ix,perc in enumerate(fgame):
				signlists[ix].append(perc)

	if gamemode<3:
	
		P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] } 
		rows = itertools.product(*(['1X2'] * 13))

		cn = 0

		with open(outfile, 'w') as f:  
			for row in rows:
				percentage = sum(P[result][n] for (n, result) in enumerate(row))
		
				if  pmin <= percentage <= pmax:
					cn += 1
					if mde==1:
						f.write("E,"+','.join(row)+"\n")
					if mde==2:
						f.write(','.join(row + (str(percentage),))+"\n")
	else:
		maxcoupons = 10000
		cn = 0
		tsts = 0
		valid_combinations = []
		
		default_workers = os.cpu_count()
		print(f"Default number of workers: {default_workers}")

		chunk_size = 500000  # You can adjust the chunk size
		total_size = 6 ** 13  # 6^13 combinations
		chunks = [(i, min(i + chunk_size, total_size)) for i in range(0, total_size, chunk_size)]
	
		print ("Length of chunks:",len(chunks))
		
		start_time = time.time()
	
		with ProcessPoolExecutor(max_workers=max_num_of_workers) as executor:
			print(f"Executor is using {executor._max_workers} workers")
			
			for chunk_result, chunk_tsts in executor.map(process_chunk, [start for start, end in chunks], [end for start, end in chunks], itertools.repeat(rowlist), itertools.repeat(pmin), itertools.repeat(pmax)):
   
				tsts += chunk_tsts
				valid_combinations.extend(chunk_result)
				cn += len(chunk_result)

				if tsts % 1000000 == 0:
					print(int(tsts / 1000000), "million iterations,", cn, "rows found")

				if cn >= maxcoupons:
					break
	
		end_time = time.time()
		taken_time = round(end_time - start_time,2)
		ave_time = round(taken_time/(tsts/1000000),4)
		print(f"Time taken: {taken_time} seconds")
		print(f"Avg. time: {ave_time} sec/million iterations")
		
		
		with open(outfile, 'w') as f:
		
			f.write(f"Fulltraff,Omg={omg}\n") # första raden 
		
			for ix,comb in enumerate(valid_combinations):
			
				if mde == 1 and ix<maxcoupons: # TXT-läge
					comb=list(comb)
					comb.pop() # ta bort summa som inte används i TXT-läge
					f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
				
				elif mde == 2 and ix<maxcoupons: # CSV-läge
					f.write(','.join(str(nm) for nm in comb)+"\n")

	cn=min(cn,maxcoupons)
	
	print(f"{outfile} skapad med {cn} rader!")

if __name__ == '__main__':
    main()
Citera
2023-09-10, 11:10
  #199
Medlem
Citat:
Ursprungligen postat av Enterprise
Efter lite grävande hittade jag rakt in i Svenska spels API.
Genom denna URL får man alla odds från valfri historisk omgång (här omgång 50 som är förra veckans):
https://api.spela.svenskaspel.se/multifetch?urls=/draw/1/fulltraff/draws/50

Jag ska försöka lägga in en fallback-lösning som hämtar en gammal omgång (och frågar användare om detta är OK) för testberäkning.

Oj, vad coolt.

Det skulle vara hur grymt som helst, även om man kanske får nöja sig med streckprocenten då oddsen verkar plockas bort av någon konstig anledning, stryktipset och europatipset finns ju sedan många år tillbaka.

Tänk om man kunde få till en sådan för travet som det körs så många av varje dag och streckprocent med decimaler
__________________
Senast redigerad av Mysadname 2023-09-10 kl. 11:21.
Citera
2023-09-10, 11:24
  #200
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Mysadname
även om man kanske får nöja sig med streckprocenten då oddsen verkar plockas bort av någon konstig anledning, stryktipset och europatipset finns ju sedan många år tillbaka.
:
Oddsen finns absolut kvar även för Fullträff, det är dessa som läses in av mitt förändrade skript.

Du kan också se dem på hemsidan under Matchinfo:

https://spela.svenskaspel.se/fulltraff/resultat/2023-09-09?draw=50&product=38
__________________
Senast redigerad av Enterprise 2023-09-10 kl. 11:27.
Citera
2023-09-10, 11:44
  #201
Medlem
Citat:
Ursprungligen postat av Enterprise
Oddsen finns absolut kvar även för Fullträff, det är dessa som läses in av mitt förändrade skript.

Du kan också se dem på hemsidan under Matchinfo:

https://spela.svenskaspel.se/fulltraff/resultat/2023-09-09?draw=50&product=38

Jo, för de 2 senaste omgångarna finns oddsen sedan plockas de bort av någon märklig anledning.

https://spela.svenskaspel.se/fulltraff/resultat/2023-08-26

Startodds finns kvar under matchinfo men det är ju de sista oddsen som är intressanta, inte de som de sätter när spelet öppnar.

Det var det jag menar med atg där man kan välja att få se streckprocenten med decimaler då streckprocenten egentligen speglar omgången bäst då det är hur folk har spelat medans oddsen är bookmakers som ligger bakom.

https://www.atg.se/spel/2017-12-02/V75/jagersro t.ex. finns ju så man kan anpassa vad som ska visas, dock är just odds där ännu mer fel då det är ett helt annat spel och därför måste man använda streckprocenten för att få rätt och man sparar ju en del omräkningar på det.
Citera
2023-09-10, 12:14
  #202
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Mysadname
Jo, för de 2 senaste omgångarna finns oddsen sedan plockas de bort av någon märklig anledning.

https://spela.svenskaspel.se/fulltraff/resultat/2023-08-26

Startodds finns kvar under matchinfo men det är ju de sista oddsen som är intressanta, inte de som de sätter när spelet öppnar.

De sista oddsen finns också kvar i data-setet på APIn.
Varje match och antal mål har tre olika slags odds, där jag tolkar odds (15,25) nedan som de sista oddsen. Detta är exempelvis oddsen för noll mål i första matchen i omgång 50 - Estland-Sverige:
{
"odds": "15,25",
"favouriteOdds": "5,94",
"startOdds": "13,30"
}

Edit: Jag dubbelkollade en gammal omgång, du har rätt att slutoddsen inte finns med där, ens i API:n.
Men då får man väl i så fall testköra med en färsk omgång.
__________________
Senast redigerad av Enterprise 2023-09-10 kl. 12:21.
Citera
2023-09-10, 12:29
  #203
Medlem
Citat:
Ursprungligen postat av Enterprise
De sista oddsen finns också kvar i data-setet på APIn.
Varje match och antal mål har tre olika slags odds, där jag tolkar odds (15,25) nedan som de sista oddsen. Detta är exempelvis oddsen för noll mål i första matchen i omgång 50 - Estland-Sverige:
{
"odds": "15,25",
"favouriteOdds": "5,94",
"startOdds": "13,30"
}

Edit: Jag dubbelkollade en gammal omgång, du har rätt att slutoddsen inte finns med där, ens i API:n.
Men då får man väl i så fall testköra med en färsk omgång.

3 odds, jag hittade bara odds och startodds innan jag lyckades knäcka koden för "5,94", den var klurig, men är man van att labba med siffror så klarade jag den också, men kanske märkligt att den finns i Api men inte på deras sida, är det avrundat till 5,94, jag får det nämligen till 5,939918 när jag beräknar den.
Citera
2023-09-10, 14:49
  #204
Medlem
Citat:
Ursprungligen postat av Enterprise
Tror detta ska funka för att också kunna hämta historisk fullträff-omgång:
Kod:
import requests
import re
import json
import itertools
import os
import time

from concurrent.futures import ProcessPoolExecutor

# konstanter och definitioner

max_num_of_workers = 8 # ändras för olika antal parallella processer
outfiles = ["", "tips.txt", "tips.csv"] # ändras för andra filnamn
urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset", "https://spela.svenskaspel.se/fulltraff"]

fallback_omg = "50";
fallback_url = f"https://api.spela.svenskaspel.se/multifetch?urls=/draw/1/fulltraff/draws/{fallback_omg}" 

def fetchFallbackGames(furl):
	
	try: 
		response = requests.get(furl)
		html_content = response.text
	
	except:
		print(f"Kan inte komma hämta data från: {furl}. Avbryter.")
		quit()
	
	try:
		json_obj = json.loads(html_content)
		gd = json_obj["responses"][0]["draw"]["drawEvents"]

	except:
		print(f"Kunde inte extrahera data, från:")
		print (json_obj)
		quit()
	
	return gd
	

def process_chunk(start, end, rowlist, pmin, pmax):
	 
	try:
		sub_gen = itertools.islice(itertools.product(*[enumerate(row) for row in rowlist]), start, end)
	except:
		print(f"Itertools failed at {start} - {end}")
		quit() 
	valid_combinations = []
	tss = 0
	for comb in sub_gen:
		tss += 1
		try:
			indices, values = zip(*comb)
		except:
			print("zip failed, with comb of:",len(comb))
			quit()
		s = sum(values)
		if pmin <= s <= pmax:
			valid_combinations.append(indices + (s,))
	return valid_combinations, tss

def main():
	

	gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))

	if not gamemode in [1,2,3]:	
		print("Endast 1-2 möjliga val. Avbryter.")
		quit()

	pgoal = float(input("Önskad summa (t.ex. 200.0) ? "))
	pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
	pmin = pgoal - pdev
	pmax = pgoal + pdev

	mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))

	if not mde in [1,2]:
		print("Endast 1 eller 2 möjliga val. Avbryter.")
		quit()

	
	url = urls[gamemode]
	
	outfile = outfiles[mde]

	try: 
		response = requests.get(url)
		html_content = response.text

	except:
		print(f"Kan inte komma hämta data från: {url}. Avbryter.")
		quit()

	pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'

	try:
		match = re.search(pattern, html_content)
		json_str = match.group(1)
		json_obj = json.loads(json_str)
		gameDict = json_obj["EventTypeStatistic"]
		gameKeys = list(dict.keys(gameDict))

	except:
		print(f"Kunde inte extrahera data")
		quit()

	signlists = []
	rowlist = []
	fallback_mode = False

	if gamemode == 3:  # om fullträff, sätt upp lista utifrån 13 rader
		draws=json_obj["Draws"]["entities"]
	
		try:
			drawsKey = list(dict.keys(draws))[0]
			omg=draws[drawsKey]["drawNumber"] # hämta omgångsnr
		except IndexError:
			print("Inte möjligt att hämta Fullträff-omgång.")
			jn = input("Tryck J för att hämta historiska data för testberäkning: ").lower()
			if not "j" == jn:
				quit()
			omg = fallback_omg
			fallback_mode = True
			gameDict = fetchFallbackGames(fallback_url)
			gameKeys = list(range(0,13))			
			
		print(f"Fullträff omgång {omg}:")	
	
	else:   # annars sätt upp lista utifrån 3 tecken
		for _ in range(0,3):
			signlists.append([])

	for gameKey in gameKeys: # iterera över alla 13 matcher
	
		numAlts=3
		if gamemode==3:  # Fullträff
			numAlts=6
	
		if fallback_mode == False:
			game = gameDict[gameKey]["odds"]["current"]["value"]  # hämtar odds-värden från Fullträff-sidan
		else:
			game = gameDict[gameKey]
		
		gamesum = 0.0
		
		floats = []
		fgame = []
		
		for i in range(0,numAlts):
			if fallback_mode == False:
				t = game[i]
			else:
				t = game["betMetrics"]["values"][i]["odds"]["odds"].replace(",",".")
			if t == None:
				print ("None-error",gameDict[gameKey])
				quit()
			#print(t)
			f = 100.0/float(t) # konvertera oddset 100/o
			floats.append(f)
		
		gamesum = sum(floats)
	
		for ix,o in enumerate(floats):
			newo = 100.0 * o / gamesum  # normalfördela fullträff-oddsen så att summan blir 100.0
			if ix<numAlts:
				fgame.append(newo)

		if gamemode==3:
			rowlist.append(fgame)
		
		else:
			for ix,perc in enumerate(fgame):
				signlists[ix].append(perc)

	if gamemode<3:
	
		P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] } 
		rows = itertools.product(*(['1X2'] * 13))

		cn = 0

		with open(outfile, 'w') as f:  
			for row in rows:
				percentage = sum(P[result][n] for (n, result) in enumerate(row))
		
				if  pmin <= percentage <= pmax:
					cn += 1
					if mde==1:
						f.write("E,"+','.join(row)+"\n")
					if mde==2:
						f.write(','.join(row + (str(percentage),))+"\n")
	else:
		maxcoupons = 10000
		cn = 0
		tsts = 0
		valid_combinations = []
		
		default_workers = os.cpu_count()
		print(f"Default number of workers: {default_workers}")

		chunk_size = 500000  # You can adjust the chunk size
		total_size = 6 ** 13  # 6^13 combinations
		chunks = [(i, min(i + chunk_size, total_size)) for i in range(0, total_size, chunk_size)]
	
		print ("Length of chunks:",len(chunks))
		
		start_time = time.time()
	
		with ProcessPoolExecutor(max_workers=max_num_of_workers) as executor:
			print(f"Executor is using {executor._max_workers} workers")
			
			for chunk_result, chunk_tsts in executor.map(process_chunk, [start for start, end in chunks], [end for start, end in chunks], itertools.repeat(rowlist), itertools.repeat(pmin), itertools.repeat(pmax)):
   
				tsts += chunk_tsts
				valid_combinations.extend(chunk_result)
				cn += len(chunk_result)

				if tsts % 1000000 == 0:
					print(int(tsts / 1000000), "million iterations,", cn, "rows found")

				if cn >= maxcoupons:
					break
	
		end_time = time.time()
		taken_time = round(end_time - start_time,2)
		ave_time = round(taken_time/(tsts/1000000),4)
		print(f"Time taken: {taken_time} seconds")
		print(f"Avg. time: {ave_time} sec/million iterations")
		
		
		with open(outfile, 'w') as f:
		
			f.write(f"Fulltraff,Omg={omg}\n") # första raden 
		
			for ix,comb in enumerate(valid_combinations):
			
				if mde == 1 and ix<maxcoupons: # TXT-läge
					comb=list(comb)
					comb.pop() # ta bort summa som inte används i TXT-läge
					f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
				
				elif mde == 2 and ix<maxcoupons: # CSV-läge
					f.write(','.join(str(nm) for nm in comb)+"\n")

	cn=min(cn,maxcoupons)
	
	print(f"{outfile} skapad med {cn} rader!")

if __name__ == '__main__':
    main()

Funkar det för dig ?

För mig stannar det på samma ställe som det gjort förut:

Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff 3
Önskad summa (t.ex. 200.0) ? 200.0
Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? 0.01
Tryck 1 för text-fil och 2 för CSV-fil: 1
Inte möjligt att hämta Fullträff-omgång.
Tryck J för att hämta historiska data för testberäkning: J
Fullträff omgång 50:
Default number of workers: 16
Length of chunks: 26122
Executor is using 8 workers
__________________
Senast redigerad av Mysadname 2023-09-10 kl. 15:01.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in