{"id":791281,"date":"2025-11-19T13:52:50","date_gmt":"2025-11-19T12:52:50","guid":{"rendered":"https:\/\/www.devoteam.com\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/"},"modified":"2025-12-08T16:31:23","modified_gmt":"2025-12-08T15:31:23","slug":"bigquery-ml-revolutionises-the-data-workflow","status":"publish","type":"expert-view","link":"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/","title":{"rendered":"From SQL to AI: How BigQuery ML Revolutionises the Data Workflow"},"content":{"rendered":"\n<p class=\"wp-block-yoast-seo-estimated-reading-time yoast-reading-time__wrapper\"><span class=\"yoast-reading-time__icon\"><svg aria-hidden=\"true\" focusable=\"false\" data-icon=\"clock\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" style=\"display:inline-block;vertical-align:-0.1em\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"><\/path><\/svg><\/span><span class=\"yoast-reading-time__spacer\" style=\"display:inline-block;width:1em\"><\/span><span class=\"yoast-reading-time__descriptive-text\">Estimated reading time: <\/span><span class=\"yoast-reading-time__reading-time\">8<\/span><span class=\"yoast-reading-time__time-unit\"> minutes<\/span><\/p>\n\n\n\n<div class=\"wp-block-group has-gray-light-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-5d9a58c0 wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--small);padding-right:var(--wp--preset--spacing--small);padding-bottom:var(--wp--preset--spacing--small);padding-left:var(--wp--preset--spacing--small)\">\n<div class=\"wp-block-yoast-seo-table-of-contents yoast-table-of-contents\"><h2>What you will learn:<\/h2><ul><li><a href=\"#h-predicting-customer-churn-the-two-ways\" data-level=\"2\">Predicting Customer Churn: The Two Ways<\/a><ul><li><a href=\"#h-path-a-bigquery-ml\" data-level=\"3\">Path A: BigQuery ML<\/a><\/li><li><a href=\"#h-path-b-python-and-the-rest-of-the-stack\" data-level=\"3\">Path B: Python and the rest of the stack<\/a><\/li><\/ul><\/li><li><a href=\"#h-the-takeaway\" data-level=\"2\">The Takeaway<\/a><ul><li><a href=\"#h-what-about-scale\" data-level=\"3\">What about Scale?<\/a><\/li><li><a href=\"#h-what-about-inference\" data-level=\"3\">What about inference?<\/a><\/li><li><a href=\"#h-overall-comparison\" data-level=\"3\">Overall comparison:<\/a><\/li><\/ul><\/li><li><a href=\"#h-bigquery-ml-vs-python-what-should-you-choose\" data-level=\"2\">BigQuery ML vs Python: What should you choose?<\/a><ul><li><a href=\"#h-when-not-to-use-bqml\" data-level=\"3\">When not to use BQML<\/a><\/li><\/ul><\/li><li><a href=\"#h-closing-remarks\" data-level=\"2\">Closing remarks<\/a><\/li><\/ul><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Building ML models shouldn&#8217;t require extracting data, configuring environments, and stitching together half a dozen tools. In reality, the traditional Python workflow is precisely reliant on these aspects: setup, distinct libraries, and nuanced model deployment. However, if one\u2019s data already resides in <a href=\"https:\/\/devoteam.info\/lu\/google-cloud\/data-solutions\/\">BigQuery<\/a>, as it does for many organisations, BigQuery ML enables model development directly within the warehouse. This raises the central question addressed in this article: <strong>How does this in-warehouse development compare to traditional approaches?\u00a0<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this article, we will compare BigQuery ML to the traditional Python workflow by building a customer churn model in both environments. We will see the pros and cons of each approach, testing how BQML streamlines preprocessing and deployment. <strong>Wondering if you should trade the granular control of Python for the speed and accessibility of SQL-based machine learning?<\/strong> Here are the answers (with some code)!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-predicting-customer-churn-the-two-ways\"><strong>Predicting Customer Churn: The Two Ways<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We&#8217;ll compare both approaches using a public telecom dataset with approximately 4,000 customers. The task: predict customer churn (whether someone cancels their service) based on usage patterns, region, and account information. Both approaches will split data into training and testing sets to evaluate model performance on unseen data.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large has-custom-border\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQueryML-vs-Traditional-Python-1-1024x576.jpg\" alt=\"\" class=\"has-border-color has-gray-light-border-color wp-image-781392\" style=\"border-width:2px\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQueryML-vs-Traditional-Python-1-1024x576.jpg 1024w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQueryML-vs-Traditional-Python-1-300x169.jpg 300w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQueryML-vs-Traditional-Python-1-768x432.jpg 768w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQueryML-vs-Traditional-Python-1-1536x864.jpg 1536w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQueryML-vs-Traditional-Python-1.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-path-a-bigquery-ml\"><br><strong>Path A: BigQuery ML<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Creating a model in BigQuery ML is deceptively simple, as it abstracts away most of the complexity and overhead, much like other managed cloud solutions. BigQuery ML automatically handles NULL values, splits data for training and evaluation, and in this case, it performs one-hot-encoding for us. Our dataset contains a &#8216;state&#8217; column with categorical values like NY or WA. BigQuery ML converts these strings into distinct features that the model can process.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With data prep handled, model creation is as simple as selecting an architecture and specifying the target variable (churn: yes or no). While not strictly necessary, excluding redundant or irrelevant variables is a sensible and standard approach; this is done through an except statement.<\/p>\n\n\n\n<pre class=\"wp-block-code has-gray-light-background-color has-background\"><code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#034cd3\" class=\"has-inline-color\">CREATE MODEL<\/mark> `project.dataset.model_name`\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#034cd3\" class=\"has-inline-color\">OPTIONS<\/mark> (\n  model_type = <mark style=\"background-color:rgba(0, 0, 0, 0);color:#399e1c\" class=\"has-inline-color\">\"LOGISTIC_REG\"<\/mark>,\n  input_label_cols = &#91;<mark style=\"background-color:rgba(0, 0, 0, 0);color:#399e1c\" class=\"has-inline-color\">\"churn\"<\/mark>] <mark style=\"background-color:rgba(0, 0, 0, 0);color:#c5106c\" class=\"has-inline-color\">--target variable<\/mark>\n) <mark style=\"background-color:rgba(0, 0, 0, 0);color:#034cd3\" class=\"has-inline-color\">AS\nSELECT<\/mark>\n  * <mark style=\"background-color:rgba(0, 0, 0, 0);color:#034cd3\" class=\"has-inline-color\">EXCEPT<\/mark> (\n      customer_id,\n      total_day_charge,\n      total_eve_charge,\n      total_night_charge,\n      total_intl_charge\n    )\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#034cd3\" class=\"has-inline-color\">FROM<\/mark> `project.dataset.table_name`<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Evaluation on the test set (unseen data) is done with the following structure.<\/p>\n\n\n\n<pre class=\"wp-block-code has-gray-light-background-color has-background\"><code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#034cd3\" class=\"has-inline-color\">SELECT\n<\/mark>  *\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#034cd3\" class=\"has-inline-color\">FROM<\/mark> ML.EVALUATE (<mark style=\"background-color:rgba(0, 0, 0, 0);color:#034cd3\" class=\"has-inline-color\">MODEL<\/mark> `project.dataset.model_name`)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This simple approach yields a model that performs quite badly. In this case, the distribution of churn isn\u2019t proportional; roughly 85% of customers don\u2019t churn, so the model defaults to predicting \u201cno churn\u201d for everyone. We can force the model to weigh these equally by adding <code>auto_class_weights = <mark style=\"background-color:rgba(0, 0, 0, 0);color:#034cd3\" class=\"has-inline-color\">True<\/mark><\/code> to the options.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This gives us a slight improvement, but logistic regression seems to hit a ceiling here. Switching to a more powerful architecture is as straightforward as changing <code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#399e1c\" class=\"has-inline-color\">\"LOGISTIC_REG\" <\/mark><\/code><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-main-color\">to<\/mark><code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#399e1c\" class=\"has-inline-color\"> \"BOOSTED_TREE_CLASSIFIER\"<\/mark><\/code>. This finally yields a model with satisfactory performance.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The key takeaway? Iterating requires minimal code changes; you&#8217;re working in SQL the entire time, while BigQuery ML does a lot behind the scenes. Train\/test splits, one-hot-encoding, and even the scaling of numerical features (a standard approach for logistic regression), all of these common practices that would require explicit implementation in traditional workflows are automatically handled. Let&#8217;s see how this compares to the traditional route.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-path-b-python-and-the-rest-of-the-stack\"><strong>Path B: Python and the rest of the stack<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The traditional approach starts with setup, if running locally it is necessary to install Python and the relevant libraries. This is abstracted away if one uses managed environments such as Google Colab or Workbench.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Next, one needs to move data from BigQuery to the development environment. This can either be done manually (exporting and then loading) or by directly querying from Python, which requires proper authentication. The following snippet uses a service account JSON key.<\/p>\n\n\n\n<pre class=\"wp-block-code has-base-color has-main-background-color has-text-color has-background has-link-color wp-elements-1\"><code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">from<\/mark> google.cloud <mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">import<\/mark> bigquery\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">import<\/mark> pandas <mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">as<\/mark> pd\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">import <\/mark>os\n\n\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#85e66a\" class=\"has-inline-color\">#set environment through JSON key and start client\n<\/mark>os.environ&#91;<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"GOOGLE_APPLICATION_CREDENTIALS\"<\/mark>]=<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"path_to_key.json\"<\/mark>\nclient = bigquery.Client(project=<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"project\"<\/mark>)\nquery = '''\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">SELECT\n  * EXCEPT (\n      customer_id,\n      total_day_charge,\n      total_eve_charge,\n      total_night_charge,\n      total_intl_charge\n    )\nFROM `project.dataset.table_name`\n'''<\/mark>\n\n\ndf = client.query(query).to_dataframe()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">We used a query that mimics our BQML EXCEPT statement to avoid loading the full table. Unlike BigQuery ML, the traditional workflow requires most actions to be explicit: handling NULL values (this dataset has none, but typically you\u2019d use pandas to drop or impute them), splitting train\/test sets, encoding categorical variables, and scaling numerical features.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All of this is managed by BigQuery ML without being instructed to do so; in Python, the entire preprocessing pipeline is explicit.<\/p>\n\n\n\n<pre class=\"wp-block-code has-base-color has-main-background-color has-text-color has-background has-link-color wp-elements-2\"><code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">from<\/mark> sklearn.model_selection <mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">import<\/mark> train_test_split\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">from<\/mark> sklearn.preprocessing <mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">import<\/mark> OneHotEncoder, StandardScaler\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">from<\/mark> sklearn.compose <mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">import<\/mark> ColumnTransformer, make_column_selector\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">from<\/mark> sklearn.linear_model <mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">import <\/mark>LogisticRegression\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">from<\/mark> sklearn.pipeline <mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">import<\/mark> Pipeline\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">from<\/mark> sklearn.metrics <mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">import<\/mark> f1_score\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">import<\/mark> numpy <mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">as<\/mark> np\n\n\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#85e66a\" class=\"has-inline-color\">#separate features and target variables and split sets\n<\/mark>y = df&#91;<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"churn\"<\/mark>]\nX = df.drop(columns=&#91;<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"churn\"]<\/mark>)\n\n\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n\n\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#85e66a\" class=\"has-inline-color\">#pre process categorical features and scale numerical variables\n<\/mark>categorical_transformer = OneHotEncoder(handle_unknown=<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"ignore\"<\/mark>)\nnumeric_transformer = StandardScaler()\n\n\npreprocessor = ColumnTransformer(\n    transformers = &#91;\n      (<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"num\"<\/mark>, numeric_transformer, make_column_selector(dtype_include=np.number)),\n      (<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"cat\"<\/mark>, categorical_transformer, make_column_selector(dtype_include=<mark style=\"background-color:rgba(0, 0, 0, 0);color:#0de2c5\" class=\"has-inline-color\">object<\/mark>)),\n      (<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"bool\"<\/mark>, <mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"passthrough\"<\/mark>, make_column_selector(dtype_include=<mark style=\"background-color:rgba(0, 0, 0, 0);color:#0de2c5\" class=\"has-inline-color\">bool<\/mark>))\n    ])\n\n\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#85e66a\" class=\"has-inline-color\">#model pipeline and evaluation\n<\/mark>model_pipeline = Pipeline(steps=&#91;\n    (<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"preprocessor\"<\/mark>, preprocessor),\n    (<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"classifier\"<\/mark>, LogisticRegression())\n])\n\n\nmodel_pipeline.fit(X_train,y_train)\ny_pred = model_pipeline.predict(X_test)\nf1 = f1_score(y_test, y_pred)\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f8eca6\" class=\"has-inline-color\">print<\/mark>(<mark style=\"background-color:rgba(0, 0, 0, 0);color:#34aadf\" class=\"has-inline-color\">f<\/mark><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"F1-Score: {f1}\"<\/mark>)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This implementation is much more verbose than BigQuery ML. It yields an F1-score around 0.2. To address class imbalance, we can add class_weight=&#8217;balanced&#8217; to the model call, which improves performance to around 0.5. The values are not exact due to the nature of the random shuffling, yet they align with our BigQuery ML results. Interestingly enough, training was nearly instantaneous in Python.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Switching to a boosted tree requires additional adjustments. Tree models don\u2019t benefit from the scaling of features we had applied, and XGBoost\u2019s class weights need to be calculated manually, unlike the previous implementation in scikit-learn.<\/p>\n\n\n\n<pre class=\"wp-block-code has-base-color has-main-background-color has-text-color has-background has-link-color wp-elements-3\"><code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">from<\/mark> xgboost <mark style=\"background-color:rgba(0, 0, 0, 0);color:#e3a4ec\" class=\"has-inline-color\">import<\/mark> XGBClassifier\n\n\nscale_pos_weight = (y_train == <mark style=\"background-color:rgba(0, 0, 0, 0);color:#34aadf\" class=\"has-inline-color\">False<\/mark>).<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f8eca6\" class=\"has-inline-color\">sum<\/mark>() \/ (y_train == <mark style=\"background-color:rgba(0, 0, 0, 0);color:#34aadf\" class=\"has-inline-color\">True<\/mark>).<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f8eca6\" class=\"has-inline-color\">sum<\/mark>()\nmodel_pipeline = Pipeline(steps=&#91;\n    (<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"preprocessor\"<\/mark>, preprocessor),\n    (<mark style=\"background-color:rgba(0, 0, 0, 0);color:#f37748\" class=\"has-inline-color\">\"classifier\"<\/mark>, XGBClassifier(scale_pos_weight=scale_pos_weight))\n])\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><\/strong>This yields an F1-score around 0.8, again with a near-instantaneous training time. While Python offers speed on small datasets, the workflow requires significantly more domain knowledge.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-the-takeaway\"><strong>The Takeaway<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Differences are stark. BigQuery ML abstracts away the complexity that would otherwise require manual work: no data movement, seamless model switching, and automated data preparation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">BigQuery ML empowers analysts with rapid prototyping. It\u2019s not designed for data scientists who need the full granularity Python allows. For teams without deep ML expertise, the tradeoff makes sense. The underlying mathematics remain consistent; a logistic regression performs the same regardless of implementation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-what-about-scale\"><strong>What about Scale?<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><\/strong>On our small dataset, Python\u2019s training speed was faster. But what happens when data grows?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We benchmarked this on a bigger dataset, just shy of 3GB, roughly 10,000 times larger than the original. The BigQuery ML workflow remained identical. Logistic regression training took a few minutes, but the process was unchanged.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">However, the Python environment crashed. The likely culprit would be the categorical encoding with more unique values, which exhausted available memory. This is fixable by allocating more RAM, optimising processing with Dask or Polars, switching to distributed Spark clusters, or even sampling the data. The point here is that each solution adds complexity, moving further away from a simple repeatable workflow.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The key insight is that <strong>BigQuery ML scales without friction<\/strong>. The same SQL query that worked on 4,000 rows also works on 50 million. No code changes, no architectural rewrites, no infrastructure decisions. BigQuery ML simply works.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-what-about-inference\"><strong>What about inference?<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Training is only half of the story. In our Python example, to actually use the model, one needs to wrap the code in an API (such as Flask or FastAPI), containerise it with Docker, and then deploy it to a callable endpoint through Google Cloud Run or Kubernetes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With BigQuery ML, this entire process is skipped. For real-time predictions, adding <code>model_registry = <mark style=\"background-color:rgba(0, 0, 0, 0);color:#85e66a\" class=\"has-inline-color\">\"vertex_ai\"<\/mark><\/code> to the SQL options automatically exports the model to Vertex AI, where it can be directly deployed as a REST endpoint. No API development, no containerisation, just a single line of code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-overall-comparison\"><strong>Overall comparison:<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bringing all the results together, the trade-offs become clear in a side-by-side comparison, as the true cost of each path is revealed when factoring in developer time, scalability, and deployment overhead.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-primary-color\">Dataset<\/mark><\/strong><\/td><td><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-primary-color\">Model<\/mark><\/strong><\/td><td><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-primary-color\">BQML F1 Score<\/mark><\/strong><\/td><td><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-primary-color\">BQML Time<\/mark><\/strong><\/td><td><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-primary-color\">Python F1 Score<\/mark><\/strong><\/td><td><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-primary-color\">Python Time<\/mark><\/strong><\/td><\/tr><tr><td>Small (4k rows)<\/td><td>Logistic Reg. with class weight<\/td><td>0.517<\/td><td>30 sec<\/td><td>~0.5<\/td><td>~Instant<\/td><\/tr><tr><td>Small (4k rows)<\/td><td>Boosted Tree with class weights<\/td><td>0.789<\/td><td>6 min 38 sec<\/td><td>~0.8<\/td><td>~Instant<\/td><\/tr><tr><td>Big (~3GB)<\/td><td>Logreg<\/td><td>0.975<\/td><td>2 min 11 sec<\/td><td>Failed<\/td><td>Failed<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Python results (~) are approximate due to the random train\/test split.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-bigquery-ml-vs-python-what-should-you-choose\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-main-color\">BigQuery ML<\/mark> vs Python: What should you choose?<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">So which path should you choose? Unfortunately, the answer is the one that nobody likes &#8211; it depends. But the table below should help you make an informed decision.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-primary-color\">BigQuery ML<\/mark><\/strong><\/td><td><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-primary-color\">Traditional Python<\/mark><\/strong><\/td><\/tr><tr><td><strong>Effortless Scalability:<\/strong> The same SQL query scales from a few to millions of rows with no changes.<\/td><td><strong>Scaling Friction:<\/strong> Requires specific implementation for large datasets (e.g., re-architecting with Spark\/Dask).<\/td><\/tr><tr><td><strong>Zero-Friction Workflow:<\/strong> Lives in the warehouse. No data movement and no setup.<\/td><td><strong>High-Overhead Workflow:<\/strong> Requires data movement and environment setup.<\/td><\/tr><tr><td><strong>Automated Preprocessing:<\/strong> Handles preprocessing steps automatically (e.g., one-hot encoding, feature scaling, NULLs).<\/td><td><strong>Explicit Preprocessing:<\/strong> You must manually code every step (e.g., StandardScaler, OneHotEncoder).<\/td><\/tr><tr><td><strong>Simple Deployment:<\/strong> A single SQL command (model_registry) deploys the model to a Vertex AI endpoint.<\/td><td><strong>Nuanced Deployment:<\/strong> Requires building an API (Flask), containerising (Docker), and deploying to infrastructure (Cloud Run).<\/td><\/tr><tr><td><strong>Less Granularity:<\/strong> Limited to BQML&#8217;s supported model architectures.<\/td><td><strong>Total Granularity:<\/strong> Unmatched flexibility for custom architectures (e.g., custom neural networks) and fine-tuning.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-when-not-to-use-bqml\"><strong>When not to use BQML<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">While BQML handles the vast majority of tabular ML use cases natively, it is bound to pre-defined model architectures. It does not support defining <span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">cu<\/span>stom neural network layers, which are often employed in specialised applications such as image processing. Since BQML does not currently provide these operations, the Python path remains relevant due to its unmatched flexibility.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-closing-remarks\"><strong>Closing remarks<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ultimately, BigQuery ML is about accessibility. It abstracts away the heavy lifting, allowing teams to focus on insights rather than setup, development and deployment.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the vast majority of business use cases, the trade-off is overwhelmingly positive: you gain a massive reduction in complexity and time-to-value, losing only the granular control that most standard predictive tasks never actually require.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Looking to optimise your BigQuery data warehouse? We prepared two articles explaining how to do it with <a href=\"https:\/\/devoteam.info\/lu\/expert-view\/optimise-your-data-warehouse-bigquery-nested-and-repeated-fields\/\">nested fields<\/a> and <a href=\"https:\/\/devoteam.info\/lu\/expert-view\/improve-bigquery-performance-normalisation-vs-denormalisation\/\">denormalisation<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<div class=\"wp-block-cover alignfull is-style-blur-image is-style-blur-image-less\" style=\"margin-top:0;margin-bottom:0;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-black-background-color has-background-dim-70 has-background-dim\"><\/span><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1047\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python.jpg\" class=\"wp-block-cover__image-background wp-post-image\" alt=\"\" data-object-fit=\"cover\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python.jpg 1920w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-300x164.jpg 300w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-1024x558.jpg 1024w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-768x419.jpg 768w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-1536x838.jpg 1536w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group alignfull has-base-color has-text-color has-global-padding is-layout-constrained wp-container-core-group-is-layout-46b67d08 wp-block-group-is-layout-constrained\" style=\"margin-top:0px;margin-bottom:0px;padding-top:var(--wp--preset--spacing--xxx-large);padding-right:var(--wp--preset--spacing--medium);padding-bottom:var(--wp--preset--spacing--xxx-large);padding-left:var(--wp--preset--spacing--medium)\">\n<div class=\"wp-block-group is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group has-global-padding is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-5f9de3d0 wp-block-group-is-layout-constrained\">\n<p class=\"has-text-align-left has-secondary-font-family has-large-font-size wp-block-paragraph\"><strong>Stop wasting the predictive power of your data!<\/strong><\/p>\n<\/div>\n\n\n\n<p class=\"has-text-align-left has-main-accent-color has-text-color wp-block-paragraph\">Ready to transform your data into a powerful, accessible competitive asset? At Devoteam, we specialise in building modern data platforms on Google Cloud. Contact us for a data strategy workshop!<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-left is-layout-flex wp-container-core-buttons-is-layout-3c38c079 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/devoteam.info\/lu\/google-cloud\/#contact\">Start your journey!<\/a><\/div>\n\n\n\n<div class=\"wp-block-button is-style-outline-white-button\"><a class=\"wp-block-button__link has-base-color has-text-color has-background wp-element-button\" href=\"https:\/\/devoteam.info\/success-story\/?topic_name=google-cloud\" style=\"background-color:#64648254\">Success Stories<\/a><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Building ML models shouldn&#8217;t require extracting data, configuring environments, and stitching together half a dozen tools. In reality, the traditional Python workflow is precisely reliant on these aspects: setup, distinct libraries, and nuanced model deployment. However, if one\u2019s data already resides in BigQuery, as it does for many organisations, BigQuery ML enables model development directly [&hellip;]<\/p>\n","protected":false},"featured_media":781483,"template":"","categories":[1632,907],"tags":[],"industry":[],"class_list":["post-791281","expert-view","type-expert-view","status-publish","has-post-thumbnail","hentry","category-data","category-google-cloud"],"acf":[],"cards":"\n\t<div class=\"single-post-card\">\n\n\t\t<figure class=\"wp-block-post-featured-image\"><a href=\"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/\" target=\"_self\" ><img width=\"1920\" height=\"1047\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python.jpg\" class=\"attachment-post-thumbnail size-post-thumbnail wp-post-image\" alt=\"From SQL to AI: How BigQuery ML Revolutionises the Data Workflow\" style=\"aspect-ratio:4\/3;width:100%;object-fit:cover;\" decoding=\"async\" loading=\"lazy\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python.jpg 1920w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-300x164.jpg 300w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-1024x558.jpg 1024w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-768x419.jpg 768w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-1536x838.jpg 1536w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><\/figure>\n\n\t\t\n\t\t<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-43282307 wp-block-group-is-layout-flex\">\n\t<p style=\"font-style:normal;font-weight:700\" class=\"has-link-color wp-elements-4 wp-block-lp-post-type has-text-color has-primary-color has-small-font-size\">Expert View<\/p>\n\n\t\t\n\t\t<h3 style=\"font-style:normal;font-weight:400\" class=\"wp-block-post-title has-base-font-size\"><a href=\"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/\" target=\"_self\" >From SQL to AI: How BigQuery ML Revolutionises the Data Workflow<\/a><\/h3><\/div>\n\t\t\n\t<\/div>\n\n","yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.4 (Yoast SEO v28.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>From SQL to AI: BigQuery ML Revolutionises the Data Workflow<\/title>\n<meta name=\"description\" content=\"Get zero-friction ML deployment. We compare the BigQuery ML vs Python workflow differences. Read our expert analysis and code now.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"From SQL to AI: How BigQuery ML Revolutionises the Data Workflow\" \/>\n<meta property=\"og:description\" content=\"Get zero-friction ML deployment. We compare the BigQuery ML vs Python workflow differences. Read our expert analysis and code now.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/\" \/>\n<meta property=\"og:site_name\" content=\"Devoteam\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-08T15:31:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1047\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/expert-view\\\/bigquery-ml-revolutionises-the-data-workflow\\\/\",\"url\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/expert-view\\\/bigquery-ml-revolutionises-the-data-workflow\\\/\",\"name\":\"From SQL to AI: BigQuery ML Revolutionises the Data Workflow\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/expert-view\\\/bigquery-ml-revolutionises-the-data-workflow\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/expert-view\\\/bigquery-ml-revolutionises-the-data-workflow\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/devoteam.info\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/BigQuery-vs-Python.jpg\",\"datePublished\":\"2025-11-19T12:52:50+00:00\",\"dateModified\":\"2025-12-08T15:31:23+00:00\",\"description\":\"Get zero-friction ML deployment. We compare the BigQuery ML vs Python workflow differences. Read our expert analysis and code now.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/expert-view\\\/bigquery-ml-revolutionises-the-data-workflow\\\/#breadcrumb\"},\"inLanguage\":\"en-LU\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/devoteam.info\\\/lu\\\/expert-view\\\/bigquery-ml-revolutionises-the-data-workflow\\\/\"]}],\"accessibilityFeature\":[\"tableOfContents\"]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-LU\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/expert-view\\\/bigquery-ml-revolutionises-the-data-workflow\\\/#primaryimage\",\"url\":\"https:\\\/\\\/devoteam.info\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/BigQuery-vs-Python.jpg\",\"contentUrl\":\"https:\\\/\\\/devoteam.info\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/BigQuery-vs-Python.jpg\",\"width\":1920,\"height\":1047},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/expert-view\\\/bigquery-ml-revolutionises-the-data-workflow\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Expert View\",\"item\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/expert-view\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"From SQL to AI: How BigQuery ML Revolutionises the Data Workflow\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/#website\",\"url\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/\",\"name\":\"Devoteam\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/devoteam.info\\\/lu\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-LU\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"From SQL to AI: BigQuery ML Revolutionises the Data Workflow","description":"Get zero-friction ML deployment. We compare the BigQuery ML vs Python workflow differences. Read our expert analysis and code now.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/","og_locale":"en_US","og_type":"article","og_title":"From SQL to AI: How BigQuery ML Revolutionises the Data Workflow","og_description":"Get zero-friction ML deployment. We compare the BigQuery ML vs Python workflow differences. Read our expert analysis and code now.","og_url":"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/","og_site_name":"Devoteam","article_modified_time":"2025-12-08T15:31:23+00:00","og_image":[{"width":1920,"height":1047,"url":"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/","url":"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/","name":"From SQL to AI: BigQuery ML Revolutionises the Data Workflow","isPartOf":{"@id":"https:\/\/devoteam.info\/lu\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/#primaryimage"},"image":{"@id":"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/#primaryimage"},"thumbnailUrl":"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python.jpg","datePublished":"2025-11-19T12:52:50+00:00","dateModified":"2025-12-08T15:31:23+00:00","description":"Get zero-friction ML deployment. We compare the BigQuery ML vs Python workflow differences. Read our expert analysis and code now.","breadcrumb":{"@id":"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/#breadcrumb"},"inLanguage":"en-LU","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/"]}],"accessibilityFeature":["tableOfContents"]},{"@type":"ImageObject","inLanguage":"en-LU","@id":"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/#primaryimage","url":"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python.jpg","contentUrl":"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python.jpg","width":1920,"height":1047},{"@type":"BreadcrumbList","@id":"https:\/\/devoteam.info\/lu\/expert-view\/bigquery-ml-revolutionises-the-data-workflow\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devoteam.info\/lu\/"},{"@type":"ListItem","position":2,"name":"Expert View","item":"https:\/\/devoteam.info\/lu\/expert-view\/"},{"@type":"ListItem","position":3,"name":"From SQL to AI: How BigQuery ML Revolutionises the Data Workflow"}]},{"@type":"WebSite","@id":"https:\/\/devoteam.info\/lu\/#website","url":"https:\/\/devoteam.info\/lu\/","name":"Devoteam","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devoteam.info\/lu\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-LU"}]}},"uagb_featured_image_src":{"full":["https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python.jpg",1920,1047,false],"thumbnail":["https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-150x150.jpg",150,150,true],"medium":["https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-300x164.jpg",300,164,true],"medium_large":["https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-768x419.jpg",768,419,true],"large":["https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-1024x558.jpg",1024,558,true],"1536x1536":["https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python-1536x838.jpg",1536,838,true],"2048x2048":["https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/BigQuery-vs-Python.jpg",1920,1047,false]},"uagb_author_info":{"display_name":"uk.emma","author_link":"https:\/\/devoteam.info\/lu\/author\/"},"uagb_comment_info":0,"uagb_excerpt":"Building ML models shouldn&#8217;t require extracting data, configuring environments, and stitching together half a dozen tools. In reality, the traditional Python workflow is precisely reliant on these aspects: setup, distinct libraries, and nuanced model deployment. However, if one\u2019s data already resides in BigQuery, as it does for many organisations, BigQuery ML enables model development directly&hellip;","_links":{"self":[{"href":"https:\/\/devoteam.info\/lu\/wp-json\/wp\/v2\/expert-view\/791281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devoteam.info\/lu\/wp-json\/wp\/v2\/expert-view"}],"about":[{"href":"https:\/\/devoteam.info\/lu\/wp-json\/wp\/v2\/types\/expert-view"}],"version-history":[{"count":0,"href":"https:\/\/devoteam.info\/lu\/wp-json\/wp\/v2\/expert-view\/791281\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devoteam.info\/lu\/wp-json\/wp\/v2\/media\/781483"}],"wp:attachment":[{"href":"https:\/\/devoteam.info\/lu\/wp-json\/wp\/v2\/media?parent=791281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devoteam.info\/lu\/wp-json\/wp\/v2\/categories?post=791281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devoteam.info\/lu\/wp-json\/wp\/v2\/tags?post=791281"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/devoteam.info\/lu\/wp-json\/wp\/v2\/industry?post=791281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}