diff --git a/tutorials/FundingMetrics.ipynb b/tutorials/FundingMetrics.ipynb
new file mode 100644
index 00000000..4966c6b3
--- /dev/null
+++ b/tutorials/FundingMetrics.ipynb
@@ -0,0 +1,1217 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "41b714c9-c749-4d0d-ad59-71e0c035d325",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# ! pip install pyoso"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "988cd219-8b29-469d-9e7a-46f7a965ddc7",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from dotenv import load_dotenv\n",
+ "import os\n",
+ "import pandas as pd\n",
+ "from pyoso import Client\n",
+ "\n",
+ "load_dotenv()\n",
+ "\n",
+ "OSO_API_KEY = os.environ['OSO_API_KEY']\n",
+ "client = Client(api_key=OSO_API_KEY)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "77fe6763-7d49-47a5-b5c6-68264034ab0c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " metric_name | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " GITCOIN_DONATIONS_funding_awarded_biannually | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " GITCOIN_DONATIONS_funding_awarded_daily | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " GITCOIN_DONATIONS_funding_awarded_monthly | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " GITCOIN_DONATIONS_funding_awarded_over_all_time | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " GITCOIN_DONATIONS_funding_awarded_quarterly | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " GITCOIN_DONATIONS_funding_awarded_weekly | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " GITCOIN_DONATIONS_funding_awarded_yearly | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " GITCOIN_MATCHING_funding_awarded_biannually | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " GITCOIN_MATCHING_funding_awarded_daily | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " GITCOIN_MATCHING_funding_awarded_monthly | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " GITCOIN_MATCHING_funding_awarded_over_all_time | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " GITCOIN_MATCHING_funding_awarded_quarterly | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " GITCOIN_MATCHING_funding_awarded_weekly | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " GITCOIN_MATCHING_funding_awarded_yearly | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " OPEN_COLLECTIVE_funding_received_biannually | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " OPEN_COLLECTIVE_funding_received_daily | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " OPEN_COLLECTIVE_funding_received_monthly | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " OPEN_COLLECTIVE_funding_received_over_all_time | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " OPEN_COLLECTIVE_funding_received_quarterly | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " OPEN_COLLECTIVE_funding_received_weekly | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " OPEN_COLLECTIVE_funding_received_yearly | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " OSS_FUNDING_funding_awarded_biannually | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " OSS_FUNDING_funding_awarded_daily | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " OSS_FUNDING_funding_awarded_monthly | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " OSS_FUNDING_funding_awarded_over_all_time | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " OSS_FUNDING_funding_awarded_quarterly | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " OSS_FUNDING_funding_awarded_weekly | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " OSS_FUNDING_funding_awarded_yearly | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " metric_name\n",
+ "0 GITCOIN_DONATIONS_funding_awarded_biannually\n",
+ "1 GITCOIN_DONATIONS_funding_awarded_daily\n",
+ "2 GITCOIN_DONATIONS_funding_awarded_monthly\n",
+ "3 GITCOIN_DONATIONS_funding_awarded_over_all_time\n",
+ "4 GITCOIN_DONATIONS_funding_awarded_quarterly\n",
+ "5 GITCOIN_DONATIONS_funding_awarded_weekly\n",
+ "6 GITCOIN_DONATIONS_funding_awarded_yearly\n",
+ "7 GITCOIN_MATCHING_funding_awarded_biannually\n",
+ "8 GITCOIN_MATCHING_funding_awarded_daily\n",
+ "9 GITCOIN_MATCHING_funding_awarded_monthly\n",
+ "10 GITCOIN_MATCHING_funding_awarded_over_all_time\n",
+ "11 GITCOIN_MATCHING_funding_awarded_quarterly\n",
+ "12 GITCOIN_MATCHING_funding_awarded_weekly\n",
+ "13 GITCOIN_MATCHING_funding_awarded_yearly\n",
+ "14 OPEN_COLLECTIVE_funding_received_biannually\n",
+ "15 OPEN_COLLECTIVE_funding_received_daily\n",
+ "16 OPEN_COLLECTIVE_funding_received_monthly\n",
+ "17 OPEN_COLLECTIVE_funding_received_over_all_time\n",
+ "18 OPEN_COLLECTIVE_funding_received_quarterly\n",
+ "19 OPEN_COLLECTIVE_funding_received_weekly\n",
+ "20 OPEN_COLLECTIVE_funding_received_yearly\n",
+ "21 OSS_FUNDING_funding_awarded_biannually\n",
+ "22 OSS_FUNDING_funding_awarded_daily\n",
+ "23 OSS_FUNDING_funding_awarded_monthly\n",
+ "24 OSS_FUNDING_funding_awarded_over_all_time\n",
+ "25 OSS_FUNDING_funding_awarded_quarterly\n",
+ "26 OSS_FUNDING_funding_awarded_weekly\n",
+ "27 OSS_FUNDING_funding_awarded_yearly"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "client.to_pandas(\"\"\"\n",
+ "SELECT metric_name\n",
+ "FROM metrics_v0\n",
+ "WHERE metric_name LIKE '%_funding_%'\n",
+ "ORDER BY 1\n",
+ "\"\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "aa31b0d1-2117-4fb0-8b6e-f206500602d2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " metric_name | \n",
+ " total_amount_in_usd | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " OSS_FUNDING_funding_awarded_over_all_time | \n",
+ " 364887873.600968 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " GITCOIN_MATCHING_funding_awarded_over_all_time | \n",
+ " 13305117.158144 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " GITCOIN_DONATIONS_funding_awarded_over_all_time | \n",
+ " 11666103.711711 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " metric_name total_amount_in_usd\n",
+ "0 OSS_FUNDING_funding_awarded_over_all_time 364887873.600968\n",
+ "1 GITCOIN_MATCHING_funding_awarded_over_all_time 13305117.158144\n",
+ "2 GITCOIN_DONATIONS_funding_awarded_over_all_time 11666103.711711"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "client.to_pandas(\"\"\"\n",
+ "SELECT\n",
+ " m.metric_name,\n",
+ " SUM(km.amount) AS total_amount_in_usd\n",
+ "FROM key_metrics_by_project_v0 AS km\n",
+ "JOIN metrics_v0 AS m ON km.metric_id = m.metric_id\n",
+ "WHERE m.metric_name LIKE '%_funding_%'\n",
+ "GROUP BY 1\n",
+ "ORDER BY 2 DESC\n",
+ "\"\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "c9edc7a4-19d1-443c-bc01-ced2c6ffda65",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " project_display_name | \n",
+ " total_amount_in_usd | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " GMX | \n",
+ " 21000000.0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " MUX Protocol | \n",
+ " 10876479.0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " Synthetix | \n",
+ " 10022628.074157 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " Perpetual Protocol | \n",
+ " 9287212.140718 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " Gains Network | \n",
+ " 7898396.135 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " Velodrome | \n",
+ " 7895037.76024 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " Camelot | \n",
+ " 5407500.0 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " Stargate Finance | \n",
+ " 5289458.865658 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " Vertex Protocol | \n",
+ " 5250000.0 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " Radiant | \n",
+ " 4991077.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " project_display_name total_amount_in_usd\n",
+ "0 GMX 21000000.0\n",
+ "1 MUX Protocol 10876479.0\n",
+ "2 Synthetix 10022628.074157\n",
+ "3 Perpetual Protocol 9287212.140718\n",
+ "4 Gains Network 7898396.135\n",
+ "5 Velodrome 7895037.76024\n",
+ "6 Camelot 5407500.0\n",
+ "7 Stargate Finance 5289458.865658\n",
+ "8 Vertex Protocol 5250000.0\n",
+ "9 Radiant 4991077.0"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "client.to_pandas(\"\"\"\n",
+ "SELECT\n",
+ " p.display_name AS project_display_name,\n",
+ " SUM(km.amount) AS total_amount_in_usd\n",
+ "FROM key_metrics_by_project_v0 AS km\n",
+ "JOIN metrics_v0 AS m ON km.metric_id = m.metric_id\n",
+ "JOIN projects_v1 AS p ON km.project_id = p.project_id\n",
+ "WHERE m.metric_name LIKE '%_funding_awarded_over_all_time'\n",
+ "GROUP BY 1\n",
+ "ORDER BY 2 DESC\n",
+ "LIMIT 10\n",
+ "\"\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "9783c7e0-c2e0-4f1c-9dda-42d458cb39ce",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " project_display_name | \n",
+ " total_amount_in_usd | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " Gitcoin | \n",
+ " 1204537.005379 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " Revoke | \n",
+ " 839092.066154 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " DefiLlama | \n",
+ " 688150.252758 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " rotki | \n",
+ " 612202.655884 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " Safe | \n",
+ " 559315.966614 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " ethers.js | \n",
+ " 553467.398145 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " Hey | \n",
+ " 483399.257399 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " Dark Forest | \n",
+ " 440813.42016 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " JediSwap | \n",
+ " 415608.378052 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " Electronic Frontier Foundation | \n",
+ " 396257.698586 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " project_display_name total_amount_in_usd\n",
+ "0 Gitcoin 1204537.005379\n",
+ "1 Revoke 839092.066154\n",
+ "2 DefiLlama 688150.252758\n",
+ "3 rotki 612202.655884\n",
+ "4 Safe 559315.966614\n",
+ "5 ethers.js 553467.398145\n",
+ "6 Hey 483399.257399\n",
+ "7 Dark Forest 440813.42016\n",
+ "8 JediSwap 415608.378052\n",
+ "9 Electronic Frontier Foundation 396257.698586"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "client.to_pandas(\"\"\"\n",
+ "SELECT\n",
+ " p.display_name AS project_display_name,\n",
+ " SUM(km.amount) AS total_amount_in_usd\n",
+ "FROM key_metrics_by_project_v0 AS km\n",
+ "JOIN metrics_v0 AS m ON km.metric_id = m.metric_id\n",
+ "JOIN projects_v1 AS p ON km.project_id = p.project_id\n",
+ "WHERE m.metric_name LIKE '%_funding_awarded_over_all_time' AND m.metric_name LIKE 'GITCOIN_%'\n",
+ "GROUP BY 1\n",
+ "ORDER BY 2 DESC\n",
+ "LIMIT 10\n",
+ "\"\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "69f8d8ff-f902-4cce-bc3f-d23182f84de3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " project_display_name | \n",
+ " total_amount_in_usd | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " Gitcoin | \n",
+ " 797206.330376 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " Dark Forest | \n",
+ " 297517.115925 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " ZigZag Exchange | \n",
+ " 199746.433382 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " ethers.js | \n",
+ " 129500.966707 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " Prysm Ethereum Client | \n",
+ " 128522.705766 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " rotki | \n",
+ " 122666.927997 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " ZeroPool | \n",
+ " 116795.642612 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " Lighthouse by Sigma Prime | \n",
+ " 114759.839844 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " The Tor Project | \n",
+ " 110669.738113 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " Hardhat | \n",
+ " 110539.758225 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " project_display_name total_amount_in_usd\n",
+ "0 Gitcoin 797206.330376\n",
+ "1 Dark Forest 297517.115925\n",
+ "2 ZigZag Exchange 199746.433382\n",
+ "3 ethers.js 129500.966707\n",
+ "4 Prysm Ethereum Client 128522.705766\n",
+ "5 rotki 122666.927997\n",
+ "6 ZeroPool 116795.642612\n",
+ "7 Lighthouse by Sigma Prime 114759.839844\n",
+ "8 The Tor Project 110669.738113\n",
+ "9 Hardhat 110539.758225"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "client.to_pandas(\"\"\"\n",
+ "SELECT\n",
+ " p.display_name AS project_display_name,\n",
+ " SUM(tm.amount) AS total_amount_in_usd\n",
+ "FROM timeseries_metrics_by_project_v0 AS tm\n",
+ "JOIN metrics_v0 AS m ON tm.metric_id = m.metric_id\n",
+ "JOIN projects_v1 AS p ON tm.project_id = p.project_id\n",
+ "WHERE m.metric_name = 'GITCOIN_DONATIONS_funding_awarded_yearly'\n",
+ "AND tm.sample_date < DATE '2022-01-01'\n",
+ "GROUP BY 1\n",
+ "ORDER BY 2 DESC\n",
+ "LIMIT 10\n",
+ "\"\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "60aa05c7-098f-4e6f-8183-a01fc5ed9652",
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "OsoHTTPError",
+ "evalue": "400 Client Error: Bad Request for url: https://www.opensource.observer/api/v1/sql - COLUMN_NOT_FOUND: line 3:7: Column 'project_id' cannot be resolved",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mOsoHTTPError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[23], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m client\u001b[38;5;241m.\u001b[39mto_pandas(\u001b[38;5;124m\"\"\"\u001b[39m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;124mSELECT * FROM int_events_daily__funding\u001b[39m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;124mWHERE project_id = \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgBq7Wl0q0X+/hAl3qY/vtLirLXpwMoCndZ8i/B/6wd0=\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 4\u001b[0m \n\u001b[1;32m 5\u001b[0m \u001b[38;5;124m\"\"\"\u001b[39m)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pyoso/client.py:69\u001b[0m, in \u001b[0;36mClient.to_pandas\u001b[0;34m(self, query)\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mto_pandas\u001b[39m(\u001b[38;5;28mself\u001b[39m, query: \u001b[38;5;28mstr\u001b[39m):\n\u001b[0;32m---> 69\u001b[0m query_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__query(query)\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m pd\u001b[38;5;241m.\u001b[39mDataFrame(\n\u001b[1;32m 71\u001b[0m query_data\u001b[38;5;241m.\u001b[39mdata, columns\u001b[38;5;241m=\u001b[39mquery_data\u001b[38;5;241m.\u001b[39mcolumns\n\u001b[1;32m 72\u001b[0m )\u001b[38;5;241m.\u001b[39mconvert_dtypes()\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pyoso/client.py:66\u001b[0m, in \u001b[0;36mClient.__query\u001b[0;34m(self, query)\u001b[0m\n\u001b[1;32m 64\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m QueryData(columns\u001b[38;5;241m=\u001b[39mcolumns, data\u001b[38;5;241m=\u001b[39mdata)\n\u001b[1;32m 65\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m requests\u001b[38;5;241m.\u001b[39mHTTPError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m---> 66\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m OsoHTTPError(e, response\u001b[38;5;241m=\u001b[39me\u001b[38;5;241m.\u001b[39mresponse) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n",
+ "\u001b[0;31mOsoHTTPError\u001b[0m: 400 Client Error: Bad Request for url: https://www.opensource.observer/api/v1/sql - COLUMN_NOT_FOUND: line 3:7: Column 'project_id' cannot be resolved"
+ ]
+ }
+ ],
+ "source": [
+ "client.to_pandas(\"\"\"\n",
+ "\n",
+ "\"\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "fa50c103-7c3c-4fb2-bcb1-ff754a8b53f6",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " _col0 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4354602 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " _col0\n",
+ "0 4354602"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "client.to_pandas(\"\"\"\n",
+ "SELECT COUNT(*) FROM stg_open_collective__deposits\n",
+ "LIMIT 5\n",
+ "\"\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "1bd3a7a8-8cac-420e-9e7b-5259ff0e3b2d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " project_id | \n",
+ " project_name | \n",
+ " github_owner | \n",
+ " github_repo | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 87 | \n",
+ " pWEQHj4IsxU8lx2EDLJpphYaGAvw/yRps3vgTbVCXjQ= | \n",
+ " uniswap | \n",
+ " uniswapfoundation | \n",
+ " uniswap-wormhole-bridge | \n",
+ "
\n",
+ " \n",
+ " | 88 | \n",
+ " pWEQHj4IsxU8lx2EDLJpphYaGAvw/yRps3vgTbVCXjQ= | \n",
+ " uniswap | \n",
+ " uniswap | \n",
+ " smart-order-router | \n",
+ "
\n",
+ " \n",
+ " | 89 | \n",
+ " pWEQHj4IsxU8lx2EDLJpphYaGAvw/yRps3vgTbVCXjQ= | \n",
+ " uniswap | \n",
+ " uniswapfoundation | \n",
+ " router-rebates | \n",
+ "
\n",
+ " \n",
+ " | 90 | \n",
+ " pWEQHj4IsxU8lx2EDLJpphYaGAvw/yRps3vgTbVCXjQ= | \n",
+ " uniswap | \n",
+ " uniswap | \n",
+ " sybil-list | \n",
+ "
\n",
+ " \n",
+ " | 91 | \n",
+ " pWEQHj4IsxU8lx2EDLJpphYaGAvw/yRps3vgTbVCXjQ= | \n",
+ " uniswap | \n",
+ " uniswapfoundation | \n",
+ " known-uniswap-forks | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " project_id project_name \\\n",
+ "87 pWEQHj4IsxU8lx2EDLJpphYaGAvw/yRps3vgTbVCXjQ= uniswap \n",
+ "88 pWEQHj4IsxU8lx2EDLJpphYaGAvw/yRps3vgTbVCXjQ= uniswap \n",
+ "89 pWEQHj4IsxU8lx2EDLJpphYaGAvw/yRps3vgTbVCXjQ= uniswap \n",
+ "90 pWEQHj4IsxU8lx2EDLJpphYaGAvw/yRps3vgTbVCXjQ= uniswap \n",
+ "91 pWEQHj4IsxU8lx2EDLJpphYaGAvw/yRps3vgTbVCXjQ= uniswap \n",
+ "\n",
+ " github_owner github_repo \n",
+ "87 uniswapfoundation uniswap-wormhole-bridge \n",
+ "88 uniswap smart-order-router \n",
+ "89 uniswapfoundation router-rebates \n",
+ "90 uniswap sybil-list \n",
+ "91 uniswapfoundation known-uniswap-forks "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "query = \"\"\"\n",
+ "SELECT\n",
+ " project_id,\n",
+ " project_name,\n",
+ " artifact_namespace as github_owner,\n",
+ " artifact_name as github_repo\n",
+ "FROM artifacts_by_project_v1\n",
+ "WHERE\n",
+ " artifact_source = 'GITHUB'\n",
+ " AND artifact_namespace LIKE '%uniswap%'\n",
+ "\"\"\"\n",
+ "df = client.to_pandas(query)\n",
+ "df.tail()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "9a2cbcee-11be-47d0-8ece-ae927178bcbb",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " metric_name | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " GITHUB_active_developers_daily | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " GITHUB_closed_issues_daily | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " GITHUB_comments_daily | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " GITHUB_commits_daily | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " GITHUB_contributors_daily | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " GITHUB_forks_daily | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " GITHUB_merged_pull_requests_daily | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " GITHUB_opened_issues_daily | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " GITHUB_opened_pull_requests_daily | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " GITHUB_releases_daily | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " GITHUB_repositories_daily | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " GITHUB_stars_daily | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " metric_name\n",
+ "0 GITHUB_active_developers_daily\n",
+ "1 GITHUB_closed_issues_daily\n",
+ "2 GITHUB_comments_daily\n",
+ "3 GITHUB_commits_daily\n",
+ "4 GITHUB_contributors_daily\n",
+ "5 GITHUB_forks_daily\n",
+ "6 GITHUB_merged_pull_requests_daily\n",
+ "7 GITHUB_opened_issues_daily\n",
+ "8 GITHUB_opened_pull_requests_daily\n",
+ "9 GITHUB_releases_daily\n",
+ "10 GITHUB_repositories_daily\n",
+ "11 GITHUB_stars_daily"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "query = \"\"\"\n",
+ "SELECT metric_name\n",
+ "FROM metrics_v0\n",
+ "WHERE\n",
+ " metric_name LIKE '%GITHUB%'\n",
+ " AND metric_name LIKE '%daily%'\n",
+ "ORDER BY 1\n",
+ "\"\"\"\n",
+ "client.to_pandas(query)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "551ab7cd-08e2-4148-8ab2-db201394a816",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " sample_date | \n",
+ " metric_name | \n",
+ " amount | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 2025-03-30 | \n",
+ " GITHUB_contributors_daily | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2025-03-30 | \n",
+ " GITHUB_commits_daily | \n",
+ " 9 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 2025-03-29 | \n",
+ " GITHUB_stars_daily | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 2025-03-29 | \n",
+ " GITHUB_commits_daily | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 2025-03-29 | \n",
+ " GITHUB_contributors_daily | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " sample_date metric_name amount\n",
+ "0 2025-03-30 GITHUB_contributors_daily 2\n",
+ "1 2025-03-30 GITHUB_commits_daily 9\n",
+ "2 2025-03-29 GITHUB_stars_daily 1\n",
+ "3 2025-03-29 GITHUB_commits_daily 3\n",
+ "4 2025-03-29 GITHUB_contributors_daily 2"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "query = \"\"\"\n",
+ "SELECT\n",
+ " tm.sample_date,\n",
+ " m.metric_name,\n",
+ " tm.amount\n",
+ "FROM timeseries_metrics_by_project_v0 AS tm\n",
+ "JOIN metrics_v0 AS m\n",
+ " ON tm.metric_id = m.metric_id\n",
+ "JOIN projects_v1 AS p\n",
+ " ON tm.project_id = p.project_id\n",
+ "WHERE \n",
+ " p.project_name = 'opensource-observer'\n",
+ " AND m.metric_name IN (\n",
+ " 'GITHUB_stars_daily',\n",
+ " 'GITHUB_forks_daily',\n",
+ " 'GITHUB_commits_daily',\n",
+ " 'GITHUB_contributors_daily'\n",
+ " )\n",
+ "ORDER BY tm.sample_date DESC\n",
+ "\"\"\"\n",
+ "df = client.to_pandas(query)\n",
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "944ee1bd-98d1-40cf-9626-a46e052e3050",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " sample_date | \n",
+ " metric_name | \n",
+ " amount | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 2025-03-31 | \n",
+ " GITHUB_opened_issues_over_all_time | \n",
+ " 914.0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2025-03-31 | \n",
+ " GITHUB_merged_pull_requests_over_all_time | \n",
+ " 2018.0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 2025-03-31 | \n",
+ " GITHUB_releases_over_all_time | \n",
+ " 950.0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 2025-03-31 | \n",
+ " GITHUB_opened_pull_requests_over_all_time | \n",
+ " 2433.0 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 2025-03-31 | \n",
+ " GITHUB_stars_over_all_time | \n",
+ " 5228.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " sample_date metric_name amount\n",
+ "0 2025-03-31 GITHUB_opened_issues_over_all_time 914.0\n",
+ "1 2025-03-31 GITHUB_merged_pull_requests_over_all_time 2018.0\n",
+ "2 2025-03-31 GITHUB_releases_over_all_time 950.0\n",
+ "3 2025-03-31 GITHUB_opened_pull_requests_over_all_time 2433.0\n",
+ "4 2025-03-31 GITHUB_stars_over_all_time 5228.0"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "query = \"\"\"\n",
+ "SELECT\n",
+ " tm.sample_date,\n",
+ " m.metric_name,\n",
+ " tm.amount\n",
+ "FROM timeseries_metrics_by_project_v0 AS tm\n",
+ "JOIN metrics_v0 AS m\n",
+ " ON tm.metric_id = m.metric_id\n",
+ "JOIN projects_v1 AS p\n",
+ " ON tm.project_id = p.project_id\n",
+ "WHERE p.project_name = 'wevm'\n",
+ "ORDER BY sample_date DESC\n",
+ "\"\"\"\n",
+ "df = client.to_pandas(query)\n",
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "2b9d04d6-9f46-4a4f-9183-4bd0aeebfa8d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "query = \"\"\"\n",
+ "SELECT * FROM int_artifacts_by_project_in_ossd\n",
+ "WHERE artifact_type = 'OPEN_COLLECTIVE'\n",
+ "\"\"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "bf7bb020-c3f9-44e3-a60a-11668a2fb5a2",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}