diff --git a/Makefile b/Makefile index 90af875..5899eb8 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,9 @@ PYTHON="./.venv/bin/python" ensure_env: -@python3 -m venv .venv +merge: + $(PYTHON) merge.py + plot: ensure_env time $(PYTHON) plot.py time $(PYTHON) merge.py diff --git a/merge.py b/merge.py index d814750..89778d6 100644 --- a/merge.py +++ b/merge.py @@ -15,6 +15,7 @@ html_content = ['<html>', <style> body { width:100%; + background-color: #000; } img { width:40%; diff --git a/plot.py b/plot.py index e2bb41e..70b6665 100644 --- a/plot.py +++ b/plot.py @@ -35,106 +35,153 @@ def query(sql): return result def render_per_hour(week): - week = f"'{week}'" + week = f"{week}" sql_presses = ( "SELECT count(0) as total, strftime('%H', timestamp) as hour, " "strftime('%U', timestamp) as week " - "FROM kevent WHERE event = 'PRESSED' AND week = {week} " + "FROM kevent WHERE event = 'PRESSED' AND week = '{week}' " "GROUP BY week, hour ORDER BY hour" ) - sql_repeated = ( - "SELECT count(0) as total, strftime('%H', timestamp) as hour, " - "strftime('%U', timestamp) as week " - "FROM kevent WHERE event = 'REPEATED' AND week = {week} " - "GROUP BY week, hour ORDER BY hour" - ) + #sql_repeated = ( + # "SELECT count(0) as total, strftime('%H', timestamp) as hour, " + # "strftime('%U', timestamp) as week " + # "FROM kevent WHERE event = 'REPEATED' AND week = {week} " + # "GROUP BY week, hour ORDER BY hour" + #) - sql_released = ( - "SELECT count(0) as total, strftime('%H', timestamp) as hour, " - "strftime('%U', timestamp) as week " - "FROM kevent WHERE event = 'RELEASED' AND week = {week} " - "GROUP BY week, hour ORDER BY hour" - ) + #sql_released = ( + # "SELECT count(0) as total, strftime('%H', timestamp) as hour, " + # "strftime('%U', timestamp) as week " + # "FROM kevent WHERE event = 'RELEASED' AND week = {week} " + # "GROUP BY week, hour ORDER BY hour" + #) + rows_presses = query(sql_presses.format(week=week)) - rows_repeated = query(sql_repeated.format(week=week)) - rows_released = query(sql_released.format(week=week)) + #rows_repeated = query(sql_repeated.format(week=week)) + #rows_released = query(sql_released.format(week=week)) totals = [row[0] for row in rows_presses] hours = [row[1] for row in rows_presses] - totals_repeated = [row[0] for row in rows_repeated] - hours_repeated = [row[1] for row in rows_repeated] + #totals_repeated = [row[0] for row in rows_repeated] + #hours_repeated = [row[1] for row in rows_repeated] - totals_released = [row[0] for row in rows_released] - hours_released = [row[1] for row in rows_released] + #totals_released = [row[0] for row in rows_released] + #hours_released = [row[1] for row in rows_released] plt.figure(figsize=(8, 6)) - plt.plot(hours_repeated, totals_repeated, marker='o', label='Repeats per hour', color='green') - plt.plot(hours_released, totals_released, marker='o', label='Releases per hour', color='orange') + #plt.plot(hours_repeated, totals_repeated, marker='o', label='Repeats per hour', color='green') + #plt.plot(hours_released, totals_released, marker='o', label='Releases per hour', color='orange') plt.plot(hours, totals, marker='o', label=f'Presses per hour week {week}', color='red') plt.xlabel('Hour') plt.ylabel('Event count') - plt.title('Keyboard events') + plt.title(f'Key presses per hour. Week {week}') + plt.style.use('dark_background') plt.legend() - plt.grid(True) - plt.savefig(f"graph_week_{week.strip("'")}_per_hour.png") + plt.savefig(f"graph_week_{week.strip('\'')}_per_hour.png") + +def render_per_day(): + sql_pressed_per_day = ( + "SELECT strftime('%Y-%m-%d', timestamp) as month_day,count(0) as total FROM kevent WHERE event = 'PRESSED' GROUP BY month_day ORDER BY month_day" + ) + plt.figure(figsize=(8,6)) + + rows_pressed_per_day = query(sql_pressed_per_day) + + totals = [row[0] for row in rows_pressed_per_day] + dates = [row[1] for row in rows_pressed_per_day] + + plt.plot(totals, dates, marker='o', label='Presses per day', color='red') + + plt.xlabel('Date') + plt.ylabel('Event count') + plt.xticks(rotation=45) + plt.title('Keyboard events') + plt.tight_layout() + plt.style.use('dark_background') + plt.legend() + + plt.savefig(f"graph_per_day.png") + +def render_per_week(): + sql_pressed_per_day = ( + f"SELECT strftime('%Y-%U', timestamp) as week,count(0) as total FROM kevent WHERE event = 'PRESSED' GROUP BY week ORDER BY week" + ) + plt.figure(figsize=(8,6)) + + rows_pressed_per_day = query(sql_pressed_per_day) + + totals = [row[0] for row in rows_pressed_per_day] + dates = [row[1] for row in rows_pressed_per_day] + + plt.plot(totals, dates, marker='o', label='Presses per day', color='red') + + plt.xlabel('Week') + plt.ylabel('Presses count') + plt.xticks(rotation=45) + plt.title(f'Presses per week') + plt.tight_layout() + plt.style.use('dark_background') + plt.legend() + + plt.savefig(f"graph_per_week.png") + + + def render_per_weekday(week): - week = f"'{week}'" - - sql_presses = ( f"SELECT count(0) as total, {weekday_sql} as weekday, " "strftime('%w', timestamp) as day, strftime('%U', timestamp) as week " - "FROM kevent WHERE event = 'PRESSED' AND week = {week} " + "FROM kevent WHERE event = 'PRESSED' AND week = '{week}' " "GROUP BY week, day ORDER BY day" ) sql_repeated = ( f"SELECT count(0) as total, {weekday_sql} as weekday, " "strftime('%w', timestamp) as day, strftime('%U', timestamp) as week " - "FROM kevent WHERE event = 'REPEATED' AND week = {week} " + "FROM kevent WHERE event = 'REPEATED' AND week = '{week}' " "GROUP BY week, day ORDER BY day" ) sql_released = ( f"SELECT count(0) as total, {weekday_sql} as weekday, " "strftime('%w', timestamp) as day, strftime('%U', timestamp) as week " - "FROM kevent WHERE event = 'RELEASED' AND week = {week} " + "FROM kevent WHERE event = 'RELEASED' AND week = '{week}' " "GROUP BY week, day ORDER BY day" ) rows_presses = query(sql_presses.format(week=week)) - rows_repeated = query(sql_repeated.format(week=week)) - rows_released = query(sql_released.format(week=week)) + #rows_repeated = query(sql_repeated.format(week=week)) + #rows_released = query(sql_released.format(week=week)) totals = [row[0] for row in rows_presses] days = [row[2] for row in rows_presses] - totals_repeated = [row[0] for row in rows_repeated] - days_repeated = [row[2] for row in rows_repeated] + #totals_repeated = [row[0] for row in rows_repeated] + #days_repeated = [row[2] for row in rows_repeated] - totals_released = [row[0] for row in rows_released] - days_released = [row[2] for row in rows_released] + #totals_released = [row[0] for row in rows_released] + #days_released = [row[2] for row in rows_released] plt.figure(figsize=(8, 6)) - plt.plot(days_repeated, totals_repeated, marker='o', label='Repeats per weekday', color='green') - plt.plot(days_released, totals_released, marker='o', label='Releases per weekday', color='orange') - plt.plot(days, totals, marker='o', label=f'Presses per weekday week {week}', color='red') + #plt.plot(days_repeated, totals_repeated, marker='o', label='Repeats per weekday', color='green') + #plt.plot(days_released, totals_released, marker='o', label='Releases per weekday', color='orange') + plt.plot(days, totals, marker='o', label=f'Press count', color='red') - plt.xlabel('Day of week (0 = Sunday, 6 = Saturday)') + plt.xlabel('Weekday (0 = Sunday, 6 = Saturday)') plt.ylabel('Event count') - plt.title('Keyboard events') + plt.title(f'Presses per weekday. Week {week}') + plt.style.use('dark_background') plt.legend() - plt.grid(True) - plt.savefig(f"graph_week_{week.strip("'")}_per_weekday.png") + plt.savefig(f"graph_week_{week.strip('\"')}_per_weekday.png") def get_weeks(): sql = "SELECT strftime('%U', timestamp) as week FROM kevent GROUP BY week" @@ -166,6 +213,8 @@ def get_totals(): if __name__ == "__main__": time_start = time.time() + render_per_day() + render_per_week() for week in get_weeks(): render_per_hour(week) render_per_weekday(week)