Источник: Nuances of Programming
Ценность внимания
Внимание, похоже, становится ценным активом в современном мире. Любое приложение и любой посещаемый вами веб-сайт заточен на то, чтобы заполучить частичку вашего внимания, которое уже превратилось практически в валюту. Поэтому имеет смысл нам самим взять под как можно больший контроль это фокусированное внимание.
Сегодня мы покажем, как отслеживать и визуализировать фокусированное время с помощью Python и Streamlit.
Отслеживание и визуализация
Пошагово пройдем следующие этапы:
- настройка скрипта отслеживания;
- настройка визуализации;
- перенос кода в приложение на Streamlit.
1. Скрипт отслеживания
Начнем с написания скрипта для отслеживания фокусированного времени:
import pandas as pd
from datetime import datetime
import numpy as np
import time
import pathlib
FOCUS_DATA_PATH = "./focus.txt"
def logFocusTime(start, end): if not pathlib.Path(FOCUS_DATA_PATH).is_file():
with open(FOCUS_DATA_PATH, "w+") as focus:
focus.write(f"{start} {end}")
focus.write("\n")
else:
with open(FOCUS_DATA_PATH, "a") as focus:
focus.write(f"{start} {end}")
focus.write("\n")
def trackFocus(): start = int(time.time())
end_session = input("Press to finish tracking")
end = int(time.time())
total = (end - start) / 3600 print(f"Tracked: {total} hours")
today_total = calculateFocusTime()
print(f"Total focus time tracked today: {today_total}")
logFocusTime(start, end)
def loadFocus(): with open(FOCUS_DATA_PATH, "r") as focus:
focusData = [f.strip("\n") for f in focus.readlines()]
timeStarts = np.array([int(f.split()[0]) for f in focusData])
timeEnds = np.array([int(f.split()[1]) for f in focusData])
durations = (timeEnds - timeStarts)/3600 timeStartsStamp = [datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')\
for ts in timeStarts]
dateStartsStamp = [datetime.fromtimestamp(ts).strftime('%Y-%m-%d')\
for ts in timeStarts]
return timeStartsStamp,dateStartsStamp,durations
def create_focus_df(): today = datetime.strftime(datetime.today(),format="%Y-%m-%d")
timeStartsStamp,dateStartsStamp,durations=loadFocus()
df = pd.DataFrame(dict(dates=dateStartsStamp, focus=durations))
return df
def calculateFocusTime(): df = create_focus_df()
todayFocus = df[df["dates"]==today]["focus"].sum()
return todayFocus
Разберемся, что здесь происходит:
- Сначала пишем функцию trackFocus(), которая элементарно отслеживает время, проходящее от одного простого пользовательского ввода до другого (например, нажатия return на mac или enter на windows).
- Затем вызываем функцию calculatefocustime(), которая возвращает общее количество времени, отслеженного в тот или иной день.
- Наконец, вызываем функцию logFocus(), которая регистрирует метки времени начала и окончания сеанса.
Теперь, когда мы подготовили скрипт отслеживания, напишем простую визуализацию для просмотра фокусированного времени на каждый день.
2. Визуализация фокусированного времени
Здесь нам понадобятся две функции: одна для создания табличной структуры данных (чтобы обеспечить правильное хранение данных), а другая для построения графика.
import pandas as pd
import plotly.graph_objs as go
from track_focus import loadFocus
from datetime import datetime
def create_focus_df(): today = datetime.strftime(datetime.today(),format="%Y-%m-%d")
timeStartsStamp,dateStartsStamp,durations=loadFocus()
df = pd.DataFrame(dict(dates=dateStartsStamp, focus=durations))
return df
def plotFocus(df): df_focus_daily = pd.DataFrame(df.groupby("dates")["focus"].sum())
mean_focus_time = round(df_focus_daily["focus"].mean(),2)
focusBar = go.Bar(x=df_focus_daily.index,y=df_focus_daily["focus"],
name="Focus",marker_color="green")
focusTrend = go.Scatter(x=df_focus_daily.index,y=df_focus_daily["focus"],
name="Focus",marker_color="red")
fig = go.Figure(data=[focusTrend,focusBar])
fig.update_layout(title=f"Overview, Average Focus Time: {mean_focus_time} hours")
fig.update_yaxes(title="Focus (h)")
return fig
df = create_focus_df()
fig = plotFocus(df)
fig.show()
Скрипт для построения графика фокусированного времени
Вот что получается:
Код состоит из двух основных частей:
- Создание табличной структуры данных с помощью функции create_focus_df().
- Построение графика фокусированного времени с помощью библиотеки plotly в функции plotfocus().
Самое крутое здесь — это то, что получаешь представление о том, сколько времени проводишь фактически на тех или иных сайтах или в приложениях. А кроме того, видишь динамику потраченных часов с течением времени.
Для меня эти данные представляют полезную информацию, позволяющую оценить степень моей последовательности и общую производительность с точки зрения времени, потраченного на продуктивную работу.
3. Оборачиваем все в приложение на Streamlit
В заключение создадим на Streamlit простое приложение с информационной панелью. С его помощью в любое время вам будет доступна визуализация данных о фокусированном времени. Для этого нужна всего одна простая команда из терминала.
import streamlit as st
from datetime import datetime
from track_focus import *
# Создание приложения с информационной панелью # st.title("Focus Tracker")
df_focus = create_focus_df()
fig = plotFocus(df_focus)
st.write(fig)
Запускаем в терминале эту команду:
streamlit run app.py
Исходный код находится здесь.
Отслеживание для получения ценной информации
Мне нравится идея отслеживания фокусированного времени, ведь так проще понять, на что и сколько времени фактически расходуется ежедневно. Эта информация позволяет ставить более реалистичные цели на ближайшие недели, создавая обоснованное ощущение того, что улучшение происходит.
Спасибо за внимание и до встречи в следующий раз!
Читайте также:
Перевод статьи Lucas Soares: Tracking your Focus with Python