Load API keys
import os
import requests
import pandas as pd
# keys are stored in env vars to be hidden from users
api_key = os.environ["NOTION_API_KEY"]
database_id = os.environ["DATABASE_ID"]
Load Notion Database to memory and check results
from IPython.display import display, JSON
headers = {
"Authorization": f"Bearer {api_key}",
"Notion-Version": "2021-08-16",
"Content-Type": "application/json",
}
# load first page
response = requests.post(
f"https://api.notion.com/v1/databases/{database_id}/query", headers=headers
).json()
print("First result:")
display(JSON(response))
# iteratively load all pages
records = response["results"]
while response["has_more"]:
response = requests.post(
f"https://api.notion.com/v1/databases/{database_id}/query",
json={"start_cursor": response["next_cursor"]},
headers=headers,
).json()
print("Loading page ...")
records.extend(response.get("results", []))
print(f"Got {len(records)} entries from Sales in Notion.")
print("Sales record have these properties", [x for x in records[0]['properties']])
First result:
Got 3 entries from Sales in Notion.
Sales record have these properties ['Total', 'Name']
Create DataFrame from Notion data
def get_raw_value(item):
item_type = item['type']
if type(item[item_type]) is list:
if item[item_type][0]['type'] == 'text':
return item[item_type][0]['plain_text']
return item[item_type]
all_values = []
for record in records:
properties = record['properties']
all_values.append({
'Name': get_raw_value(properties['Name']),
'Total': get_raw_value(properties['Total']),
})
df = pd.DataFrame(all_values)
df
df
Make any visualization, we want :)
For demonstration, we will show sales per county. Hover mouse over!
Record time of running this notebook
from datetime import datetime
print(f'Last run: {datetime.now()} UTC.')
Last run: 2021-11-18 22:10:50.242229 UTC.