<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: nicodemus </title>
    <description>The latest articles on DEV Community by nicodemus  (@nicodemus_koech_de2504f3e).</description>
    <link>https://dev.to/nicodemus_koech_de2504f3e</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3146223%2Fcbde1f4f-3e14-4e0e-be97-15274c95b626.png</url>
      <title>DEV Community: nicodemus </title>
      <link>https://dev.to/nicodemus_koech_de2504f3e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nicodemus_koech_de2504f3e"/>
    <language>en</language>
    <item>
      <title>Prometheus &amp; Grafana: Complete Setup Guide</title>
      <dc:creator>nicodemus </dc:creator>
      <pubDate>Tue, 23 Jun 2026 16:30:00 +0000</pubDate>
      <link>https://dev.to/nicodemus_koech_de2504f3e/prometheus-grafana-complete-setup-guide-22g</link>
      <guid>https://dev.to/nicodemus_koech_de2504f3e/prometheus-grafana-complete-setup-guide-22g</guid>
      <description>&lt;h2&gt;
  
  
  Monitoring Your App with Prometheus &amp;amp; Grafana
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A simple, beginner-friendly walkthrough — from zero to a live dashboard.&lt;/strong&gt;&lt;br&gt;
What You're Building&lt;br&gt;
Prometheus and Grafana work together to monitor your app:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prometheus&lt;/strong&gt; is the collector. It checks your app every few seconds and saves what it finds (requests, memory, errors).&lt;br&gt;
&lt;strong&gt;Grafana&lt;/strong&gt; is the visualizer. It turns Prometheus's raw numbers into graphs you can actually read.&lt;/p&gt;

&lt;p&gt;Think of a fitness tracker: Prometheus is the device collecting your heart rate and steps. Grafana is the app that turns that into a nice chart.&lt;br&gt;
By the end of this guide you'll have: your app exposing live stats, Prometheus collecting them, and a Grafana dashboard showing them as graphs.&lt;br&gt;
&lt;strong&gt;Part 1 — Create the /metrics Endpoint in Your App&lt;/strong&gt;&lt;br&gt;
Prometheus can only collect data your app actually exposes. If you don't have a &lt;code&gt;/metrics&lt;/code&gt;route yet, here's how to add one using prometheus-client, the official Python library.&lt;br&gt;
Install it:&lt;br&gt;
&lt;code&gt;pip install prometheus-client&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you're using FastAPI&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pythonfrom&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;prometheus_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Histogram&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;generate_latest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CONTENT_TYPE_LATEST&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;starlette.responses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Response&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Define your metrics
&lt;/span&gt;&lt;span class="n"&gt;REQUEST_COUNT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_requests_total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total API requests&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endpoint&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;REQUEST_LATENCY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Histogram&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_request_duration_seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Request latency in seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endpoint&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;track_requests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call_next&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;start_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;call_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start_time&lt;/span&gt;

    &lt;span class="n"&gt;REQUEST_COUNT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;REQUEST_LATENCY&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/metrics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;generate_latest&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;media_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CONTENT_TYPE_LATEST&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello World&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Run your app&lt;/strong&gt;&lt;br&gt;
FastAPI:&lt;br&gt;
&lt;code&gt;uvicorn main:app --host 0.0.0.0 --port 8000&lt;/code&gt;&lt;br&gt;
Confirm it works&lt;br&gt;
&lt;code&gt;curl http://localhost:8000/metrics&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2 — Expose Metrics From Your App&lt;/strong&gt;&lt;br&gt;
Before Prometheus can collect anything, your app needs a /metrics page. This is just a plain-text page listing your app's current stats.&lt;br&gt;
Test if yours already has one:&lt;br&gt;
curl &lt;a href="http://localhost:8000/metrics" rel="noopener noreferrer"&gt;http://localhost:8000/metrics&lt;/a&gt;&lt;br&gt;
You should see something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fifieysf97zxbu3pcbhy1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fifieysf97zxbu3pcbhy1.png" alt=" " width="800" height="242"&gt;&lt;/a&gt;&lt;br&gt;
 Got numbers back? Your app is ready. Move to Part 2.&lt;/p&gt;

&lt;p&gt;Got "Connection refused"? Your app isn't running — start it first.&lt;/p&gt;

&lt;p&gt;Got "404 Not Found"? Your app has no /metrics route yet — ask your developer to add one (most languages have a free metrics library for this).&lt;br&gt;
[SCREENSHOT: Terminal output of curl &lt;a href="http://localhost:8000/metrics" rel="noopener noreferrer"&gt;http://localhost:8000/metrics&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs03pybmt9afh8fk57blk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs03pybmt9afh8fk57blk.png" alt=" " width="798" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 3 — Install Prometheus &amp;amp; Grafana&lt;/strong&gt;&lt;br&gt;
The easiest way to run both is with Docker. Create a file called &lt;code&gt;_docker-compose.yml_&lt;/code&gt; in a new folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;yamlversion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;prometheus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prom/prometheus:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prometheus&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9090:9090"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./prometheus.yml:/etc/prometheus/prometheus.yml&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;monitoring&lt;/span&gt;

  &lt;span class="na"&gt;grafana&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;grafana/grafana:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;grafana&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;GF_SECURITY_ADMIN_PASSWORD=admin&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;monitoring&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;monitoring&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start everything with one command:&lt;br&gt;
&lt;code&gt;docker-compose up -d&lt;/code&gt;&lt;br&gt;
Check both containers are running:&lt;br&gt;
&lt;code&gt;docker ps&lt;/code&gt;&lt;br&gt;
You should see prometheus and grafana listed as Up.&lt;br&gt;
[SCREENSHOT: Terminal output of docker ps showing both containers running]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F24r37bguetatx41stpxc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F24r37bguetatx41stpxc.png" alt=" " width="798" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 4 — Configure Prometheus&lt;/strong&gt;&lt;br&gt;
Prometheus needs a config file telling it where your app lives. &lt;em&gt;Create &lt;strong&gt;prometheus.yml&lt;/strong&gt; in the same folder:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;yamlglobal&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt;

&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;my-app'&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;host.docker.internal:8000'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;metrics_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/metrics'&lt;/span&gt;
    &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
&lt;span class="s"&gt;What this means, line by line&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;scrape_interval&lt;/strong&gt;: 15s — how often Prometheus checks all apps by default&lt;br&gt;
&lt;strong&gt;job_name&lt;/strong&gt; — a label you choose for your app&lt;br&gt;
&lt;strong&gt;targets&lt;/strong&gt; — the address and port where your app runs&lt;br&gt;
&lt;strong&gt;metrics_path&lt;/strong&gt; — the page Prometheus reads from (almost always /metrics)&lt;/p&gt;

&lt;p&gt;Replace &lt;code&gt;host.docker.internal:8000&lt;/code&gt; with your actual &lt;code&gt;app's address and port&lt;/code&gt;. Restart Prometheus so it picks up the change:&lt;br&gt;
&lt;code&gt;docker restart prometheus&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 5 — Verify Prometheus Is Collecting Data&lt;/strong&gt;&lt;br&gt;
Open Prometheus in your browser:&lt;br&gt;
&lt;a href="http://localhost:9090" rel="noopener noreferrer"&gt;http://localhost:9090&lt;/a&gt;&lt;br&gt;
[SCREENSHOT: Browser showing the Prometheus home page at localhost:9090]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi32emq6xejqsv8zchumy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi32emq6xejqsv8zchumy.png" alt=" " width="800" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check your app shows as UP&lt;br&gt;
Click Status → Targets. Your job name should show state UP.&lt;br&gt;
[SCREENSHOT: Prometheus Targets page showing your app's status as UP]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftvkurz8qlvar76unpxps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftvkurz8qlvar76unpxps.png" alt=" " width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it shows DOWN: double-check the address in &lt;code&gt;prometheus.yml&lt;/code&gt;matches where your app actually runs.&lt;br&gt;
Run a test query&lt;br&gt;
Click Graph, type a metric name, and click Execute:&lt;br&gt;
api_requests_total&lt;br&gt;
A line should appear on the graph. That confirms data is flowing.&lt;br&gt;
[SCREENSHOT: Prometheus Graph tab showing a line for api_requests_total]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjqrswfiqmqgz0jp5617r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjqrswfiqmqgz0jp5617r.png" alt=" " width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 6 — Connect Grafana to Prometheus&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Grafana in your browser:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;br&gt;
Log in with &lt;code&gt;username: admin&lt;/code&gt;and &lt;code&gt;password: admin&lt;/code&gt; (or whatever you set in docker-compose.yml).&lt;br&gt;
[SCREENSHOT: Grafana login page]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu8vge411ohle5wy6frqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu8vge411ohle5wy6frqo.png" alt=" " width="799" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now link it to Prometheus:&lt;/p&gt;

&lt;p&gt;Go to Connections (or the gear icon) → Data Sources&lt;br&gt;
Click Add data source → select Prometheus&lt;br&gt;
Set the URL to &lt;a href="http://prometheus:9090" rel="noopener noreferrer"&gt;http://prometheus:9090&lt;/a&gt;&lt;br&gt;
Click Save &amp;amp; Test — you should see "Data source is working"&lt;/p&gt;

&lt;p&gt;[SCREENSHOT: Grafana data source page showing 'Data source is working']&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0kp3si1tse1jxtf4rgag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0kp3si1tse1jxtf4rgag.png" alt=" " width="799" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 7 — Build Your First Dashboard&lt;/strong&gt;&lt;br&gt;
Time to turn raw numbers into a graph you can actually look at.&lt;/p&gt;

&lt;p&gt;Go to Dashboards → New Dashboard → Add panel&lt;br&gt;
Set Data source to Prometheus&lt;br&gt;
In the query box, type: api_requests_total&lt;br&gt;
Click Run queries — a graph should appear above&lt;br&gt;
Give the panel a title, e.g. "Total API Requests", then click Save&lt;/p&gt;

&lt;p&gt;[SCREENSHOT: Grafana panel editor showing a live graph for Total API Requests Over Time]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftzduuu6lhepb08dhmas0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftzduuu6lhepb08dhmas0.png" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add two more panels the same way, using these queries:&lt;br&gt;
mem_stats_heap_in_use&lt;br&gt;
rate(go_gc_pauses_seconds_total[5m])&lt;br&gt;
Name them "Memory Usage" and "GC Pause Rate". Save the dashboard with a name like "My App Monitoring".&lt;br&gt;
[SCREENSHOT: Final Grafana dashboard with panels: Total API Requests Over Time, memory use,sum of heap allocation in bytes,processes in cpu,total_gc_cycles_total and  sum go_gc pauses in second]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9n8wtcwgu8bxilzo8h43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9n8wtcwgu8bxilzo8h43.png" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reading Your Graphs&lt;br&gt;
MetricWhat it tells youHealthy rangeAPI requests totalHow many requests your app has receivedSteady increaseMemory (heap in use)RAM your app is using right nowStable, ~300–400 MBGC pause timeTime spent pausing to clean up memoryUnder 50msCPU processesHow busy the server isRoughly steady, no constant spikes&lt;/p&gt;

&lt;p&gt;Troubleshooting&lt;br&gt;
ProblemLikely causeFixNo data in GrafanaPrometheus isn't collecting yetCheck Status → Targets is UP, wait 1–2 minConnection refusedYour API isn't runningStart the API, then re-test /metrics404 on /metricsNo metrics endpoint in your appAdd a metrics library/route to your APITarget shows DOWNWrong address in prometheus.ymlFix the target address, restart Prometheus&lt;/p&gt;

&lt;p&gt;Next Steps&lt;/p&gt;

&lt;p&gt;Share the dashboard link with your team&lt;br&gt;
Check in on it daily for the first week to learn what "normal" looks like&lt;br&gt;
Set up an alert for when memory usage climbs too high&lt;br&gt;
Add more apps to the same Prometheus config as your system grows&lt;/p&gt;

</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>nicodemus </dc:creator>
      <pubDate>Mon, 15 Jun 2026 09:59:52 +0000</pubDate>
      <link>https://dev.to/nicodemus_koech_de2504f3e/-9co</link>
      <guid>https://dev.to/nicodemus_koech_de2504f3e/-9co</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/gpiechnik/loki-effective-logging-and-log-aggregation-with-grafana-53lc" class="crayons-story__hidden-navigation-link"&gt;Loki: Effective Logging and Log Aggregation with Grafana&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/gpiechnik" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1222232%2F86cf79b4-fed6-4eb1-9055-44c5d5667ea7.jpg" alt="gpiechnik profile" class="crayons-avatar__image" width="" height=""&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/gpiechnik" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Grzegorz Piechnik
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Grzegorz Piechnik
                
              
              &lt;div id="story-author-preview-content-1711690" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/gpiechnik" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1222232%2F86cf79b4-fed6-4eb1-9055-44c5d5667ea7.jpg" class="crayons-avatar__image" alt="" width="" height=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Grzegorz Piechnik&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/gpiechnik/loki-effective-logging-and-log-aggregation-with-grafana-53lc" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Dec 29 '23&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/gpiechnik/loki-effective-logging-and-log-aggregation-with-grafana-53lc" id="article-link-1711690"&gt;
          Loki: Effective Logging and Log Aggregation with Grafana
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/gpiechnik/loki-effective-logging-and-log-aggregation-with-grafana-53lc" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/gpiechnik/loki-effective-logging-and-log-aggregation-with-grafana-53lc#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Using Python for Data Analysis</title>
      <dc:creator>nicodemus </dc:creator>
      <pubDate>Mon, 16 Mar 2026 19:05:56 +0000</pubDate>
      <link>https://dev.to/nicodemus_koech_de2504f3e/using-python-for-data-analysis-2lge</link>
      <guid>https://dev.to/nicodemus_koech_de2504f3e/using-python-for-data-analysis-2lge</guid>
      <description>&lt;p&gt;Data analysis is the process of examining, cleaning, and interpreting data to find useful patterns, trends, or insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose Python for Data Analytics?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ease of Use and Readability: Python has an intuitive syntax, making it easy for beginners and professionals to learn and use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extensive Library Support: A rich ecosystem of libraries such as Pandas, NumPy, Matplotlib, Seaborn,  makes data processing smooth and efficient. These libraries provide built-in functions for cleaning, transforming, visualizing, and modeling data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scalability and Performance: Python can handle small datasets for academic projects and large-scale enterprise datasets efficiently. It integrates well with big data frameworks like Apache Spark to scale processing power further.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Need for a Data Analysis Workflow
&lt;/h2&gt;

&lt;p&gt;A data analysis workflow is a process that provides a set of steps for your analysis team to follow when analyzing data. &lt;br&gt;
By following the defined steps, your analysis become systematic, which minimizes the possibility that you’ll make mistakes or miss something. Furthermore, when you carefully document your work, you can reapply your steps against future data as it becomes available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Acquiring Your Data.
&lt;/h2&gt;

&lt;p&gt;step 1&lt;br&gt;
&lt;code&gt;import pandas as pd  &lt;br&gt;
import matplotlib.pyplot as plt  &lt;br&gt;
import seaborn as sns&lt;br&gt;
from sqlalchemy import create_engine&lt;br&gt;
import numpy as np&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;step 2&lt;br&gt;
Reading Data From CSV Files&lt;br&gt;
You can obtain your data in a variety of file formats. One of the most common is the comma-separated values (CSV) file. This is a text file that separates each piece of data with commas. The first row is usually a header row that defines the file’s content, with the subsequent rows containing the actual data&lt;br&gt;
&lt;code&gt;df = pd.read_csv('data.csv')&lt;/code&gt;  &lt;/p&gt;

&lt;h2&gt;
  
  
  Cleaning Your Data With Python.
&lt;/h2&gt;

&lt;p&gt;The data cleaning stage of the data analysis workflow is often the stage that takes the longest, particularly when there’s a large volume of data to be analyzed. It’s at this stage that you must check over your data to make sure that it’s free from poorly formatted, incorrect, duplicated, or incomplete data.&lt;/p&gt;

&lt;h3&gt;
  
  
  steps in cleaning your data.
&lt;/h3&gt;

&lt;p&gt;1.Dealing With Missing Data.&lt;br&gt;
 Check missing values&lt;br&gt;
&lt;code&gt;print(df.isnull().sum())&lt;/code&gt;&lt;br&gt;
 Fill missing values with the column average&lt;br&gt;
&lt;code&gt;df.fillna(df.mean(), inplace=True)&lt;/code&gt;&lt;br&gt;
importance&lt;br&gt;
Filling missing values prevents data bias and ensures accuracy in your analysis.&lt;/p&gt;

&lt;p&gt;2.Correcting Invalid Data Types.&lt;br&gt;
 Convert 'age' column to integer&lt;br&gt;
&lt;code&gt;df['age'] = df['age'].astype(int)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Convert 'date' column to proper date format&lt;br&gt;
&lt;code&gt;df['date'] = pd.to_datetime(df['date'])&lt;/code&gt;&lt;br&gt;
importance&lt;br&gt;
Fixing data types ensures that operations like calculations or sorting work correctly.&lt;br&gt;
3.Fixing Inconsistencies in Data.&lt;br&gt;
Convert all text to lowercase for consistency&lt;br&gt;
&lt;code&gt;df['category'] = df['category'].str.lower()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Replace variations with a standardized term&lt;br&gt;
&lt;code&gt;df['category'].replace({'elec': 'electronics', 'electro': 'electronics'}, inplace=True)&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
4.Removing Duplicate Data.&lt;br&gt;
 Check for duplicates&lt;br&gt;
&lt;code&gt;print(df.duplicated().sum())&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Remove duplicate entries&lt;br&gt;
&lt;code&gt;df.drop_duplicates(inplace=True)&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
importance&lt;br&gt;
It improves Data Accuracy&lt;br&gt;
5.Storing Your Cleansed Data.&lt;br&gt;
 Save cleaned data&lt;br&gt;
&lt;code&gt;df.to_csv('cleaned_data.csv', index=False)&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  connecting to my database.
&lt;/h2&gt;

&lt;p&gt;How to Connect DBeaver to PostgreSQL with SQLAlchemy&lt;/p&gt;

&lt;p&gt;Step 1: Install SQLAlchemy &amp;amp; PostgreSQL Driver&lt;br&gt;
&lt;code&gt;&lt;br&gt;
pip install sqlalchemy psycopg2&lt;br&gt;
sqlalchemy&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Set Up Your Connection in DBeaver&lt;br&gt;
 Open DBeaver&lt;br&gt;&lt;br&gt;
 Click Database &amp;gt; New Connection → Select PostgreSQL. &lt;br&gt;
 Enter your credentials:&lt;/p&gt;

&lt;p&gt;Host: localhost &lt;/p&gt;

&lt;p&gt;Port: 5432 &lt;/p&gt;

&lt;p&gt;Database Name: Use your database name.&lt;/p&gt;

&lt;p&gt;Username/Password:&lt;br&gt;&lt;br&gt;
Test Connection → If it’s successful, you're good to go.&lt;/p&gt;

&lt;p&gt;Step 3: Connect SQLAlchemy to Your Database&lt;/p&gt;

&lt;p&gt;`DATABASE_URL = "postgresql://username:password@localhost:5432/dbname"&lt;/p&gt;

&lt;p&gt;engine = create_engine(DATABASE_URL)&lt;/p&gt;

&lt;p&gt;with engine.connect() as connection:&lt;br&gt;
    print("Connected successfully!")`&lt;/p&gt;

&lt;h2&gt;
  
  
  After successful connection we can Build visuals in python
&lt;/h2&gt;

&lt;p&gt;Group by category and sum sales&lt;br&gt;
category_sales = df.groupby('Category')['Sales ($)'].sum()&lt;/p&gt;

&lt;p&gt;Create bar graph&lt;br&gt;
plt.bar(category_sales.index, category_sales.values, color=['blue', 'green', 'red'])&lt;/p&gt;

&lt;p&gt;Labels and title&lt;br&gt;
&lt;code&gt;plt.xlabel('Product Category')&lt;/code&gt;&lt;br&gt;
&lt;code&gt;plt.ylabel('Total Sales ($)')&lt;/code&gt;&lt;br&gt;
&lt;code&gt;plt.title('Sales by Category')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Show graph&lt;br&gt;
&lt;code&gt;plt.show()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fibpw7pbbyp35ub9fkfr0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fibpw7pbbyp35ub9fkfr0.png" alt=" " width="589" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create line graph&lt;br&gt;
&lt;code&gt;plt.plot(df['Date'], df['Sales ($)'], marker='o', linestyle='-', color='blue')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Labels and title&lt;br&gt;
&lt;code&gt;plt.xlabel('Date')&lt;/code&gt;&lt;br&gt;
&lt;code&gt;plt.ylabel('Sales ($)')&lt;/code&gt;&lt;br&gt;
&lt;code&gt;plt.title('Sales Trend Over Time')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Rotate x-axis labels for better readability&lt;br&gt;
&lt;code&gt;plt.xticks(rotation=45)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Show graph&lt;br&gt;
&lt;code&gt;plt.show()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flygphayyhfmz9ycp232j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flygphayyhfmz9ycp232j.png" alt=" " width="591" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;creating a pie chart.&lt;br&gt;
labels = list(category_sales.keys())&lt;br&gt;&lt;br&gt;
sizes = list(category_sales.values()) &lt;/p&gt;

&lt;p&gt;plt.title('Sales Distribution by Category')&lt;br&gt;
plt.figure(figsize=(6,6))&lt;br&gt;&lt;br&gt;
plt.pie(sizes, labels=labels, autopct='%1.1f%%', colors=['blue', 'green', 'red'])&lt;/p&gt;

&lt;p&gt;Show chart&lt;br&gt;
plt.show()&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpaewjzy2ah647hrjf4vh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpaewjzy2ah647hrjf4vh.png" alt=" " width="504" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  conclusion
&lt;/h2&gt;

</description>
      <category>analytics</category>
      <category>data</category>
      <category>datascience</category>
      <category>python</category>
    </item>
    <item>
      <title>"Building a Data Pipeline: Apache Airflow and PostgreSQL Integration on WSL"</title>
      <dc:creator>nicodemus </dc:creator>
      <pubDate>Mon, 16 Mar 2026 19:05:22 +0000</pubDate>
      <link>https://dev.to/nicodemus_koech_de2504f3e/building-a-data-pipeline-apache-airflow-and-postgresql-integration-on-wsl-k3c</link>
      <guid>https://dev.to/nicodemus_koech_de2504f3e/building-a-data-pipeline-apache-airflow-and-postgresql-integration-on-wsl-k3c</guid>
      <description>&lt;p&gt;Install WSL and Ubuntu&lt;br&gt;
Open PowerShell as Administrator:&lt;/p&gt;

&lt;p&gt;Press Win + X and select Windows PowerShell (Admin).&lt;/p&gt;

&lt;p&gt;Install WSL:&lt;/p&gt;

&lt;p&gt;Run the following command:&lt;/p&gt;

&lt;p&gt;powershell&lt;br&gt;
&lt;code&gt;wsl --install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This command installs WSL, the latest Ubuntu distribution, and sets WSL 2 as your default version.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pv81ae9beogux4h3cbm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pv81ae9beogux4h3cbm.png" alt=" " width="800" height="341"&gt;&lt;/a&gt;&lt;br&gt;
After installation, restart your computer.&lt;/p&gt;

&lt;p&gt;Open Ubuntu from the Start menu and complete the initial setup by creating a user and password.&lt;/p&gt;

&lt;p&gt;🐘 Step 2: Install PostgreSQL on Ubuntu (WSL)&lt;br&gt;
Update Package Lists:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt update&lt;/code&gt;&lt;br&gt;
Install PostgreSQL:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt install postgresql postgresql-contrib&lt;/code&gt;&lt;br&gt;
Start PostgreSQL Service:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo service postgresql start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfcz0edxxersp4wsfyy5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfcz0edxxersp4wsfyy5.png" alt=" " width="650" height="269"&gt;&lt;/a&gt;&lt;br&gt;
Access PostgreSQL:&lt;br&gt;
&lt;code&gt;sudo -u postgres psql&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foeou5wtgnepkomfff4gg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foeou5wtgnepkomfff4gg.png" alt=" " width="641" height="402"&gt;&lt;/a&gt;&lt;br&gt;
Create Airflow Database and User:&lt;/p&gt;

&lt;p&gt;CREATE DATABASE airflow;&lt;br&gt;
CREATE USER airflow WITH PASSWORD 'airflow';&lt;br&gt;
GRANT ALL PRIVILEGES ON DATABASE airflow TO airflow;&lt;br&gt;
Exit PostgreSQL:&lt;br&gt;
&lt;code&gt;\q&lt;/code&gt;&lt;br&gt;
🐍 Step 3: Set Up Python Virtual Environment&lt;br&gt;
Install Python 3 and venv:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt install python3 python3-venv python3-pip&lt;/code&gt;&lt;br&gt;
Create Virtual Environment:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;python3 -m venv airflow_env&lt;/code&gt;&lt;br&gt;
Activate Virtual Environment:&lt;br&gt;
&lt;code&gt;source airflow_env/bin/activate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprmpxqu0abywc56bbncz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprmpxqu0abywc56bbncz.png" alt=" " width="748" height="534"&gt;&lt;/a&gt;&lt;br&gt;
pip install --upgrade pip&lt;br&gt;
📦 Step 4: Install Apache Airflow&lt;br&gt;
Install Apache Airflow with PostgreSQL Support:&lt;/p&gt;

&lt;p&gt;pip install apache-airflow[postgres]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhpzak7idia1nplll84ap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhpzak7idia1nplll84ap.png" alt=" " width="748" height="534"&gt;&lt;/a&gt;&lt;br&gt;
Set Airflow Home Directory:&lt;/p&gt;

&lt;p&gt;export AIRFLOW_HOME=~/airflow&lt;br&gt;
Initialize Airflow Database:&lt;br&gt;
&lt;code&gt;airflow db init&lt;/code&gt;&lt;br&gt;
Create Airflow Admin User:&lt;br&gt;
airflow users create \&lt;br&gt;
  --username admin \&lt;br&gt;
  --password admin \&lt;br&gt;
  --firstname Admin \&lt;br&gt;
  --lastname User \&lt;br&gt;
  --role Admin \&lt;br&gt;
  --email &lt;a href="mailto:admin@example.com"&gt;admin@example.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6lunkemebmnxinv8o3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6lunkemebmnxinv8o3w.png" alt=" " width="800" height="138"&gt;&lt;/a&gt;&lt;br&gt;
Start Airflow Web Server:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;airflow webserver --port 8080&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02m8i3xolqkua827qjjs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02m8i3xolqkua827qjjs.png" alt=" " width="800" height="279"&gt;&lt;/a&gt;&lt;br&gt;
Start Airflow Scheduler:&lt;/p&gt;

&lt;p&gt;airflow scheduler&lt;br&gt;
🔗 Step 5: Connect to PostgreSQL Using DBeaver&lt;br&gt;
Open DBeaver and click on the New Connection button.&lt;/p&gt;

&lt;p&gt;Select PostgreSQL from the list of database types.&lt;/p&gt;

&lt;p&gt;Configure Connection Settings:&lt;/p&gt;

&lt;p&gt;Host: localhost&lt;/p&gt;

&lt;p&gt;Port: 5432&lt;/p&gt;

&lt;p&gt;Database: airflow&lt;/p&gt;

&lt;p&gt;Username: airflow&lt;/p&gt;

&lt;p&gt;Password: airflow&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8l3tpigrvw0l9xxm4ky.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8l3tpigrvw0l9xxm4ky.png" alt=" " width="684" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Test Connection to ensure it's successful.&lt;/p&gt;

&lt;p&gt;Finish to save the connection.&lt;/p&gt;

&lt;p&gt;🌐 Step 6: Access Airflow Web Interface&lt;br&gt;
Open your web browser and navigate to:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp7gt3k539ql3zljevsui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp7gt3k539ql3zljevsui.png" alt=" " width="800" height="239"&gt;&lt;/a&gt;&lt;br&gt;
Log in using the credentials:&lt;/p&gt;

&lt;p&gt;Username: admin&lt;/p&gt;

&lt;p&gt;Password: admin&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>linux</category>
      <category>postgres</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Understanding DAX Functions in Power BI: A Guide for Beginners.</title>
      <dc:creator>nicodemus </dc:creator>
      <pubDate>Mon, 16 Mar 2026 18:55:46 +0000</pubDate>
      <link>https://dev.to/nicodemus_koech_de2504f3e/understanding-dax-functions-in-power-bi-a-guide-for-beginners-1f0d</link>
      <guid>https://dev.to/nicodemus_koech_de2504f3e/understanding-dax-functions-in-power-bi-a-guide-for-beginners-1f0d</guid>
      <description>&lt;p&gt;If you've ever used Power BI and thought, "Wow, this is great, but how do I calculate profit margins, compare this year’s sales to last year, or create my own KPIs?" — then what you’re really looking for is DAX.&lt;/p&gt;

&lt;p&gt;Short for Data Analysis Expressions, DAX is the behind-the-scenes language that lets you tell Power BI exactly how to analyze your data. It’s what takes your dashboards from informative to insightful.&lt;/p&gt;

&lt;p&gt;In this article, we’ll break down what DAX is, why it’s important, and introduce you to some of the most useful functions — all in simple, relatable terms.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is DAX?
&lt;/h2&gt;

&lt;p&gt;Think of DAX as the Excel formulas of Power BI — but supercharged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dax can do the following
&lt;/h2&gt;

&lt;p&gt;-Create custom calculations (like monthly sales growth)&lt;/p&gt;

&lt;p&gt;-Build dynamic measures (like year-to-date revenue)&lt;/p&gt;

&lt;p&gt;-Control what gets shown in visuals (like excluding certain filters)&lt;/p&gt;

&lt;p&gt;Even if you're not a data scientist, DAX gives you the power to ask smarter questions of your data and get meaningful answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Learn DAX?
&lt;/h2&gt;

&lt;p&gt;Without DAX, Power BI is mostly just a pretty interface. With DAX, you can:&lt;/p&gt;

&lt;p&gt;-Build custom KPIs and metrics that fit your business&lt;/p&gt;

&lt;p&gt;-Slice and dice your data however you want&lt;/p&gt;

&lt;p&gt;-Analyze performance over time, across regions, teams, or products&lt;/p&gt;

&lt;p&gt;-Create dashboards that tell a clear, powerful story&lt;/p&gt;

&lt;p&gt;In short: DAX is your analytics superpower.&lt;/p&gt;

&lt;h2&gt;
  
  
  Categories of DAX Functions.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Aggregation Functions
&lt;/h3&gt;

&lt;p&gt;These are the basics &lt;/p&gt;

&lt;p&gt;Function    What it does&lt;br&gt;
&lt;code&gt;SUM()&lt;/code&gt;    Adds up numbers in a column&lt;br&gt;
&lt;code&gt;AVERAGE()&lt;/code&gt;    Finds the average&lt;br&gt;
&lt;code&gt;COUNT()&lt;/code&gt;  Counts values&lt;br&gt;
&lt;code&gt;MIN() / MAX()&lt;/code&gt;    Finds the lowest or highest value&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;code&gt;Total Sales = SUM(Sales[Amount])&lt;/code&gt;&lt;br&gt;
This gives you the total amount sold — useful for dashboards, KPIs, and reports.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Time Intelligence Functions
&lt;/h3&gt;

&lt;p&gt;Time-based analysis is essential. Want to compare sales this month vs. last month&lt;/p&gt;

&lt;p&gt;Function       What it does&lt;br&gt;
&lt;code&gt;SAMEPERIODLASTYEAR()&lt;/code&gt; Returns the same date range last year&lt;br&gt;
&lt;code&gt;DATEADD()&lt;/code&gt;    Shifts dates forward/backward&lt;br&gt;
&lt;code&gt;TOTALYTD()&lt;/code&gt;   Calculates year-to-date totals&lt;br&gt;
&lt;code&gt;DATESINPERIOD()&lt;/code&gt;  Creates custom time frames&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Sales LY = CALCULATE([Total Sales], SAMEPERIODLASTYEAR('Date'[Date]))&lt;/code&gt;&lt;br&gt;
Now your dashboard can show last year’s sales next to this year’s — perfect for trend analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Filter Functions
&lt;/h3&gt;

&lt;p&gt;These let you control what Power BI is looking at.&lt;/p&gt;

&lt;p&gt;Function    What it does&lt;br&gt;
&lt;code&gt;CALCULATE()&lt;/code&gt;  Changes the context of a calculation&lt;br&gt;
&lt;code&gt;FILTER()&lt;/code&gt; Filters a table based on logic&lt;br&gt;
&lt;code&gt;ALL()&lt;/code&gt;    Removes filters (like showing totals)&lt;br&gt;
&lt;code&gt;ALLEXCEPT()&lt;/code&gt;  Keeps filters on some columns but removes others&lt;/p&gt;

&lt;p&gt;Example&lt;br&gt;
&lt;code&gt;Sales All Regions = CALCULATE([Total Sales], ALL('Region'))&lt;/code&gt;&lt;br&gt;
This might be used to show overall performance even when a region filter is applied.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Iterator Functions
&lt;/h3&gt;

&lt;p&gt;These work row by row — great for calculations like revenue = price × quantity.&lt;/p&gt;

&lt;p&gt;Function    What it does&lt;br&gt;
&lt;code&gt;SUMX()&lt;/code&gt;   Adds up the result of a formula for each row&lt;br&gt;
&lt;code&gt;AVERAGEX()&lt;/code&gt;   Averages results across rows&lt;br&gt;
&lt;code&gt;COUNTX()&lt;/code&gt; Counts things with a condition&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Revenue = SUMX(Sales, Sales[Quantity] * Sales[Price])&lt;/code&gt;&lt;br&gt;
This calculates actual revenue from individual sales.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Logical &amp;amp; Conditional Functions
&lt;/h3&gt;

&lt;p&gt;These help you make decisions in your formulas.&lt;/p&gt;

&lt;p&gt;Function    What it does&lt;br&gt;
&lt;code&gt;IF()&lt;/code&gt; Basic if-then logic&lt;br&gt;
&lt;code&gt;SWITCH()&lt;/code&gt; Like a case statement&lt;br&gt;
&lt;code&gt;AND() / OR()&lt;/code&gt; Combine conditions&lt;br&gt;
&lt;code&gt;ISBLANK()&lt;/code&gt;    Checks for empty values&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;High Discount = IF(Sales[Discount] &amp;gt; 0.2, "Yes", "No")&lt;/code&gt;&lt;br&gt;
Use this to flag sales with high discounts — useful in heatmaps or alerts.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Text Functions
&lt;/h3&gt;

&lt;p&gt;Need to clean or combine names, IDs, or descriptions? These help with that.&lt;/p&gt;

&lt;h4&gt;
  
  
  Function             What it does
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;CONCATENATE() / &amp;amp;&lt;/code&gt;    Joins strings&lt;br&gt;
&lt;code&gt;LEFT() / RIGHT()&lt;/code&gt; Gets parts of a string&lt;br&gt;
&lt;code&gt;UPPER() / LOWER()&lt;/code&gt;    Changes case&lt;br&gt;
&lt;code&gt;SEARCH()&lt;/code&gt; Finds text inside text&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;code&gt;Full Name = Sales[FirstName] &amp;amp; " " &amp;amp; Sales[LastName]&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pro Tip: Use Variables to Simplify Complex DAX
&lt;/h3&gt;

&lt;p&gt;When your formulas get long or confusing, use VAR to break it into steps:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Profit Margin = &lt;br&gt;
VAR Profit = SUM(Sales[Revenue]) - SUM(Sales[Cost])&lt;br&gt;
RETURN DIVIDE(Profit, SUM(Sales[Revenue]))&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-Life Example: Creating a Profit KPI
&lt;/h3&gt;

&lt;p&gt;Let’s say you want to create a profit and profit margin card for your Power BI dashboard:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Profit = SUM(Sales[Revenue]) - SUM(Sales[Cost])&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Profit Margin = DIVIDE([Profit], SUM(Sales[Revenue]))&lt;/code&gt;&lt;br&gt;
Now you have custom KPIs that reflect your business logic — and update automatically as filters change.&lt;/p&gt;

&lt;h3&gt;
  
  
  conclusion
&lt;/h3&gt;

&lt;p&gt;Learning DAX might feel a bit intimidating at first, but once you get the hang of it, you’ll wonder how you ever worked without it. It’s the secret sauce behind powerful Power BI dashboards — turning static data into dynamic, insightful stories.&lt;/p&gt;

&lt;p&gt;Start with basic functions, experiment with your own data, and before long, you’ll be writing DAX like a pro.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>beginners</category>
      <category>microsoft</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Common SQL Mistakes and How to Avoid Them</title>
      <dc:creator>nicodemus </dc:creator>
      <pubDate>Mon, 12 May 2025 08:56:37 +0000</pubDate>
      <link>https://dev.to/nicodemus_koech_de2504f3e/common-sql-mistakes-and-how-to-avoid-them-5dh</link>
      <guid>https://dev.to/nicodemus_koech_de2504f3e/common-sql-mistakes-and-how-to-avoid-them-5dh</guid>
      <description>&lt;p&gt;Structured Query Language (SQL) is an essential tool for working with databases, but even seasoned developers sometimes make mistakes that can lead to slow queries, inaccurate data, and inefficient systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Four common SQL mistakes and how to fix them.
&lt;/h3&gt;

&lt;h3&gt;
  
  
  1. Incorrect Use of GROUP BY – The Data Mess
&lt;/h3&gt;

&lt;p&gt;When summarizing data, the GROUP BY clause organizes information into meaningful groups. However, misusing GROUP BY can lead to incorrect results—sometimes without obvious errors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Mistake: Grouping Without Aggregating Correctly
&lt;/h3&gt;

&lt;p&gt;A database tracks employee salaries per department. Someone writes:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
SELECT Department, Name, AVG(Salary) &lt;br&gt;
FROM Employees &lt;br&gt;
GROUP BY Department;&lt;br&gt;
What happens? The query runs, but because Name isn’t inside an aggregate function, the results may be incorrect—random employee names might appear instead of grouping correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Fix: Aggregate Only Necessary Data
&lt;/h2&gt;

&lt;p&gt;To summarize salaries by department, the query should be:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
SELECT Department, AVG(Salary) &lt;br&gt;
FROM Employees &lt;br&gt;
GROUP BY Department;&lt;br&gt;
I Want to see which department pays the most?&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
SELECT Department, AVG(Salary) &lt;br&gt;
FROM Employees &lt;br&gt;
GROUP BY Department &lt;br&gt;
ORDER BY AVG(Salary) DESC;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices to Avoid Grouping Errors
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Only group necessary columns—non-grouped columns need aggregate functions. &lt;/li&gt;
&lt;li&gt;Use HAVING instead of WHERE for filtering grouped results:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;sql&lt;br&gt;
SELECT Department, AVG(Salary) &lt;br&gt;
FROM Employees &lt;br&gt;
GROUP BY Department &lt;br&gt;
HAVING AVG(Salary) &amp;gt; 60000;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Using SELECT * in Production
&lt;/h3&gt;

&lt;p&gt;During testing, SELECT * is quick and handy. But in production? It slows queries, overloads networks, and makes applications harder to maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Mistake: Fetching Too Much Data
&lt;/h3&gt;

&lt;p&gt;sql&lt;br&gt;
SELECT * FROM Employees WHERE Department = 'IT';&lt;br&gt;
Imagine this table has 50+ columns—even if you only need two, the database fetches everything, wasting resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix: Select Only Required Columns
&lt;/h3&gt;

&lt;p&gt;sql&lt;br&gt;
SELECT Name, Salary FROM Employees WHERE Department = 'IT';&lt;br&gt;
This reduces memory usage, improves query speed, and lowers network traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices for Selecting Data Efficiently
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Explicitly specify needed columns instead of SELECT *.&lt;/li&gt;
&lt;li&gt;Use LIMIT for large queries:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;sql&lt;br&gt;
SELECT Name, Salary FROM Employees WHERE Department = 'HR' LIMIT 100;&lt;br&gt;
-Use views for reusable queries:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
CREATE VIEW IT_Employees AS &lt;br&gt;
SELECT Name, Department, Salary &lt;br&gt;
FROM Employees WHERE Department = 'IT';&lt;br&gt;
Now applications can just call:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
SELECT * FROM IT_Employees;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Inefficient Indexing – The Silent Query Killer
&lt;/h3&gt;

&lt;p&gt;Indexes speed up data retrieval, but poorly designed indexes can slow down updates, inserts, and deletes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Mistake: Misusing Indexes
&lt;/h3&gt;

&lt;p&gt;sql&lt;br&gt;
CREATE INDEX idx_department_salary ON Employees(Department, Salary);&lt;br&gt;
If the system rarely searches by Salary, this reduces efficiency and slows updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix: Index Only Frequently Used Columns
&lt;/h3&gt;

&lt;p&gt;A better strategy:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
CREATE INDEX idx_department ON Employees(Department);&lt;br&gt;
Indexes should match the most common search patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices for Efficient Indexing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Index columns frequently used in WHERE clauses. &lt;/li&gt;
&lt;li&gt;Avoid over-indexing, which slows write operations.&lt;/li&gt;
&lt;li&gt;Use EXPLAIN or ANALYZE to check query performance:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;sql&lt;br&gt;
EXPLAIN SELECT Name, Salary FROM Employees WHERE Department = 'Finance';&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use composite indexes only when queries filter by multiple columns:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;sql&lt;br&gt;
CREATE INDEX idx_customer_date ON Orders(CustomerID, OrderDate);&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Not Handling NULL Values Properly.
&lt;/h3&gt;

&lt;p&gt;NULL values represent missing information, and if not handled correctly, they can cause errors or misleading results.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Mistake: Ignoring NULL Values in Calculations
&lt;/h3&gt;

&lt;p&gt;This query calculates average salaries:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
SELECT AVG(Salary) FROM Employees;&lt;br&gt;
If some Salary values are NULL, SQL ignores them, leading to inaccurate reports.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Fix: Handle NULLs Carefully
&lt;/h3&gt;

&lt;p&gt;Ensure NULLs are accounted for:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
SELECT AVG(COALESCE(Salary, 0)) FROM Employees;&lt;br&gt;
If checking for employees without salaries, use:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
SELECT Name FROM Employees WHERE Salary IS NULL;&lt;br&gt;
Best Practices for Handling NULLs&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use IS NULL and IS NOT NULL to prevent logic errors. &lt;/li&gt;
&lt;li&gt;Replace NULLs using COALESCE() or IFNULL():&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;sql&lt;br&gt;
SELECT Name, COALESCE(Salary, 0) AS AdjustedSalary FROM Employees;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate NULL handling in reports to avoid misleading calculations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion.
&lt;/h3&gt;

&lt;p&gt;SQL mistakes can affect speed, accuracy, and system stability. But with the right practices, you can write efficient, optimized queries that scale well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GROUP BY must include all non-aggregated columns to avoid incorrect grouping. &lt;/li&gt;
&lt;li&gt;Never use SELECT * in production—fetch only required data. &lt;/li&gt;
&lt;li&gt;Index smartly, targeting commonly searched fields. &lt;/li&gt;
&lt;li&gt;Handle NULLs carefully, ensuring accurate calculations.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Mastering Data Analysis with Excel: A Practical Approach</title>
      <dc:creator>nicodemus </dc:creator>
      <pubDate>Mon, 12 May 2025 07:41:48 +0000</pubDate>
      <link>https://dev.to/nicodemus_koech_de2504f3e/mastering-data-analysis-with-excel-a-practical-approach-gek</link>
      <guid>https://dev.to/nicodemus_koech_de2504f3e/mastering-data-analysis-with-excel-a-practical-approach-gek</guid>
      <description>&lt;p&gt;Working with excel is an efficient tools for working with data  as it  offers powerful features for organizing, analyzing, and visualizing it.&lt;br&gt;
Excel can  make data interpretation easier for both data analyst and stakeholders.&lt;br&gt;
This guide explores essential Excel functions for effective data analysis.&lt;br&gt;
Understanding Data and Analysis&lt;/p&gt;

&lt;h2&gt;
  
  
  key concepts in excel:
&lt;/h2&gt;

&lt;p&gt;• Data: Raw facts or figures that can be processed to generate meaningful insights.&lt;br&gt;
• Data Analysis: The practice of refining, organizing, and interpreting data to identify trends and patterns for decision-making.&lt;br&gt;
• Data Science: An advanced field combining statistical methods, algorithms, and computing techniques to extract knowledge from data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools Commonly Used for Data Analysis.
&lt;/h2&gt;

&lt;p&gt;Category             Examples&lt;br&gt;
Spreadsheet Software     Excel, Google Sheets&lt;br&gt;
 Programming Languages    Python, R&lt;br&gt;
Data Visualization Tools    Power BI, Tableau&lt;br&gt;
Databases               MySQL, PostgreSQL&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose Excel for Data Analysis?
&lt;/h2&gt;

&lt;p&gt;Excel is widely used for data analysis due to its accessibility and user-friendly interface. Key benefits include:&lt;br&gt;
• Ease of Use: No coding skills required.&lt;br&gt;
• Built-in Functions: Automate calculations and data manipulation.&lt;br&gt;
• Visualization Tools: Quickly generate charts and graphs.&lt;br&gt;
• Integration: Works with multiple data sources and systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Essential Data Analysis Tasks in Excel
&lt;/h2&gt;

&lt;p&gt;Sorting &amp;amp; Filtering &lt;br&gt;
 Sorting  allows users to arrange data logically, whether alphabetically, numerically, or chronologically. Filtering helps refine data visibility, showing only relevant records &lt;br&gt;
based on conditions such as values exceeding a specific amount.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using Formulas and Functions
&lt;/h3&gt;

&lt;p&gt;Excel's formulas help automate calculations.&lt;br&gt;
 Some commonly used functions include:&lt;/p&gt;

&lt;h3&gt;
  
  
  Function    Purpose                Example
&lt;/h3&gt;

&lt;p&gt;SUM()           Adds values          =SUM(A1:A10)&lt;/p&gt;

&lt;p&gt;AVERAGE()   Calculates average    =AVERAGE(B1:B10)&lt;/p&gt;

&lt;p&gt;IF()           Logical decision-making         =IF(A1&amp;gt;50, "Pass", "Fail")&lt;/p&gt;

&lt;p&gt;VLOOKUP()   Searches for data     =VLOOKUP(101, A2:B10, 2, FALSE)&lt;/p&gt;

&lt;h2&gt;
  
  
  Conditional Formatting
&lt;/h2&gt;

&lt;p&gt;Conditional formatting visually highlights important data by applying rules that change the appearance of cells. Examples include color-coded sales performance or date-based deadline tracking.&lt;br&gt;
Pivot Tables&lt;br&gt;
Pivot Tables provide a simple way to summarize large datasets. They allow dynamic sorting, filtering, and analysis, helping users extract meaningful insights with minimal effort&lt;/p&gt;

&lt;p&gt;. Steps to create a Pivot Table:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Select data range.&lt;/li&gt;
&lt;li&gt; Navigate to Insert &amp;gt; Pivot Table.&lt;/li&gt;
&lt;li&gt; Place fields into Rows and Columns for organization.&lt;/li&gt;
&lt;li&gt; Apply custom filters and calculations.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Data Visualization
&lt;/h2&gt;

&lt;p&gt;Charts and graphs convert raw numbers into easy-to-understand visuals. Excel supports various chart types such as:&lt;br&gt;
• Line Charts: Best for tracking trends over time.&lt;/p&gt;

&lt;p&gt;• Bar and Column Charts: Used for comparing categories.&lt;/p&gt;

&lt;p&gt;• Pie Charts: Displays proportions within a dataset.&lt;/p&gt;

&lt;p&gt;• Scatter Plots: Shows relationships between variables.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Excel simplifies complex data analysis, providing built-in functions, visualization tools, and interactive PivotTables.&lt;br&gt;
 Whether summarizing information, tracking patterns, or optimizing decision-making, Excel remains an indispensable resource for professionals handling data.&lt;br&gt;
. By mastering these fundamental techniques, users can transform raw data into actionable insights.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
