Private
Public Access
1
0

reset css

This commit is contained in:
Sander Roosendaal
2022-07-03 16:42:55 +02:00
parent 726e1a652f
commit c0f409203c
8 changed files with 1284 additions and 25 deletions

View File

@@ -192,7 +192,7 @@ class Race(models.Model):
athlete.trueskill_mu = rating.mu
athlete.trueskill_sigma = rating.sigma
athlete.save()
u = 'Rating athlete {id} {f} {l} mu = {mu} sigma = {sigma} race {rid} {rname}'.format(
u = '{id},{f},{l},{mu},{sigma},{rid},{rname}'.format(
id = id,
f = athlete.first_name,
l = athlete.last_name,
@@ -201,7 +201,7 @@ class Race(models.Model):
rid = self.id,
rname = self.name,
)
dologging('ratings.log',u)
dologging('ratings.csv',u)
self.processed = True
self.save()

View File

@@ -15,12 +15,12 @@
<h1>
Boat Movers Ranking
Boat Movers Ranglijst
</h1>
<div>
<a href="/boatmovers/?filter=f">Women</a>
<a href="/boatmovers/?filter=m">Men</a>
<a href="/boatmovers/">All</a>
<a href="/boatmovers/?filter=f">Dames</a>
<a href="/boatmovers/?filter=m">Heren</a>
<a href="/boatmovers/">Alles</a>
</div>
<div class="row">
<div class="column">
@@ -52,27 +52,24 @@
</div>
<div class="column">
<p>
This page is an experimental ranking based on public race results,
mainly from Dutch Masters
rowing events. It is inspired by <a href="https://rowingstats.com/">Rowing Stats</a>.
Deze ranglijst is een experimentele lijst gebaseerd op wedstrijduitslagen
die op het internet te vinden zijn. De focus is op Nederlandse Masters-wedstrijden
volgens KNRB-regels.
De inspiratie voor deze site kwam van <a href="https://rowingstats.com/">Rowing Stats</a>.
</p>
<p>
The best way to climb the ranking is to win races against crews with people who are higher
in the ranking (unexpected win).
Zie onze <a href="faq">F.A.Q.</a> voor een beschrijving van hoe wij de ranglijst
berekenen.
</p>
<p>
If your name shows up and you do not agree with that, contact us at info@rowsandall.com
and we'll remove your name.
Als je je naam hier wilt laten verwijderen, kan dat natuurlijk. Stuur ons
een emailtje op info@rowsandall.com.
</p>
<p>
If you'd like us to include a recent race result, use the "Add Race" link below. A race
is a single start (during a regatta).
Als je een uitslag mist, kun je ons dat laten weten door de "Nieuwe Race" link onder.
</p>
<p>
You can also contact us at info@rowsandall.com.
</p>
<p>
This ranking was based on results from following races:
De ranglijst bevat nu resultaten van de volgende races:
</p>
<p>
<table>
@@ -87,8 +84,9 @@
</table>
</p>
{% if user.is_authenticated and user.is_staff %}
{% if new_races %}
<p>
Unprocessed races
Niet verwerkte races:
</p>
<p>
<table>
@@ -102,19 +100,20 @@
{% endfor %}
</table>
</p>
{% endif %}
<p>
<a href="athlete/add/">Add Athlete</a>
<a href="athlete/add/">Nieuwe Roeier</a>
</p>
<p>
<a href="crew/add/">Add Crew</a>
<a href="crew/add/">Nieuwe Ploeg</a>
</p>
{% endif %}
<p>
<a href="race/add/">Add Race</a>
<a href="race/add/">Nieuwe Race</a>
</p>
{% if user.is_authenticated and user.is_staff %}
<p>
<a href="result/add/">Add Result</a>
<a href="result/add/">Nieuwe uitslag</a>
</p>
{% endif %}
</div>

View File

@@ -7,11 +7,19 @@
<html>
<head>
<title>{% block title %}Rowsandall Boatmovers{% endblock %}</title>
<link rel="stylesheet" href="/static/css/resetnew.css" />
<link rel="stylesheet" href="/static/fontawesome/css/fontawesome.min.css">
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
<link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.12.0/css/all.css" integrity="sha384-ekOryaXPbeCpWQNxMwSWVvQ0+1VrStoPJq54shlYhR8HzQgig1v5fas6YgOqLoKz" crossorigin="anonymous">
<link rel="stylesheet" href="/static/css/styles2.css">
<link rel="stylesheet" href="/static/css/text2.css" />
<link rel="stylesheet" href="/static/css/rowsandall2.css" />
</head>
<body>
<div>
<a href="/boatmovers/">Ranking</a>
<a href="/boatmovers/">Ranglijst</a>
<a href="/boatmovers/faq/">F.A.Q.</a>
</div>
{% if WARNING_MESSAGE != '' %}
{{ WARNING_MESSAGE }}

View File

@@ -0,0 +1,137 @@
{% extends "boatmovers_base.html" %}
{% block main %}
<h1>Hoe werkt de ranking?</h1>
<p>De ranking is gebaseerd op het “TrueSkill ranking system”. Voor iedere roeier worden twee variabelen
berekend. De eerste variabele (“mu”) geeft aan hoe “goed” je gemiddeld bent (in goede uitslagen van
wedstrijden). De tweede variabele (“sigma”) geeft de mate van onzekerheid in de schatting van “mu”.
De score op de site is berekend als “mu 3 sigma”. Vooral als je net begint, is dit een conservatieve
schatting.
</p>
<p>Iedere keer als er een wedstrijduitslag wordt verwerkt waar jij aan hebt deelgenomen, wordt je score
opnieuw berekend. Er wordt gekeken naar de (gemiddelde) scores van alle ploegen die aan de wedstrijd
hebben deelgenomen. Dan wordt er gekeken hoe waarschijnlijk deze uitslag is, gebaseerd op de scores
van de ploegen.</p>
<p>
Als je beter eindigt dan een ploeg met een hogere score voor de wedstrijd, zal jouw score stijgen.
Andersom, als je lager eindigt dan een ploeg met een lagere score, zal jouw score dalen. Hoeveel je
score stijgt of daalt, hangt af van hoe “onwaarschijnlijk” de uitslag is. Hoe onwaarschijnlijker je winst,
hoe meer je stijgt.</p>
<p>
Ook de onzekerheid in je “mu” zal dalen door aan wedstrijden deel te nemen. Als je begint, zal het dus
relatief makkelijk zijn om te stijgen in de ranking.</p>
<p>
<h1>Hoe kan ik stijgen op de ranking?</h1>
<p>Hoe vaker je aan wedstrijden deelneemt, hoe beter we weten hoe goed je bent. Zeker in het begin kun
je dus stijgen door veel wedstrijden te roeien. Je zult sneller stijgen door skiffwedstrijden te winnen dan
met wedstrijden in de 8. Dit komt doordat een skiff-uitslag de mate van onzekerheid in je skills sneller
doet dalen. Dit betekent niet dat je als 8-roeier niet bovenaan de ranking kunt staan. Je moet alleen
meer wedstrijden roeien voordat je “boven komt drijven”.</p>
<p>
Ook zul je sneller stijgen (en dalen!) door deel te nemen aan wedstrijden met een groot startveld.
Zodra je een paar wedstrijden hebt geroeid en het systeem een goed idee heeft van je niveau, is het
zaak om beter te worden en ploegen te verslaan die boven je staan. Het is dus verstandig om deel te
nemen aan goedbezochte wedstrijden.</p>
<h1>
Als het makkelijker is om te stijgen als je net begint, zijn dan ook mijn eerste races het belangrijkst
voor de plaats in de ranglijst?</h1>
<p>
Nee, dat is niet zo. TrueSkill legt meer nadruk op recente uitslagen dan aan oudere uitslagen. Als je dus
vaak tegen dezelfde ploegen start, zullen de meest recente winnaars hoger staan dan de oudere
winnaars.</p>
<h1>
Is dit een “ranglijst aller tijden” of een seizoensranking?</h1>
<p>Dit is een ranglijst aller tijden. Omdat veel roeiers in viertjes en achten starten, is een seizoen eigenlijk te
kort om skiffeurs te kunnen voorbijgaan op de ranking. Daarom laat ik de ranglijst oneindig doorlopen.
</p>
<h1>Als ik hoog sta in de ranking, kan ik dan hoog blijven door niet meer aan wedstrijden deel te nemen?</h1>
<p>Dat is inderdaad mogelijk. We gaan ervan uit dat je het leuker vindt om wedstrijden te roeien dan om
hoog in de ranking te staan. Ook hopen we dat de ranking mensen aanspoort om elkaar uit te dagen aan
wedstrijden mee te doen.</p>
<p>
Mocht blijken dat dit echt een probleem is, dan is het eenvoudig om een filter op laatste deelname aan
een wedstrijd toe te voegen. Persoonlijk vind ik het ook wel mooi als “legendarische” roeiers lang na
hun carriere hoog in de ranking blijven staan, ook al is er geen gelegenheid meer om tegen ze te starten.</p>
<h1>Ik roei altijd met dezelfde ploeg. Hoe kan het systeem een onderscheid in niveau bepalen tussen mijn
ploegleden onderling?</h1>
<p>Als alle leden van jouw ploeg altijd alleen in deze ene ploeg starten, zal je altijd dezelfde score houden.
Maar als een van jouw ploegleden ook wedstrijden start in een andere ploeg, dan zal jullie score gaan
verschillen.</p>
<h1>Is het eerlijk om voor ploegen het gemiddelde niveau te gebruiken?</h1>
<p>Onze aanname is dat dat de eenvoudigste manier is die waarschijnlijk vrij eerlijk is. Als roeien alleen
afhankelijk is van de power (ergometer score) die je in de benen hebt, klopt deze aanname 100 procent.
Maar bij het roeien is ook techniek belangrijk, dus er zal (gelukkig) altijd een verrassingsaspect zijn.
Waarom ontbreekt mijn ploeg in de uitslag?</p>
<p>In sommige uitslagen staan ploegen met roeiers met dezelfde naam. Dit is waarschijnlijk een foutje bij
de inschrijving, of het kan zijn dat je toevallig tegen een naamgenoot geroeid hebt.
Het systeem identificeert roeiers door hun voornaam/achternaam en geslacht. We hebben op dit
moment geen goed systeem om onderscheid te maken tussen twee verschillende roeiers die toevallig
allebei “Jan Visser” heten. Je zou de clubnaam kunnen gebruiken, maar soms wisselen roeiers van club.
Ook staan in de uitslagen ploegen geïdentificeerd als “Willem III/RIC/Hoop” en is het onmogelijk om te
zien welk ploeglid bij Willem III roeit en welk ploeglid bij De Hoop.</p>
<h1>Welke wedstrijden worden meegenomen?</h1>
<p>Op dit moment verwerken wij uitslagen van de volgende wedstrijden:
<ul>
<li>Heineken Roeivierkamp (einduitslag over alle afstanden)</li>
<li>Head of the River Amstel</li>
<li>Tweehead</li>
<li>Skiffhead</li>
<li>Spaarne Lenterace</li>
<li>Dutch Masters Open (alleen uitslagen van races die zonder startverschil worden geroeid)</li>
<li>Cottwich</li>
<li>Eemhead</li>
<li>Tromp Boat Races</li>
<li>Novembervieren</li>
</ul>
</p>
<p>Van deze wedstrijden nemen we uitslagen van veteranenvelden. We kijken niet naar het clubveld, of
open velden.</p>
<p>De reden dat we deze wedstrijden kiezen is dat het goedbezochte wedstrijden zijn met een online
uitslag die makkelijk te verwerken is (Time-Team, hoesnelwasik.nl). Het is lastig om wedstrijden te
verwerken waar niet de namen van alle ploegleden zijn te achterhalen. Vaak wordt er een PDF-je
gepubliceerd met alleen de naam van de slagroeier.</p>
<p>
Dit betekent niet dat we niet open staan voor het toevoegen van nieuwe wedstrijden. Volg de “Add
Race” link en vul de gegevens in. Wij krijgen dan een automatische email en gaan ernaar kijken.
Kan ik ook een onderling duel aangaan met iemand en dan de uitslag mee laten tellen?</p>
<p>
Het is belangrijk dat de uitslag van de wedstrijd onafhankelijk te controleren is. Het makkelijkst is dus af
te spreken allebei aan een van de meetellende wedstrijden te starten, of ons te vragen een (onder
KNRB-auspiciën geroeide) wedstrijd toe te voegen,
waarvan de uitslag online staat met alle ploegleden.</p>
<h1>Ik wil niet op deze ranking staan. Kun je mij verwijderen?</h1>
<p>Ja, dat kan op twee manieren:
<ol>
<li>Ik kan zorgen dat je naam niet in de ranking vermeld wordt. Je scores worden dan wel gebruikt
als je in ploegen start met andere mensen op de ranglijst. Je naam is dan nog wel zichtbaar als
mensen op die ploegen klikken in de uitslagenlijst. Aangezien deze uitslagen identiek zijn aan
wat al op het internet te vinden is, neem ik aan dat dit geen probleem is.
</li>
<li>Ik kan zorgen dat je uit de ranking verwijderd wordt en blijft. Bij het verwerken van uitslagen zal
ik dan jouw hele ploeg moeten verwijderen. De consequentie is dat je ploegmaten alleen
kunnen stijgen en dalen door wedstrijden zonder jou te roeien.
</li>
</ol>
</p>
<p>De enige informatie in het systeem is je voornaam, achternaam, geslacht en in welke ploegen je bent
gestart. Dit is informatie die in wedstrijduitslagen al beschikbaar is. Door in te schrijven voor deze
wedstrijden heb je al ingestemd met het openbaar maken van jouw naam en ploeggegevens in de
uitslag. Daarom vind ik het een redelijke aanname dat je geen bezwaar hebt tegen het opgenomen zijn
in deze ranking, maar als je het vraagt haal ik je er met alle plezier vanaf.</p>
{% endblock %}

View File

@@ -47,11 +47,17 @@
<p>
Race is not verified. <a href="verify/">Verify Race</a>
</p>
<p>
<a href="/boatmovers/race/{{ race.id }}/deleteresults/">Remove all results</a>
</p>
{% endif %}
{% if not race.verified and not race.processed %}
<p>
<a href="/boatmovers/result/add/">Add Result</a>
</p>
<p>
<a href="/boatmovers/race/{{ race.id }}/csv/">Add Result CSV</a>
</p>
{% endif %}
{% endif %}
{% endblock %}

View File

@@ -2,6 +2,8 @@ from django.conf import settings
from django.conf.urls import url, include
from django.urls import path, re_path
from django.views.generic.base import TemplateView
import boatmovers.views as views
urlpatterns = [
@@ -14,7 +16,10 @@ urlpatterns = [
url(r'race/(?P<id>\d+)/csv/$',views.race_add_csv,name='race_add_csv'),
url(r'race/(?P<id>\d+)/verify/$',views.race_verify,name='race_verify'),
url(r'race/(?P<id>\d+)/process/$',views.race_process,name='race_process'),
url(r'race/(?P<id>\d+)/deleteresults/$',views.race_delete_results,
name='race_delete_results'),
url(r'crew/(?P<id>\d+)/$',views.crew_view,name='crew_view'),
url(r'^$',views.boatmovers_view,name='boatmovers'),
path(r'faq/', TemplateView.as_view(template_name='faq.html'), name='faq'),
#url(r'(?P<filter>\b[0-9A-Fa-f]+\b)/$',views.boatmovers_view,name='boatmovers')
]

View File

@@ -188,6 +188,21 @@ def race_process(request, id=0):
return HttpResponseRedirect(reverse('race_view',kwargs={'id':race.id}))
def race_delete_results(request, id=0):
race = get_object_or_404(Race, pk=id)
results = race.results.all()
if not race.processed:
for result in results:
result.delete()
messages.info(request,'Results have been removed')
else:
messages.error(request,'Cannot remove processed results')
url = reverse('race_view',kwargs={'id':race.id})
return HttpResponseRedirect(url)
def crew_view(request, id=0):
crew = get_object_or_404(Crew, pk=id)
athletes = crew.athletes.all().order_by("-trueskill_exposed")

1089
ratings.csv Normal file

File diff suppressed because it is too large Load Diff