{"id":3902,"date":"2026-04-29T13:43:49","date_gmt":"2026-04-29T13:43:49","guid":{"rendered":"https:\/\/ranaghazzi.com\/?p=3902"},"modified":"2026-05-04T13:25:03","modified_gmt":"2026-05-04T13:25:03","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-00d6f0f1b14a217f2983decb481aa06c 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-dd425814af396056bdb883c09878a91a\"><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 alignwide is-layout-flex 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-text-align-center has-custom-font-size wp-element-button\" href=\"https:\/\/github.com\/Ranoush75\/AirFlights.git\" 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-e15205401a499cf58b209603d883efad 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-f81661bf07115108f674ffc9b2fe42cc\"><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\">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\">&#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\">&#8211; The second notebook runs the same logic  to capture return flights.<\/p>\n\n\n\n<p class=\"has-large-font-size\"> 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\"> 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\"><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<figure class=\"wp-block-image alignwide size-large\"><img decoding=\"async\" width=\"683\" height=\"1024\" src=\"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1-683x1024.jpg\" alt=\"\" class=\"wp-image-3919\" srcset=\"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1-683x1024.jpg 683w, https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1-200x300.jpg 200w, https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1-768x1152.jpg 768w, https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1-1024x1536.jpg 1024w, https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1.jpg 1360w\" sizes=\"(max-width: 683px) 100vw, 683px\" \/><\/figure>\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-feb31da42c86bcc2d378d1dc006eba83\"><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-41532314a7e68028a2a88da5c95ce865 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-7d01d5f6c869f2a8582d983292d03199\">\u2014 SerpAPI is a service that scrapes Google search results (including Google Flights) and returns structured data <code>SERPAPI_KEY<\/code> 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-464c4cdfe5bce7f95c3f571068689d8e\">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-786d0c639663b030f34dcd5f0e35ea76\">Code Explanation<\/h3>\n\n\n\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-2febf36b7e56ab15a2bc7249b57f3011\">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-abcb6014109d426c5cdbc7e8a2f93f8e\"><code><strong>extract_flights(origin, destination)<\/strong><\/code><\/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-5f7dbde53460e2beda7f9211dc035e67\">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-440e4eab8dcd05ddf0f79ea29e957e13\">Sends a request to SerpAPI&#8217;s Google Flights engine and gets back a dictionary of results. For each flight offer, it grabs <code>segs[0]<\/code> (first segment) and <code>segs[-1]<\/code> (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-9f4d09a252035029acc4daafb7923d96 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p>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><code>other_flights<\/code> \u2014 remaining available options<\/p>\n\n\n\n<p><code>best_flights<\/code> \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\"><code>write_to_delta_table(df, table_name)<\/code><\/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-957d1158034e7681fe6fa009aa301b47 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-45b7354cf2697b6ec920d7f6d3a1feb3\">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-f97ed583357a2aea7207f32605658a3b\">Using <code>mode(overwrit)<\/code> 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\"><code>extract_all_flights(origins, destinations)<\/code><\/h4>\n\n\n\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-c1efd5692b196746da194bbd7981ea55\">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-9b14984625132313234fddd0b15057d1\">The function accepts origins  and destinations as parameters \u2014 the loop hardcodes<code> FL_AIRPOSRT<\/code>S and <code>DC_AIRPORTS<\/code> directly.<\/p>\n\n\n\n<p class=\"has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-4447742c49be236fe480271a0348458e\">Collects all non-empty DataFrames, concatenates them, then writes once to Airflights_Outbound  and Airflights_Return.<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-large-font-size\">Execution Flow<\/h4>\n\n\n\n<pre class=\"wp-block-code has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-3ab4c4596c2569f128e7bee9086f4c87\"><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 v27.2 - 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-05-04T13:25:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1360\" \/>\n\t<meta property=\"og:image:height\" content=\"2040\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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-05-04T13:25:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ranaghazzi.com\/?p=3902\"},\"wordCount\":338,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc\"},\"image\":{\"@id\":\"https:\/\/ranaghazzi.com\/?p=3902#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1-683x1024.jpg\",\"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\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/ranaghazzi.com\/?p=3902#primaryimage\"},\"image\":{\"@id\":\"https:\/\/ranaghazzi.com\/?p=3902#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1-683x1024.jpg\",\"datePublished\":\"2026-04-29T13:43:49+00:00\",\"dateModified\":\"2026-05-04T13:25:03+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\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ranaghazzi.com\/?p=3902#primaryimage\",\"url\":\"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1.jpg\",\"contentUrl\":\"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1.jpg\",\"width\":1360,\"height\":2040},{\"@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-05-04T13:25:03+00:00","og_image":[{"width":1360,"height":2040,"url":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1.jpg","type":"image\/jpeg"}],"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-05-04T13:25:03+00:00","mainEntityOfPage":{"@id":"https:\/\/ranaghazzi.com\/?p=3902"},"wordCount":338,"commentCount":0,"publisher":{"@id":"https:\/\/ranaghazzi.com\/#\/schema\/person\/d8ee34f53cb0df9faaf816fb5363a4cc"},"image":{"@id":"https:\/\/ranaghazzi.com\/?p=3902#primaryimage"},"thumbnailUrl":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1-683x1024.jpg","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"},"primaryImageOfPage":{"@id":"https:\/\/ranaghazzi.com\/?p=3902#primaryimage"},"image":{"@id":"https:\/\/ranaghazzi.com\/?p=3902#primaryimage"},"thumbnailUrl":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1-683x1024.jpg","datePublished":"2026-04-29T13:43:49+00:00","dateModified":"2026-05-04T13:25:03+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":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ranaghazzi.com\/?p=3902#primaryimage","url":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1.jpg","contentUrl":"https:\/\/ranaghazzi.com\/wp-content\/uploads\/2026\/04\/bronze-notebook_flow-1.jpg","width":1360,"height":2040},{"@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":107,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts\/3902\/revisions"}],"predecessor-version":[{"id":4400,"href":"https:\/\/ranaghazzi.com\/index.php?rest_route=\/wp\/v2\/posts\/3902\/revisions\/4400"}],"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}]}}