48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Plot weekly Ollama Cloud usage: x = days since start of weekly window."""
|
|
|
|
import sqlite3
|
|
from datetime import datetime, timedelta, timezone
|
|
|
|
import matplotlib
|
|
matplotlib.use("Agg")
|
|
import matplotlib.pyplot as plt
|
|
|
|
DB = "db/ollama_usage.sqlite"
|
|
OUT = "results/ollama_weekly_usage.png"
|
|
|
|
|
|
def parse(ts: str) -> datetime:
|
|
return datetime.fromisoformat(ts)
|
|
|
|
|
|
def window_start(d: datetime) -> datetime:
|
|
"""Monday 00:00 UTC of the week containing d."""
|
|
monday = d - timedelta(days=d.weekday())
|
|
return monday.replace(hour=0, minute=0, second=0, microsecond=0)
|
|
|
|
|
|
con = sqlite3.connect(DB)
|
|
rows = con.execute(
|
|
"SELECT ts, weekly_usage FROM samples ORDER BY ts"
|
|
).fetchall()
|
|
con.close()
|
|
|
|
samples = [(parse(r[0]), r[1] * 100) for r in rows]
|
|
|
|
start = window_start(samples[0][0])
|
|
x = [(t - start).total_seconds() / 86400 for t, _ in samples]
|
|
y = [u for _, u in samples]
|
|
|
|
fig, ax = plt.subplots(figsize=(14, 6), layout="constrained")
|
|
ax.plot(x, y, color="#2563eb", lw=1.5, marker=".", ms=3)
|
|
ax.fill_between(x, y, alpha=0.15, color="#2563eb")
|
|
ax.set_title("Ollama Cloud — spotřeba týdenního limitu")
|
|
ax.set_xlabel(f"dny od začátku okna (den 0 = {start.strftime('%d.%m.')} 00:00 UTC)")
|
|
ax.set_ylabel("využití týdenního limitu (%)")
|
|
ax.set_xticks(range(int(min(x)) + 1, int(max(x)) + 1))
|
|
ax.set_xlim(min(x) - 0.1, max(x) + 0.1)
|
|
ax.grid(True, alpha=0.3)
|
|
|
|
fig.savefig(OUT, dpi=150)
|
|
print(f"saved {OUT}, {len(samples)} samples, window start {start.isoformat()}") |