Отслеживание фокусированного времени с помощью Python

Ценность внимания

Внимание, похоже, становится ценным активом в современном мире. Любое приложение и любой посещаемый вами веб-сайт заточен на то, чтобы заполучить частичку вашего внимания, которое уже превратилось практически в валюту. Поэтому имеет смысл нам самим взять под как можно больший контроль это фокусированное внимание.

Сегодня мы покажем, как отслеживать и визуализировать фокусированное время с помощью 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

Разберемся, что здесь происходит:

  1. Сначала пишем функцию trackFocus(), которая элементарно отслеживает время, проходящее от одного простого пользовательского ввода до другого (например, нажатия return на mac или enter на windows).
  2. Затем вызываем функцию calculatefocustime(), которая возвращает общее количество времени, отслеженного в тот или иной день.
  3. Наконец, вызываем функцию 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()

Скрипт для построения графика фокусированного времени

Вот что получается:

Фокусированное время с февраля по июнь 2021 года

Код состоит из двух основных частей:

  1. Создание табличной структуры данных с помощью функции create_focus_df().
  2. Построение графика фокусированного времени с помощью библиотеки 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

Исходный код находится здесь.

Отслеживание для получения ценной информации

Мне нравится идея отслеживания фокусированного времени, ведь так проще понять, на что и сколько времени фактически расходуется ежедневно. Эта информация позволяет ставить более реалистичные цели на ближайшие недели, создавая обоснованное ощущение того, что улучшение происходит.

Спасибо за внимание и до встречи в следующий раз! 🙂

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Lucas Soares: Tracking your Focus with Python

Предыдущая статьяВведение в сетки в цифровом дизайне
Следующая статьяПрограмма на Си для проверки числа: положительное или отрицательное