{"id":41,"date":"2024-05-21T23:26:13","date_gmt":"2024-05-21T23:26:13","guid":{"rendered":"https:\/\/wordpress.joeltan.me\/?p=41"},"modified":"2026-01-10T00:09:56","modified_gmt":"2026-01-10T00:09:56","slug":"using-ai-for-data-analysis-a-deep-dive-into-googles-gemini-1-5-pro","status":"publish","type":"post","link":"https:\/\/joeltan.me\/?p=41","title":{"rendered":"Using AI for Data Analysis: A Deep Dive into Google&#8217;s Gemini 1.5 Pro"},"content":{"rendered":"\n<p>Google recently announced the world&#8217;s <a href=\"https:\/\/blog.google\/products\/gemini\/google-gemini-update-may-2024\/#context-window\">longest context window in AI<\/a>. A context window this long is useful, because we now can make sense of a large documents. Can AI then perform data analysis on a large dataset and derive data insights, like human does? In this blog, we will take a look at Google&#8217;s latest Gemini Model 1.5 Pro and see how well it performs data analysis.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Say Goodbye to Duplicate Data Headaches<\/h2>\n\n\n\n<p>Let&#8217;s start with a very common scenario &#8211; duplicate data! It clogs up databases, skews analysis, and makes it difficult to get a clear picture of your customers.<br>Wouldn&#8217;t it be good if we can tell AI to tackle this age-old problem?<br>Ok, here we go. In Gemini AI Studio, let&#8217;s start with a system instruction to give our AI cousin a persona, like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>You're an assistant designed to identify potential duplicates in large dataset.\nUsers will paste a csv text consisting of multiple customer records and you'll respond with potential duplicate groupings. \nExplain how you arrive at the groupings.<\/code><\/pre>\n\n\n\n<p>Temperature: <strong>0.8<\/strong> (A value less than 1 is preferred, as we don&#8217;t want to AI to be too creative in data analysis task!)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Specify the output we want to see<\/h2>\n\n\n\n<p>Our AI cousin is like us, they want to know what is the report format we want to see. We could either specify them in writing, or provide them with<br>some sample outputs (in AI, this is called few shots learning), which honestly is the simpler thing to do:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">User prompt<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>CUST_ID First Name Middle Name Last Name DOB TFN House No Street City State Country Credit Card Number\n599 Charles Jessica Wade 12\/09\/2004 903166839 64483 George Dale Lake Thomasview Queensland Australia 4718492351287510\n599 Charles Jessica Wade 12\/09\/2004 903166832 4627 Casey Club Port Marcusfort New South Wales Australia 4718492351287510\n599 Charles Jessica Wade 12\/09\/2004 903166839 64483 George Dale Lake Thomasview Queensland Australia 4718492351287510\n1 Amy Bryan Fitzgerald 26\/09\/1973 567042755 53315 Dylan Streets Lake Tinamouth Western Australia Australia 6538822699865230\n2 Erika Jesse Gibbs 2\/09\/1974 771803753 931 Sullivan Camp Jessemouth New South Wales Australia 5575683130284680\n3 Steven Ashley Green 23\/11\/1984 236952690 7620 Shepherd Tunnel Jasonfort Tasmania Australia 6011406732918180\n4 Amanda Tiffany Nelson 19\/10\/1952 547399051 705 Terri Cape Alvaradoport Victoria Australia 2575718427801270\n5 Wendy Carl Hall 7\/07\/1952 889917142 572 Ryan Bridge East Lisaport Tasmania Australia 213130649985643\n6 Patricia Linda Thompson 27\/06\/1976 380810740 8768 Christopher Groves New Jamesview Queensland Australia 3569631294279980\n7 Linda William Fletcher 11\/08\/1991 176447589 854 Tracy Coves Masonport Victoria Australia 4752175679472640\n8 Kelsey Jill Baker 19\/09\/2004 646188273 24799 Jones Alley Gibsonville Queensland Australia 4919192731457300\n9 Matthew Amanda Pennington 9\/12\/1970 463387631 725 Black Cliff New Melissa South Australia Australia 676191496600\n10 James Gina Thompson 20\/08\/1971 697372205 5784 Sanders Harbors Port Jaclyn Victoria Australia 3522324210776590\n11 Albert Emily Lopez 3\/02\/1993 290025911 308 Tiffany Fields South Suefurt Victoria Australia 566677122822\n12 Gina Christina White 18\/07\/1972 772607628 124 Farmer Ways Rubenchester New South Wales Australia 346309889995633\n13 Rebecca Timothy Chapman 1\/07\/1974 584767009 57 David Prairie Kathleenhaven Victoria Australia 38230725252018<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Model response<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>GrpID CUST_ID First Name Middle Name Last Name DOB TFN House No Street City State Country Credit Card Number\n1 599 Charles Jessica Wade 12\/09\/2004 903166839 64483 George Dale Lake Thomasview Queensland Australia 4718492351287510\n1 599 Charles Jessica Wade 12\/09\/2004 903166832 4627 Casey Club Port Marcusfort New South Wales Australia 4718492351287510\n1 599 Charles Jessica Wade 12\/09\/2004 903166839 64483 George Dale Lake Thomasview Queensland Australia 4718492351287510<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Let the magic happens<\/h2>\n\n\n\n<p>For this test, I have a python script to generate fake customer data and also performs some error functions to micmic real-life data entry errors.<br>These data entry errors are appended with the parent record id, to check our AI&#8217;s results.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pandas as pd\nfrom faker import Faker\nimport random\nfrom datetime import date, timedelta\n\nfake = Faker()\n\n# --- Functions for data generation ---\ndef random_dob(start_year=1950, end_year=2005):\n    year = random.randint(start_year, end_year)\n    month = random.randint(1, 12)\n    day = random.randint(1, 28)\n    return pd.to_datetime(f\"{year}-{month:02}-{day:02}\")\n\ndef generate_address(state_probs):\n    state = random.choices(list(state_probs.keys()), weights=list(state_probs.values()))&#91;0]\n    return {\n        'House No': fake.building_number(),\n        'Street': fake.street_name(),\n        'City': fake.city(),\n        'State': state,\n        'Country': 'Australia'\n    }\n\ndef generate_credit_card():\n    return fake.credit_card_number(card_type=None)\n\ndef generate_tfn():\n    return fake.random_number(digits=9, fix_len=True)\n\ndef introduce_tfn_error(tfn):\n        tfn = str(tfn) # Convert to string \n        position = random.randint(0, 8)\n        new_digit = str(random.randint(0, 9))\n        return int(tfn&#91;:position] + new_digit + tfn&#91;position + 1:]) # Convert back to int\n\n# --- Simulation settings ---\nstart_year = 2013\nend_year = 2023\ninitial_num_customers = 500\nstate_probabilities = {\n    'Victoria': 0.3,\n    'New South Wales': 0.25,\n    'Queensland': 0.2,\n    'South Australia': 0.1,\n    'Western Australia': 0.1,\n    'Tasmania': 0.05\n}\n\n# --- Data storage ---\ncustomers = &#91;]\nnext_cust_id = 1\n\n# --- Generate initial customer data ---\nfor _ in range(initial_num_customers):\n    customer = {\n        'CUST_ID': next_cust_id,\n        'First Name': fake.first_name(),\n        'Middle Name': fake.first_name(),\n        'Last Name': fake.last_name(),\n        'DOB': random_dob(),\n        'TFN': generate_tfn(),  # Introduce potential TFN error\n        **generate_address(state_probabilities),\n        'Credit Card Number': generate_credit_card(),\n        'PARENT_CUST_ID': 0\n    }\n    customers.append(customer)\n    next_cust_id += 1\n\n# --- Simulate changes over time ---\nfor year in range(start_year + 1, end_year + 1):\n    for i in range(len(customers)):\n\n        # 2% chance of moving\n        if random.random() &lt; 0.02:\n            new_customer = customers&#91;i].copy()\n            OLD_ID = new_customer&#91;'CUST_ID']\n            new_customer.update(generate_address(state_probabilities))\n            new_customer&#91;'CUST_ID'] = next_cust_id\n            new_customer&#91;'PARENT_CUST_ID'] = OLD_ID\n            customers.append(new_customer)\n            next_cust_id += 1\n\n        # 1% chance of marriage (and last name change)\n        if random.random() &lt; 0.01:\n            new_customer = customers&#91;i].copy()\n            OLD_ID = new_customer&#91;'CUST_ID']\n            new_customer&#91;'Last Name'] = fake.last_name()\n            new_customer&#91;'CUST_ID'] = next_cust_id\n            new_customer&#91;'PARENT_CUST_ID'] = OLD_ID\n            customers.append(new_customer)\n            next_cust_id += 1\n\n        # 2% chance of TFN errors\n        if random.random() &lt; 0.02: \n            new_customer = customers&#91;i].copy()\n            OLD_ID = new_customer&#91;'CUST_ID']\n            new_tfn = introduce_tfn_error(new_customer&#91;'TFN'])\n            new_customer&#91;'TFN'] = new_tfn\n            new_customer&#91;'CUST_ID'] = next_cust_id\n            new_customer&#91;'PARENT_CUST_ID'] = OLD_ID\n            customers.append(new_customer)\n            next_cust_id += 1\n\n# --- Create DataFrame ---\ndf = pd.DataFrame(customers)\nprint(df.head())\ndf.to_csv('crm_data_with_tfn_errors.csv', index=False)<\/code><\/pre>\n\n\n\n<p>Below is the screenshots taken from AI Studio &#8211; all outputs are generated by the AI:<br><img decoding=\"async\" src=\"http:\/\/joeltan.me\/content\/images\/2025\/03\/ai_studio_output.png\" alt=\"ai_studio_output.png\"><\/p>\n\n\n\n<p>Pretty impressive stuff, if you asked me.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p>AI did not even break a sweat while churning out the analysis above. However, when I subjected it to further complex duplicate matching logic (example 2 way match, with blank TFN or DOB), it was unable to provide the correct analysis. So, not to worry my friend, AI is not taking over our job anytime soon.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Useful links<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/ai.google.dev\/gemini-api\/docs\/ai-studio-quickstart\">Google AI Studio Quick Start<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/blog.google\/technology\/developers\/gemini-gemma-developer-updates-may-2024\/\">Google Gemini 1.5 Pro announcement<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Google recently announced the world&#8217;s longest context window in AI. A context window this long is useful, because we now&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":52,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[4],"tags":[],"class_list":["post-41","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering-ai-beyond-the-prompt"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Using AI for Data Analysis: A Deep Dive into Google&#039;s Gemini 1.5 Pro - Joel Tan Tech Blogs<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/joeltan.me\/?p=41\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using AI for Data Analysis: A Deep Dive into Google&#039;s Gemini 1.5 Pro - Joel Tan Tech Blogs\" \/>\n<meta property=\"og:description\" content=\"Google recently announced the world&#8217;s longest context window in AI. A context window this long is useful, because we now&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/joeltan.me\/?p=41\" \/>\n<meta property=\"og:site_name\" content=\"Joel Tan Tech Blogs\" \/>\n<meta property=\"article:published_time\" content=\"2024-05-21T23:26:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-10T00:09:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/joeltan.me\/wp-content\/uploads\/2024\/05\/ai-cover.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1140\" \/>\n\t<meta property=\"og:image:height\" content=\"641\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Joel Tan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Tan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/joeltan.me\/?p=41#article\",\"isPartOf\":{\"@id\":\"https:\/\/joeltan.me\/?p=41\"},\"author\":{\"name\":\"Joel Tan\",\"@id\":\"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743\"},\"headline\":\"Using AI for Data Analysis: A Deep Dive into Google&#8217;s Gemini 1.5 Pro\",\"datePublished\":\"2024-05-21T23:26:13+00:00\",\"dateModified\":\"2026-01-10T00:09:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/joeltan.me\/?p=41\"},\"wordCount\":372,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/joeltan.me\/?p=41#primaryimage\"},\"thumbnailUrl\":\"https:\/\/joeltan.me\/wp-content\/uploads\/2024\/05\/ai-cover.jpg\",\"articleSection\":[\"Engineering AI: Beyond the Prompt\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/joeltan.me\/?p=41#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/joeltan.me\/?p=41\",\"url\":\"https:\/\/joeltan.me\/?p=41\",\"name\":\"Using AI for Data Analysis: A Deep Dive into Google's Gemini 1.5 Pro - Joel Tan Tech Blogs\",\"isPartOf\":{\"@id\":\"https:\/\/joeltan.me\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/joeltan.me\/?p=41#primaryimage\"},\"image\":{\"@id\":\"https:\/\/joeltan.me\/?p=41#primaryimage\"},\"thumbnailUrl\":\"https:\/\/joeltan.me\/wp-content\/uploads\/2024\/05\/ai-cover.jpg\",\"datePublished\":\"2024-05-21T23:26:13+00:00\",\"dateModified\":\"2026-01-10T00:09:56+00:00\",\"author\":{\"@id\":\"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743\"},\"breadcrumb\":{\"@id\":\"https:\/\/joeltan.me\/?p=41#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/joeltan.me\/?p=41\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/joeltan.me\/?p=41#primaryimage\",\"url\":\"https:\/\/joeltan.me\/wp-content\/uploads\/2024\/05\/ai-cover.jpg\",\"contentUrl\":\"https:\/\/joeltan.me\/wp-content\/uploads\/2024\/05\/ai-cover.jpg\",\"width\":1140,\"height\":641},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/joeltan.me\/?p=41#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/joeltan.me\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using AI for Data Analysis: A Deep Dive into Google&#8217;s Gemini 1.5 Pro\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/joeltan.me\/#website\",\"url\":\"https:\/\/joeltan.me\/\",\"name\":\"Joel Tan Tech Blogs\",\"description\":\"Building systems that survive real life\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/joeltan.me\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743\",\"name\":\"Joel Tan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/joeltan.me\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d9b5d1ab218cb2478280027d371ea60543f6551132d31a8cbd45a5a5b3fbadc9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d9b5d1ab218cb2478280027d371ea60543f6551132d31a8cbd45a5a5b3fbadc9?s=96&d=mm&r=g\",\"caption\":\"Joel Tan\"},\"sameAs\":[\"http:\/\/192.168.1.146\"],\"url\":\"https:\/\/joeltan.me\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Using AI for Data Analysis: A Deep Dive into Google's Gemini 1.5 Pro - Joel Tan Tech Blogs","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:\/\/joeltan.me\/?p=41","og_locale":"en_US","og_type":"article","og_title":"Using AI for Data Analysis: A Deep Dive into Google's Gemini 1.5 Pro - Joel Tan Tech Blogs","og_description":"Google recently announced the world&#8217;s longest context window in AI. A context window this long is useful, because we now&#46;&#46;&#46;","og_url":"https:\/\/joeltan.me\/?p=41","og_site_name":"Joel Tan Tech Blogs","article_published_time":"2024-05-21T23:26:13+00:00","article_modified_time":"2026-01-10T00:09:56+00:00","og_image":[{"width":1140,"height":641,"url":"https:\/\/joeltan.me\/wp-content\/uploads\/2024\/05\/ai-cover.jpg","type":"image\/jpeg"}],"author":"Joel Tan","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Joel Tan","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/joeltan.me\/?p=41#article","isPartOf":{"@id":"https:\/\/joeltan.me\/?p=41"},"author":{"name":"Joel Tan","@id":"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743"},"headline":"Using AI for Data Analysis: A Deep Dive into Google&#8217;s Gemini 1.5 Pro","datePublished":"2024-05-21T23:26:13+00:00","dateModified":"2026-01-10T00:09:56+00:00","mainEntityOfPage":{"@id":"https:\/\/joeltan.me\/?p=41"},"wordCount":372,"commentCount":0,"image":{"@id":"https:\/\/joeltan.me\/?p=41#primaryimage"},"thumbnailUrl":"https:\/\/joeltan.me\/wp-content\/uploads\/2024\/05\/ai-cover.jpg","articleSection":["Engineering AI: Beyond the Prompt"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/joeltan.me\/?p=41#respond"]}]},{"@type":"WebPage","@id":"https:\/\/joeltan.me\/?p=41","url":"https:\/\/joeltan.me\/?p=41","name":"Using AI for Data Analysis: A Deep Dive into Google's Gemini 1.5 Pro - Joel Tan Tech Blogs","isPartOf":{"@id":"https:\/\/joeltan.me\/#website"},"primaryImageOfPage":{"@id":"https:\/\/joeltan.me\/?p=41#primaryimage"},"image":{"@id":"https:\/\/joeltan.me\/?p=41#primaryimage"},"thumbnailUrl":"https:\/\/joeltan.me\/wp-content\/uploads\/2024\/05\/ai-cover.jpg","datePublished":"2024-05-21T23:26:13+00:00","dateModified":"2026-01-10T00:09:56+00:00","author":{"@id":"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743"},"breadcrumb":{"@id":"https:\/\/joeltan.me\/?p=41#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/joeltan.me\/?p=41"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/joeltan.me\/?p=41#primaryimage","url":"https:\/\/joeltan.me\/wp-content\/uploads\/2024\/05\/ai-cover.jpg","contentUrl":"https:\/\/joeltan.me\/wp-content\/uploads\/2024\/05\/ai-cover.jpg","width":1140,"height":641},{"@type":"BreadcrumbList","@id":"https:\/\/joeltan.me\/?p=41#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/joeltan.me\/"},{"@type":"ListItem","position":2,"name":"Using AI for Data Analysis: A Deep Dive into Google&#8217;s Gemini 1.5 Pro"}]},{"@type":"WebSite","@id":"https:\/\/joeltan.me\/#website","url":"https:\/\/joeltan.me\/","name":"Joel Tan Tech Blogs","description":"Building systems that survive real life","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/joeltan.me\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743","name":"Joel Tan","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/joeltan.me\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d9b5d1ab218cb2478280027d371ea60543f6551132d31a8cbd45a5a5b3fbadc9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d9b5d1ab218cb2478280027d371ea60543f6551132d31a8cbd45a5a5b3fbadc9?s=96&d=mm&r=g","caption":"Joel Tan"},"sameAs":["http:\/\/192.168.1.146"],"url":"https:\/\/joeltan.me\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/posts\/41","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=41"}],"version-history":[{"count":1,"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/posts\/41\/revisions"}],"predecessor-version":[{"id":43,"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/posts\/41\/revisions\/43"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/media\/52"}],"wp:attachment":[{"href":"https:\/\/joeltan.me\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=41"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=41"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=41"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}