{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "a286c8df",
"metadata": {},
"outputs": [],
"source": [
"# Copyright 2026 Google LLC\n",
"#\n",
"# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
"# you may not use this file except in compliance with the License.\n",
"# You may obtain a copy of the License at\n",
"#\n",
"# https://www.apache.org/licenses/LICENSE-2.0\n",
"#\n",
"# Unless required by applicable law or agreed to in writing, software\n",
"# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
"# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
"# See the License for the specific language governing permissions and\n",
"# limitations under the License."
]
},
{
"cell_type": "markdown",
"id": "d62dc22f",
"metadata": {},
"source": [
"# Use AI Functions with the BigQuery Accessor\n",
"
\n",
"\n",
" \n",
" \n",
" Run in Colab\n",
" \n",
" | \n",
" \n",
" \n",
" \n",
" View on GitHub\n",
" \n",
" | \n",
" \n",
" \n",
" \n",
" Open in Colab Enterprise\n",
" \n",
" | \n",
" \n",
" \n",
" \n",
" Open in BQ Studio\n",
" \n",
" | \n",
"
"
]
},
{
"cell_type": "markdown",
"id": "fddd106d",
"metadata": {},
"source": [
"## Environment Setup"
]
},
{
"cell_type": "markdown",
"id": "53f8dd15",
"metadata": {},
"source": [
"Make sure your GCP project have the follwing roles:\n",
"* [roles/bigquery.jobUser](https://docs.cloud.google.com/iam/docs/roles-permissions/bigquery#bigquery.jobUser)\n",
"* [roles/aiplatform.user](https://docs.cloud.google.com/iam/docs/roles-permissions/aiplatform#aiplatform.user)\n",
"\n",
"Then import bigframes to enable the `bigquery` accessor:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "27900938",
"metadata": {},
"outputs": [],
"source": [
"import bigframes.pandas as bpd\n",
"\n",
"PROJECT_ID = \"\" # @param {type:\"string\"}\n",
"LOCATION = \"US\" # @param {type:\"string\"}\n",
"\n",
"bpd.options.bigquery.project = PROJECT_ID\n",
"bpd.options.bigquery.location = LOCATION\n",
"bpd.options.display.progress_bar = None"
]
},
{
"cell_type": "markdown",
"id": "d3e4540a",
"metadata": {},
"source": [
"## Functions on pandas Series\n",
"### Example: AI.EMBED"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "b4f7f2f5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 {'result': array([ 1.78243860e-03, -1.10658340...\n",
"1 {'result': array([-7.29714287e-03, 1.04725976...\n",
"dtype: struct, status: string>[pyarrow]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"The type of the result is: \n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"animals = pd.Series(['dog', 'fish'])\n",
"result = animals.bigquery.ai.embed(endpoint='text-embedding-005')\n",
"display(result)\n",
"\n",
"print(f\"The type of the result is: {type(result)}\")"
]
},
{
"cell_type": "markdown",
"id": "3957ba3c",
"metadata": {},
"source": [
"### Example: AI.SIMILARITY"
]
},
{
"cell_type": "markdown",
"id": "1d021166",
"metadata": {},
"source": [
"Computes similarities between a series and a constant:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "d62f63ee",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 0.629751\n",
"1 0.768028\n",
"dtype: Float64"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"animals = pd.Series(['dog', 'fish'])\n",
"animals.bigquery.ai.similarity('shrimp', endpoint='text-embedding-005')"
]
},
{
"cell_type": "markdown",
"id": "5918c440",
"metadata": {},
"source": [
"Computes similiarities between two series:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "a1f61abf",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 0.651206\n",
"1 0.835251\n",
"dtype: Float64"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"animals = pd.Series(['dog', 'fish'])\n",
"random_stuff = pd.Series(['smart phone', 'salmon'])\n",
"\n",
"animals.bigquery.ai.similarity(random_stuff, endpoint='text-embedding-005')\n"
]
},
{
"cell_type": "markdown",
"id": "7df7a3d4",
"metadata": {},
"source": [
"## Functions on pandas DataFrames\n",
"### Example: AI.PREDICT\n",
"\n",
"First, prepare a dataset suitable for regression:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "a8b96156",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"=====Training data:\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" neighborhood | \n",
" bedrooms | \n",
" bathrooms | \n",
" sqft | \n",
" monthly_rent | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" Downtown | \n",
" 1 | \n",
" 1.0 | \n",
" 650 | \n",
" 2200 | \n",
"
\n",
" \n",
" | 1 | \n",
" Downtown | \n",
" 2 | \n",
" 1.5 | \n",
" 900 | \n",
" 2800 | \n",
"
\n",
" \n",
" | 2 | \n",
" Downtown | \n",
" 2 | \n",
" 2.0 | \n",
" 1100 | \n",
" 3300 | \n",
"
\n",
" \n",
" | 3 | \n",
" Downtown | \n",
" 3 | \n",
" 2.5 | \n",
" 1500 | \n",
" 4200 | \n",
"
\n",
" \n",
" | 4 | \n",
" Suburbs | \n",
" 2 | \n",
" 1.5 | \n",
" 950 | \n",
" 1600 | \n",
"
\n",
" \n",
" | 5 | \n",
" Suburbs | \n",
" 3 | \n",
" 2.0 | \n",
" 1300 | \n",
" 2100 | \n",
"
\n",
" \n",
" | 6 | \n",
" Suburbs | \n",
" 3 | \n",
" 2.5 | \n",
" 1600 | \n",
" 2500 | \n",
"
\n",
" \n",
" | 7 | \n",
" Suburbs | \n",
" 4 | \n",
" 3.0 | \n",
" 2100 | \n",
" 3100 | \n",
"
\n",
" \n",
" | 8 | \n",
" Midtown | \n",
" 1 | \n",
" 1.0 | \n",
" 700 | \n",
" 1950 | \n",
"
\n",
" \n",
" | 9 | \n",
" Midtown | \n",
" 2 | \n",
" 1.5 | \n",
" 950 | \n",
" 2500 | \n",
"
\n",
" \n",
" | 10 | \n",
" Midtown | \n",
" 2 | \n",
" 2.0 | \n",
" 1200 | \n",
" 3000 | \n",
"
\n",
" \n",
" | 11 | \n",
" Midtown | \n",
" 3 | \n",
" 2.5 | \n",
" 1650 | \n",
" 3800 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" neighborhood bedrooms bathrooms sqft monthly_rent\n",
"0 Downtown 1 1.0 650 2200\n",
"1 Downtown 2 1.5 900 2800\n",
"2 Downtown 2 2.0 1100 3300\n",
"3 Downtown 3 2.5 1500 4200\n",
"4 Suburbs 2 1.5 950 1600\n",
"5 Suburbs 3 2.0 1300 2100\n",
"6 Suburbs 3 2.5 1600 2500\n",
"7 Suburbs 4 3.0 2100 3100\n",
"8 Midtown 1 1.0 700 1950\n",
"9 Midtown 2 1.5 950 2500\n",
"10 Midtown 2 2.0 1200 3000\n",
"11 Midtown 3 2.5 1650 3800"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"=====Prediction data:\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" neighborhood | \n",
" bedrooms | \n",
" bathrooms | \n",
" sqft | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" Downtown | \n",
" 2 | \n",
" 2.0 | \n",
" 1050 | \n",
"
\n",
" \n",
" | 1 | \n",
" Suburbs | \n",
" 3 | \n",
" 2.0 | \n",
" 1450 | \n",
"
\n",
" \n",
" | 2 | \n",
" Midtown | \n",
" 1 | \n",
" 1.5 | \n",
" 850 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" neighborhood bedrooms bathrooms sqft\n",
"0 Downtown 2 2.0 1050\n",
"1 Suburbs 3 2.0 1450\n",
"2 Midtown 1 1.5 850"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"\n",
"train_df = pd.DataFrame({\n",
" \"neighborhood\": [\n",
" \"Downtown\", \"Downtown\", \"Downtown\", \"Downtown\",\n",
" \"Suburbs\", \"Suburbs\", \"Suburbs\", \"Suburbs\",\n",
" \"Midtown\", \"Midtown\", \"Midtown\", \"Midtown\",\n",
" ],\n",
" \"bedrooms\": [1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3],\n",
" \"bathrooms\": [1.0, 1.5, 2.0, 2.5, 1.5, 2.0, 2.5, 3.0, 1.0, 1.5, 2.0, 2.5],\n",
" \"sqft\": [650, 900, 1100, 1500, 950, 1300, 1600, 2100, 700, 950, 1200, 1650],\n",
" \"monthly_rent\": [2200, 2800, 3300, 4200, 1600, 2100, 2500, 3100, 1950, 2500, 3000, 3800],\n",
"})\n",
"\n",
"predict_df = pd.DataFrame({\n",
" \"neighborhood\": [\"Downtown\", \"Suburbs\", \"Midtown\"],\n",
" \"bedrooms\": [2, 3, 1],\n",
" \"bathrooms\": [2.0, 2.0, 1.5],\n",
" \"sqft\": [1050, 1450, 850],\n",
"})\n",
"\n",
"print(\"=====Training data:\")\n",
"display(train_df)\n",
"print(\"=====Prediction data:\")\n",
"display(predict_df)"
]
},
{
"cell_type": "markdown",
"id": "ce41aabb",
"metadata": {},
"source": [
"Then, perform a regression with **TabFM** without prior model training:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0b93cf31",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" neighborhood | \n",
" bedrooms | \n",
" bathrooms | \n",
" sqft | \n",
" predicted_monthly_rent | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" Suburbs | \n",
" 3 | \n",
" 2.0 | \n",
" 1450 | \n",
" 2008.0 | \n",
"
\n",
" \n",
" | 1 | \n",
" Midtown | \n",
" 1 | \n",
" 1.5 | \n",
" 850 | \n",
" 2352.0 | \n",
"
\n",
" \n",
" | 2 | \n",
" Downtown | \n",
" 2 | \n",
" 2.0 | \n",
" 1050 | \n",
" 3392.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" neighborhood bedrooms bathrooms sqft predicted_monthly_rent\n",
"0 Suburbs 3 2.0 1450 2008.0\n",
"1 Midtown 1 1.5 850 2352.0\n",
"2 Downtown 2 2.0 1050 3392.0"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictions = train_df.bigquery.ai.predict(\n",
" predict_df,\n",
" label_col=\"monthly_rent\",\n",
")\n",
"predictions"
]
},
{
"cell_type": "markdown",
"id": "f3689dcb",
"metadata": {},
"source": [
"### Example: AI.FORECAST\n",
"\n",
"First, prepare a timeseries dataset:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "b2588d49",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" date | \n",
" item_id | \n",
" sales | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 2025-01-01 | \n",
" item_1 | \n",
" 100 | \n",
"
\n",
" \n",
" | 1 | \n",
" 2025-01-02 | \n",
" item_1 | \n",
" 105 | \n",
"
\n",
" \n",
" | 2 | \n",
" 2025-01-03 | \n",
" item_1 | \n",
" 110 | \n",
"
\n",
" \n",
" | 3 | \n",
" 2025-01-04 | \n",
" item_1 | \n",
" 115 | \n",
"
\n",
" \n",
" | 4 | \n",
" 2025-01-05 | \n",
" item_1 | \n",
" 120 | \n",
"
\n",
" \n",
" | 5 | \n",
" 2025-01-06 | \n",
" item_1 | \n",
" 125 | \n",
"
\n",
" \n",
" | 6 | \n",
" 2025-01-07 | \n",
" item_1 | \n",
" 130 | \n",
"
\n",
" \n",
" | 7 | \n",
" 2025-01-08 | \n",
" item_1 | \n",
" 135 | \n",
"
\n",
" \n",
" | 8 | \n",
" 2025-01-09 | \n",
" item_1 | \n",
" 140 | \n",
"
\n",
" \n",
" | 9 | \n",
" 2025-01-10 | \n",
" item_1 | \n",
" 145 | \n",
"
\n",
" \n",
" | 10 | \n",
" 2025-01-11 | \n",
" item_1 | \n",
" 150 | \n",
"
\n",
" \n",
" | 11 | \n",
" 2025-01-12 | \n",
" item_1 | \n",
" 155 | \n",
"
\n",
" \n",
" | 12 | \n",
" 2025-01-13 | \n",
" item_1 | \n",
" 160 | \n",
"
\n",
" \n",
" | 13 | \n",
" 2025-01-14 | \n",
" item_1 | \n",
" 165 | \n",
"
\n",
" \n",
" | 14 | \n",
" 2025-01-01 | \n",
" item_2 | \n",
" 50 | \n",
"
\n",
" \n",
" | 15 | \n",
" 2025-01-02 | \n",
" item_2 | \n",
" 52 | \n",
"
\n",
" \n",
" | 16 | \n",
" 2025-01-03 | \n",
" item_2 | \n",
" 55 | \n",
"
\n",
" \n",
" | 17 | \n",
" 2025-01-04 | \n",
" item_2 | \n",
" 58 | \n",
"
\n",
" \n",
" | 18 | \n",
" 2025-01-05 | \n",
" item_2 | \n",
" 60 | \n",
"
\n",
" \n",
" | 19 | \n",
" 2025-01-06 | \n",
" item_2 | \n",
" 62 | \n",
"
\n",
" \n",
" | 20 | \n",
" 2025-01-07 | \n",
" item_2 | \n",
" 65 | \n",
"
\n",
" \n",
" | 21 | \n",
" 2025-01-08 | \n",
" item_2 | \n",
" 68 | \n",
"
\n",
" \n",
" | 22 | \n",
" 2025-01-09 | \n",
" item_2 | \n",
" 70 | \n",
"
\n",
" \n",
" | 23 | \n",
" 2025-01-10 | \n",
" item_2 | \n",
" 72 | \n",
"
\n",
" \n",
" | 24 | \n",
" 2025-01-11 | \n",
" item_2 | \n",
" 75 | \n",
"
\n",
" \n",
" | 25 | \n",
" 2025-01-12 | \n",
" item_2 | \n",
" 78 | \n",
"
\n",
" \n",
" | 26 | \n",
" 2025-01-13 | \n",
" item_2 | \n",
" 80 | \n",
"
\n",
" \n",
" | 27 | \n",
" 2025-01-14 | \n",
" item_2 | \n",
" 85 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" date item_id sales\n",
"0 2025-01-01 item_1 100\n",
"1 2025-01-02 item_1 105\n",
"2 2025-01-03 item_1 110\n",
"3 2025-01-04 item_1 115\n",
"4 2025-01-05 item_1 120\n",
"5 2025-01-06 item_1 125\n",
"6 2025-01-07 item_1 130\n",
"7 2025-01-08 item_1 135\n",
"8 2025-01-09 item_1 140\n",
"9 2025-01-10 item_1 145\n",
"10 2025-01-11 item_1 150\n",
"11 2025-01-12 item_1 155\n",
"12 2025-01-13 item_1 160\n",
"13 2025-01-14 item_1 165\n",
"14 2025-01-01 item_2 50\n",
"15 2025-01-02 item_2 52\n",
"16 2025-01-03 item_2 55\n",
"17 2025-01-04 item_2 58\n",
"18 2025-01-05 item_2 60\n",
"19 2025-01-06 item_2 62\n",
"20 2025-01-07 item_2 65\n",
"21 2025-01-08 item_2 68\n",
"22 2025-01-09 item_2 70\n",
"23 2025-01-10 item_2 72\n",
"24 2025-01-11 item_2 75\n",
"25 2025-01-12 item_2 78\n",
"26 2025-01-13 item_2 80\n",
"27 2025-01-14 item_2 85"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"dates = pd.date_range(\"2025-01-01\", periods=14, freq=\"D\")\n",
"\n",
"df = pd.DataFrame({\n",
" \"date\": dates.tolist() * 2,\n",
" \"item_id\": [\"item_1\"] * 14 + [\"item_2\"] * 14,\n",
" \"sales\": [\n",
" 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165,\n",
" 50, 52, 55, 58, 60, 62, 65, 68, 70, 72, 75, 78, 80, 85,\n",
" ],\n",
"})\n",
"\n",
"df\n"
]
},
{
"cell_type": "markdown",
"id": "28cdfb02",
"metadata": {},
"source": [
"Then, use TimesFM to forecase the time series"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "419e2ebe",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" item_id | \n",
" forecast_timestamp | \n",
" forecast_value | \n",
" confidence_level | \n",
" prediction_interval_lower_bound | \n",
" prediction_interval_upper_bound | \n",
" ai_forecast_status | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" item_1 | \n",
" 2025-01-16 00:00:00+00:00 | \n",
" 174.257492 | \n",
" 0.95 | \n",
" 175.728216 | \n",
" 177.85742 | \n",
" | \n",
"
\n",
" \n",
" | 1 | \n",
" item_1 | \n",
" 2025-01-15 00:00:00+00:00 | \n",
" 167.466003 | \n",
" 0.95 | \n",
" 169.34789 | \n",
" 169.553343 | \n",
" | \n",
"
\n",
" \n",
" | 2 | \n",
" item_1 | \n",
" 2025-01-17 00:00:00+00:00 | \n",
" 180.491333 | \n",
" 0.95 | \n",
" 178.587954 | \n",
" 185.040092 | \n",
" | \n",
"
\n",
" \n",
" | 3 | \n",
" item_2 | \n",
" 2025-01-17 00:00:00+00:00 | \n",
" 91.99752 | \n",
" 0.95 | \n",
" 79.145413 | \n",
" 100.786089 | \n",
" | \n",
"
\n",
" \n",
" | 4 | \n",
" item_2 | \n",
" 2025-01-15 00:00:00+00:00 | \n",
" 87.950104 | \n",
" 0.95 | \n",
" 82.876698 | \n",
" 92.470649 | \n",
" | \n",
"
\n",
" \n",
" | 5 | \n",
" item_2 | \n",
" 2025-01-16 00:00:00+00:00 | \n",
" 90.050346 | \n",
" 0.95 | \n",
" 81.460533 | \n",
" 96.463373 | \n",
" | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" item_id forecast_timestamp forecast_value confidence_level \\\n",
"0 item_1 2025-01-16 00:00:00+00:00 174.257492 0.95 \n",
"1 item_1 2025-01-15 00:00:00+00:00 167.466003 0.95 \n",
"2 item_1 2025-01-17 00:00:00+00:00 180.491333 0.95 \n",
"3 item_2 2025-01-17 00:00:00+00:00 91.99752 0.95 \n",
"4 item_2 2025-01-15 00:00:00+00:00 87.950104 0.95 \n",
"5 item_2 2025-01-16 00:00:00+00:00 90.050346 0.95 \n",
"\n",
" prediction_interval_lower_bound prediction_interval_upper_bound \\\n",
"0 175.728216 177.85742 \n",
"1 169.34789 169.553343 \n",
"2 178.587954 185.040092 \n",
"3 79.145413 100.786089 \n",
"4 82.876698 92.470649 \n",
"5 81.460533 96.463373 \n",
"\n",
" ai_forecast_status \n",
"0 \n",
"1 \n",
"2 \n",
"3 \n",
"4 \n",
"5 "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.bigquery.ai.forecast(\n",
" data_col=\"sales\", \n",
" timestamp_col=\"date\", \n",
" id_cols=[\"item_id\"], \n",
" horizon=3\n",
")\n"
]
},
{
"cell_type": "markdown",
"id": "2ffa0534",
"metadata": {},
"source": [
"### Example: AI.GENERATE_BOOL\n",
"Evaluates a structured prompt condition using Gemini and returns a boolean series:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "eba4b82f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 True\n",
"1 False\n",
"Name: result, dtype: bool[pyarrow]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"df = pd.DataFrame({\n",
" \"animal\": [\"cougar\", \"fish\"],\n",
" \"habitat\": [\"mountain\", \"grassland\"]\n",
"})\n",
"\n",
"prompt = (df[\"animal\"], \"lives in the \", df[\"habitat\"])\n",
"\n",
"df.bigquery.ai.generate_bool(prompt, endpoint=\"gemini-2.5-flash\").struct.field(\"result\")\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "venv (3.14.2)",
"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.14.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}