{"id":3902,"date":"2026-04-29T13:43:49","date_gmt":"2026-04-29T13:43:49","guid":{"rendered":"https:\/\/ranaghazzi.com\/?p=3902"},"modified":"2026-06-11T12:48:59","modified_gmt":"2026-06-11T12:48:59","slug":"3902","status":"publish","type":"post","link":"https:\/\/ranaghazzi.com\/?p=3902","title":{"rendered":"AirFlights Bronze Layer"},"content":{"rendered":"<p><style>\n    .light-font-container, .light-font-container p, .light-font-container h2, .light-font-container li {<br \/>\n        font-weight: #FFFFFF !important;<br \/>\n    }<br \/>\n<\/style>\n<\/p>\n<div class=\"light-font-container\" style=\"background-color: #2b85d9; padding: 40px; border-radius: 15px;\">\n\n\n<div class=\"wp-block-group is-style-default has-contrast-color has-text-color has-link-color has-medium-font-size wp-elements-1 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><style>\n    .light-font-container, .light-font-container p, .light-font-container h2, .light-font-container li {<br \/>\n        font-weight: #FFFFFF !important;<br \/>\n    }<br \/>\n<\/style>\n<\/p>\n<div class=\"light-font-container\" style=\"background-color: #2b85d9; padding: 40px; border-radius: 15px;\">\n<h2 style=\"text-align: center;\">AirFlights Bronze Layer<\/h2>\n<\/div>\n\n\n\n<p class=\"has-text-align-left is-style-default has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-2 wp-block-paragraph\"><strong>Tools: Databricks | SerpAPI | Pandas | PyArrow | PySpark | Delta Lake | datetime<\/strong><\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Moving Airplane<\/title>\n  <style>\n    body {\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      min-height: 100vh;\n      margin: 0;\n      background: ;\n    }\n\n    .sky {\n      width: 100%;\n      \/\/background: rgba(180, 220, 255, 0.18);\n      \/\/border: 1px solid rgba(180, 220, 255, 0.35);\n      border-radius: 16px;\n      height: 50px;\n      overflow: hidden;\n      position: relative;\n    }\n\n    .cloud {\n      position: absolute;\n      background: rgba(255, 255, 255, 0.35);\n      border-radius: 50px;\n    }\n    .cloud::before, .cloud::after {\n      content: '';\n      position: absolute;\n      background: rgba(255, 255, 255, 0.35);\n      border-radius: 50%;\n    }\n\n    .c1 { width: 80px; height: 24px; top: 30px; animation: driftCloud 14s linear infinite; }\n    .c1::before { width: 34px; height: 34px; top: -18px; left: 10px; }\n    .c1::after  { width: 24px; height: 24px; top: -12px; left: 36px; }\n\n    .c2 { width: 60px; height: 18px; top: 90px; animation: driftCloud 20s linear infinite 5s; }\n    .c2::before { width: 26px; height: 26px; top: -14px; left: 8px; }\n    .c2::after  { width: 18px; height: 18px; top: -8px; left: 28px; }\n\n    .c3 { width: 50px; height: 16px; top: 55px; animation: driftCloud 17s linear infinite 9s; }\n    .c3::before { width: 22px; height: 22px; top: -12px; left: 6px; }\n    .c3::after  { width: 16px; height: 16px; top: -7px; left: 24px; }\n\n    @keyframes driftCloud {\n      from { left: 110%; }\n      to   { left: -20%; }\n    }\n\n    .trail {\n      position: absolute;\n      top: 50%;\n      transform: translateY(-50%);\n      height: 2px;\n      width: 70px;\n      background: linear-gradient(to left, transparent, rgba(180, 210, 255, 0.5));\n      border-radius: 2px;\n      animation: flyPlane 5s linear infinite;\n      margin-left: -70px;\n    }\n\n    .plane {\n      position: absolute;\n      top: 50%;\n      transform: translateY(-50%);\n      animation: flyPlane 5s linear infinite;\n    }\n\n    @keyframes flyPlane {\n      from { left: -100px; }\n      to   { left: 110%; }\n    }\n  <\/style>\n<\/head>\n<body>\n\n  <div class=\"sky\">\n    <div class=\"cloud c1\"><\/div>\n    <div class=\"cloud c2\"><\/div>\n    <div class=\"cloud c3\"><\/div>\n    <div class=\"trail\"><\/div>\n    <div class=\"plane\">\n      <svg width=\"72\" height=\"72\" viewBox=\"0 0 64 64\"  xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n        <path d=\"M60 28 L38 28 L26 8 L18 8 L26 28 L8 28 L4 22 L0 22 L4 32 L0 42 L4 42 L8 36 L26 36 L18 56 L26 56 L38 36 L60 36 C62.2 36 64 34.2 64 32 C64 29.8 62.2 28 60 28 Z\"\/>\n      <\/svg>\n    <\/div>\n  <\/div>\n\n<\/body>\n<\/html>\n\n\n\n<div style=\"height:34px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-3189c7ba wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-background has-large-font-size has-custom-font-size wp-element-button\" href=\"https:\/\/github.com\/Ranoush-USA\/AirFlights\/blob\/main\/Airflight-dev\/resources\/notebooks\/AirFlights_Bronze.ipynb\" style=\"background-color:#cca031de;padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)\"><strong>GitHub<\/strong><\/a><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-3 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-4\"><strong>Description:<\/strong><\/h2>\n\n\n\n<div style=\"height:12px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">This layer is responsible for extracting and storing raw flight data, no transformations or business logic applied. It consists of two identical notebooks: <\/p>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">&#8211; The first notebook extracts outbound flights between the defined origin airports  , in this Example :(DC metro \u2014 IAD, DCA, BWI) to  destination airports (Florida \u2014 5 airports)<\/p>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">&#8211; The second notebook runs the same logic  to capture return flights.<\/p>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\"> Each notebook calls SerpAPI&#8217;s Google Flights engine across all airport combinations (15 API calls per run), parses the raw response into a flat pandas DataFrame enforced by a PyArrow schema, and writes the result to a Delta table in Databricks. <\/p>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\"> The raw fetched_at timestamp on every record ensures full traceability back to the moment of ingestion.<\/p>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\"><strong>Saved as:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-large-font-size\">Airflights_Outbound \u2014 DC \u2192 FL flights<\/li>\n\n\n\n<li class=\"has-large-font-size\">Airflights_Return \u2014 FL \u2192 DC flights<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div style=\"height:52px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:39px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-5\"><strong>The configuration and setup <\/strong><\/h2>\n\n\n\n<div class=\"wp-block-group has-contrast-color has-text-color has-link-color wp-elements-6 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-7 wp-block-paragraph\">\u2014 SerpAPI is a service that scrapes Google search results (including Google Flights) and returns structured data SERPAPI_KEY is retrieved securely from Databricks Secrets rather than hardcoded<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-8 wp-block-paragraph\">Using  PyArrow to define the structure of  Delta\/Parquet table before any data is written.  Defining the schema upfront enforces type safety .<\/p>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-9\">Code Explanation<\/h3>\n\n\n\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-10 wp-block-paragraph\">Three functions that together form the <strong>extract and load<\/strong> step of your Bronze ingestion pipeline.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-11\"><strong>extract_flights(origin, destination)<\/strong><\/h4>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-12 wp-block-paragraph\">Fetches flight data for a single airport pair from SerpAPI. <\/p>\n\n\n\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-13 wp-block-paragraph\">Sends a request to SerpAPI&#8217;s Google Flights engine and gets back a dictionary of results. For each flight offer, it grabs segs[0] (first segment) and segs[-1] (last segment) .<\/p>\n<\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\"><strong>Parsing the response:<\/strong><\/h2>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-14 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\">SerpAPI returns two buckets of flights:<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-content-justification-center is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\">other_flights \u2014 remaining available options<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">best_flights \u2014 Google&#8217;s top recommended options<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div style=\"height:36px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading has-large-font-size\">write_to_delta_table(df, table_name)<\/h4>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-15 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-16 wp-block-paragraph\">Converts the pandas DataFrame to Spark and writes it as a Delta table.<\/p>\n\n\n\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-17 wp-block-paragraph\">Using mode(overwrit) replaces the table on each run \u2014 appropriate for Bronze since you&#8217;re re-fetching fresh raw data.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading has-large-font-size\">extract_all_flights(origins, destinations)<\/h4>\n\n\n\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-18 wp-block-paragraph\">Orchestrates the full extraction across all airport combinations.<\/p>\n\n\n\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-19 wp-block-paragraph\">The function accepts origins and destinations as parameters \u2014 the loop hardcodes FL_AIRPOSRTS and DC_AIRPORTS directly.<\/p>\n\n\n\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-20 wp-block-paragraph\">Collects all non-empty DataFrames, concatenates them, then writes once to Airflights_Outbound  and Airflights_Return.<\/p>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading has-large-font-size\">Execution Flow<\/h4>\n\n\n\n<div style=\"height:19px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-21\"><code>extract_all_flights(FL_AIRPORTS, DC_AIRPORTS)\n    \u2514\u2500\u2500 for each of 15 pairs (5 FL \u00d7 3 DC airports):\n            extract_flights(origin, destination)\n                \u2514\u2500\u2500 SerpAPI call \u2192 parse best + other flights \u2192 pandas df\n    \u2514\u2500\u2500 pd.concat all results\n    \u2514\u2500\u2500 write_to_delta_table \u2192 \"Airflights_Bronze_Return\"\n\n<\/code><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>AirFlights Bronze Layer Tools: Databricks | SerpAPI | Pandas | PyArrow | PySpark | Delta Lake | datetime Moving Airplane Description: This layer is responsible for extracting and storing raw flight data, no transformations or business logic applied. It consists of two identical notebooks: &#8211; The first notebook extracts outbound flights between the defined origin [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3902","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>AirFlights Bronze Layer - Rana Nasri Ghazzi<\/title>\n<meta name=\"description\" content=\"Explore Rana Ghazzi&#039;s data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI &amp; Python.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ranaghazzi.com\/?p=3902\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AirFlights Bronze Layer - Rana Nasri Ghazzi\" \/>\n<meta property=\"og:description\" content=\"Explore Rana Ghazzi&#039;s data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI &amp; Python.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ranaghazzi.com\/?p=3902\" \/>\n<meta property=\"og:site_name\" content=\"Rana Nasri Ghazzi\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-29T13:43:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-11T12:48:59+00:00\" \/>\n<meta name=\"author\" content=\"Rana Ghazzi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Rana Ghazzi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=3902#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=3902\"},\"author\":{\"name\":\"Rana Ghazzi\",\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/#\\\/schema\\\/person\\\/d8ee34f53cb0df9faaf816fb5363a4cc\"},\"headline\":\"AirFlights Bronze Layer\",\"datePublished\":\"2026-04-29T13:43:49+00:00\",\"dateModified\":\"2026-06-11T12:48:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=3902\"},\"wordCount\":369,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/#\\\/schema\\\/person\\\/d8ee34f53cb0df9faaf816fb5363a4cc\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/ranaghazzi.com\\\/?p=3902#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=3902\",\"url\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=3902\",\"name\":\"AirFlights Bronze Layer - Rana Nasri Ghazzi\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/#website\"},\"datePublished\":\"2026-04-29T13:43:49+00:00\",\"dateModified\":\"2026-06-11T12:48:59+00:00\",\"description\":\"Explore Rana Ghazzi's data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI & Python.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=3902#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ranaghazzi.com\\\/?p=3902\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/?p=3902#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ranaghazzi.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AirFlights Bronze Layer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/#website\",\"url\":\"https:\\\/\\\/ranaghazzi.com\\\/\",\"name\":\"Rana Nasri Ghazzi\",\"description\":\"Turning Data into Decisions\",\"publisher\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/#\\\/schema\\\/person\\\/d8ee34f53cb0df9faaf816fb5363a4cc\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ranaghazzi.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/#\\\/schema\\\/person\\\/d8ee34f53cb0df9faaf816fb5363a4cc\",\"name\":\"Rana Ghazzi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/logo.png\",\"url\":\"https:\\\/\\\/ranaghazzi.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/logo.png\",\"contentUrl\":\"https:\\\/\\\/ranaghazzi.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/logo.png\",\"width\":1024,\"height\":1024,\"caption\":\"Rana Ghazzi\"},\"logo\":{\"@id\":\"https:\\\/\\\/ranaghazzi.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/logo.png\"},\"url\":\"https:\\\/\\\/ranaghazzi.com\\\/?author=2\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"AirFlights Bronze Layer - Rana Nasri Ghazzi","description":"Explore Rana Ghazzi's data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI & Python.","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:\/\/ranaghazzi.com\/?p=3902","og_locale":"en_US","og_type":"article","og_title":"AirFlights Bronze Layer - Rana Nasri Ghazzi","og_description":"Explore Rana Ghazzi's data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI & Python.","og_url":"https:\/\/ranaghazzi.com\/?p=3902","og_site_name":"Rana Nasri Ghazzi","article_published_time":"2026-04-29T13:43:49+00:00","article_modified_time":"2026-06-11T12:48:59+00:00","author":"Rana Ghazzi","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Rana Ghazzi","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ranaghazzi.com\/?p=3902#article","isPartOf":{"@id":"https:\/\/ranaghazzi.com\/?p=3902"},"author":{"name":"Rana Ghazzi","@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc"},"headline":"AirFlights Bronze Layer","datePublished":"2026-04-29T13:43:49+00:00","dateModified":"2026-06-11T12:48:59+00:00","mainEntityOfPage":{"@id":"https:\/\/ranaghazzi.com\/?p=3902"},"wordCount":369,"commentCount":0,"publisher":{"@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc"},"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ranaghazzi.com\/?p=3902#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ranaghazzi.com\/?p=3902","url":"https:\/\/ranaghazzi.com\/?p=3902","name":"AirFlights Bronze Layer - Rana Nasri Ghazzi","isPartOf":{"@id":"https:\/\/ranaghazzi.com\/#website"},"datePublished":"2026-04-29T13:43:49+00:00","dateModified":"2026-06-11T12:48:59+00:00","description":"Explore Rana Ghazzi's data analytics portfolio \u2014 dashboards, visualizations, and insights built with Tableau, Power BI & Python.","breadcrumb":{"@id":"https:\/\/ranaghazzi.com\/?p=3902#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ranaghazzi.com\/?p=3902"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ranaghazzi.com\/?p=3902#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ranaghazzi.com\/"},{"@type":"ListItem","position":2,"name":"AirFlights Bronze Layer"}]},{"@type":"WebSite","@id":"https:\/\/ranaghazzi.com\/#website","url":"https:\/\/ranaghazzi.com\/","name":"Rana Nasri Ghazzi","description":"Turning Data into Decisions","publisher":{"@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ranaghazzi.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc","name":"Rana Ghazzi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png","url":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png","contentUrl":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png","width":1024,"height":1024,"caption":"Rana Ghazzi"},"logo":{"@id":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2025\/11\/logo.png"},"url":"https:\/\/ranaghazzi.com\/?author=2"}]}},"_links":{"self":[{"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts\/3902","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3902"}],"version-history":[{"count":116,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts\/3902\/revisions"}],"predecessor-version":[{"id":5466,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts\/3902\/revisions\/5466"}],"wp:attachment":[{"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}