webhost: stats improvements
This commit is contained in:
		
							parent
							
								
									dae0e233b8
								
							
						
					
					
						commit
						249972c7fd
					
				| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
from collections import Counter, defaultdict
 | 
			
		||||
from itertools import cycle
 | 
			
		||||
from datetime import datetime, timedelta, date
 | 
			
		||||
from math import pi
 | 
			
		||||
from math import tau
 | 
			
		||||
 | 
			
		||||
from bokeh.embed import components
 | 
			
		||||
from bokeh.palettes import Dark2_8 as palette
 | 
			
		||||
| 
						 | 
				
			
			@ -13,7 +13,17 @@ from pony.orm import select
 | 
			
		|||
from . import app, cache
 | 
			
		||||
from .models import Room
 | 
			
		||||
 | 
			
		||||
pi2 = 2 * pi
 | 
			
		||||
 | 
			
		||||
def get_db_data():
 | 
			
		||||
    games_played = defaultdict(Counter)
 | 
			
		||||
    total_games = Counter()
 | 
			
		||||
    cutoff = date.today()-timedelta(days=30000)
 | 
			
		||||
    room: Room
 | 
			
		||||
    for room in select(room for room in Room if room.creation_time >= cutoff):
 | 
			
		||||
        for slot in room.seed.slots:
 | 
			
		||||
            total_games[slot.game] += 1
 | 
			
		||||
            games_played[room.creation_time.date()][slot.game] += 1
 | 
			
		||||
    return total_games, games_played
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route('/stats')
 | 
			
		||||
| 
						 | 
				
			
			@ -21,24 +31,19 @@ pi2 = 2 * pi
 | 
			
		|||
def stats():
 | 
			
		||||
    plot = figure(title="Games played per day", x_axis_type='datetime', x_axis_label="Date", y_axis_label="Played",
 | 
			
		||||
                  sizing_mode="scale_both")
 | 
			
		||||
    games_played = defaultdict(Counter)
 | 
			
		||||
    total_games = Counter()
 | 
			
		||||
    room: Room
 | 
			
		||||
    games = set()
 | 
			
		||||
    cutoff = date.today()-timedelta(days=30000)
 | 
			
		||||
    for room in select(room for room in Room if room.creation_time >= cutoff):
 | 
			
		||||
        for slot in room.seed.slots:
 | 
			
		||||
            total_games[slot.game] += 1
 | 
			
		||||
            games.add(slot.game)
 | 
			
		||||
            games_played[room.creation_time.date()][slot.game] += 1
 | 
			
		||||
 | 
			
		||||
    total_games, games_played = get_db_data()
 | 
			
		||||
    days = sorted(games_played)
 | 
			
		||||
 | 
			
		||||
    cyc_palette = cycle(palette)
 | 
			
		||||
    for game in sorted(games):
 | 
			
		||||
 | 
			
		||||
    for game in sorted(total_games):
 | 
			
		||||
        occurences = []
 | 
			
		||||
        for day in days:
 | 
			
		||||
            occurences.append(games_played[day][game])
 | 
			
		||||
        plot.line([datetime.combine(day, datetime.min.time()) for day in days],
 | 
			
		||||
                  occurences, legend_label=game, line_width=2, color=next(cyc_palette))
 | 
			
		||||
 | 
			
		||||
    total = sum(total_games.values())
 | 
			
		||||
    pie = figure(plot_height=350, title=f"Games played in the last 30 days. (Total: {total})", toolbar_location=None,
 | 
			
		||||
                 tools="hover", tooltips=[("Game:", "@games"), ("Played:", "@count")],
 | 
			
		||||
| 
						 | 
				
			
			@ -56,11 +61,12 @@ def stats():
 | 
			
		|||
        data["games"].append(game)
 | 
			
		||||
        data["count"].append(count)
 | 
			
		||||
        data["start_angles"].append(current_angle)
 | 
			
		||||
        angle = count / total * pi2
 | 
			
		||||
        angle = count / total * tau
 | 
			
		||||
        current_angle += angle
 | 
			
		||||
        data["end_angles"].append(current_angle)
 | 
			
		||||
 | 
			
		||||
    data["colors"] = [element[1] for element in sorted((game, color) for game, color in zip(data["games"], cycle(palette)))]
 | 
			
		||||
    data["colors"] = [element[1] for element in sorted((game, color) for game, color in
 | 
			
		||||
                                                       zip(data["games"], cycle(palette)))]
 | 
			
		||||
    pie.wedge(x=0.5, y=0.5, radius=0.5,
 | 
			
		||||
              start_angle="start_angles", end_angle="end_angles", fill_color="colors",
 | 
			
		||||
              source=ColumnDataSource(data=data), legend_field="games")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
{% extends 'pageWrapper.html' %}
 | 
			
		||||
 | 
			
		||||
{% block head %}
 | 
			
		||||
    <title>Site Map</title>
 | 
			
		||||
    <title>Statistics</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename="styles/markdown.css") }}" />
 | 
			
		||||
    {{ css_resources|indent(4)|safe }}
 | 
			
		||||
    {{ js_resources|indent(4)|safe }}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue