Skip to content

Instantly share code, notes, and snippets.

@dineshj1
Last active July 30, 2018 19:21
Show Gist options
  • Save dineshj1/26cbe7dbcb797658048bdcb16fc9d061 to your computer and use it in GitHub Desktop.
Save dineshj1/26cbe7dbcb797658048bdcb16fc9d061 to your computer and use it in GitHub Desktop.
How to dump parameters to google spreadsheet to track experiments
# First make sure you pip install google-api-python-client
from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
def store_opts(opt): # opt is the object returned by argparse
params = dict(opt.__dict__)
# here I remove parameters I don't want recorded in google sheets
params.pop('retain_in_test', None)
params.pop('exec_mode', None)
params.pop('sacred', None)
# some boilerplate code... once you figure out how the Sheets API works, this section becomes clear.
SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
store = file.Storage('credentials.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('client_secret.json', SCOPES) # this is a user-specific thing you'll have to download
creds = tools.run_flow(flow, store)
service = build('sheets', 'v4', http=creds.authorize(Http()))
result = service.spreadsheets().values().get(spreadsheetId=config.spreadsheet_id, # Will look like 1Y_5-d9Az2m1Mc8vVoUNv6KVjNApuvhy5oiNdaadgvP0. See Google Sheets API for how to get a spreadsheet ID (it is the key portion of the URL)
range=config.title_range_).execute() # I set config.title_range_ to 'Sheet1!A1:AZ1', which are the cell addresses that contains the title row of my sheet ...
keys = result.get('values', [])
if len(keys) == 0:
keys = sorted(params.keys())
first_keys = ['job_id', 'dist_regress', 'data_version', 'limit_trn_files', 'seed', # for setting a good ordering of the columns in the spreadsheet first time around, I specify which columns I want first
'posneg_ratio', 'lr', 'lr_stepsize', 'lr_gamma', 'kl_lambda', 'batch_size',
'sysid_featlen', 'act_featlen', 'sysid_lstm_nlayers', 'feat_len',
'vae', 'epochs', 'freeze_imgfeat', 'save_freq']
for k in first_keys:
try:
print(k)
keys.remove(k)
except ValueError:
pass
keys = first_keys + keys
value_range_body = {
"values": [
[key for key in keys]
]
}
request = service.spreadsheets().values().append(
spreadsheetId=config.spreadsheet_id, # Will look like 1Y_5-d9Az2m1Mc8vVoUNv6KVjNApuvhy5oiNdaadgvP0. See Google Sheets API for how to get a spreadsheet ID (it is the key portion of the URL)
range=config.title_range_, # Will look like Sheet1!A1:ZZ1
valueInputOption='RAW',
insertDataOption='OVERWRITE',
body=value_range_body)
response = request.execute()
value_range_body = {
"values": [
[(params[key] if key in params else 'NA') for key in keys[0]]
]
}
# The portion where I actually dump parameters
request = service.spreadsheets().values().append(
spreadsheetId=config.spreadsheet_id,
range=config.range_, # Sheet1!A2:ZZ100
valueInputOption='RAW',
insertDataOption='INSERT_ROWS',
body=value_range_body)
response = request.execute()
return response
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment