more graphs
This commit is contained in:
@@ -14,6 +14,12 @@
|
|||||||
|
|
||||||
<h1>{{ user }}</h1>
|
<h1>{{ user }}</h1>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm">
|
||||||
|
<img src="{% url 'user_charts_pie' user.id %}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm">
|
<div class="col-sm">
|
||||||
@@ -77,8 +83,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-sm">
|
<div class="col-sm">
|
||||||
<img src="{% url 'user_charts_pie' user.id %}"/>
|
|
||||||
|
|
||||||
<h2>Активности</h2>
|
<h2>Активности</h2>
|
||||||
<ul>
|
<ul>
|
||||||
{% for activities_and_pct in activities_and_pcts %}
|
{% for activities_and_pct in activities_and_pcts %}
|
||||||
|
@@ -13,16 +13,9 @@ class UserChartsPie(DetailView):
|
|||||||
model = User
|
model = User
|
||||||
pk_url_kwarg = 'user_id'
|
pk_url_kwarg = 'user_id'
|
||||||
|
|
||||||
def render_to_response(self, context, **response_kwargs):
|
def pie_chart(self, plt, ax, logs):
|
||||||
import matplotlib
|
|
||||||
matplotlib.use('Agg')
|
|
||||||
import matplotlib.pyplot as plt
|
|
||||||
fig = plt.figure(figsize=(6, 6), dpi=100)
|
|
||||||
ax = fig.add_subplot(111)
|
|
||||||
|
|
||||||
total_time = defaultdict(float)
|
total_time = defaultdict(float)
|
||||||
|
|
||||||
logs = ActivityLog.objects.filter(user=self.object).all()
|
|
||||||
for log in logs:
|
for log in logs:
|
||||||
total_time[str(log.activity)] += (log.end_time - log.start_time).total_seconds()
|
total_time[str(log.activity)] += (log.end_time - log.start_time).total_seconds()
|
||||||
|
|
||||||
@@ -30,6 +23,51 @@ class UserChartsPie(DetailView):
|
|||||||
|
|
||||||
ax.pie(x=[i[1] for i in sectors], labels=[i[0] for i in sectors], autopct='%1.0f%%')
|
ax.pie(x=[i[1] for i in sectors], labels=[i[0] for i in sectors], autopct='%1.0f%%')
|
||||||
|
|
||||||
|
def average_chart(self, plt, ax, logs):
|
||||||
|
interval = timedelta(minutes=10)
|
||||||
|
interval_count = timedelta(days=1) // interval
|
||||||
|
intervals = [(interval * i) / timedelta(hours=1) for i in range(interval_count)]
|
||||||
|
|
||||||
|
distr_by_activity = {}
|
||||||
|
for i in logs:
|
||||||
|
if i.activity not in distr_by_activity:
|
||||||
|
distr_by_activity[i.activity] = np.zeros(interval_count)
|
||||||
|
|
||||||
|
for i in logs:
|
||||||
|
day = i.start_time.replace(hour=0, minute=0, second=0, microsecond=0)
|
||||||
|
|
||||||
|
t = i.start_time
|
||||||
|
t_i = (t - day) // interval
|
||||||
|
|
||||||
|
while t < i.end_time:
|
||||||
|
distr_by_activity[i.activity][t_i] += 1
|
||||||
|
|
||||||
|
t += interval
|
||||||
|
t_i = (t_i + 1) % interval_count
|
||||||
|
|
||||||
|
for activity, distr in distr_by_activity.items():
|
||||||
|
ax.plot(intervals, distr, label=f'{activity}')
|
||||||
|
|
||||||
|
distr[0] = 0
|
||||||
|
distr[-1] = 0
|
||||||
|
ax.fill(intervals, distr, alpha=0.2)
|
||||||
|
|
||||||
|
plt.legend()
|
||||||
|
|
||||||
|
def render_to_response(self, context, **response_kwargs):
|
||||||
|
logs = ActivityLog.objects.filter(user=self.object).all()
|
||||||
|
|
||||||
|
import matplotlib
|
||||||
|
matplotlib.use('Agg')
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
fig = plt.figure(figsize=(12, 16), dpi=100)
|
||||||
|
|
||||||
|
ax = fig.add_subplot(221)
|
||||||
|
self.pie_chart(plt, ax, logs)
|
||||||
|
|
||||||
|
ax = fig.add_subplot(212)
|
||||||
|
self.average_chart(plt, ax, logs)
|
||||||
|
|
||||||
buf = io.BytesIO()
|
buf = io.BytesIO()
|
||||||
fig.savefig(buf, format='png')
|
fig.savefig(buf, format='png')
|
||||||
b = buf.getvalue()
|
b = buf.getvalue()
|
||||||
@@ -84,30 +122,33 @@ class UserChartsActivityAll(DetailView):
|
|||||||
plt.yticks(days, [f'{i:%m-%d}' for i in days])
|
plt.yticks(days, [f'{i:%m-%d}' for i in days])
|
||||||
plt.grid(True, zorder=1)
|
plt.grid(True, zorder=1)
|
||||||
|
|
||||||
def render_to_response(self, context, **response_kwargs):
|
def average_chart(self, plt, ax, logs, day_l, day_r, day_count, days):
|
||||||
logs = list(ActivityLog.objects.filter(user=self.object, activity=context['activity']).order_by('start_time').all())
|
pass
|
||||||
|
|
||||||
|
def render_to_response(self, context, **response_kwargs):
|
||||||
|
logs = ActivityLog.objects.filter(user=self.object).all()
|
||||||
day_r = logs[-1].end_time.replace(hour=0, minute=0, second=0, microsecond=0)
|
day_r = logs[-1].end_time.replace(hour=0, minute=0, second=0, microsecond=0)
|
||||||
day_l = max(
|
day_l = max(
|
||||||
logs[0].start_time.replace(hour=0, minute=0, second=0, microsecond=0),
|
logs[0].start_time.replace(hour=0, minute=0, second=0, microsecond=0),
|
||||||
day_r - timedelta(days=13)
|
day_r - timedelta(days=13)
|
||||||
)
|
)
|
||||||
|
|
||||||
day_count = (day_r - day_l) // timedelta(days=1) + 1
|
day_count = (day_r - day_l) // timedelta(days=1) + 1
|
||||||
|
|
||||||
days = [day_l + timedelta(days=1) * i for i in range(day_count)]
|
days = [day_l + timedelta(days=1) * i for i in range(day_count)]
|
||||||
|
|
||||||
import matplotlib
|
import matplotlib
|
||||||
matplotlib.use('Agg')
|
matplotlib.use('Agg')
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
fig = plt.figure(figsize=(16, 12), dpi=100)
|
fig = plt.figure(figsize=(8, 12), dpi=100)
|
||||||
|
|
||||||
ax = fig.add_subplot(211)
|
ax = fig.add_subplot(311)
|
||||||
self.bar_chart(plt, ax, logs, day_l, day_r, day_count, days)
|
self.bar_chart(plt, ax, logs, day_l, day_r, day_count, days)
|
||||||
|
|
||||||
ax = fig.add_subplot(212)
|
ax = fig.add_subplot(312)
|
||||||
self.tracker_chart(plt, ax, logs, day_l, day_r, day_count, days)
|
self.tracker_chart(plt, ax, logs, day_l, day_r, day_count, days)
|
||||||
|
|
||||||
|
ax = fig.add_subplot(313)
|
||||||
|
self.average_chart(plt, ax, logs, day_l, day_r, day_count, days)
|
||||||
|
|
||||||
buf = io.BytesIO()
|
buf = io.BytesIO()
|
||||||
fig.savefig(buf, format='png')
|
fig.savefig(buf, format='png')
|
||||||
b = buf.getvalue()
|
b = buf.getvalue()
|
||||||
|
Reference in New Issue
Block a user