{"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-1b04f1adcc98a83378eea4d99bddecfb 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-1ff2d5625303808cf5587e851a82c343 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-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 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-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-b6ec3e2ce3153f8c2ded24948e19756d 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-ab671e5d6e1243715589291644c1ba1d 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-464c4cdfe5bce7f95c3f571068689d8e 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-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 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-8df5d090dbcc56d13de8e21456bec1c7\"><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-5f7dbde53460e2beda7f9211dc035e67 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-e29bb5b94294f4cea34bf4013e514695 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-df15d0b356b3719a93234294f6024bfc 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-78488507c35102d5292612bff4cd6393 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 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-4a256b5c7fe9cde9b86746d32c1a3ce7 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-c1efd5692b196746da194bbd7981ea55 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-29c9bb2f0f5b7c2b8fee27a24cbd9c8d 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-4447742c49be236fe480271a0348458e 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-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-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}]}}