refactor(mood/stats): streamline and optimize visualizations

This commit streamlines mood and activity visualization code in
mood/statistics.py for better readability and maintainability. By
consolidating similar code blocks, replacing ' extension calls with
consistent double quotes, and reformatting large data structures for
clarity, we ensure the code is more Pythonic and easier to follow.
Additionally, the alterations in how pie charts and mood statistics are
generated not only maintain functionality but also reduce cognitive load
when navigating the codebase. These changes pave the way for future
enhancements and debugging efforts by making the codebase more
approachable.
This commit is contained in:
Kumi 2024-03-24 16:28:10 +01:00
parent c7295829fc
commit 71c34db6d8
Signed by: kumi
GPG key ID: ECBCC9082395383F

View file

@ -15,23 +15,18 @@ from dateutil.relativedelta import relativedelta
from .models import Status, Mood, StatusActivity
def moodstats(user):
hv.extension('bokeh')
hv.extension("bokeh")
tooltips = [
('Date', '@date{%F %H:%M}'),
('Mood', '@name (@value)')
]
tooltips = [("Date", "@date{%F %H:%M}"), ("Mood", "@name (@value)")]
formatters = {
'@date': 'datetime'
}
formatters = {"@date": "datetime"}
hover = HoverTool(tooltips=tooltips, formatters=formatters)
pointdict = {"date": [], "value": [], "color": [], "name": []}
for status in Status.objects.filter(user=user):
if status.mood:
pointdict["date"].append(status.timestamp)
@ -44,11 +39,20 @@ def moodstats(user):
points = hv.Points(pointframe)
points.opts(
tools=[hover], color='color', cmap='Category20',
line_color='black', size=25,
width=600, height=400, show_grid=True)
tools=[hover],
color="color",
cmap="Category20",
line_color="black",
size=25,
width=600,
height=400,
show_grid=True,
)
pointtuples = [(pointdict["date"][i], pointdict["value"][i]) for i in range(len(pointdict["date"]))]
pointtuples = [
(pointdict["date"][i], pointdict["value"][i])
for i in range(len(pointdict["date"]))
]
line = hv.Curve(pointtuples)
@ -56,13 +60,14 @@ def moodstats(user):
maxy = maxval + max(maxval * 0.1, 1)
maxx = timezone.now().timestamp() * 1000
minx = maxx - (60*60*24*7) * 1000
minx = maxx - (60 * 60 * 24 * 7) * 1000
output = points * line * timeseries.rolling(line, rolling_window=7)
output.opts(ylim=(0, maxy), xlim=(minx, maxx))
return output
def activitystats(user):
output = {}
@ -73,7 +78,7 @@ def activitystats(user):
"alltime": 0,
"yearly": 0,
"monthly": 0,
"weekly": 0
"weekly": 0,
}
output[activity]["alltime"] += 1
@ -89,14 +94,27 @@ def activitystats(user):
return output
def moodpies(user):
hv.extension('bokeh')
hv.extension("bokeh")
maxdate = timezone.now()
weekly_moods = Status.objects.filter(user=user, timestamp__lte=maxdate, timestamp__gte=maxdate - relativedelta(weeks=1))
monthly_moods = Status.objects.filter(user=user, timestamp__lte=maxdate, timestamp__gte=maxdate - relativedelta(months=1))
yearly_moods = Status.objects.filter(user=user, timestamp__lte=maxdate, timestamp__gte=maxdate - relativedelta(years=1))
weekly_moods = Status.objects.filter(
user=user,
timestamp__lte=maxdate,
timestamp__gte=maxdate - relativedelta(weeks=1),
)
monthly_moods = Status.objects.filter(
user=user,
timestamp__lte=maxdate,
timestamp__gte=maxdate - relativedelta(months=1),
)
yearly_moods = Status.objects.filter(
user=user,
timestamp__lte=maxdate,
timestamp__gte=maxdate - relativedelta(years=1),
)
weekly = dict()
colors = []
@ -119,55 +137,96 @@ def moodpies(user):
if status.mood:
yearly[status.mood.name] += 1
weekly_data = pd.Series(weekly).reset_index(name='value').rename(columns={'index':'mood'})
weekly_data['angle'] = weekly_data['value']/weekly_data['value'].sum() * 2*pi
weekly_data['color'] = colors
weekly_data = (
pd.Series(weekly).reset_index(name="value").rename(columns={"index": "mood"})
)
weekly_data["angle"] = weekly_data["value"] / weekly_data["value"].sum() * 2 * pi
weekly_data["color"] = colors
weekly_chart = figure(height=350, title="Weekly", toolbar_location=None,
tools="hover", tooltips="@mood: @value")
weekly_chart = figure(
height=350,
title="Weekly",
toolbar_location=None,
tools="hover",
tooltips="@mood: @value",
)
weekly_chart.axis.visible = False
weekly_chart.wedge(x=0, y=1, radius=0.4,
start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
line_color="white", fill_color='color', legend='mood', source=weekly_data)
weekly_chart.wedge(
x=0,
y=1,
radius=0.4,
start_angle=cumsum("angle", include_zero=True),
end_angle=cumsum("angle"),
line_color="white",
fill_color="color",
legend="mood",
source=weekly_data,
)
monthly_data = pd.Series(monthly).reset_index(name='value').rename(columns={'index':'mood'})
monthly_data['angle'] = monthly_data['value']/monthly_data['value'].sum() * 2*pi
monthly_data['color'] = colors
monthly_data = (
pd.Series(monthly).reset_index(name="value").rename(columns={"index": "mood"})
)
monthly_data["angle"] = monthly_data["value"] / monthly_data["value"].sum() * 2 * pi
monthly_data["color"] = colors
monthly_chart = figure(height=350, title="Monthly", toolbar_location=None,
tools="hover", tooltips="@mood: @value")
monthly_chart = figure(
height=350,
title="Monthly",
toolbar_location=None,
tools="hover",
tooltips="@mood: @value",
)
monthly_chart.axis.visible = False
monthly_chart.wedge(x=0, y=1, radius=0.4,
start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
line_color="white", fill_color='color', legend='mood', source=monthly_data)
monthly_chart.wedge(
x=0,
y=1,
radius=0.4,
start_angle=cumsum("angle", include_zero=True),
end_angle=cumsum("angle"),
line_color="white",
fill_color="color",
legend_label="mood",
source=monthly_data,
)
yearly_data = pd.Series(yearly).reset_index(name='value').rename(columns={'index':'mood'})
yearly_data['angle'] = yearly_data['value']/yearly_data['value'].sum() * 2*pi
yearly_data['color'] = colors
yearly_data = (
pd.Series(yearly).reset_index(name="value").rename(columns={"index": "mood"})
)
yearly_data["angle"] = yearly_data["value"] / yearly_data["value"].sum() * 2 * pi
yearly_data["color"] = colors
yearly_chart = figure(height=350, title="Yearly", toolbar_location=None,
tools="hover", tooltips="@mood: @value")
yearly_chart = figure(
height=350,
title="Yearly",
toolbar_location=None,
tools="hover",
tooltips="@mood: @value",
)
yearly_chart.axis.visible = False
yearly_chart.wedge(x=0, y=1, radius=0.4,
start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
line_color="white", fill_color='color', legend='mood', source=yearly_data)
yearly_chart.wedge(
x=0,
y=1,
radius=0.4,
start_angle=cumsum("angle", include_zero=True),
end_angle=cumsum("angle"),
line_color="white",
fill_color="color",
legend_label="mood",
source=yearly_data,
)
return column(weekly_chart, monthly_chart, yearly_chart)
def activitymood(activity):
hv.extension('bokeh')
hv.extension("bokeh")
tooltips = [
('Date', '@date{%F %H:%M}'),
('Mood', '@name (@value)')
]
tooltips = [("Date", "@date{%F %H:%M}"), ("Mood", "@name (@value)")]
formatters = {
'@date': 'datetime'
}
formatters = {"@date": "datetime"}
hover = HoverTool(tooltips=tooltips, formatters=formatters)
@ -185,11 +244,20 @@ def activitymood(activity):
points = hv.Points(pointframe)
points.opts(
tools=[hover], color='color', cmap='Category20',
line_color='black', size=25,
width=600, height=400, show_grid=True)
tools=[hover],
color="color",
cmap="Category20",
line_color="black",
size=25,
width=600,
height=400,
show_grid=True,
)
pointtuples = [(pointdict["date"][i], pointdict["value"][i]) for i in range(len(pointdict["date"]))]
pointtuples = [
(pointdict["date"][i], pointdict["value"][i])
for i in range(len(pointdict["date"]))
]
line = hv.Curve(pointtuples)
@ -197,15 +265,16 @@ def activitymood(activity):
maxy = maxval + max(maxval * 0.1, 1)
maxx = timezone.now().timestamp() * 1000
minx = maxx - (60*60*24*7) * 1000
minx = maxx - (60 * 60 * 24 * 7) * 1000
output = points * line * timeseries.rolling(line, rolling_window=7)
output.opts(ylim=(0, maxy), xlim=(minx, maxx))
return output
def activitypies(activity):
hv.extension('bokeh')
hv.extension("bokeh")
maxdate = timezone.now()
@ -229,40 +298,85 @@ def activitypies(activity):
if single.status.timestamp > timezone.now() - relativedelta(years=1):
yearly[single.status.mood.name] += 1
weekly_data = pd.Series(weekly).reset_index(name='value').rename(columns={'index':'mood'})
weekly_data['angle'] = weekly_data['value']/weekly_data['value'].sum() * 2*pi
weekly_data['color'] = colors
weekly_data = (
pd.Series(weekly).reset_index(name="value").rename(columns={"index": "mood"})
)
weekly_data["angle"] = weekly_data["value"] / weekly_data["value"].sum() * 2 * pi
weekly_data["color"] = colors
weekly_chart = figure(height=350, title="Weekly", toolbar_location=None,
tools="hover", tooltips="@mood: @value")
weekly_chart = figure(
height=350,
title="Weekly",
toolbar_location=None,
tools="hover",
tooltips="@mood: @value",
)
weekly_chart.axis.visible = False
weekly_chart.wedge(x=0, y=1, radius=0.4,
start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
line_color="white", fill_color='color', legend='mood', source=weekly_data)
weekly_chart.wedge(
x=0,
y=1,
radius=0.4,
start_angle=cumsum("angle", include_zero=True),
end_angle=cumsum("angle"),
line_color="white",
fill_color="color",
legend_label="mood",
source=weekly_data,
)
monthly_data = pd.Series(monthly).reset_index(name='value').rename(columns={'index':'mood'})
monthly_data['angle'] = monthly_data['value']/monthly_data['value'].sum() * 2*pi
monthly_data['color'] = colors
monthly_data = (
pd.Series(monthly).reset_index(name="value").rename(columns={"index": "mood"})
)
monthly_data["angle"] = monthly_data["value"] / monthly_data["value"].sum() * 2 * pi
monthly_data["color"] = colors
monthly_chart = figure(height=350, title="Monthly", toolbar_location=None,
tools="hover", tooltips="@mood: @value")
monthly_chart = figure(
height=350,
title="Monthly",
toolbar_location=None,
tools="hover",
tooltips="@mood: @value",
)
monthly_chart.axis.visible = False
monthly_chart.wedge(x=0, y=1, radius=0.4,
start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
line_color="white", fill_color='color', legend='mood', source=monthly_data)
monthly_chart.wedge(
x=0,
y=1,
radius=0.4,
start_angle=cumsum("angle", include_zero=True),
end_angle=cumsum("angle"),
line_color="white",
fill_color="color",
legend_label="mood",
source=monthly_data,
)
yearly_data = pd.Series(yearly).reset_index(name='value').rename(columns={'index':'mood'})
yearly_data['angle'] = yearly_data['value']/yearly_data['value'].sum() * 2*pi
yearly_data['color'] = colors
yearly_data = (
pd.Series(yearly).reset_index(name="value").rename(columns={"index": "mood"})
)
yearly_data["angle"] = yearly_data["value"] / yearly_data["value"].sum() * 2 * pi
yearly_data["color"] = colors
yearly_chart = figure(height=350, title="Yearly", toolbar_location=None,
tools="hover", tooltips="@mood: @value")
yearly_chart = figure(
height=350,
title="Yearly",
toolbar_location=None,
tools="hover",
tooltips="@mood: @value",
)
yearly_chart.axis.visible = False
yearly_chart.wedge(x=0, y=1, radius=0.4,
start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
line_color="white", fill_color='color', legend='mood', source=yearly_data)
yearly_chart.wedge(
x=0,
y=1,
radius=0.4,
start_angle=cumsum("angle", include_zero=True),
end_angle=cumsum("angle"),
line_color="white",
fill_color="color",
legend_label="mood",
source=yearly_data,
)
return column(weekly_chart, monthly_chart, yearly_chart)
return column(weekly_chart, monthly_chart, yearly_chart)