Habits v0.01

So I recently wrote an initial version of Habits with a few restrictions:

  • It is a command-line only application.
  • It only tracks one habit: squats

This is a relatively simple application, which I will reproduce below with comments:

import csv
import datetime
import matplotlib.pyplot as plt

# This function writes a date and number of squats for each set to the squats.csv file
def track_squats(date, sets):
  # Open the squats.csv file in append mode
  with open('squats.csv', 'a', newline='') as csvfile:
    # Create a writer object for writing to the file
    squat_writer = csv.writer(csvfile, delimiter=',')
    # Iterate over the sets and write the date and number of squats for each set
    for s in sets:
      squat_writer.writerow([date, s])

# This function calculates and displays statistics for the squats
def get_squat_stats():
  # Initialize variables for storing the total number of squats and the maximum number of squats
  total_squats = 0
  max_squats = 0
  # Open the squats.csv file in read mode
  with open('squats.csv', 'r') as csvfile:
    # Create a reader object for reading from the file
    squat_reader = csv.reader(csvfile, delimiter=',')
    # Initialize a variable for storing the number of sets
    num_sets = 0
    # Initialize lists for storing the dates and number of squats
    dates = []
    squats = []
    # Iterate over the rows in the file
    for row in squat_reader:
      # Add the number of squats for this set to the total
      total_squats += int(row[1])
      # Update the maximum number of squats if necessary
      max_squats = max(max_squats, int(row[1]))
      # Increment the number of sets
      num_sets += 1
      # Add the date and number of squats for this set to the lists
      dates.append(row[0])
      squats.append(int(row[1]))
  # Calculate the average number of squats per set
  if num_sets > 0:
    avg_squats = total_squats / num_sets
  else:
    avg_squats = 0
  # Display the statistics
  print(f'Total squats: {total_squats}')
  print(f'Average squats per set: {avg_squats:.2f}')
  print(f'Max squats per set: {max_squats}')
  # Return the lists of dates and squats
  return (dates, squats)

# This function creates a bar chart showing the number of squats per date
def show_bar_chart(dates, squats):
  # Create the bar chart using the dates and squats lists
  plt.bar(dates, squats)
  # Set the x-axis label
  plt.xlabel('Date')
  # Set the y-axis label
  plt.ylabel('Squats')
  # Set the title
  plt.title('Squats per Day')
  # Show the chart
  plt.show()

# Get the action from the user
action = input('Enter "input" to input new data, "stats" to view statistics, or "chart" to view data in a bar chart: ')

# Perform the appropriate action
if action.lower() == 'input':
  # Get the date from the user
  date = input('Enter date (YYYY-MM-DD): ')
  # Initialize a list for storing the number of squats for each set
  sets = []
  # Loop until the user is done inputting sets
  while True:
    # Get the number of squats for this set from the user
    num_squats = input('Enter number of squats (or "done" to finish): ')
    # If the user is done, exit the loop
    if num_squats.lower() == 'done':
      break
    # Add the number of squats for this set to the list
    sets.append(int(num_squats))
  # Write the date and number of squats for each set to the squats.csv file
  track_squats(date, sets)
elif action.lower() == 'stats':
  # Calculate and display the squat statistics
  get_squat_stats()
elif action.lower() == 'chart':
  # Calculate the squat statistics and get the lists of dates and squats
  dates, squats = get_squat_stats()
  # Create a bar chart showing the number of squats per date
  show_bar_chart(dates, squats)
else:
  # If the action is not recognized, display an error message
  print('Invalid input')

This code is a simple program that allows a user to track their squats, view statistics about their squats, and view a bar chart of their squats over time. The user can input new data by specifying a date and entering the number of squats they performed on that date. When the user selects the “stats” action, the program calculates and displays the total number of squats, the average number of squats per set, and the maximum number of squats per set. When the user selects the “chart” action, the program displays a bar chart showing the number of squats performed on each date.

To track the squats, the program uses a CSV file called “squats.csv” to store the date and number of squats for each set of squats. The program has a function called “track_squats” that writes the date and number of squats for each set to the CSV file. Another function called “get_squat_stats” reads the data from the CSV file and calculates the statistics for the squats. Finally, a function called “show_bar_chart” reads the data from the CSV file and creates a bar chart using the matplotlib library.

Of course, we can build up from this in the future.

For example, Habits could allow the user to track multiple habits, such as push-ups or running, in addition to squats. The app could enable users to set goals for each habit and track their progress. It could also provide detailed stats and charts, like a line chart showing progress over time or a pie chart showing activity by day of the week. These features could transform the app into a powerful aid for developing and sustaining healthy habits.

I’ll soon work on a v0.02, and I am sure by the time we get to V1 we will have a decent application on our hands!

Related Essays