# pandas and numpy for data manipulation import pandas as pd import numpy as np # fbprophet for additive models import fbprophet # gspread for Google Sheets access import gspread # slacker for interacting with Slack from slacker import Slacker # oauth2client for authorizing access to Google Sheets from oauth2client.service_account import ServiceAccountCredentials # os for deleting images import os # matplotlib for plotting import matplotlib.pyplot as plt import matplotlib.patches as mpatches import matplotlib # import weighter from weighter import Weighter if __name__ == "__main__": # google sheets access scope = ["https://spreadsheets.google.com/feeds"] # Use local stored credentials in json file # make sure to first share the sheet with the email in the json file credentials = ServiceAccountCredentials.from_json_keyfile_name( "C:/Users/Will Koehrsen/Desktop/weighter-2038ffb4e5a6.json", scope ) # Authorize access gc = gspread.authorize(credentials) # Slack api key is stored as text file with open("C:/Users/Will Koehrsen/Desktop/slack_api.txt", "r") as f: slack_api_key = f.read() slack = Slacker(slack_api_key) # Open the sheet, need to share the sheet with email specified in json file gsheet = gc.open("Auto Weight Challenge").sheet1 # List of lists with each row in the sheet as a list weight_lists = gsheet.get_all_values() # Headers are the first list # Pop returns the element (list in this case) and removes it from the list headers = weight_lists.pop(0) # Convert list of lists to a dataframe with specified column header weights = pd.DataFrame(weight_lists, columns=headers) # Record column should be a boolean weights["Record"] = weights["Record"].astype(bool) # Name column is a string weights["Name"] = weights["Name"].astype(str) # Convert dates to datetime, then set as index, then set the time zone weights["Date"] = pd.to_datetime(weights["Date"], unit="s") weights = weights.set_index("Date", drop=True).tz_localize(tz="US/Eastern") # Drop any extra entries weights = weights.drop("NaT") # If there are new entries create the weighter object if len(weights) > np.count_nonzero(weights["Record"]): # Initialize with dataframe of weights, google sheet, and slack object weighter = Weighter(weights, gsheet, slack) weighter.process_entries() print("Success")