{"id":347,"date":"2024-02-11T06:26:08","date_gmt":"2024-02-11T06:26:08","guid":{"rendered":"https:\/\/datadandies.nl\/?p=347"},"modified":"2024-03-03T13:55:03","modified_gmt":"2024-03-03T13:55:03","slug":"geautomatiseerd-data-binnenhalen-met-api-calls-middels-een-python-script-in-azure-functions","status":"publish","type":"post","link":"https:\/\/datadandies.nl\/index.php\/2024\/02\/11\/geautomatiseerd-data-binnenhalen-met-api-calls-middels-een-python-script-in-azure-functions\/","title":{"rendered":"Geautomatiseerd data binnenhalen met API calls middels een Python script in Azure Functions"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Ben je op zoek naar het bouwen van een near real-time dashboard dat naadloos integreert met Azure-services?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In de vorige post heb ik een script gedeeld om middels Power Query API calls te doen en zo automatisch data binnen te halen. In deze post zullen we een simpel Python-script doorlopen dat API calls doet en gebruikmaakt van Azure Functions en Blob-opslag. Deze data is dan vanuit Power BI te benaderen om er vervolgens een dashboard van te maken.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Kennismaking met het Script<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Het meegeleverde Python-script is ontworpen om te worden ingezet als een Azure Function. Het wordt elke minuut getriggerd en voert de volgende taken uit:<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\" start=\"1\">\n<li>Haalt nodige omgevingsvariabelen op zoals Azure Storage-accountinformatie, container naam, gebruikersnaam en wachtwoord (uiteindelijk handiger om dit op te slaan in Azure Key Vault i.p.v. in een omgevingsvariabele).<\/li>\n\n\n\n<li>Maakt een API-oproep om de huidige Tenant ID op te halen.<\/li>\n\n\n\n<li>Maakt een DataFrame aan met de Tenant ID.<\/li>\n\n\n\n<li>Converteert de DataFrame naar JSON-formaat.<\/li>\n\n\n\n<li>Maakt een verbinding met Azure Blob-opslag.<\/li>\n\n\n\n<li>Uploadt de JSON-gegevens als een blob naar Azure Blob-opslag.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Belangrijke Componenten en Concepten<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Azure Functions<\/strong>: Dit zijn serverloze compute oplossingen die worden geleverd door Azure. Ze stellen ontwikkelaars in staat om kleine stukjes code, of &#8220;functies&#8221;, uit te voeren in reactie op verschillende triggers zonder zich zorgen te hoeven maken over het beheer van de infrastructuur. Oftewel, je hoeft niet de hele tijd je laptop aan te laten staan zodat dit script gedraaid wordt. Azure zorgt ervoor dat er altijd ergens een server beschikbaar is om het script af te trappen volgens een schema dat door jou gedefinieerd is.<\/li>\n\n\n\n<li><strong>Azure Blob-opslag<\/strong>: Dit is een van de mogelijke opslag mogelijkheden van Microsoft voor de cloud. Het is ideaal voor het opslaan van grote hoeveelheden ongestructureerde gegevens, zoals tekst- of binaire gegevens.<\/li>\n\n\n\n<li><strong>Pandas<\/strong>: Pandas is een krachtige Python-bibliotheek voor gegevensmanipulatie en -analyse. In dit script wordt het gebruikt om een DataFrame te maken met de Tenant ID en vervolgens om te zetten naar JSON.<\/li>\n\n\n\n<li><strong>Requests-bibliotheek<\/strong>: Deze bibliotheek maakt eenvoudige HTTP-verzoeken in Python mogelijk. Hier wordt het gebruikt om een API-oproep te maken om de huidige Tenant ID op te halen.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Hoe Het Werkt<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Het script maakt gebruik van de tijdgestuurde functionaliteit van Azure Functions en voert de gedefinieerde functie elke minuut uit. Bij uitvoering worden de benodigde referenties opgehaald en wordt een API-call gedaan om de Tenant ID op te halen. Deze ID wordt vervolgens gebruikt om een DataFrame te maken, die wordt geconverteerd naar JSON. Ten slotte worden de JSON-gegevens ge\u00fcpload naar Azure Blob-opslag.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Conclusie<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Door Azure Functions en Blob-opslag te combineren met Python-bibliotheken zoals Pandas en Requests, kun je moeiteloos een near real-time data pijplijn voor je applicaties maken. Dit script dient als een basisstuk voor het bouwen en het onderhouden van up-to-date gegevens in je Azure-omgeving.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voel je vrij om dit script aan te passen en uit te breiden om aan je specifieke vereisten te voldoen! <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Onder de onderstaande screenshot is een kopieerbare versie van het script voor handen. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"872\" height=\"1024\" src=\"https:\/\/datadandies.nl\/wp-content\/uploads\/2024\/02\/API-call-in-Azure-Functions-met-Python-script-872x1024.png\" alt=\"\" class=\"wp-image-348\" srcset=\"https:\/\/datadandies.nl\/wp-content\/uploads\/2024\/02\/API-call-in-Azure-Functions-met-Python-script-872x1024.png 872w, https:\/\/datadandies.nl\/wp-content\/uploads\/2024\/02\/API-call-in-Azure-Functions-met-Python-script-255x300.png 255w, https:\/\/datadandies.nl\/wp-content\/uploads\/2024\/02\/API-call-in-Azure-Functions-met-Python-script-768x902.png 768w, https:\/\/datadandies.nl\/wp-content\/uploads\/2024\/02\/API-call-in-Azure-Functions-met-Python-script-1308x1536.png 1308w, https:\/\/datadandies.nl\/wp-content\/uploads\/2024\/02\/API-call-in-Azure-Functions-met-Python-script.png 1359w\" sizes=\"auto, (max-width: 872px) 100vw, 872px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import os\n\nimport logging\n\nimport azure.functions as func\n\nimport requests\n\nimport pandas as pd\n\nfrom azure.storage.blob import BlockBlobService\n\napp = func.FunctionApp()\n\n# Every minute this script is executed (cron below)\n\n@app.schedule(schedule=&quot;0 *\/1 * * * *&quot;, arg_name=&quot;myTimer&quot;, run_on_startup=True,\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 use_monitor=False)\n\ndef dashboardshakerfunction(myTimer: func.TimerRequest) -&gt; None:\n\n\u00a0 \u00a0 if myTimer.past_due:\n\n\u00a0 \u00a0 \u00a0 \u00a0 logging.info('The timer is past due!')\n\n\u00a0 \u00a0 logging.info('Python timer trigger function executed.')\n\n# Your Azure Storage account information retrieved from Azure Functions application settings\n\naccount_name = os.environ[&quot;AzureStorageAccountName&quot;]\n\naccount_key = os.environ[&quot;AzureStorageAccountKey&quot;]\n\ncontainer_name = os.environ[&quot;AzureBlobContainerName&quot;]\n\nusername = os.environ[&quot;Username&quot;]\n\npassword = os.environ[&quot;Password&quot;]\n\n# API call to get Tenant ID\n\napi_url_tenant = &quot;https:\/\/app.someurl.com\/api\/v2\/tenants\/current&quot;\n\ntenant_id_call = requests.get(api_url_tenant, auth=(username, password))\n\ntenant_id = tenant_id_call.json().get('id')\n\n# Naming the Blob\n\nblob_name = f'tenant_{tenant_id}.json'\n\n# Create a DataFrame with a single row and a single column\n\ndf_tenant = pd.DataFrame({'TenantID': [tenant_id]})\n\n# Convert DataFrame to JSON\n\njson_data = df_tenant.to_json()\n\n# Create a connection to Azure Storage\n\nblock_blob_service = BlockBlobService(account_name=account_name, account_key=account_key)\n\n# Upload JSON data to Azure Blob Storage\n\nblock_blob_service.create_blob_from_text(container_name, blob_name, json_data)\n\nprint(f&quot;JSON data uploaded to Azure Blob Storage: {blob_name}&quot;)\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Kopieer\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> os<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> logging<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> azure<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">functions <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> func<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> requests<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> pandas <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> pd<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">from<\/span><span style=\"color: #D8DEE9FF\"> azure<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">storage<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">blob <\/span><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> BlockBlobService<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">app <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> func<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">FunctionApp<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Every minute this script is executed (cron below)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">@<\/span><span style=\"color: #D08770\">app<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D08770\">schedule<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">schedule<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">0 *\/1 * * * *<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">arg_name<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">myTimer<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">run_on_startup<\/span><span style=\"color: #81A1C1\">=True<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #D8DEE9\">use_monitor<\/span><span style=\"color: #81A1C1\">=False<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">dashboardshakerfunction<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">myTimer<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> func<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">TimerRequest<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">-&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">None<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\u00a0 \u00a0 <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> myTimer<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">past_due<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\u00a0 \u00a0 \u00a0 \u00a0 logging<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">The timer is past due!<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\u00a0 \u00a0 logging<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">Python timer trigger function executed.<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Your Azure Storage account information retrieved from Azure Functions application settings<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">account_name <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> os<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">environ<\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">AzureStorageAccountName<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">account_key <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> os<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">environ<\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">AzureStorageAccountKey<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">container_name <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> os<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">environ<\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">AzureBlobContainerName<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">username <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> os<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">environ<\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Username<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">password <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> os<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">environ<\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Password<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># API call to get Tenant ID<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">api_url_tenant <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">https:\/\/app.someurl.com\/api\/v2\/tenants\/current<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">tenant_id_call <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> requests<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">api_url_tenant<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">auth<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">username<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> password<\/span><span style=\"color: #ECEFF4\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">tenant_id <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> tenant_id_call<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">json<\/span><span style=\"color: #ECEFF4\">().<\/span><span style=\"color: #88C0D0\">get<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">id<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Naming the Blob<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">blob_name <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">f<\/span><span style=\"color: #A3BE8C\">&#39;tenant_<\/span><span style=\"color: #EBCB8B\">{<\/span><span style=\"color: #D8DEE9FF\">tenant_id<\/span><span style=\"color: #EBCB8B\">}<\/span><span style=\"color: #A3BE8C\">.json&#39;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Create a DataFrame with a single row and a single column<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">df_tenant <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> pd<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">DataFrame<\/span><span style=\"color: #ECEFF4\">({<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">TenantID<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">[<\/span><span style=\"color: #D8DEE9FF\">tenant_id<\/span><span style=\"color: #ECEFF4\">]})<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Convert DataFrame to JSON<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">json_data <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> df_tenant<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">to_json<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Create a connection to Azure Storage<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">block_blob_service <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">BlockBlobService<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">account_name<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\">account_name<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">account_key<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\">account_key<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Upload JSON data to Azure Blob Storage<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">block_blob_service<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">create_blob_from_text<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">container_name<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> blob_name<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> json_data<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">f<\/span><span style=\"color: #A3BE8C\">&quot;JSON data uploaded to Azure Blob Storage: <\/span><span style=\"color: #EBCB8B\">{<\/span><span style=\"color: #D8DEE9FF\">blob_name<\/span><span style=\"color: #EBCB8B\">}<\/span><span style=\"color: #A3BE8C\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span><\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ben je op zoek naar het bouwen van een near real-time dashboard dat naadloos integreert met Azure-services? In de vorige post heb ik een script gedeeld om middels Power Query API calls te doen en zo automatisch data binnen te halen. In deze post zullen we een simpel Python-script doorlopen dat API calls doet en&hellip;<\/p>\n<p class=\"more-link\"><a href=\"https:\/\/datadandies.nl\/index.php\/2024\/02\/11\/geautomatiseerd-data-binnenhalen-met-api-calls-middels-een-python-script-in-azure-functions\/\" class=\"themebutton\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":348,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[29,34,33],"class_list":["post-347","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-api","tag-azure","tag-azurefunctions"],"_links":{"self":[{"href":"https:\/\/datadandies.nl\/index.php\/wp-json\/wp\/v2\/posts\/347","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/datadandies.nl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/datadandies.nl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/datadandies.nl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/datadandies.nl\/index.php\/wp-json\/wp\/v2\/comments?post=347"}],"version-history":[{"count":2,"href":"https:\/\/datadandies.nl\/index.php\/wp-json\/wp\/v2\/posts\/347\/revisions"}],"predecessor-version":[{"id":365,"href":"https:\/\/datadandies.nl\/index.php\/wp-json\/wp\/v2\/posts\/347\/revisions\/365"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/datadandies.nl\/index.php\/wp-json\/wp\/v2\/media\/348"}],"wp:attachment":[{"href":"https:\/\/datadandies.nl\/index.php\/wp-json\/wp\/v2\/media?parent=347"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/datadandies.nl\/index.php\/wp-json\/wp\/v2\/categories?post=347"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/datadandies.nl\/index.php\/wp-json\/wp\/v2\/tags?post=347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}