<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged dataanalytics</title>
<link>https://coderlegion.com/tag/dataanalytics</link>
<description>Powered by Question2Answer</description>
<item>
<title>Forensic Aviation Analytics: Auditing Fuel Bleeds &amp; Delay Cascades on a Regional A320neo Network</title>
<link>https://coderlegion.com/28910/forensic-aviation-analytics-auditing-fuel-bleeds-delay-cascades-regional-a320neo-network</link>
<description>&lt;p&gt;When evaluating airline performance, typical analytics dashboards rely blindly on passenger-facing &quot;On-Time&quot; arrival percentages. However, from an operational and financial engineering standpoint, these high-level metrics can easily mask millions of dollars in silent cash destruction. &lt;/p&gt;
&lt;p&gt;Due to strategic schedule padding, a short-haul flight can sit idling its engines on a congested tarmac for 20 minutes, yet still be registered as &quot;On-Time&quot; to the customer. The passenger is happy, but the airline’s finance department just watched pure margin vaporize into thin air.&lt;/p&gt;
&lt;p&gt;To expose these hidden friction layers, I engineered LCC-Ops: an end-to-end data warehouse auditing over 120,000 regional transaction legs modeled around the single-aisle network performance of flynas across key GCC hubs.&lt;/p&gt;
&lt;p&gt;Here is the technical architecture and the forensic database methodologies behind the pipeline.&lt;/p&gt;
&lt;h3 id=&quot;the-tech-stack-amp-architecture&quot;&gt;The Tech Stack &amp;amp; Architecture&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Database Layer:&lt;/strong&gt; MySQL Server 8.0 (Advanced CTEs, Mathematical Window Functions, Schema Migrations)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business Intelligence:&lt;/strong&gt; Power BI Desktop (Data Type Optimization, Cross-Table Iterators, UI Design)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core Fleet Constants:&lt;/strong&gt; Engineered around the Airbus A320neo (CFM LEAP-1A26 engine) utilizing official ICAO Engine Emissions Databank metrics. At a standard 7% ground idle taxi thrust, this engine burns exactly 0.0940 kg of fuel per second, per engine&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-database-engineering-breakdown&quot;&gt;The Database Engineering Breakdown&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pillar 1&lt;/strong&gt;: Isolating Tarmac Cash Destruction (Domain A)To find the true cost of airport ground bottlenecks, the ingestion engine isolates rows inside the transactions table (fact_flights) where the Out-Gate to Runway Takeoff latency (taxi_out) exceeded a standard 4-minute engine stabilization and warming buffer.&lt;/p&gt;
&lt;p&gt;By pulling the real-world ICAO fuel coefficients down via relational keys, the calculation bypasses text-based padding and computes raw physical fuel destruction.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT 
    f.origin AS departure_hub,
    COUNT(f.tail_number) AS total_monitored_flights,
    ROUND(AVG(f.taxi_out), 2) AS avg_taxi_out_minutes,
    -- Formula: (Actual Taxi Time - 4 Min Buffer) * 60 Sec * ICAO Idle Flow Rate * 2 Engines
    ROUND(SUM((f.taxi_out - 4) * 60 * e.fuel_flow_idle_kg_sec * 2), 2) AS total_wasted_fuel_kg
FROM fact_flights f
JOIN dim_aircraft a ON f.tail_number = a.tail_number
JOIN dim_engine e ON a.engine_identification = e.engine_identification
WHERE f.reporting_airline = 'XY' AND f.taxi_out &amp;gt; 4
GROUP f.origin;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Pillar 2: Tracking Cross-Border Delay Cascades (Domain D)&lt;/strong&gt;&lt;br&gt;
When an international flight arriving from an airport like Karachi (KHI) experiences customs or airspace delays, that latency risks cascading into the aircraft’s subsequent domestic legs (e.g., RUH ➔ JED).&lt;/p&gt;
&lt;p&gt;To track this chronologically across individual daily airframe lifecycles, I utilized advanced LEAD() mathematical window functions&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WITH ranked_daily_schedule AS (
    SELECT 
        flight_date, tail_number, origin, dest, carrier_delay AS leg_1_delay,
        LEAD(origin, 1) OVER (PARTITION BY tail_number, flight_date ORDER BY taxi_out DESC) AS leg_2_origin,
        LEAD(carrier_delay, 1) OVER (PARTITION BY tail_number, flight_date ORDER BY taxi_out DESC) AS leg_2_delay
    FROM fact_flights
    WHERE reporting_airline = 'XY'
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Pillar 3: Menu Logistics &amp;amp; Hangar Risk Automation (Domains B &amp;amp; C)&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Catering Spoilage Optimization:&lt;/em&gt; Short flight windows on regional tracks mean cabin crews lack the time to complete complex perishable sales loops. The data models validate flynas’s lean, shelf-stable buy-on-board menu model, proving that switching to fresh profiles would trigger an immediate &lt;strong&gt;54% inventory spoilage cash bleed&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;em&gt;Automated Hangar Reorder Points (ROP):&lt;/em&gt; The warehouse tracks rolling airframe hours against specific tail numbers (HZ-NS1 to HZ-NS5) [Query-relevant Context]. If a component approaches its high-wear safety limit, the system triggers automated database alerts to protect the airline against catastrophic &lt;strong&gt;$25,000/day Aircraft on Ground (AOG) hangar penalties&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;ui-engineering-in-power-bi&quot;&gt;UI Engineering in Power BI&lt;/h3&gt;
&lt;p&gt;To present these data layers to corporate stakeholders, I built an interactive application-style interface directly inside Power BI using flynas’s signature branding tones.&lt;/p&gt;
&lt;p&gt;The biggest challenge during BI ingestion was data type conversions—empty strings or trailing spaces in the raw logs caused math functions to drop blank values (--). By implementing upfront string transformations (Uppercase/Trim) and embedding data validation wrappers like ISNUMBER(VALUE()) directly into row-level DAX iterators, the front-end dynamically scales across massive transaction volumes without data loss.&lt;/p&gt;
&lt;p&gt;The entire production code schema and scripts are live on my GitHub &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/hafsamotiwala/flynas-fleet-telemetry-analytics&quot;&gt;Link&lt;/a&gt;. I'd love to hear how other data engineers manage real-time fuel-burn parameters or multi-leg network routing in your pipelines!&lt;/p&gt;
</description>
<category>Discussions</category>
<guid isPermaLink="true">https://coderlegion.com/28910/forensic-aviation-analytics-auditing-fuel-bleeds-delay-cascades-regional-a320neo-network</guid>
<pubDate>Mon, 28 Sep 2026 11:41:49 +0000</pubDate>
</item>
<item>
<title>The Part of Shipping Software That Doesn't Show Up in a Portfolio Screenshot</title>
<link>https://coderlegion.com/28813/the-part-of-shipping-software-that-doesnt-show-up-in-a-portfolio-screenshot</link>
<description>&lt;p&gt;A few weeks into building a live finance dashboard for a client, I learned something that had nothing to do with writing code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I built&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The brief was simple to state and harder to deliver: a dashboard connected directly to the client's Excel workbook — no exports, no &quot;send me the latest file,&quot; no waiting on me every time a number changed. Edit the sheet, save it, and the dashboard reflects it within seconds.&lt;/p&gt;
&lt;p&gt;Under the hood, it's a &lt;strong&gt;Python (Flask)&lt;/strong&gt; backend that reads straight from the workbook on every request, paired with a frontend that polls for changes and re-renders automatically. On top of that, an interactive map view lets the client click into any project location and see its P&amp;amp;L, purchases, and profitability pulled live from the sheet — no manual recalculation, no stale numbers.&lt;/p&gt;
&lt;p&gt;The last step was packaging it so the client — who isn't technical — could just double-click one file and have it work. &lt;strong&gt;No Python install, no terminal, no code in sight.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where it actually got hard&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Technically, everything worked. Locally, on my machine, the dashboard ran exactly as intended.&lt;/p&gt;
&lt;p&gt;Then I packaged it into a standalone &lt;strong&gt;.exe&lt;/strong&gt; to hand off — and Windows flagged it as potentially unsafe before it ever reached the client.&lt;/p&gt;
&lt;p&gt;My first instinct was to assume something was wrong with the code. It wasn't. The actual cause was &lt;strong&gt;Smart App Control — a Windows 11 feature&lt;/strong&gt; that's cautious by default about any unsigned, unrecognized executable, regardless of what's inside it. A freshly built app with no signing history and no reputation looks suspicious to it, even when it's completely benign.&lt;/p&gt;
&lt;p&gt;Knowing why it happened didn't make it &lt;em&gt;&quot;shippable,&quot;&lt;/em&gt; though. I couldn't just tell the client &lt;em&gt;&quot;ignore the warning.&quot;&lt;/em&gt; I submitted the file to Microsoft for analysis through their official review process, and the status sat at Pending for a stretch — there's no way to force that along, it just takes as long as it takes. When the analyst's response came back, it confirmed the file had been incorrectly blocked and had been remediated so it would no longer trigger the warning.&lt;/p&gt;
&lt;p&gt;Only then was it actually ready to hand to someone else's computer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The takeaway&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If I ship more builds of this app over time, the same thing could happen again — a new build means a new file hash, and a new file hash means zero reputation, all over again. The durable fix, I learned, is code-signing: a certificate from a trusted authority that lets Windows (and Microsoft's own analysts) recognize the publisher quickly instead of treating every new build as an unknown.&lt;/p&gt;
&lt;p&gt;But the bigger lesson wasn't technical. It was this: building something and shipping something to a real, non-technical user are two different bars. The first one is the part that shows up in a portfolio screenshot. The second one — the packaging, the trust signals, the &lt;em&gt;&quot;will this actually work on someone else's machine without me standing next to them&quot;&lt;/em&gt; — is invisible until it isn't, and it's just as much a part of the job.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/28813/the-part-of-shipping-software-that-doesnt-show-up-in-a-portfolio-screenshot</guid>
<pubDate>Sun, 27 Sep 2026 16:15:09 +0000</pubDate>
</item>
<item>
<title>Looking for a feedback</title>
<link>https://coderlegion.com/28780/looking-for-a-feedback</link>
<description>&lt;p&gt;I have 7+ years of experience as a full-stack and data engineer, and I’m currently transitioning into AI.&lt;/p&gt;
&lt;p&gt;I’ve tried applying for projects through platforms such as Mercor, AfterQuery, DataAnnotation, Outlier, Turing, and Snorkel, but I haven’t had much success so far.&lt;/p&gt;
&lt;p&gt;I’d really appreciate advice from developers or AI professionals who have experience with these platforms or similar AI-related opportunities.&lt;/p&gt;
&lt;p&gt;I’d especially like to know:&lt;/p&gt;
&lt;p&gt;How to improve my profile and applications&lt;br&gt;
What skills or experience these platforms are currently looking for&lt;br&gt;
How to stand out when applying for AI projects&lt;br&gt;
Other platforms or opportunities worth exploring&lt;/p&gt;
&lt;p&gt;Any practical advice or personal experience would be greatly appreciated.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/28780/looking-for-a-feedback</guid>
<pubDate>Sun, 27 Sep 2026 06:46:52 +0000</pubDate>
</item>
<item>
<title>Retail FMCG Sales Analytics: From 100,000 Transactions to Power BI, Machine Learning, and Streamlit</title>
<link>https://coderlegion.com/26992/retail-fmcg-sales-analytics-from-100-000-transactions-power-machine-learning-streamlit</link>
<description>&lt;h3 id=&quot;introduction&quot;&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Retail businesses generate large amounts of transactional data every day, but raw data alone does not provide much value unless it can be transformed into meaningful insights and actionable information.&lt;/p&gt;
&lt;p&gt;For our Retail FMCG Sales Analytics project, we worked with a dataset representing one full year of retail activity during 2024 for a multi-city FMCG retailer in India.&lt;/p&gt;
&lt;p&gt;The dataset contains 100,000 transaction records and 21 variables, covering product and brand information, customer characteristics, sales and financial metrics, stores and cities, sales channels, payment methods, loyalty status, and inventory information.&lt;/p&gt;
&lt;p&gt;The objective was not simply to perform exploratory analysis. We wanted to build an end-to-end analytics solution that could move from:&lt;/p&gt;
&lt;p&gt;Raw Data → Data Preparation → EDA → Business Analytics → Power BI → Machine Learning → Streamlit Deployment&lt;/p&gt;
&lt;p&gt;The final solution combines Python-based analysis, interactive Power BI dashboards, regression modeling, and a Streamlit application that allows users to explore the data and generate transaction-level margin predictions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Understanding the Dataset&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The dataset contains several analytical dimensions that make it suitable for both business intelligence and predictive analytics.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The main dimensions include:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Product:&lt;/strong&gt; Category and Brand&lt;br&gt;
&lt;strong&gt;Customer:&lt;/strong&gt; Age, Gender, and Loyalty Flag&lt;br&gt;
&lt;strong&gt;Sales:&lt;/strong&gt; Units, Selling Price, Revenue, Cost, Margin, and Margin %&lt;br&gt;
&lt;strong&gt;Store:&lt;/strong&gt; City and Store Format&lt;br&gt;
&lt;strong&gt;Channel:&lt;/strong&gt; Online, Offline, and Omnichannel&lt;br&gt;
&lt;strong&gt;Payment:&lt;/strong&gt; UPI, Card, Wallet, and Cash&lt;br&gt;
&lt;strong&gt;Inventory:&lt;/strong&gt; Stock on Hand, Reorder Level, and Lead Time&lt;br&gt;
&lt;strong&gt;Time:&lt;/strong&gt; Invoice Date and derived temporal features&lt;/p&gt;
&lt;p&gt;The dataset includes eight FMCG categories: Beverages, Snacks, Dairy, Grocery, Personal Care, Home Care, Fruits, and Vegetables.&lt;/p&gt;
&lt;p&gt;One of the main data quality challenges was Customer Age, where approximately 40% of the values were missing. The original dataset also did not include information about returns, wastage, or promotional campaigns, which limited some areas of analysis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Data Cleaning and Preprocessing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before performing analysis or machine learning, we first had to understand and prepare the dataset.&lt;/p&gt;
&lt;p&gt;The preprocessing workflow focused on improving consistency while preserving the analytical value of the original data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The main steps included:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Identifying missing values and data quality issues.&lt;/li&gt;
&lt;li&gt;Validating customer age values.&lt;/li&gt;
&lt;li&gt;Creating an indicator for missing customer age.&lt;/li&gt;
&lt;li&gt;Handling missing customer age values.&lt;/li&gt;
&lt;li&gt;Handling missing categorical values.&lt;/li&gt;
&lt;li&gt;Extracting temporal features from Invoice_Date.&lt;/li&gt;
&lt;li&gt;Creating additional analytical features.&lt;/li&gt;
&lt;li&gt;Preparing categorical variables for machine learning.&lt;/li&gt;
&lt;li&gt;Separating the target variable from the input features.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The project also considered the limitations of the dataset during interpretation. In particular, the missing customer-age values affect age-based segmentation, while the absence of promotion and wastage data limits more advanced FMCG analysis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Exploratory Data Analysis&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After cleaning the data, the next stage was Exploratory Data Analysis.&lt;/p&gt;
&lt;p&gt;The purpose of EDA was not only to create visualizations, but to understand how different business dimensions interact.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We explored:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sales and Profitability&lt;/p&gt;
&lt;p&gt;Revenue, cost, margin, margin percentage, and units sold were analyzed to understand overall business performance.&lt;/p&gt;
&lt;p&gt;Product and Category Performance&lt;/p&gt;
&lt;p&gt;Category and brand-level analysis was used to examine differences between sales volume and profitability.&lt;/p&gt;
&lt;p&gt;This distinction is particularly important in FMCG because the category with the highest sales volume is not necessarily the category generating the highest margin.&lt;/p&gt;
&lt;p&gt;Sales Channels&lt;/p&gt;
&lt;p&gt;The dataset contains online, offline, and omnichannel transactions, allowing us to compare the economic performance of different channels.&lt;/p&gt;
&lt;p&gt;Customer Behavior&lt;/p&gt;
&lt;p&gt;Customer age, gender, and loyalty status were analyzed to understand differences in customer behavior.&lt;/p&gt;
&lt;p&gt;Inventory&lt;/p&gt;
&lt;p&gt;Stock on hand, reorder level, and lead time were analyzed as operational indicators.&lt;/p&gt;
&lt;p&gt;These variables allowed us to investigate questions around inventory availability and replenishment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Business Intelligence with Power BI&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After completing the exploratory analysis, we transformed the results into interactive dashboards using Microsoft Power BI.&lt;/p&gt;
&lt;p&gt;The objective was to move beyond static charts and create a business-facing interface where users could interact with the results.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The dashboard focused on areas such as:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Revenue&lt;br&gt;
Profitability&lt;br&gt;
Profit margin&lt;br&gt;
Units sold&lt;br&gt;
Sales channels&lt;br&gt;
Categories&lt;br&gt;
Brands&lt;br&gt;
Cities&lt;br&gt;
Customer loyalty&lt;br&gt;
Inventory performance&lt;br&gt;
Sales &amp;amp; Profitability Dashboard&lt;/p&gt;
&lt;p&gt;The first dashboard provides a high-level view of sales and profitability.&lt;/p&gt;
&lt;p&gt;It combines KPI cards with charts that allow users to explore revenue and profit across different business dimensions.&lt;/p&gt;
&lt;p&gt;The dashboard also provides interactive filtering, allowing users to investigate specific channels and categories.&lt;/p&gt;
&lt;p&gt;Customers &amp;amp; Sales Channels&lt;/p&gt;
&lt;p&gt;The customer-focused analysis looks at sales channels, customer age, loyalty, revenue, and margin.&lt;/p&gt;
&lt;p&gt;This helps connect customer behavior with financial performance rather than treating customer analytics as a separate topic.&lt;/p&gt;
&lt;p&gt;Power BI therefore became the business intelligence layer of the project, transforming analytical results into an interactive decision-support interface.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Machine Learning&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The next stage was to introduce predictive analytics.&lt;/p&gt;
&lt;p&gt;We formulated the machine learning problem as a supervised regression task, with transaction-level Margin as the target variable. Ten regression models were evaluated using standard metrics including:&lt;/p&gt;
&lt;p&gt;MAE&lt;br&gt;
MSE&lt;br&gt;
RMSE&lt;br&gt;
R²&lt;/p&gt;
&lt;p&gt;The purpose was to compare different approaches rather than relying on a single algorithm.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The evaluated models included:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Linear Regression&lt;br&gt;
Ridge Regression&lt;br&gt;
Lasso Regression&lt;br&gt;
Decision Tree&lt;br&gt;
Random Forest&lt;br&gt;
Gradient Boosting&lt;br&gt;
XGBoost&lt;br&gt;
LightGBM&lt;br&gt;
CatBoost&lt;br&gt;
Support Vector Regression&lt;/p&gt;
&lt;p&gt;The final evaluation identified Linear Regression as the selected model based on the executed test results, with an R² value of approximately 1.00 and error values approaching zero.&lt;/p&gt;
&lt;p&gt;The selected model was then integrated into the deployed application.&lt;/p&gt;
&lt;p&gt;Why compare multiple models?&lt;/p&gt;
&lt;p&gt;Model comparison gave us a broader understanding of how different regression approaches performed on the dataset.&lt;/p&gt;
&lt;p&gt;Instead of assuming that a more complex algorithm would automatically produce the best result, we evaluated the models using the same evaluation framework and selected the final model based on the observed test performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Streamlit Deployment&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of the main goals of the project was to take the analysis beyond notebooks and dashboards.&lt;/p&gt;
&lt;p&gt;For this reason, we developed a Streamlit web application that integrates the main analytical and machine learning components into one interface.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The deployed application contains five main sections:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Overview&lt;/p&gt;
&lt;p&gt;Introduces the project, dataset, and analytical context.&lt;/p&gt;
&lt;p&gt;Analytics&lt;/p&gt;
&lt;p&gt;Provides interactive Python-based analysis across revenue, profit, margin, channels, categories, brands, cities, customers, loyalty, and inventory.&lt;/p&gt;
&lt;p&gt;Data Quality&lt;/p&gt;
&lt;p&gt;Provides visibility into important data quality characteristics, including missing customer-age values.&lt;/p&gt;
&lt;p&gt;Machine Learning&lt;/p&gt;
&lt;p&gt;Presents the machine learning workflow, evaluated models, and final model results.&lt;/p&gt;
&lt;p&gt;Prediction&lt;/p&gt;
&lt;p&gt;Allows users to enter transaction characteristics and generate a predicted transaction-level margin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The application workflow is essentially:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Load Data → Load Model → Prepare Features → Accept User Inputs → Apply Transformations → Generate Prediction&lt;/p&gt;
&lt;p&gt;This deployment creates a user-facing layer on top of the analytical workflow and removes the need for users to directly execute the original notebooks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7. The Complete Architecture&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The project can be viewed as several connected layers rather than separate tools.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;                Retail FMCG Dataset
                       │
                       ▼
            Data Understanding
                       │
                       ▼
          Cleaning &amp;amp; Preprocessing
                       │
                       ▼
              Feature Engineering
                       │
                       ▼
                Exploratory EDA
                 /           \
                /             \
               ▼               ▼
      Business Analytics    ML Modeling
               │               │
               ▼               ▼
           Power BI       Model Evaluation
               │               │
               └───────┬───────┘
                       ▼
                  Streamlit
                       │
                       ▼
             Interactive Solution
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This architecture allowed us to keep the project connected from the original dataset all the way to the final deployed application.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The final report describes the same lifecycle as a nine-stage workflow:&lt;/strong&gt; dataset understanding, cleaning, feature engineering, EDA, business analytics, Power BI, machine learning, model evaluation, and Streamlit deployment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8. Key Business Questions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The project was built around several business questions rather than analysis for its own sake.&lt;/p&gt;
&lt;p&gt;Which categories perform better in terms of margin versus volume?&lt;/p&gt;
&lt;p&gt;This allows management to distinguish between high-volume categories and highly profitable categories.&lt;/p&gt;
&lt;p&gt;Which sales channels are more economically viable?&lt;/p&gt;
&lt;p&gt;The combination of revenue, margin, and channel information allows online, offline, and omnichannel performance to be compared.&lt;/p&gt;
&lt;p&gt;Do loyalty customers behave differently?&lt;/p&gt;
&lt;p&gt;Customer loyalty can be analyzed alongside revenue, units, and margin.&lt;/p&gt;
&lt;p&gt;How can inventory indicators support operational decisions?&lt;/p&gt;
&lt;p&gt;Stock on hand, reorder level, and lead time provide indicators that can be used to investigate inventory and replenishment performance.&lt;/p&gt;
&lt;p&gt;Which store formats are more efficient for perishable products?&lt;/p&gt;
&lt;p&gt;The dataset contains store-format and category information that can support comparisons between Hyper, Super, and Express formats.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9. Challenges and Limitations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No analytical project should be presented without discussing its limitations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The main limitations of this dataset were:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Missing Customer Age:&lt;/strong&gt;&lt;br&gt;
Approximately 40% of customer-age values were missing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No Returns or Wastage:&lt;/strong&gt;&lt;br&gt;
This limits detailed analysis of shrinkage and perishables.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No Promotion Data:&lt;/strong&gt;&lt;br&gt;
The dataset does not include promotional campaigns or discounts, limiting promotion-effectiveness and price-elasticity analysis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Limited Basket Analysis:&lt;/strong&gt;&lt;br&gt;
Each record represents a single transaction line, which limits the ability to reliably analyze products purchased together.&lt;/p&gt;
&lt;p&gt;These limitations are important because they define what the dataset can—and cannot—tell us.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10. What We Built&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At the end of the project, we had a complete analytical solution rather than a collection of disconnected notebooks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The final solution includes:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Python&lt;br&gt;
For data preparation, analysis, visualization, and machine learning.&lt;/p&gt;
&lt;p&gt;Power BI&lt;br&gt;
For interactive business intelligence dashboards.&lt;/p&gt;
&lt;p&gt;Machine Learning&lt;br&gt;
For comparing ten regression models and building a margin prediction capability.&lt;/p&gt;
&lt;p&gt;Streamlit&lt;br&gt;
For exposing the analytical and predictive functionality through an interactive web application.&lt;/p&gt;
&lt;p&gt;GitHub&lt;br&gt;
For organizing and sharing the complete project.&lt;/p&gt;
&lt;p&gt;The final project therefore combines descriptive analytics, business intelligence, predictive analytics, and deployment into one workflow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11. Final Takeaways&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The main lesson from this project was that a successful data analytics project is not only about building charts or achieving a high machine learning score.&lt;/p&gt;
&lt;p&gt;The real value comes from connecting the different stages.&lt;/p&gt;
&lt;p&gt;A dataset becomes useful when it is properly understood.&lt;/p&gt;
&lt;p&gt;Clean data enables reliable analysis.&lt;/p&gt;
&lt;p&gt;EDA reveals patterns.&lt;/p&gt;
&lt;p&gt;Business intelligence makes those patterns easier to explore.&lt;/p&gt;
&lt;p&gt;Machine learning adds predictive capability.&lt;/p&gt;
&lt;p&gt;And deployment makes the final solution accessible to people who may never open a Jupyter Notebook.&lt;/p&gt;
&lt;p&gt;For us, the project was an opportunity to work through that entire process.&lt;/p&gt;
&lt;p&gt;100,000 records → one analytical workflow → one deployed solution.&lt;/p&gt;
&lt;p&gt;Project Resources&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt;&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Fadydesoky/Retail-FMCG-Analytics&quot;&gt;https://github.com/Fadydesoky/Retail-FMCG-Analytics&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live Streamlit Application:&lt;/strong&gt;&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://retail-fmcg-analytics.streamlit.app/&quot;&gt;https://retail-fmcg-analytics.streamlit.app/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What's next?&lt;/p&gt;
&lt;p&gt;There are several directions in which this project could be extended.&lt;/p&gt;
&lt;p&gt;Future versions could include:&lt;/p&gt;
&lt;p&gt;Demand forecasting&lt;br&gt;
Inventory optimization&lt;br&gt;
Promotion and pricing analysis&lt;br&gt;
Customer segmentation&lt;br&gt;
Basket analysis&lt;br&gt;
Perishable-product analysis&lt;br&gt;
More advanced machine learning approaches&lt;br&gt;
Additional Streamlit functionality&lt;/p&gt;
&lt;p&gt;These extensions are also consistent with the limitations identified in the project report.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/czgmpvdsk9cc1xblkbfk.jpeg&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/2cbfyk6xrun0bdits6i1.jpeg&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/cpd0jybu7cix6r5j9rkb.png&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/6jr3hg8wr9myf1v78uys.jpeg&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let's Connect&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you found this project interesting or would like to discuss data analytics, business intelligence, machine learning, or similar projects, feel free to connect with me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LinkedIn:&lt;/strong&gt;&lt;br&gt;
https:www.linkedin.com/in/fadydesokysaeedabdelaziz&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;https:www.github.com/Fadydesoky&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/26992/retail-fmcg-sales-analytics-from-100-000-transactions-power-machine-learning-streamlit</guid>
<pubDate>Sat, 12 Sep 2026 16:51:51 +0000</pubDate>
</item>
<item>
<title>From GitHub Repositories to a Professional Data Analytics Portfolio Website</title>
<link>https://coderlegion.com/24288/from-github-repositories-to-a-professional-data-analytics-portfolio-website</link>
<description>&lt;h3 id=&quot;building-more-than-just-projects-building-my-professional-identity&quot;&gt;Building More Than Just Projects — Building My Professional Identity&lt;/h3&gt;
&lt;p&gt;Completing my &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://yasirawaninfo-data.vercel.app/&quot;&gt;Data Analyst Internship&lt;/a&gt;&lt;/strong&gt; at &lt;strong&gt;Logic Stack&lt;/strong&gt; was a significant milestone. Over four weeks, I worked on real-world business problems using &lt;strong&gt;Excel, Power BI, Python and SQL&lt;/strong&gt;, successfully completing four practical analytics projects.&lt;/p&gt;
&lt;p&gt;Like many learners, I initially thought that uploading my projects to GitHub would be enough.&lt;/p&gt;
&lt;p&gt;After all, GitHub is the standard platform for developers and data professionals.&lt;/p&gt;
&lt;p&gt;But then I asked myself a simple question:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;If a recruiter visits my profile, will they truly understand my journey just by opening four separate repositories?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The answer was &lt;strong&gt;No.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That realization inspired me to build something much bigger than another GitHub repository.&lt;/p&gt;
&lt;p&gt;It inspired me to build my own &lt;strong&gt;Production-Level Data Analytics &lt;a rel=&quot;nofollow&quot; href=&quot;https://yasirawaninfo-data.vercel.app/&quot;&gt;Portfolio Website&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;why-github-alone-wasn-t-enough&quot;&gt;Why GitHub Alone Wasn't Enough&lt;/h2&gt;
&lt;p&gt;GitHub is excellent for storing source code and documentation.&lt;/p&gt;
&lt;p&gt;However, recruiters usually spend only a few minutes reviewing a candidate's profile.&lt;/p&gt;
&lt;p&gt;Opening multiple repositories one by one makes it difficult to understand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The overall learning journey&lt;/li&gt;
&lt;li&gt;Project progression&lt;/li&gt;
&lt;li&gt;Skills gained&lt;/li&gt;
&lt;li&gt;Business impact&lt;/li&gt;
&lt;li&gt;Technical growth&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wanted to create a place where everything could be explored from a &lt;strong&gt;single professional dashboard&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-idea&quot;&gt;The Idea&lt;/h2&gt;
&lt;p&gt;Instead of sharing multiple independent repositories, I designed a portfolio website that presents my internship as one complete journey.&lt;/p&gt;
&lt;p&gt;Rather than saying,&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;Here are my projects.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I wanted the website to tell a story:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;How I started, what I learned, which challenges I faced, how I solved them and what I built by the end of the internship.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That became the foundation of the entire portfolio.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;designing-the-portfolio&quot;&gt;Designing the Portfolio&lt;/h2&gt;
&lt;p&gt;The goal was simple:&lt;/p&gt;
&lt;p&gt;Create a clean, modern, recruiter-friendly website that highlights both my &lt;strong&gt;Data Analytics skills&lt;/strong&gt; and my &lt;strong&gt;Web Development experience&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The portfolio includes carefully designed sections that guide visitors through my internship journey.&lt;/p&gt;
&lt;h4 id=&quot;home&quot;&gt;Home&lt;/h4&gt;
&lt;p&gt;A professional landing page introducing my internship, background, and career focus.&lt;/p&gt;
&lt;h4 id=&quot;projects&quot;&gt;Projects&lt;/h4&gt;
&lt;p&gt;A dedicated section for all four internship projects.&lt;/p&gt;
&lt;p&gt;Each project contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project overview&lt;/li&gt;
&lt;li&gt;Technologies used&lt;/li&gt;
&lt;li&gt;GitHub Repository&lt;/li&gt;
&lt;li&gt;LinkedIn post&lt;/li&gt;
&lt;li&gt;YouTube explanation video&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything is connected from one location.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;skills-learned&quot;&gt;Skills Learned&lt;/h2&gt;
&lt;p&gt;Instead of simply listing technologies, I organized everything I learned during the internship into one dedicated section.&lt;/p&gt;
&lt;p&gt;The portfolio highlights skills including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Excel&lt;/li&gt;
&lt;li&gt;Power BI&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;SQL&lt;/li&gt;
&lt;li&gt;Data Cleaning&lt;/li&gt;
&lt;li&gt;Exploratory Data Analysis&lt;/li&gt;
&lt;li&gt;KPI Development&lt;/li&gt;
&lt;li&gt;Business Intelligence&lt;/li&gt;
&lt;li&gt;Dashboard Design&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This gives recruiters a quick overview of my technical capabilities.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;challenges-solved&quot;&gt;Challenges Solved&lt;/h2&gt;
&lt;p&gt;One of my favourite sections is the &lt;strong&gt;Challenges Solved&lt;/strong&gt; page.&lt;/p&gt;
&lt;p&gt;Instead of hiding the problems I encountered, I documented them professionally.&lt;/p&gt;
&lt;p&gt;Examples include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python environment setup&lt;/li&gt;
&lt;li&gt;Library installation issues&lt;/li&gt;
&lt;li&gt;SQL query debugging&lt;/li&gt;
&lt;li&gt;Data cleaning problems&lt;/li&gt;
&lt;li&gt;Documentation challenges&lt;/li&gt;
&lt;li&gt;GitHub repository organization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each challenge is paired with the solution I implemented.&lt;/p&gt;
&lt;p&gt;I believe problem-solving demonstrates professional growth more effectively than simply showing successful projects.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;certificate-amp-internship-documents&quot;&gt;Certificate &amp;amp; Internship Documents&lt;/h2&gt;
&lt;p&gt;The portfolio also includes my internship certificate and professional documents.&lt;/p&gt;
&lt;p&gt;To keep them organized, I implemented a simple password-protected section that allows authorized viewers to access these files when needed.&lt;/p&gt;
&lt;p&gt;This keeps the homepage clean while still making important documents available.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;building-with-modern-technologies&quot;&gt;Building with Modern Technologies&lt;/h2&gt;
&lt;p&gt;This project also became an opportunity to strengthen my web development skills.&lt;/p&gt;
&lt;p&gt;The website was built using modern technologies including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;Framer Motion&lt;/li&gt;
&lt;li&gt;Responsive Design&lt;/li&gt;
&lt;li&gt;SEO Optimization&lt;/li&gt;
&lt;li&gt;Structured Data (JSON-LD)&lt;/li&gt;
&lt;li&gt;Robots.txt&lt;/li&gt;
&lt;li&gt;Sitemap.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By combining these technologies, I transformed a simple portfolio into a production-ready web application.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;seo-matters-too&quot;&gt;SEO Matters Too&lt;/h2&gt;
&lt;p&gt;I didn't want the website to look professional only for people who already had the link.&lt;/p&gt;
&lt;p&gt;I wanted search engines to understand it as well.&lt;/p&gt;
&lt;p&gt;To improve visibility, I implemented:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Metadata optimization&lt;/li&gt;
&lt;li&gt;Open Graph tags&lt;/li&gt;
&lt;li&gt;Structured Data&lt;/li&gt;
&lt;li&gt;Robots configuration&lt;/li&gt;
&lt;li&gt;XML Sitemap&lt;/li&gt;
&lt;li&gt;Performance optimization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Achieving high Lighthouse scores became another goal during development, ensuring the website follows modern web standards.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;combining-two-different-skill-sets&quot;&gt;Combining Two Different Skill Sets&lt;/h2&gt;
&lt;p&gt;This project became much more than a portfolio.&lt;/p&gt;
&lt;p&gt;It combined two different fields I enjoy:&lt;/p&gt;
&lt;h4 id=&quot;data-analytics&quot;&gt;Data Analytics&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Business insights&lt;/li&gt;
&lt;li&gt;SQL&lt;/li&gt;
&lt;li&gt;Power BI&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Excel&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;web-development&quot;&gt;Web Development&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;UI Design&lt;/li&gt;
&lt;li&gt;Responsive Layouts&lt;/li&gt;
&lt;li&gt;SEO&lt;/li&gt;
&lt;li&gt;Performance Optimization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bringing these two disciplines together allowed me to create something that represents my complete technical profile.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;lessons-beyond-the-internship&quot;&gt;Lessons Beyond the Internship&lt;/h2&gt;
&lt;p&gt;Building this website taught me several important lessons.&lt;/p&gt;
&lt;p&gt;A portfolio is not just about displaying work.&lt;/p&gt;
&lt;p&gt;It is about presenting your journey professionally.&lt;/p&gt;
&lt;p&gt;I learned that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Presentation matters.&lt;/li&gt;
&lt;li&gt;Documentation matters.&lt;/li&gt;
&lt;li&gt;User experience matters.&lt;/li&gt;
&lt;li&gt;Personal branding matters.&lt;/li&gt;
&lt;li&gt;Professional storytelling matters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A recruiter should be able to understand who you are within minutes.&lt;/p&gt;
&lt;p&gt;That became the guiding principle behind this project.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Looking back, I'm glad I didn't stop after uploading four repositories.&lt;/p&gt;
&lt;p&gt;Creating this portfolio allowed me to organize my internship experience into one professional platform that showcases both my technical skills and my continuous learning journey.&lt;/p&gt;
&lt;p&gt;This website represents more than projects.&lt;/p&gt;
&lt;p&gt;It represents persistence.&lt;/p&gt;
&lt;p&gt;It represents growth.&lt;/p&gt;
&lt;p&gt;It represents every challenge solved throughout the internship.&lt;/p&gt;
&lt;p&gt;Most importantly, it reminds me that learning never truly ends.&lt;/p&gt;
&lt;p&gt;Every project becomes a stepping stone toward the next opportunity.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;explore-my-complete-portfolio&quot;&gt;Explore My Complete Portfolio&lt;/h3&gt;
&lt;p&gt;🌐 &lt;strong&gt;Live Portfolio:&lt;/strong&gt;&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://yasirawaninfo-data.vercel.app/&quot;&gt;https://yasirawaninfo-data.vercel.app/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;💻 &lt;strong&gt;GitHub:&lt;/strong&gt;&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/YasirAwan4831&quot;&gt;https://github.com/YasirAwan4831&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you for taking the time to explore my journey. I hope it inspires other learners to build not only projects—but also a professional identity around their work.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;#DataAnalytics #SQL #SQLite #PowerBI #Python #Panda  #Numpy #Matplotlib #Excel #BusinessIntelligence  #DataVisualization #Dashboard #DataCleaning #JupyterNotebook #ProblemSolving  #GitHub #WebDevelopment #LearningInPublic #Portfolio #CareerGrowth ##MuhammadYasir #YasirAwan4831&lt;/em&gt; &lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24288/from-github-repositories-to-a-professional-data-analytics-portfolio-website</guid>
<pubDate>Sat, 08 Aug 2026 07:35:02 +0000</pubDate>
</item>
<item>
<title>Continuing My Data Analyst Journey: Week 3, 4 and Challenges I Faced During My Data Analyst Intern</title>
<link>https://coderlegion.com/24267/continuing-my-data-analyst-journey-week-and-challenges-faced-during-data-analyst-intern</link>
<description>&lt;p&gt;In my previous blog, I shared my journey through Week 1 and Week 2, where I worked on Excel-based data cleaning, sales analysis, Pivot Tables and Power BI dashboards.&lt;/p&gt;
&lt;p&gt;As the internship progressed, the learning curve became much steeper. The focus shifted from spreadsheet analytics to programming, databases and solving real-world business problems using professional data analysis tools.&lt;/p&gt;
&lt;p&gt;Weeks 3 and 4 introduced completely new technologies, larger datasets and more technical challenges that pushed me far beyond my comfort zone.&lt;/p&gt;
&lt;p&gt;These two weeks transformed my internship from learning business reporting into building complete end-to-end data analytics solutions.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;week-3-supply-chain-analytics-using-python-amp-power-bi&quot;&gt;Week 3: Supply Chain Analytics using Python &amp;amp; Power BI&lt;/h3&gt;
&lt;p&gt;Week 3 marked my first serious experience with &lt;strong&gt;Python for Data Analytics.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Unlike previous weeks, this project required setting up a complete Python development environment before writing a single line of analysis. I worked extensively with &lt;strong&gt;Pandas, NumPy, Matplotlib and Jupyter Notebook&lt;/strong&gt; to clean, analyse and visualize a real-world supply chain dataset containing thousands of records.&lt;/p&gt;
&lt;p&gt;After completing the &lt;strong&gt;Exploratory Ddata Analysis (EDA)&lt;/strong&gt;, I integrated the insights into &lt;strong&gt;Power BI&lt;/strong&gt;, creating an interactive dashboard that highlighted sales performance, shipment modes, product groups, vendors and country-wise business metrics.&lt;/p&gt;
&lt;p&gt;This project taught me that successful data analysis begins with clean, reliable data—and that Python is one of the most powerful tools for transforming raw datasets into meaningful business insights.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/YasirAwan4831/week-3-python-powerbi-supply-chain-analytics&quot;&gt;https://github.com/YasirAwan4831/week-3-python-powerbi-supply-chain-analytics&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;YouTube Video:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/SQk41XxxpsY?si=ElhxePDt916bh_VJ&quot;&gt;https://youtu.be/SQk41XxxpsY?si=ElhxePDt916bh_VJ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LinkedIn Post:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/posts/yasirawan4831_eda-dataabranalyst-fullabrstackabrdeveloper-activity-7482280841147006976-YKho?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAAFyt-1EB5XKMOcxukQpAzVmx6pIKiXdCz64&quot;&gt;https://www.linkedin.com/posts/yasirawan4831_eda-dataabranalyst-fullabrstackabrdevel&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;week-4-funnel-amp-revenue-analysis-using-sql-amp-power-bi&quot;&gt;Week 4: Funnel &amp;amp; Revenue Analysis using SQL &amp;amp; Power BI&lt;/h3&gt;
&lt;p&gt;The final week introduced one of the most important skills in modern data analytics: &lt;strong&gt;SQL&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For this project, I worked with SQLite to analyse customer funnel performance, revenue generation and conversion metrics directly from a relational database. Instead of relying on spreadsheets, I learned how businesses retrieve insights using SQL queries, aggregate functions, filtering, grouping and KPI calculations.&lt;/p&gt;
&lt;p&gt;The extracted data was then connected to &lt;strong&gt;Power BI&lt;/strong&gt;, where I built an interactive business dashboard presenting conversion rates, revenue trends and overall funnel performance.&lt;/p&gt;
&lt;p&gt;This project completed my internship journey by combining database querying, business intelligence and visualization into one complete analytics workflow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;:  &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/YasirAwan4831/week-4-sql-powerbi-funnel-analysis&quot;&gt;https://github.com/YasirAwan4831/week-4-sql-powerbi-funnel-analysis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;YouTube Video:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/sdBYOKqT6YM?si=HfNw1CrgG71dHIzi&quot;&gt;https://youtu.be/sdBYOKqT6YM?si=HfNw1CrgG71dHIzi&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LinkedIn Post:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/posts/yasirawan4831_sqlite-sqlabrbased-dataabranalyst-activity-7486642277780742144-lXpI?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAAFyt-1EB5XKMOcxukQpAzVmx6pIKiXdCz64&quot;&gt;https://www.linkedin.com/posts/yasirawan4831_sqlite-sqlabrbased-dataabranalys&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;from-learning-tools-to-solving-problems&quot;&gt;From Learning Tools to Solving Problems&lt;/h3&gt;
&lt;p&gt;By the end of Week 4, I had worked with:&lt;br&gt;
Microsoft Excel&lt;br&gt;
Power BI&lt;br&gt;
Python&lt;br&gt;
SQL&lt;br&gt;
Business Analytics&lt;br&gt;
Data Cleaning&lt;br&gt;
Exploratory Data Analysis (EDA)&lt;br&gt;
KPI Dashboard Development&lt;br&gt;
Funnel Analysis&lt;br&gt;
GitHub Documentation&lt;/p&gt;
&lt;p&gt;However, learning these tools was only part of the journey.&lt;br&gt;
The real growth came from overcoming technical challenges, debugging errors, researching solutions and continuously improving every project.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;10-real-challenges-i-faced-during-my-data-analyst-internship-and-how-i-solved-them-&quot;&gt;10 Real Challenges I Faced During My Data Analyst Internship (And How I Solved Them)&lt;/h2&gt;
&lt;p&gt; Every Internship Teaches Skills — But Real Growth Comes From Solving Problems&lt;/p&gt;
&lt;p&gt;When people look at a completed project, they usually see the dashboard, the charts, the SQL queries, or the final GitHub repository.&lt;/p&gt;
&lt;p&gt;What they don't see are the countless hours spent fixing errors, learning unfamiliar tools, debugging environments, researching documentation and solving problems that never appeared in any tutorial.&lt;/p&gt;
&lt;p&gt;During my one-month Data Analyst Internship at &lt;strong&gt;Logic Stack&lt;/strong&gt;, I completed four industry-based projects covering &lt;strong&gt;Excel, Power BI, Python, SQL and Business Analytics&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;However, the most valuable outcome wasn't just the projects themselves.&lt;/p&gt;
&lt;p&gt;It was learning &lt;strong&gt;how to solve problems independently.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This blog shares the biggest technical and practical challenges I faced during my internship—and how each one made me a better Data Analyst.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;week-3-project&quot;&gt;Week 3 Project&lt;/h2&gt;
&lt;h3 id=&quot;supply-chain-analytics-using-python-amp-power-bi&quot;&gt;Supply Chain Analytics using Python &amp;amp; Power BI&lt;/h3&gt;
&lt;p&gt;By Week 3, the internship shifted from Excel into Python-based analytics.&lt;/p&gt;
&lt;p&gt;This project focused on cleaning, analysing and visualizing a real-world Supply Chain dataset using &lt;strong&gt;Python (Pandas, NumPy, Matplotlib)&lt;/strong&gt; alongside &lt;strong&gt;Power BI&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Unlike previous weeks, this project introduced a completely new development environment, making it both exciting and challenging.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;week-4-project&quot;&gt;Week 4 Project&lt;/h2&gt;
&lt;h3 id=&quot;funnel-amp-revenue-analysis-using-sql-amp-power-bi&quot;&gt;Funnel &amp;amp; Revenue Analysis using SQL &amp;amp; Power BI&lt;/h3&gt;
&lt;p&gt;The final week introduced SQL for business analytics.&lt;/p&gt;
&lt;p&gt;The objective was to analyse conversion funnels, revenue performance and customer behaviour using SQL queries before presenting business insights inside Power BI dashboards.&lt;/p&gt;
&lt;p&gt;This project simulated real-world reporting workflows where raw database queries become executive dashboards.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;challenge-1&quot;&gt;Challenge 1&lt;/h2&gt;
&lt;h3 id=&quot;starting-with-zero-practical-experience&quot;&gt;Starting With Zero Practical Experience&lt;/h3&gt;
&lt;h4 id=&quot;challenge&quot;&gt;Challenge&lt;/h4&gt;
&lt;p&gt;Although I had experience in web development, I had almost no practical exposure to professional Data Analytics workflows.&lt;/p&gt;
&lt;p&gt;Everything—from Excel reporting to SQL analytics—was new.&lt;/p&gt;
&lt;h4 id=&quot;solution&quot;&gt;Solution&lt;/h4&gt;
&lt;p&gt;Instead of trying to learn everything at once, I followed a structured approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/YasirAwan4831/week-1-retail-sales-excel-analysis&quot;&gt;Week 1 → Excel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/YasirAwan4831/week-2-excel-powerbi-sales-dashboard&quot;&gt;Week 2 → Power BI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/YasirAwan4831/week-3-python-powerbi-supply-chain-analytics&quot;&gt;Week 3 → Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/YasirAwan4831/week-4-sql-powerbi-funnel-analysis&quot;&gt;Week 4 → SQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learning one technology at a time helped me build confidence while creating portfolio-ready projects every week.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;challenge-2&quot;&gt;Challenge 2&lt;/h2&gt;
&lt;h3 id=&quot;building-a-professional-excel-workflow&quot;&gt;Building a Professional Excel Workflow&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;Creating clean spreadsheets is easy.&lt;/p&gt;
&lt;p&gt;Creating professional business reports is not.&lt;/p&gt;
&lt;p&gt;I had to learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Structured Tables&lt;/li&gt;
&lt;li&gt;Pivot Tables&lt;/li&gt;
&lt;li&gt;Professional Formatting&lt;/li&gt;
&lt;li&gt;Multiple Worksheets&lt;/li&gt;
&lt;li&gt;Formula Organization&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;solution-1&quot;&gt;Solution&lt;/h4&gt;
&lt;p&gt;I researched Excel best practices and redesigned my workbook several times until it followed professional reporting standards.&lt;/p&gt;
&lt;p&gt;The result was an organized multi-sheet Excel project that later became the foundation for my Power BI dashboard.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;challenge-3&quot;&gt;Challenge 3&lt;/h2&gt;
&lt;h3 id=&quot;learning-power-bi-dashboard-design&quot;&gt;Learning Power BI Dashboard Design&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;Power BI wasn't difficult because of the software.&lt;/p&gt;
&lt;p&gt;It was difficult because dashboards must answer business questions—not simply display charts.&lt;/p&gt;
&lt;h4 id=&quot;solution-2&quot;&gt;Solution&lt;/h4&gt;
&lt;p&gt;I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KPI Cards&lt;/li&gt;
&lt;li&gt;DAX Basics&lt;/li&gt;
&lt;li&gt;Dashboard Layout Principles&lt;/li&gt;
&lt;li&gt;Visual Hierarchy&lt;/li&gt;
&lt;li&gt;Business Storytelling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rather than creating colourful visuals, I focused on dashboards that communicate insights clearly.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;challenge-4&quot;&gt;Challenge 4&lt;/h2&gt;
&lt;h3 id=&quot;configuring-the-python-development-environment&quot;&gt;Configuring the Python Development Environment&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;This was one of the toughest technical challenges.&lt;/p&gt;
&lt;p&gt;Issues included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VS Code Python interpreter problems&lt;/li&gt;
&lt;li&gt;Jupyter Kernel connection failures&lt;/li&gt;
&lt;li&gt;Package installation errors&lt;/li&gt;
&lt;li&gt;Environment configuration&lt;/li&gt;
&lt;li&gt;Version conflicts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These problems had nothing to do with analytics—but they completely blocked development.&lt;/p&gt;
&lt;h4 id=&quot;solution-3&quot;&gt;Solution&lt;/h4&gt;
&lt;p&gt;Instead of giving up, I researched official documentation, debugging guides and community discussions.&lt;/p&gt;
&lt;p&gt;Eventually I:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed interpreter paths&lt;/li&gt;
&lt;li&gt;Installed required libraries&lt;/li&gt;
&lt;li&gt;Connected Jupyter successfully&lt;/li&gt;
&lt;li&gt;Stabilized the development environment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This experience taught me that environment setup is a real engineering skill.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;challenge-5&quot;&gt;Challenge 5&lt;/h2&gt;
&lt;h3 id=&quot;cleaning-a-real-world-dataset&quot;&gt;Cleaning a Real-World Dataset&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;The Supply Chain dataset contained:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Missing values&lt;/li&gt;
&lt;li&gt;Mixed data types&lt;/li&gt;
&lt;li&gt;Invalid numeric values&lt;/li&gt;
&lt;li&gt;Text inside number columns&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Real business datasets are rarely clean.&lt;/p&gt;
&lt;h4 id=&quot;solution-4&quot;&gt;Solution&lt;/h4&gt;
&lt;p&gt;Using Pandas, I:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Converted invalid values safely&lt;/li&gt;
&lt;li&gt;Filled missing values&lt;/li&gt;
&lt;li&gt;Removed inconsistencies&lt;/li&gt;
&lt;li&gt;Validated cleaned data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only after proper cleaning did visualization become meaningful.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;challenge-6&quot;&gt;Challenge 6&lt;/h2&gt;
&lt;h3 id=&quot;installing-sqlite-amp-building-sql-workflows&quot;&gt;Installing SQLite &amp;amp; Building SQL Workflows&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;Week 4 introduced SQL.&lt;/p&gt;
&lt;p&gt;Before writing queries, I first had to configure SQLite and import datasets correctly.&lt;/p&gt;
&lt;h4 id=&quot;solution-5&quot;&gt;Solution&lt;/h4&gt;
&lt;p&gt;I installed DB Browser for SQLite, verified database structure, imported CSV datasets correctly and prepared the environment before beginning SQL analysis.&lt;/p&gt;
&lt;p&gt;This preparation prevented many future errors.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;challenge-7&quot;&gt;Challenge 7&lt;/h2&gt;
&lt;h3 id=&quot;writing-complex-sql-queries&quot;&gt;Writing Complex SQL Queries&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;Simple SELECT statements were easy.&lt;/p&gt;
&lt;p&gt;Business reporting required:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GROUP BY&lt;/li&gt;
&lt;li&gt;Aggregate Functions&lt;/li&gt;
&lt;li&gt;Filtering&lt;/li&gt;
&lt;li&gt;Revenue Calculations&lt;/li&gt;
&lt;li&gt;Conversion Metrics&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;solution-6&quot;&gt;Solution&lt;/h4&gt;
&lt;p&gt;Instead of memorizing syntax, I practiced writing increasingly complex queries while documenting each command inside my repository.&lt;/p&gt;
&lt;p&gt;This improved both my SQL knowledge and documentation skills.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;challenge-8&quot;&gt;Challenge 8&lt;/h2&gt;
&lt;h3 id=&quot;turning-data-into-business-insights&quot;&gt;Turning Data Into Business Insights&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;Anyone can generate numbers.&lt;/p&gt;
&lt;p&gt;A Data Analyst must explain what those numbers actually mean.&lt;/p&gt;
&lt;h4 id=&quot;solution-7&quot;&gt;Solution&lt;/h4&gt;
&lt;p&gt;For every project I focused on answering business questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which products perform best?&lt;/li&gt;
&lt;li&gt;Where is revenue growing?&lt;/li&gt;
&lt;li&gt;Which funnel stage loses customers?&lt;/li&gt;
&lt;li&gt;What actions should businesses take?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This mindset transformed technical work into business analysis.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;challenge-9&quot;&gt;Challenge 9&lt;/h2&gt;
&lt;h3 id=&quot;professional-github-documentation&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/YasirAwan4831/week-1-retail-sales-excel-analysis/blob/main/README.md&quot;&gt;Professional GitHub Documentation&lt;/a&gt;&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;Writing code is only half the job.&lt;/p&gt;
&lt;p&gt;Presenting &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/YasirAwan4831/week-1-retail-sales-excel-analysis/blob/main/README.md&quot;&gt;projects professionally&lt;/a&gt; is equally important.&lt;/p&gt;
&lt;h4 id=&quot;solution-8&quot;&gt;Solution&lt;/h4&gt;
&lt;p&gt;I created consistent repositories with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Detailed README files&lt;/li&gt;
&lt;li&gt;Professional documentation&lt;/li&gt;
&lt;li&gt;SVG animations&lt;/li&gt;
&lt;li&gt;Shields.io badges&lt;/li&gt;
&lt;li&gt;Folder organization&lt;/li&gt;
&lt;li&gt;Screenshots&lt;/li&gt;
&lt;li&gt;Business explanations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These repositories became portfolio-quality projects rather than simple assignments.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;challenge-10&quot;&gt;Challenge 10&lt;/h2&gt;
&lt;h3 id=&quot;building-my-own-data-analyst-portfolio-website&quot;&gt;Building My Own Data Analyst Portfolio Website&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;Instead of simply uploading four GitHub repositories, I wanted to create something unique.&lt;/p&gt;
&lt;h4 id=&quot;solution-9&quot;&gt;Solution&lt;/h4&gt;
&lt;p&gt;I designed and developed a complete interactive portfolio website using &lt;strong&gt;Next.js&lt;/strong&gt; and &lt;strong&gt;TypeScript&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The website includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internship Overview&lt;/li&gt;
&lt;li&gt;Four Complete Projects&lt;/li&gt;
&lt;li&gt;GitHub Repositories&lt;/li&gt;
&lt;li&gt;LinkedIn Posts&lt;/li&gt;
&lt;li&gt;YouTube Project Videos&lt;/li&gt;
&lt;li&gt;Skills Learned&lt;/li&gt;
&lt;li&gt;Challenges Solved&lt;/li&gt;
&lt;li&gt;Password-Protected Certificate Section&lt;/li&gt;
&lt;li&gt;Resume Download&lt;/li&gt;
&lt;li&gt;Modern Responsive UI&lt;/li&gt;
&lt;li&gt;SEO Optimization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This project combined my web development background with my newly acquired Data Analytics skills, creating a portfolio that reflects both technical implementation and professional presentation.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;what-this-internship-really-taught-me&quot;&gt;What This Internship Really Taught Me&lt;/h2&gt;
&lt;p&gt;This internship wasn't just about learning Excel, Python, SQL, or Power BI.&lt;/p&gt;
&lt;p&gt;It taught me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How to research independently.&lt;/li&gt;
&lt;li&gt;How to debug unfamiliar problems.&lt;/li&gt;
&lt;li&gt;How to organize professional projects.&lt;/li&gt;
&lt;li&gt;How to document technical work.&lt;/li&gt;
&lt;li&gt;How to communicate business insights.&lt;/li&gt;
&lt;li&gt;How to keep learning when solutions aren't immediately obvious.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These lessons will remain valuable long after the internship ends.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;final-thoughts-1&quot;&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Looking back, the dashboards and repositories represent only the visible outcome.&lt;/p&gt;
&lt;p&gt;The real achievement was overcoming every obstacle that appeared along the way.&lt;/p&gt;
&lt;p&gt;Every error message, every failed installation, every debugging session and every rewritten query contributed to my growth as a Data Analyst.&lt;/p&gt;
&lt;p&gt;The internship has ended—but the learning journey continues.&lt;/p&gt;
&lt;p&gt;Thank you, &lt;strong&gt;Logic Stack&lt;/strong&gt;, for providing a practical environment where I could build real projects, solve real problems and gain valuable industry experience.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;connect-with-me&quot;&gt;Connect With Me&lt;/h3&gt;
&lt;p&gt;🌐 Portfolio&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://yasirawaninfo-data.vercel.app/&quot;&gt;https://yasirawaninfo-data.vercel.app/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;💻 GitHub&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/YasirAwan4831&quot;&gt;https://github.com/YasirAwan4831&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;💼 LinkedIn&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://linkedin.com/in/yasirawan4831&quot;&gt;https://linkedin.com/in/yasirawan4831&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you for reading. If this journey inspires someone starting their own Data Analytics path, then sharing these experiences has been worthwhile.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;#DataAnalytics #SQL #SQLite #PowerBI #BusinessIntelligence #DataVisualization #Dashboard #GitHub #Internship #LogicStack #DataAnalyst #LearningJourney #OpenToWork #Portfolio #YasirAwan4831&lt;/em&gt; &lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24267/continuing-my-data-analyst-journey-week-and-challenges-faced-during-data-analyst-intern</guid>
<pubDate>Fri, 07 Aug 2026 19:22:22 +0000</pubDate>
</item>
<item>
<title>My Data Analyst Internship Journey: From Learning the Fundamentals to Building Production-Ready Anal</title>
<link>https://coderlegion.com/24250/data-analyst-internship-journey-from-learning-fundamentals-building-production-ready</link>
<description>&lt;h3 id=&quot;introduction-1&quot;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Every learning journey begins with a single decision.&lt;/p&gt;
&lt;p&gt;For me, that decision was to step into the world of &lt;strong&gt;Data Analytics&lt;/strong&gt;—a field that combines problem-solving, business understanding, and technology to transform raw data into meaningful insights.&lt;/p&gt;
&lt;p&gt;When I joined the &lt;strong&gt;Logic Stack Data Analyst Internship&lt;/strong&gt;, I wasn't simply looking to complete another internship. My goal was much bigger: I wanted to build practical skills, work on real-world projects, document every step professionally and create a portfolio that genuinely reflected my growth.&lt;/p&gt;
&lt;p&gt;Over the course of one month, I worked on multiple projects involving &lt;strong&gt;Excel, Python, SQL, Power BI, GitHub, technical documentation, and portfolio development&lt;/strong&gt;. Every week introduced new concepts, new challenges and new opportunities to improve.&lt;/p&gt;
&lt;p&gt;This blog shares my complete journey—from the first day of the internship to the completion of the final project. Rather than focusing only on the outcomes, I want to share the process, the lessons I learned and how each project helped me grow as an aspiring Data Analyst.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;why-i-chose-this-internship&quot;&gt;Why I Chose This Internship&lt;/h2&gt;
&lt;p&gt;The field of Data Analytics has become one of the fastest-growing domains in technology. Organizations across every industry rely on data to make better decisions, optimize operations, and understand customer behaviour.&lt;/p&gt;
&lt;p&gt;I wanted hands-on experience with the tools and workflows used by professionals instead of learning only through theory.&lt;/p&gt;
&lt;p&gt;This internship provided exactly that opportunity.&lt;/p&gt;
&lt;p&gt;It focused on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Practical business datasets&lt;/li&gt;
&lt;li&gt;Real analytical workflows&lt;/li&gt;
&lt;li&gt;Professional documentation&lt;/li&gt;
&lt;li&gt;Dashboard development&lt;/li&gt;
&lt;li&gt;Industry-standard tools&lt;/li&gt;
&lt;li&gt;Portfolio building&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of completing isolated exercises, every week contributed to a larger learning journey.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;about-the-logic-stack-internship&quot;&gt;About the Logic Stack Internship&lt;/h2&gt;
&lt;p&gt;The internship was designed as a structured four-week program where every week introduced a new challenge.&lt;/p&gt;
&lt;p&gt;Rather than repeating similar exercises, each project focused on solving a different business problem using different analytical techniques.&lt;/p&gt;
&lt;p&gt;Throughout the internship I worked with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Excel&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Pandas&lt;/li&gt;
&lt;li&gt;NumPy&lt;/li&gt;
&lt;li&gt;SQL (SQLite)&lt;/li&gt;
&lt;li&gt;Power BI&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Technical Documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every project required not only completing the technical work but also presenting it professionally through GitHub repositories, documentation, dashboards, screenshots and project reports.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;my-goals-before-starting&quot;&gt;My Goals Before Starting&lt;/h2&gt;
&lt;p&gt;Before beginning the internship, I set a few personal goals for myself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Learn modern Data Analytics tools through practical work.&lt;/li&gt;
&lt;li&gt;Improve my analytical thinking.&lt;/li&gt;
&lt;li&gt;Build projects suitable for a professional portfolio.&lt;/li&gt;
&lt;li&gt;Learn proper GitHub documentation.&lt;/li&gt;
&lt;li&gt;Create dashboards that communicate business insights effectively.&lt;/li&gt;
&lt;li&gt;Gain confidence working with real datasets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking back now, these goals helped me stay focused throughout the internship.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;week-1-learning-the-foundations&quot;&gt;Week 1 – Learning the Foundations&lt;/h2&gt;
&lt;p&gt;The first week focused on building a strong analytical foundation.&lt;/p&gt;
&lt;p&gt;Instead of jumping directly into advanced visualization, the emphasis was placed on understanding datasets, identifying business questions, cleaning information and extracting useful insights.&lt;/p&gt;
&lt;p&gt;This project taught me that successful data analysis begins long before dashboards are created.&lt;/p&gt;
&lt;p&gt;Some of the concepts I worked on included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understanding structured datasets&lt;/li&gt;
&lt;li&gt;Data cleaning&lt;/li&gt;
&lt;li&gt;Exploratory analysis&lt;/li&gt;
&lt;li&gt;Identifying patterns&lt;/li&gt;
&lt;li&gt;Basic business insights&lt;/li&gt;
&lt;li&gt;Professional project documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More importantly, I learned how to organize a project professionally from the beginning—a habit that became extremely valuable during the following weeks.&lt;/p&gt;
&lt;p&gt;GitHub Repository: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/YasirAwan4831/week-1-retail-sales-excel-analysis&quot;&gt;https://github.com/YasirAwan4831/week-1-retail-sales-excel-analysis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;YouTube Video:  &lt;a rel=&quot;nofollow&quot; href=&quot;https://youtube.com/shorts/-vCaOvUj-DA?si=4DzXsE1v3Idt84xs&quot;&gt;https://youtube.com/shorts/-vCaOvUj-DA?si=4DzXsE1v3Idt84xs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;LinkedIn Post: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/posts/yasirawan4831_excel-logicstack-dataanalyst-activity-7476570834262945792-XcJ4?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAAFyt-1EB5XKMOcxukQpAzVmx6pIKiXdCz64&quot;&gt;https://www.linkedin.com/posts/yasirawan4831_excel-logicstack-dataanalyst-activity-&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;week-2-building-analytical-confidence&quot;&gt;Week 2 – Building Analytical Confidence&lt;/h2&gt;
&lt;p&gt;The second week pushed my skills further.&lt;/p&gt;
&lt;p&gt;The datasets became larger, the questions became more analytical and the expectations shifted from simply calculating values to explaining business performance.&lt;/p&gt;
&lt;p&gt;This project strengthened my ability to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Interpret business metrics&lt;/li&gt;
&lt;li&gt;Compare trends&lt;/li&gt;
&lt;li&gt;Identify opportunities&lt;/li&gt;
&lt;li&gt;Present findings clearly&lt;/li&gt;
&lt;li&gt;Think from a business perspective instead of only a technical perspective&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One important lesson from this week was that data alone has very little value unless it is converted into actionable insights.&lt;/p&gt;
&lt;p&gt;That mindset completely changed how I approached the remaining internship projects.&lt;/p&gt;
&lt;p&gt;GitHub Repository: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/YasirAwan4831/week-2-excel-powerbi-sales-dashboard&quot;&gt;https://github.com/YasirAwan4831/week-2-excel-powerbi-sales-dashboard&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;YouTube Video: &lt;a rel=&quot;nofollow&quot; href=&quot;https://youtube.com/shorts/JLg-B-rs0gE?si=kCWG7KHxdxw2d-Pa&quot;&gt;https://youtube.com/shorts/JLg-B-rs0gE?si=kCWG7KHxdxw2d-Pa&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;LinkedIn Post: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/posts/yasirawan4831_weekabr2-excel-powerabrbi-activity-7480188105535209473-ekdu?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAAFyt-1EB5XKMOcxukQpAzVmx6pIKiXdCz64&quot;&gt;https://www.linkedin.com/posts/yasirawan4831_weekabr2-excel-powerabrbi-activity-&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;continuing-the-journey-&quot;&gt;Continuing the Journey...&lt;/h3&gt;
&lt;p&gt;By the end of the first two weeks, I had gained confidence working with datasets, understanding business requirements, and documenting projects professionally.&lt;/p&gt;
&lt;p&gt;However, the most challenging—and most rewarding—part of the internship was still ahead.&lt;/p&gt;
&lt;p&gt;In the next part of this journey, I'll cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Week 3: Supply Chain Analytics with Python &amp;amp; Power BI&lt;/li&gt;
&lt;li&gt;Week 4: SQL + Power BI Funnel Analysis&lt;/li&gt;
&lt;li&gt;Building production-quality GitHub repositories&lt;/li&gt;
&lt;li&gt;Creating a modern Data Analytics Portfolio Website&lt;/li&gt;
&lt;li&gt;Earning my internship completion certificate&lt;/li&gt;
&lt;li&gt;Key lessons and reflections from the entire experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second half of this journey represents the point where I transitioned from completing internship tasks to building projects that reflect my professional capabilities as a Data Analyst.&lt;/p&gt;
&lt;p&gt;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---------------------------------------------------&lt;br&gt;
&lt;em&gt;#DataAnalytics #Portfolio #SQL #PowerBI #Python #Excel #GitHub #WebDevelopment #LearningInPublic #CareerGrowth #OpenToWork Muhammad Yasir #MuhammadYasir #YasirAwan4831&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;-&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24250/data-analyst-internship-journey-from-learning-fundamentals-building-production-ready</guid>
<pubDate>Fri, 07 Aug 2026 06:12:48 +0000</pubDate>
</item>
<item>
<title>Smart Movie Recommender using Linear SVC</title>
<link>https://coderlegion.com/15179/smart-movie-recommender-using-linear-svc</link>
<description>&lt;h4 id=&quot;project-overview&quot;&gt;&lt;strong&gt;Project Overview&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;This project focuses on building an end-to-end Machine Learning pipeline to analyze user sentiment from IMDB movie reviews. Unlike standard binary classifiers, this system incorporates &lt;strong&gt;Decision Logic&lt;/strong&gt; to identify neutral feedback, providing a more nuanced recommendation: &quot;Recommend,&quot; &quot;Do Not Recommend,&quot; or &quot;Maybe Watch.&quot;&lt;/p&gt;
&lt;h4 id=&quot;how-i-built-it-technical-workflow-&quot;&gt;&lt;strong&gt;How I Built It (Technical Workflow)&lt;/strong&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Advanced Text Preprocessing:&lt;/strong&gt;&lt;br&gt;
Raw text is often noisy. I developed a cleaning pipeline using &lt;strong&gt;NLTK&lt;/strong&gt; and &lt;strong&gt;Regex&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Noise Removal:&lt;/strong&gt; Stripped HTML tags and non-alphabetic characters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Normalization:&lt;/strong&gt; Converted all text to lowercase for consistency.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stopword Removal &amp;amp; Lemmatization:&lt;/strong&gt; Removed common fillers (e.g., &quot;the&quot;, &quot;a&quot;) and reduced words to their dictionary root (e.g., &quot;watched&quot; becomes &quot;watch&quot;) to reduce dimensionality.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Feature Engineering (TF-IDF):&lt;/strong&gt;&lt;br&gt;
To translate text into a language machines understand, I used &lt;strong&gt;TF-IDF (Term Frequency-Inverse Document Frequency)&lt;/strong&gt;. I limited the vocabulary to the &lt;strong&gt;top 5,000 features&lt;/strong&gt; to ensure the model focuses on the most impactful words while ignoring rare noise.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model Implementation:&lt;/strong&gt;&lt;br&gt;
I chose &lt;strong&gt;Linear SVC (Support Vector Classification)&lt;/strong&gt;. It is highly efficient for high-dimensional text data and provides a clear decision boundary between sentiments.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;challenges-amp-solutions&quot;&gt;&lt;strong&gt;Challenges &amp;amp; Solutions&lt;/strong&gt;&lt;/h4&gt;
&lt;h5 id=&quot;1-the-neutral-data-gap&quot;&gt;&lt;strong&gt;1. The Neutral Data Gap&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; The IMDB dataset is strictly binary (Positive/Negative). This meant the model had never &quot;seen&quot; a neutral review, causing it to force-classify &quot;average&quot; movies as either good or bad.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Instead of using &lt;code&gt;model.predict()&lt;/code&gt;, I utilized &lt;code&gt;model.decision_function()&lt;/code&gt;. By calculating how close a review lies to the decision boundary (Thresholding), I was able to manually trigger a &lt;strong&gt;Neutral (0)&lt;/strong&gt; classification for reviews that lacked strong positive or negative conviction.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&quot;2-balancing-overfitting&quot;&gt;&lt;strong&gt;2. Balancing Overfitting&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; Initially, the model showed high training accuracy but lower performance on new data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; I leveraged &lt;strong&gt;L2 Regularization&lt;/strong&gt; (inherent in Linear SVC). By monitoring the gap between training and testing scores, I ensured the model generalized well. Limiting the TF-IDF features also helped prevent the model from &quot;memorizing&quot; specific review noise.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;how-to-use-this-project&quot;&gt;&lt;strong&gt;How To Use This Project&lt;/strong&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Setup:&lt;/strong&gt; Ensure &lt;code&gt;scikit-learn&lt;/code&gt;, &lt;code&gt;pandas&lt;/code&gt;, and &lt;code&gt;nltk&lt;/code&gt; are installed in your Python environment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Input:&lt;/strong&gt; Pass a raw string (movie review) into the &lt;code&gt;get_recommendation&lt;/code&gt; function.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inference Example:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;review = &quot;The visuals were stunning, but the pacing was a bit slow and mediocre.&quot;
print(get_recommendation(review)) 
    
# Result -&amp;gt; Score: 0.04 | Sentiment: 0 | Action: Maybe watch (Neutral)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;final-performance&quot;&gt;&lt;strong&gt;Final Performance&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test Accuracy:&lt;/strong&gt; 88%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generalization:&lt;/strong&gt; The model maintains a balanced F1-score across both classes, proving it is robust against bias and ready for real-world unseen data.&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Launches</category>
<guid isPermaLink="true">https://coderlegion.com/15179/smart-movie-recommender-using-linear-svc</guid>
<pubDate>Sun, 19 Apr 2026 14:49:45 +0000</pubDate>
</item>
<item>
<title>Movie Review Sentiment Analysis</title>
<link>https://coderlegion.com/15178/movie-review-sentiment-analysis</link>
<description>&lt;h4 id=&quot;project-overview-1&quot;&gt;&lt;strong&gt;Project Overview&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;This project focuses on building an end-to-end Machine Learning pipeline to analyze user sentiment from IMDB movie reviews. Unlike standard binary classifiers, this system incorporates &lt;strong&gt;Decision Logic&lt;/strong&gt; to identify neutral feedback, providing a more nuanced recommendation: &quot;Recommend,&quot; &quot;Do Not Recommend,&quot; or &quot;Maybe Watch.&quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;how-i-built-it-technical-workflow--1&quot;&gt;&lt;strong&gt;How I Built It (Technical Workflow)&lt;/strong&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Advanced Text Preprocessing:&lt;/strong&gt;&lt;br&gt;
Raw text is often noisy. I developed a cleaning pipeline using &lt;strong&gt;NLTK&lt;/strong&gt; and &lt;strong&gt;Regex&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Noise Removal:&lt;/strong&gt; Stripped HTML tags and non-alphabetic characters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Normalization:&lt;/strong&gt; Converted all text to lowercase for consistency.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stopword Removal &amp;amp; Lemmatization:&lt;/strong&gt; Removed common fillers (e.g., &quot;the&quot;, &quot;a&quot;) and reduced words to their dictionary root (e.g., &quot;watched&quot; becomes &quot;watch&quot;) to reduce dimensionality.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Feature Engineering (TF-IDF):&lt;/strong&gt;&lt;br&gt;
To translate text into a language machines understand, I used &lt;strong&gt;TF-IDF (Term Frequency-Inverse Document Frequency)&lt;/strong&gt;. I limited the vocabulary to the &lt;strong&gt;top 5,000 features&lt;/strong&gt; to ensure the model focuses on the most impactful words while ignoring rare noise.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model Implementation:&lt;/strong&gt;&lt;br&gt;
I chose &lt;strong&gt;Linear SVC (Support Vector Classification)&lt;/strong&gt;. It is highly efficient for high-dimensional text data and provides a clear decision boundary between sentiments.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h4 id=&quot;challenges-amp-solutions-1&quot;&gt;&lt;strong&gt;Challenges &amp;amp; Solutions&lt;/strong&gt;&lt;/h4&gt;
&lt;h5 id=&quot;1-the-neutral-data-gap-1&quot;&gt;&lt;strong&gt;1. The Neutral Data Gap&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; The IMDB dataset is strictly binary (Positive/Negative). This meant the model had never &quot;seen&quot; a neutral review, causing it to force-classify &quot;average&quot; movies as either good or bad.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Instead of using &lt;code&gt;model.predict()&lt;/code&gt;, I utilized &lt;code&gt;model.decision_function()&lt;/code&gt;. By calculating how close a review lies to the decision boundary (Thresholding), I was able to manually trigger a &lt;strong&gt;Neutral (0)&lt;/strong&gt; classification for reviews that lacked strong positive or negative conviction.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&quot;2-balancing-overfitting-1&quot;&gt;&lt;strong&gt;2. Balancing Overfitting&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; Initially, the model showed high training accuracy but lower performance on new data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; I leveraged &lt;strong&gt;L2 Regularization&lt;/strong&gt; (inherent in Linear SVC). By monitoring the gap between training and testing scores, I ensured the model generalized well. Limiting the TF-IDF features also helped prevent the model from &quot;memorizing&quot; specific review noise.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&quot;how-to-use-this-project-1&quot;&gt;&lt;strong&gt;How To Use This Project&lt;/strong&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Setup:&lt;/strong&gt; Ensure &lt;code&gt;scikit-learn&lt;/code&gt;, &lt;code&gt;pandas&lt;/code&gt;, and &lt;code&gt;nltk&lt;/code&gt; are installed in your Python environment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Input:&lt;/strong&gt; Pass a raw string (movie review) into the &lt;code&gt;get_recommendation&lt;/code&gt; function.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inference Example:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;review = &quot;The visuals were stunning, but the pacing was a bit slow and mediocre.&quot;
print(get_recommendation(review)) 
    
# Result -&amp;gt; Score: 0.04 | Sentiment: 0 | Action: Maybe watch (Neutral)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;final-performance-1&quot;&gt;&lt;strong&gt;Final Performance&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test Accuracy:&lt;/strong&gt; 88%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generalization:&lt;/strong&gt; The model maintains a balanced F1-score across both classes, proving it is robust against bias and ready for real-world unseen data.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
</description>
<category>Launches</category>
<guid isPermaLink="true">https://coderlegion.com/15178/movie-review-sentiment-analysis</guid>
<pubDate>Sun, 19 Apr 2026 14:48:21 +0000</pubDate>
</item>
<item>
<title>Sentiment Analysis Using NLP: Visualizing Emotions in Text with Python and Power BI</title>
<link>https://coderlegion.com/15014/sentiment-analysis-using-nlp-visualizing-emotions-in-text-with-python-and-power-bi</link>
<description>&lt;h3 id=&quot;introduction-2&quot;&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Sentiment analysis&lt;/strong&gt; is one of the most practical applications of &lt;strong&gt;Natural Language Processing (NLP)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In this project, I explore how to perform &lt;strong&gt;sentiment analysis&lt;/strong&gt; on a short story and visualize emotional patterns using &lt;strong&gt;Python&lt;/strong&gt; and &lt;strong&gt;Power BI&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The goal is simple: transform raw text into meaningful insights.&lt;/p&gt;
&lt;p&gt;In this guide, we’ll walk through how to perform sentiment analysis using &lt;strong&gt;NLP&lt;/strong&gt; step-by-step.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;What is Sentiment Analysis in NLP?&lt;/p&gt;
&lt;p&gt;Sentiment analysis is a technique used in &lt;strong&gt;NLP&lt;/strong&gt; to determine whether a piece of text expresses a positive, negative, or neutral emotion.&lt;/p&gt;
&lt;p&gt;It is widely used in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Customer feedback analysis&lt;/li&gt;
&lt;li&gt;Social media monitoring&lt;/li&gt;
&lt;li&gt;Product reviews&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this case, I applied sentiment analysis to a literary text to understand how emotions evolve throughout a story.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Project Idea&lt;/p&gt;
&lt;p&gt;Most people read stories…&lt;/p&gt;
&lt;p&gt;But what if we could analyze how a story feels?&lt;/p&gt;
&lt;p&gt;I used “The Tell-Tale Heart” by Edgar Allan Poe and broke it into smaller segments, then applied sentiment analysis to each part.&lt;/p&gt;
&lt;p&gt;This allowed me to track emotional changes across the narrative.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;How to Analyze Text Using NLP&lt;/p&gt;
&lt;p&gt;The workflow for this project was:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Load and clean the text&lt;/li&gt;
&lt;li&gt;Split the text into segments&lt;/li&gt;
&lt;li&gt;Apply sentiment analysis&lt;/li&gt;
&lt;li&gt;Generate a structured dataset&lt;/li&gt;
&lt;li&gt;Visualize the results&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here’s a simplified Python example:&lt;/p&gt;
&lt;p&gt;from textblob import TextBlob&lt;/p&gt;
&lt;p&gt;text = &quot;I felt nervous and terrified.&quot;&lt;br&gt;
blob = TextBlob(text)&lt;/p&gt;
&lt;p&gt;sentiment = blob.sentiment.polarity&lt;br&gt;
print(sentiment)&lt;/p&gt;
&lt;p&gt;This returns a sentiment score that helps classify the emotional tone of the text.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Building a Sentiment Analysis Dataset&lt;/p&gt;
&lt;p&gt;After processing the text, I created a dataset like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;   Segment  | Label   | Score
   1        | Positive| 0.91
   2        | Negative| 0.45
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This step is critical because it transforms unstructured text into structured data that can be analyzed and visualized.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Visualizing Sentiment Analysis Results Using Power BI&lt;/p&gt;
&lt;p&gt;Once the dataset was ready, I built a dashboard using &lt;strong&gt;Power BI&lt;/strong&gt; to visualize:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Emotional trends over time&lt;/li&gt;
&lt;li&gt;Distribution of positive vs negative segments&lt;/li&gt;
&lt;li&gt;Key moments of emotional intensity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &lt;strong&gt;Sentiment analysis&lt;/strong&gt; dashboard using &lt;strong&gt;NLP&lt;/strong&gt; and &lt;strong&gt;Power BI&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=1985612089013176719&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;This helped turn raw numbers into a clear emotional narrative.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Key Insights from the Analysis&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The story appears mostly positive overall (~56%)&lt;/li&gt;
&lt;li&gt;However, it contains frequent sharp emotional drops&lt;/li&gt;
&lt;li&gt;These drops align with moments of tension and psychological intensity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This shows that even if a story seems balanced overall, emotional spikes reveal its most impactful moments.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;What I Learned&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How to apply sentiment analysis using &lt;strong&gt;NLP&lt;/strong&gt; in a real project&lt;/li&gt;
&lt;li&gt;How to transform text into structured datasets&lt;/li&gt;
&lt;li&gt;How to visualize insights using &lt;em&gt;Power BI&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;The importance of storytelling in &lt;em&gt;data analysis&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Conclusion&lt;/p&gt;
&lt;p&gt;This project demonstrates how sentiment analysis using &lt;strong&gt;NLP&lt;/strong&gt; can go beyond traditional use cases and be applied to creative domains like literature.&lt;/p&gt;
&lt;p&gt;By combining &lt;strong&gt;NLP&lt;/strong&gt; with visualization tools, we can better understand how emotions evolve in any text.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt; Project Links&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Fadydesoky/ai-story-sentiment-analysis&quot;&gt;https://github.com/Fadydesoky/ai-story-sentiment-analysis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/fadydesokysaeedabdelaziz&quot;&gt;https://www.linkedin.com/in/fadydesokysaeedabdelaziz&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you're interested in sentiment analysis using NLP or building real-world data projects, feel free to explore the full project on GitHub or connect with me on LinkedIn.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/15014/sentiment-analysis-using-nlp-visualizing-emotions-in-text-with-python-and-power-bi</guid>
<pubDate>Fri, 17 Apr 2026 00:26:59 +0000</pubDate>
</item>
<item>
<title>Mastering Pandas — Part 3: Data Cleaning, Merging &amp; Joining</title>
<link>https://coderlegion.com/13151/mastering-pandas-part-3-data-cleaning-merging-joining</link>
<description>&lt;h3 id=&quot;real-data-is-never-clean&quot;&gt;Real Data Is Never Clean&lt;/h3&gt;
&lt;p&gt;In Part 2, you learned how to group and slice a DataFrame with precision. But in real projects, the data you receive rarely arrives ready to analyze. Column names have spaces. Ages are negative. Phone numbers mix letters with digits. Duplicate rows sneak in. And your data often lives across multiple files that need to be combined before you can do anything useful.&lt;/p&gt;
&lt;p&gt;This article covers the two skills that bridge raw data and real analysis:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data Cleaning&lt;/strong&gt; — detecting and fixing everything wrong with your data before it corrupts your results&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Merging &amp;amp; Joining&lt;/strong&gt; — combining separate DataFrames into a single, unified dataset&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These topics flow naturally into each other. You clean each source first, then you combine them. That's the order every data analyst follows in practice — and it's the order we'll follow here.&lt;/p&gt;
&lt;p&gt;We'll use this sample dataset throughout the cleaning section:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import pandas as pd
import numpy as np

data = {
    &quot;Name&quot;:             [&quot;Alice&quot;, &quot;bob&quot;, &quot;Carol&quot;, &quot;Alice&quot;, &quot;  dave  &quot;, &quot;Eve&quot;],
    &quot;Age&quot;:              [25, -5, 200, 25, 30, None],
    &quot;Phone&quot;:            [&quot;055-123-4567&quot;, None, &quot;55123x&quot;, &quot;055-123-4567&quot;, &quot;055-987-0000&quot;, &quot;055abc&quot;],
    &quot;Email&quot;:            [&quot;*Emails are not allowed*&quot;, &quot;*Emails are not allowed*&quot;, None, &quot;*Emails are not allowed*&quot;, &quot;*Emails are not allowed*&quot;, &quot;not-an-email&quot;],
    &quot;Paying_Customer&quot;:  [&quot;Y&quot;, &quot;N&quot;, &quot;Yes&quot;, &quot;Y&quot;, &quot;N&quot;, &quot;y&quot;],
    &quot;Score&quot;:            [85, 110, 72, 85, -10, 90],
}
df = pd.DataFrame(data)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-1-inspect-before-you-touch-anything&quot;&gt;Step 1 — Inspect Before You Touch Anything&lt;/h3&gt;
&lt;p&gt;The most important rule in data cleaning: &lt;strong&gt;look before you act&lt;/strong&gt;. Jumping straight into fixes without understanding the full picture leads to mistakes you won't catch until much later.&lt;/p&gt;
&lt;p&gt;These are the inspection tools you should run on every new dataset:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df.shape          # (rows, columns) — how big is this?
df.info()         # column names, data types, non-null counts
df.head()         # first 5 rows
df.tail()         # last 5 rows
df.describe()     # min, max, mean, std — spot impossible values here
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For missing values specifically:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df.isna().sum()           # count NaN per column
df.isnull().sum()         # same as isna() — both work
df[df[&quot;Phone&quot;].notna()]   # rows that actually have a phone number
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For duplicates and inconsistent categories:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df.duplicated()                         # True/False per row
df[df.duplicated()]                     # show only the duplicate rows
df[&quot;Paying_Customer&quot;].value_counts()    # reveals: Y, N, Yes, y — all meaning the same thing
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Always run &lt;code&gt;describe()&lt;/code&gt; on numeric columns&lt;/strong&gt; — the min and max alone will tell you immediately if something is wrong. A minimum age of -5 or a score of 110 out of 100 is a red flag you can't miss.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-2-fix-column-names-first&quot;&gt;Step 2 — Fix Column Names First&lt;/h3&gt;
&lt;p&gt;Messy column names make everything harder. Clean them before anything else, so every subsequent operation uses predictable, consistent names.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rename specific columns:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df.rename(columns={&quot;Old Name&quot;: &quot;New_Name&quot;, &quot;phone number&quot;: &quot;Phone&quot;})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Clean all column names at once — the standard one-liner:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df.columns = df.columns.str.strip().str.lower().str.replace(&quot; &quot;, &quot;_&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This strips surrounding spaces, converts to lowercase, and replaces spaces with underscores in a single chain. After this, &lt;code&gt;&quot;First Name&quot;&lt;/code&gt; becomes &lt;code&gt;&quot;first_name&quot;&lt;/code&gt;, &lt;code&gt;&quot;  Age &quot;&lt;/code&gt; becomes &lt;code&gt;&quot;age&quot;&lt;/code&gt;, and so on.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Before:              After:
&quot;First Name&quot;    →    &quot;first_name&quot;
&quot;  Age &quot;        →    &quot;age&quot;
&quot;Phone Number&quot;  →    &quot;phone_number&quot;
&quot;ZIP Code&quot;      →    &quot;zip_code&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-3-handle-missing-values&quot;&gt;Step 3 — Handle Missing Values&lt;/h3&gt;
&lt;p&gt;Missing values appear as &lt;code&gt;NaN&lt;/code&gt; in Pandas. Before deciding what to do with them, you need to understand &lt;em&gt;why&lt;/em&gt; they're missing — because the right fix depends on the cause.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fill missing values with a fixed value:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[&quot;Phone&quot;].fillna(&quot;000-000-0000&quot;)    # placeholder for missing phone
df[&quot;Age&quot;].fillna(0)                   # fill numeric with 0
df[&quot;Name&quot;].fillna(&quot;Unknown&quot;)          # fill text with label
df[&quot;Score&quot;].fillna(df[&quot;Score&quot;].mean()) # fill with column average
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Fill missing numeric values by estimating from neighbors:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[&quot;Sales&quot;] = df[&quot;Sales&quot;].interpolate()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;interpolate()&lt;/code&gt; fills NaN by calculating the midpoint between the values above and below it. This is ideal for time series or sensor data where values change gradually — it would be wrong to use for random datasets.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Before:     After interpolate():
100         100
NaN    →    150   ← estimated midpoint
200         200
NaN    →    225   ← estimated midpoint
250         250
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Remove rows with missing values:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df.dropna()                            # drop any row with at least one NaN
df.dropna(subset=[&quot;Phone&quot;])            # drop only if Phone is NaN
df.dropna(thresh=3)                    # drop rows that have fewer than 3 non-NaN values
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;inplace&lt;/code&gt; rule:&lt;/strong&gt; use either &lt;code&gt;inplace=True&lt;/code&gt; or variable assignment — never both. They do the same thing, and combining them produces a bug where &lt;code&gt;df&lt;/code&gt; becomes &lt;code&gt;None&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df.dropna(subset=[&quot;Phone&quot;], inplace=True)   # ✅ modifies df directly
df = df.dropna(subset=[&quot;Phone&quot;])            # ✅ returns new df
df = df.dropna(subset=[&quot;Phone&quot;], inplace=True)  # ❌ df becomes None
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-4-remove-duplicates&quot;&gt;Step 4 — Remove Duplicates&lt;/h3&gt;
&lt;p&gt;Duplicate rows silently inflate counts, averages, and totals. Always check for them.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df.drop_duplicates()                         # remove fully identical rows
df.drop_duplicates(subset=[&quot;Name&quot;])          # remove rows with duplicate Name only
df.drop_duplicates(subset=[&quot;Name&quot;, &quot;Email&quot;]) # remove rows where both columns match
df.drop_duplicates(keep=&quot;last&quot;)              # keep the last occurrence instead of the first
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Before:                        After drop_duplicates():
Name   Email                   Name   Email
Alice  *Emails are not allowed*          Alice  *Emails are not allowed*
Bob    *Emails are not allowed*      →     Bob    *Emails are not allowed*
Alice  *Emails are not allowed* ← dup    Carol  *Emails are not allowed*
Carol  *Emails are not allowed*
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-5-fix-data-types&quot;&gt;Step 5 — Fix Data Types&lt;/h3&gt;
&lt;p&gt;Pandas sometimes reads numeric columns as strings, or dates as plain text. Operations on wrong types either crash or silently produce wrong results.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Change column type directly:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[&quot;Zip_Code&quot;] = df[&quot;Zip_Code&quot;].astype(str)     # treat as text, not a number
df[&quot;Age&quot;] = df[&quot;Age&quot;].astype(int)               # convert to integer
df[&quot;Price&quot;] = df[&quot;Price&quot;].astype(float)         # convert to decimal
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Handle messy numbers that contain symbols or text:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[&quot;Price&quot;] = pd.to_numeric(df[&quot;Price&quot;], errors=&quot;coerce&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;errors=&quot;coerce&quot;&lt;/code&gt; converts anything that can't be parsed into &lt;code&gt;NaN&lt;/code&gt; instead of crashing. This is the safe way to clean columns like &lt;code&gt;&quot;$1,200&quot;&lt;/code&gt; or &lt;code&gt;&quot;N/A&quot;&lt;/code&gt; that can't be directly cast with &lt;code&gt;astype()&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Before:           After pd.to_numeric(..., errors=&quot;coerce&quot;):
&quot;1200&quot;    →       1200.0
&quot;$850&quot;    →       NaN     ← couldn't parse
&quot;700.5&quot;   →       700.5
&quot;N/A&quot;     →       NaN     ← couldn't parse
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Convert to datetime:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[&quot;Date&quot;] = pd.to_datetime(df[&quot;Date&quot;])
df[&quot;Date&quot;] = pd.to_datetime(df[&quot;Date&quot;], format=&quot;%d/%m/%Y&quot;)  # specify format if needed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once a column is proper datetime, you unlock sorting by date, filtering by year/month, calculating time differences, and much more.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-6-clean-strings&quot;&gt;Step 6 — Clean Strings&lt;/h3&gt;
&lt;p&gt;String columns are almost always the messiest part of a real dataset. Pandas provides a full &lt;code&gt;.str&lt;/code&gt; accessor with everything you need.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strip unwanted characters from edges:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[&quot;Name&quot;] = df[&quot;Name&quot;].str.strip()           # remove spaces from both sides
df[&quot;Name&quot;] = df[&quot;Name&quot;].str.strip(&quot; ./-&quot;)     # remove spaces, dots, slashes, dashes
df[&quot;Name&quot;] = df[&quot;Name&quot;].str.lstrip()          # left side only
df[&quot;Name&quot;] = df[&quot;Name&quot;].str.rstrip()          # right side only
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Replace characters anywhere in the string:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[&quot;Phone&quot;] = df[&quot;Phone&quot;].str.replace(r&quot;[a-zA-Z]&quot;, &quot;&quot;, regex=True)   # remove all letters
df[&quot;Phone&quot;] = df[&quot;Phone&quot;].str.replace(r&quot;\D&quot;, &quot;&quot;, regex=True)          # keep digits only
df[&quot;Name&quot;]  = df[&quot;Name&quot;].str.replace(r&quot;[./]&quot;, &quot;&quot;, regex=True)         # remove dots and slashes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Standardize text case:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[&quot;Name&quot;] = df[&quot;Name&quot;].str.lower()     # all lowercase → &quot;alice&quot;
df[&quot;Name&quot;] = df[&quot;Name&quot;].str.upper()     # all uppercase → &quot;ALICE&quot;
df[&quot;Name&quot;] = df[&quot;Name&quot;].str.title()     # title case    → &quot;Alice&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Check text content:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[df[&quot;Email&quot;].str.contains(&quot;@&quot;)]           # filter valid-looking emails
df[df[&quot;Phone&quot;].str.len() != 12]             # find rows where phone length is wrong
df[df[&quot;Name&quot;].str.startswith(&quot;A&quot;)]          # names starting with A
df[df[&quot;Name&quot;].str.endswith(&quot;e&quot;)]            # names ending with e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Extract a pattern using regex:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[&quot;Zip&quot;] = df[&quot;Address&quot;].str.extract(r&quot;(\d{5})&quot;)        # pull 5-digit zip code
df[&quot;Area_Code&quot;] = df[&quot;Phone&quot;].str.extract(r&quot;^(\d{3})&quot;)   # pull first 3 digits
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Split one column into multiple columns:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[[&quot;Street&quot;, &quot;State&quot;, &quot;Zip&quot;]] = (
    df[&quot;Address&quot;]
    .str.split(&quot;,&quot;, n=2, expand=True)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;n=2&lt;/code&gt; limits the split to 2 times, producing exactly 3 parts regardless of how many commas the string contains. &lt;code&gt;expand=True&lt;/code&gt; spreads those parts into separate columns.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Before:                              After:
&quot;123 Main St, Texas, 75001&quot;   →   Street=&quot;123 Main St&quot;  State=&quot;Texas&quot;  Zip=&quot;75001&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-7-replace-and-standardize-values&quot;&gt;Step 7 — Replace and Standardize Values&lt;/h3&gt;
&lt;p&gt;Raw data often has the same value written multiple ways: &lt;code&gt;&quot;Y&quot;&lt;/code&gt;, &lt;code&gt;&quot;Yes&quot;&lt;/code&gt;, &lt;code&gt;&quot;yes&quot;&lt;/code&gt;, &lt;code&gt;&quot;y&quot;&lt;/code&gt; — all meaning the same thing. Standardize them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Replace whole cell values using a dictionary:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[&quot;Status&quot;] = df[&quot;Status&quot;].replace({&quot;Y&quot;: &quot;Yes&quot;, &quot;N&quot;: &quot;No&quot;, &quot;y&quot;: &quot;Yes&quot;})

# Apply to multiple columns at once
df[[&quot;Paying_Customer&quot;, &quot;Do_Not_Contact&quot;]] = (
    df[[&quot;Paying_Customer&quot;, &quot;Do_Not_Contact&quot;]]
    .replace({&quot;Y&quot;: &quot;Yes&quot;, &quot;N&quot;: &quot;No&quot;, &quot;y&quot;: &quot;Yes&quot;, &quot;n&quot;: &quot;No&quot;})
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Overwrite invalid values using &lt;code&gt;loc[]&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df.loc[df[&quot;Age&quot;] &amp;lt; 0,   &quot;Age&quot;] = None     # negative age → invalid
df.loc[df[&quot;Age&quot;] &amp;gt; 120, &quot;Age&quot;] = None     # age over 120 → invalid
df.loc[df[&quot;Price&quot;] &amp;lt; 0, &quot;Price&quot;] = None   # negative price → invalid
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Keep valid values, replace everything else with NaN:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df[&quot;Salary&quot;] = df[&quot;Salary&quot;].where(df[&quot;Salary&quot;] &amp;gt; 0)
# Rows where Salary &amp;lt;= 0 become NaN; the rest are untouched
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;now-combine-merging-amp-joining-dataframes&quot;&gt;Now Combine — Merging &amp;amp; Joining DataFrames&lt;/h3&gt;
&lt;p&gt;Once each source is clean, the next challenge is combining them. In the real world, data almost never lives in a single file. You might have orders in one table, customers in another, and products in a third. Merging is how you bring those pieces together.&lt;/p&gt;
&lt;p&gt;Pandas provides three main tools for this:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Tool &lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;merge()&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Joins two DataFrames by matching on a shared column&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;concat()&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Stacks DataFrames vertically or side by side&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;join()&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Joins on the index instead of a column&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;We'll use these two DataFrames for all the examples:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;customers = pd.DataFrame({
    &quot;ID&quot;:        [1, 2, 3, 4],
    &quot;Name&quot;:      [&quot;Alice&quot;, &quot;Bob&quot;, &quot;Carol&quot;, &quot;Dave&quot;],
    &quot;Country&quot;:   [&quot;USA&quot;, &quot;UK&quot;, &quot;India&quot;, &quot;USA&quot;],
})

orders = pd.DataFrame({
    &quot;ID&quot;:        [1, 2, 3, 5],
    &quot;Product&quot;:   [&quot;Laptop&quot;, &quot;Phone&quot;, &quot;Tablet&quot;, &quot;Monitor&quot;],
    &quot;Price&quot;:     [1200, 800, 600, 400],
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice that &lt;code&gt;ID=4&lt;/code&gt; (Dave) exists in &lt;code&gt;customers&lt;/code&gt; but not in &lt;code&gt;orders&lt;/code&gt;, and &lt;code&gt;ID=5&lt;/code&gt; exists in &lt;code&gt;orders&lt;/code&gt; but not in &lt;code&gt;customers&lt;/code&gt;. This is exactly the kind of mismatch you encounter in practice — and why the &lt;code&gt;how=&lt;/code&gt; parameter matters so much.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-merge-the-main-tool&quot;&gt;1️⃣ &lt;code&gt;merge()&lt;/code&gt; — The Main Tool&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;merge()&lt;/code&gt; works like a SQL JOIN. It aligns two DataFrames by finding rows where a shared column has the same value.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Basic syntax:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;customers.merge(orders, how=&quot;inner&quot;, on=&quot;ID&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;the-how-parameter-all-four-types&quot;&gt;The &lt;code&gt;how=&lt;/code&gt; Parameter — All Four Types&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# INNER → only rows that match in both DataFrames (default)
customers.merge(orders, how=&quot;inner&quot;, on=&quot;ID&quot;)
# Result: IDs 1, 2, 3 only — Dave (4) and Monitor (5) are excluded

# LEFT → all rows from the left + matched rows from the right
customers.merge(orders, how=&quot;left&quot;, on=&quot;ID&quot;)
# Result: all 4 customers — Dave gets NaN for Product and Price

# RIGHT → all rows from the right + matched rows from the left
customers.merge(orders, how=&quot;right&quot;, on=&quot;ID&quot;)
# Result: all 4 orders — Monitor (ID=5) gets NaN for Name and Country

# OUTER → all rows from both, NaN where no match
customers.merge(orders, how=&quot;outer&quot;, on=&quot;ID&quot;)
# Result: all 5 unique IDs — gaps filled with NaN on both sides
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;code&gt;how=&lt;/code&gt; &lt;/th&gt;&lt;th&gt;Keeps from Left &lt;/th&gt;&lt;th&gt;Keeps from Right &lt;/th&gt;&lt;th&gt;NaN Possible&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;inner&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Matched only &lt;/td&gt;&lt;td&gt;Matched only &lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;left&lt;/code&gt; &lt;/td&gt;&lt;td&gt;All rows &lt;/td&gt;&lt;td&gt;Matched only &lt;/td&gt;&lt;td&gt;Right side&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;right&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Matched only &lt;/td&gt;&lt;td&gt;All rows &lt;/td&gt;&lt;td&gt;Left side&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;outer&lt;/code&gt; &lt;/td&gt;&lt;td&gt;All rows &lt;/td&gt;&lt;td&gt;All rows &lt;/td&gt;&lt;td&gt;Both sides&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;CROSS merge — every row with every row:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;customers.merge(orders, how=&quot;cross&quot;)
# Produces 4 × 4 = 16 rows — every customer paired with every order
# No on= parameter — it will raise an error if you include it
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h4 id=&quot;the-on-parameter-what-to-match-on&quot;&gt;The &lt;code&gt;on=&lt;/code&gt; Parameter — What to Match On&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Match on a single column
customers.merge(orders, how=&quot;inner&quot;, on=&quot;ID&quot;)

# Match on multiple columns — both must match simultaneously
customers.merge(orders, how=&quot;inner&quot;, on=[&quot;ID&quot;, &quot;Country&quot;])

# Auto-detect — Pandas finds all shared column names automatically
customers.merge(orders)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Be careful with auto-detect.&lt;/strong&gt; If both DataFrames happen to share a column that you don't intend to join on (like a generic &lt;code&gt;&quot;Name&quot;&lt;/code&gt; column), Pandas will include it in the match condition and produce unexpected results. Explicit is safer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h4 id=&quot;handling-shared-column-names-x-and-y&quot;&gt;Handling Shared Column Names — &lt;code&gt;_x&lt;/code&gt; and &lt;code&gt;_y&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;If both DataFrames have a column with the same name, but you only join on &lt;code&gt;ID&lt;/code&gt;, Pandas keeps both copies and renames them automatically:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Both DataFrames have a &quot;Name&quot; column, but you only merge on &quot;ID&quot;
customers.merge(orders, how=&quot;inner&quot;, on=&quot;ID&quot;)
# Result: Name_x (from customers), Name_y (from orders)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Three ways to fix this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Option 1 — merge on all shared columns so no duplicates appear
customers.merge(orders, how=&quot;inner&quot;, on=[&quot;ID&quot;, &quot;Name&quot;])

# Option 2 — use custom suffixes instead of _x and _y
customers.merge(orders, how=&quot;inner&quot;, on=&quot;ID&quot;, suffixes=(&quot;_customer&quot;, &quot;_order&quot;))

# Option 3 — drop the shared column from one DataFrame before merging
orders_clean = orders.drop(columns=[&quot;Name&quot;])
customers.merge(orders_clean, how=&quot;inner&quot;, on=&quot;ID&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h4 id=&quot;other-useful-parameters&quot;&gt;Other Useful Parameters&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# left_on / right_on — when the key column has different names in each DataFrame
customers.merge(orders, how=&quot;inner&quot;, left_on=&quot;CustomerID&quot;, right_on=&quot;OrderID&quot;)

# indicator — adds a column showing where each row came from
customers.merge(orders, how=&quot;outer&quot;, on=&quot;ID&quot;, indicator=True)
# _merge column values: &quot;left_only&quot;, &quot;right_only&quot;, &quot;both&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;indicator=True&lt;/code&gt; parameter is especially useful for auditing: after a merge, you can immediately see which rows matched, which came only from the left, and which came only from the right.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;2-concat-stacking-dataframes&quot;&gt;2️⃣ &lt;code&gt;concat()&lt;/code&gt; — Stacking DataFrames&lt;/h3&gt;
&lt;p&gt;While &lt;code&gt;merge()&lt;/code&gt; combines DataFrames horizontally by matching values, &lt;code&gt;concat()&lt;/code&gt; simply stacks them — either rows on top of rows, or columns side by side.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;pd.concat([df1, df2])        # stack vertically (default)
pd.concat([df1, df2], axis=1)  # stack horizontally
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;axis-parameter&quot;&gt;&lt;code&gt;axis=&lt;/code&gt; Parameter&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# axis=0 → stack rows vertically (append one DataFrame below another)
monthly_data = pd.concat([january, february, march], axis=0)

# axis=1 → stack columns side by side
combined = pd.concat([names_df, scores_df], axis=1)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;join-parameter&quot;&gt;&lt;code&gt;join=&lt;/code&gt; Parameter&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# outer (default) → keep all columns, NaN where a column doesn't exist in one source
pd.concat([df1, df2], join=&quot;outer&quot;)

# inner → keep only columns that exist in all DataFrames
pd.concat([df1, df2], join=&quot;inner&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;ignore-index-parameter&quot;&gt;&lt;code&gt;ignore_index=&lt;/code&gt; Parameter&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Without ignore_index — original indices are preserved, which can repeat
pd.concat([df1, df2])
# Index: 0, 1, 2, 0, 1, 2  ← 0, 1, 2 repeats

# With ignore_index=True — fresh sequential index
pd.concat([df1, df2], ignore_index=True)
# Index: 0, 1, 2, 3, 4, 5  ← clean
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Always use &lt;code&gt;ignore_index=True&lt;/code&gt; after stacking unless you specifically need the original indices.&lt;/p&gt;
&lt;h4 id=&quot;keys-parameter&quot;&gt;&lt;code&gt;keys=&lt;/code&gt; Parameter&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Label each source so you can identify where each row came from
combined = pd.concat([df1, df2], keys=[&quot;source_a&quot;, &quot;source_b&quot;])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This creates a MultiIndex where the first level is your label and the second is the original row index — useful when you need to trace data back to its source after combining.&lt;/p&gt;
&lt;h4 id=&quot;verify-integrity-parameter&quot;&gt;&lt;code&gt;verify_integrity=&lt;/code&gt; Parameter&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Raises an error if any duplicate index values are found after concatenation
pd.concat([df1, df2], verify_integrity=True)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h4 id=&quot;merge-vs-concat-when-to-use-which&quot;&gt;&lt;code&gt;merge()&lt;/code&gt; vs &lt;code&gt;concat()&lt;/code&gt; — When to Use Which&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;code&gt;merge()&lt;/code&gt; &lt;/th&gt;&lt;th&gt;&lt;code&gt;concat()&lt;/code&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Direction &lt;/td&gt;&lt;td&gt;Horizontal (by matching) &lt;/td&gt;&lt;td&gt;Vertical or horizontal (by stacking)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Needs a shared key column &lt;/td&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Best for &lt;/td&gt;&lt;td&gt;Joining related tables &lt;/td&gt;&lt;td&gt;Combining same-structure data&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Equivalent to &lt;/td&gt;&lt;td&gt;SQL JOIN &lt;/td&gt;&lt;td&gt;SQL UNION&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A simple rule: if you're &lt;strong&gt;combining columns from different tables&lt;/strong&gt;, use &lt;code&gt;merge()&lt;/code&gt;. If you're &lt;strong&gt;stacking more rows of the same structure&lt;/strong&gt;, use &lt;code&gt;concat()&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;3-join-index-based-joining&quot;&gt;3️⃣ &lt;code&gt;join()&lt;/code&gt; — Index-Based Joining&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;join()&lt;/code&gt; works like &lt;code&gt;merge()&lt;/code&gt;, but it joins on the &lt;strong&gt;index&lt;/strong&gt; instead of a regular column. You need to set the index first.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;customers_indexed = customers.set_index(&quot;ID&quot;)
orders_indexed    = orders.set_index(&quot;ID&quot;)

customers_indexed.join(orders_indexed, how=&quot;inner&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;how=&lt;/code&gt; options are the same as &lt;code&gt;merge()&lt;/code&gt;: &lt;code&gt;inner&lt;/code&gt;, &lt;code&gt;left&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;outer&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;why-merge-is-almost-always-better&quot;&gt;Why &lt;code&gt;merge()&lt;/code&gt; Is Almost Always Better&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;code&gt;merge()&lt;/code&gt; &lt;/th&gt;&lt;th&gt;&lt;code&gt;join()&lt;/code&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Join on any column &lt;/td&gt;&lt;td&gt;✅ Yes &lt;/td&gt;&lt;td&gt;❌ No — index only&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Join on index &lt;/td&gt;&lt;td&gt;✅ Yes &lt;/td&gt;&lt;td&gt;✅ Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Requires &lt;code&gt;set_index()&lt;/code&gt; first &lt;/td&gt;&lt;td&gt;❌ No &lt;/td&gt;&lt;td&gt;✅ Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Simpler syntax &lt;/td&gt;&lt;td&gt;✅ Yes &lt;/td&gt;&lt;td&gt;⚠️ Extra steps&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;-gt-use-join-only-when-your-data-is-already-indexed-for-example-after-a-groupby-that-produced-a-meaningful-index-otherwise-merge-is-cleaner-and-more-flexible-&quot;&gt;&amp;gt; Use &lt;code&gt;join()&lt;/code&gt; only when your data is already indexed — for example, after a &lt;code&gt;groupby()&lt;/code&gt; that produced a meaningful index. Otherwise, &lt;code&gt;merge()&lt;/code&gt; is cleaner and more flexible.&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;This is Part 3 of the Pandas for Data Science series. Next up: Part 4 — Data Visualization with &lt;strong&gt;Matplotlib &amp;amp; Seaborn&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To access the full article, please visit the link below or directly access the repository via the links below.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Refrences&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Repo : &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Hu8MA/Mastering-Pandas-Reference&quot;&gt;https://github.com/Hu8MA/Mastering-Pandas-Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Website : &lt;a rel=&quot;nofollow&quot; href=&quot;https://pandas.pydata.org/&quot;&gt;https://pandas.pydata.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub Library : &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/pandas-dev/pandas&quot;&gt;https://github.com/pandas-dev/pandas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Course : &lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/Mdq1WWSdUtw&quot;&gt;https://youtu.be/Mdq1WWSdUtw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Full article : &lt;a rel=&quot;nofollow&quot; href=&quot;https://hussein16mahdi.medium.com/mastering-pandas-part-3-data-cleaning-merging-joining-817a070147ca&quot;&gt;https://hussein16mahdi.medium.com/mastering-pandas-part-3-data-cleaning-merging-joining-817a070147ca&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Tutorials</category>
<guid isPermaLink="true">https://coderlegion.com/13151/mastering-pandas-part-3-data-cleaning-merging-joining</guid>
<pubDate>Wed, 18 Mar 2026 23:24:55 +0000</pubDate>
</item>
<item>
<title>Why Most Data Projects Fail Before the First Model Is Built</title>
<link>https://coderlegion.com/12407/why-most-data-projects-fail-before-the-first-model-is-built</link>
<description>&lt;p&gt;&lt;strong&gt;Many organizations invest in AI, analytics, and dashboards — yet most data projects fail before the first model is even built.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When people think about data projects, they often imagine machine learning models, predictive algorithms, and complex pipelines.&lt;/p&gt;
&lt;p&gt;But in reality, most data initiatives fail long before any model is trained.&lt;/p&gt;
&lt;p&gt;Not because the algorithms are weak.&lt;/p&gt;
&lt;p&gt;But because the foundation is broken.&lt;/p&gt;
&lt;h3 id=&quot;the-data-illusion&quot;&gt;The Data Illusion&lt;/h3&gt;
&lt;p&gt;Organizations today generate enormous amounts of data.&lt;/p&gt;
&lt;p&gt;They store logs, transactions, operational records, and performance metrics.&lt;/p&gt;
&lt;p&gt;On paper, everything looks ready for analytics.&lt;/p&gt;
&lt;p&gt;But when teams actually start working with the data, they quickly encounter problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Missing values&lt;/li&gt;
&lt;li&gt;Inconsistent formats&lt;/li&gt;
&lt;li&gt;Conflicting sources&lt;/li&gt;
&lt;li&gt;Undefined metrics&lt;/li&gt;
&lt;li&gt;Poor documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Suddenly, the project shifts from analysis to data archaeology.&lt;/p&gt;
&lt;h3 id=&quot;data-science-starts-with-data-reliability&quot;&gt;Data Science Starts with Data Reliability&lt;/h3&gt;
&lt;p&gt;Before any meaningful analysis can begin, teams must answer fundamental questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the source of truth?&lt;/li&gt;
&lt;li&gt;Who owns the dataset?&lt;/li&gt;
&lt;li&gt;How frequently is it updated?&lt;/li&gt;
&lt;li&gt;What transformations are applied?&lt;/li&gt;
&lt;li&gt;Are definitions consistent across departments?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without clear answers, even the most advanced models produce misleading insights.&lt;/p&gt;
&lt;h3 id=&quot;the-hidden-cost-of-poor-data-foundations&quot;&gt;The Hidden Cost of Poor Data Foundations&lt;/h3&gt;
&lt;p&gt;Many organizations invest heavily in analytics tools, dashboards, and AI platforms.&lt;/p&gt;
&lt;p&gt;But without strong data foundations, these investments create an illusion of intelligence.&lt;/p&gt;
&lt;p&gt;Dashboards become visually impressive but operationally misleading.&lt;/p&gt;
&lt;p&gt;Models generate predictions, but the inputs themselves are unstable.&lt;/p&gt;
&lt;p&gt;This leads to one of the most dangerous outcomes in data work:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;False confidence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Decisions start relying on numbers that appear precise but are fundamentally unreliable.&lt;/p&gt;
&lt;h3 id=&quot;data-engineering-is-the-real-backbone&quot;&gt;Data Engineering Is the Real Backbone&lt;/h3&gt;
&lt;p&gt;In practice, the majority of effort in data projects is not modeling.&lt;/p&gt;
&lt;p&gt;It is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Data cleaning&lt;/li&gt;
&lt;li&gt;Validation&lt;/li&gt;
&lt;li&gt;Schema alignment&lt;/li&gt;
&lt;li&gt;Pipeline reliability&lt;/li&gt;
&lt;li&gt;Monitoring data quality&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is why experienced teams often say:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“80% of data science is data preparation.”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And the better the data infrastructure, the faster meaningful insights appear.&lt;/p&gt;
&lt;h3 id=&quot;a-simple-rule-for-data-teams&quot;&gt;A Simple Rule for Data Teams&lt;/h3&gt;
&lt;p&gt;Before building any model, ask three questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Is the data trustworthy?&lt;/li&gt;
&lt;li&gt;Is the definition of the metric consistent?&lt;/li&gt;
&lt;li&gt;Can the pipeline reproduce the same dataset tomorrow?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the answer to any of these is unclear, the problem is not analytical.&lt;/p&gt;
&lt;p&gt;It is architectural.&lt;/p&gt;
&lt;h3 id=&quot;final-thought&quot;&gt;Final Thought&lt;/h3&gt;
&lt;p&gt;Good data teams do not start with models.&lt;/p&gt;
&lt;p&gt;They start with reliability.&lt;/p&gt;
&lt;p&gt;Because in data systems, accuracy is not created by algorithms.&lt;/p&gt;
&lt;p&gt;It is created by architecture.&lt;/p&gt;
&lt;p&gt;If you're interested in systems thinking, data architecture, and enterprise optimization, feel free to connect.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;LinkedIn:&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/fadydesokysaeedabdelaziz&quot;&gt;https://www.linkedin.com/in/fadydesokysaeedabdelaziz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;GitHub:&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/fadydesoky&quot;&gt;https://github.com/fadydesoky&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/12407/why-most-data-projects-fail-before-the-first-model-is-built</guid>
<pubDate>Thu, 05 Mar 2026 18:45:16 +0000</pubDate>
</item>
<item>
<title>Beyond the Basics: 5 Game-Changing Secrets of SQL Joins and Window Functions</title>
<link>https://coderlegion.com/12308/beyond-the-basics-5-game-changing-secrets-of-sql-joins-and-window-functions</link>
<description>&lt;h3 id=&quot;1-introduction-the-data-relationships-hook&quot;&gt;1. Introduction: The Data Relationships Hook&lt;/h3&gt;
&lt;p&gt;Think of a database as a digital filing cabinet. In this architecture, information is organized into drawers—or schemas—such as HR, Finance, or Sales. Within these drawers sit the documents, which represent our individual tables.&lt;/p&gt;
&lt;p&gt;While this structure ensures clean organization, real-world business intelligence rarely lives in a single drawer. To answer strategic questions, you must bridge the gaps between disparate tables without creating a &quot;data mess&quot;. Whether you are joining sales records with inventory levels or HR data with finance budgets, mastering these relationships is what separates a basic query-writer from a Senior Architect. This guide distills complex SQL operations into high-impact takeaways, focusing on maintaining relational integrity while scaling your analysis.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;2-the-horizontal-vs-vertical-divide-joins-vs-unions&quot;&gt;2. The Horizontal vs. Vertical Divide: Joins vs. Unions&lt;/h3&gt;
&lt;p&gt;The most fundamental distinction in data architecture is how you choose to expand your result set.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Joins&lt;/strong&gt; combine tables &lt;em&gt;horizontally&lt;/em&gt;. They add columns based on a shared key (like a Primary or Foreign Key), making the result set &quot;wider&quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unions&lt;/strong&gt; combine tables &lt;em&gt;vertically&lt;/em&gt;. They stack rows from one dataset on top of another, making the result set &quot;longer&quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a UNION to be architecturally sound, the query must meet three strict structural requirements: the columns must be in the same order, have the same count, and—most importantly—possess matching data types. As an architect, you must remember that the database engine is indifferent to your column aliases but ruthless regarding data types.&lt;/p&gt;
&lt;p&gt;&quot;The database doesn't care about naming but cares about data types in Unions... If a VARCHAR is matched with an INT, the database will throw a mismatch error.&quot; — &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.datawithbaraa.com/wiki/sql&quot;&gt;Data with Baraa&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Mental Model: Distinct vs. All&lt;/strong&gt; From a strategy perspective, think of UNION as a DISTINCT operation for stacked rows; it automatically removes duplicates. If you need the &quot;data as is&quot; without the overhead of deduplication, &lt;strong&gt;UNION ALL&lt;/strong&gt; is your preferred tool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sample Query: Vertical Stacking&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;``-- Combining customer and employee names into a single master list&lt;br&gt;
SELECT first_name, last_name FROM customers&lt;br&gt;
UNION&lt;br&gt;
SELECT first_name, last_name FROM employees&lt;br&gt;
LIMIT 100;&lt;/p&gt;
&lt;h3 id=&quot;-&quot;&gt;``&lt;/h3&gt;
&lt;h3 id=&quot;3-the-workhorse-joins-why-left-is-often-better-than-right&quot;&gt;3. The &quot;Workhorse&quot; Joins: Why Left is Often Better than Right&lt;/h3&gt;
&lt;p&gt;In relational logic, the Inner Join is the default state. When you use the JOIN keyword, SQL is explicitly looking for matching values in the ON statement. If a record in the first table—for example, a customer who hasn't placed an order yet—has no match in the second table, that record &quot;disappears&quot; from the final result set.&lt;/p&gt;
&lt;p&gt;For high-level reporting where data integrity is paramount, the Left Join is the industry workhorse. It preserves every record from the left (first) table and fills missing data from the right table with NULL values. This ensures you don't accidentally drop crucial business entities (like customers or products) simply because they lack transaction history.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Architectural Insight&lt;/strong&gt;: The Right Join is functionally redundant. Any Right Join can be reframed as a Left Join by simply reordering the tables. In production environments, Left Joins are the standard because they align with a left-to-right reading flow, making queries significantly easier to audit and maintain.&lt;/p&gt;
&lt;p&gt;Sample Query: Production-Ready Left Join&lt;br&gt;
``-- Retrieving all customers and any associated event data&lt;br&gt;
SELECT&lt;br&gt;
  c.customer_id,&lt;br&gt;
  c.first_name,&lt;br&gt;
  e.event_name&lt;br&gt;
FROM customers AS c&lt;br&gt;
LEFT JOIN events AS e&lt;br&gt;
  ON c.customer_id = e.customer_id&lt;br&gt;
WHERE c.customer_id IS NOT NULL&lt;br&gt;
LIMIT 500;&lt;/p&gt;
&lt;h3 id=&quot;--1&quot;&gt;``&lt;/h3&gt;
&lt;h3 id=&quot;4-the-cartesian-chaos-understanding-the-cross-join&quot;&gt;4. The Cartesian Chaos: Understanding the Cross Join&lt;/h3&gt;
&lt;p&gt;A Cross Join represents the &quot;Cartesian Product&quot; of two tables. Unlike other joins, it ignores matching values entirely, attaching every row of the second table to every row of the first. If you join a 1,000-row table with a 500-row table, you will generate a massive result set of 500,000 rows.&lt;/p&gt;
&lt;p&gt;In standard relational reporting, Cross Joins are often avoided because they lack the primary/foreign key bond that defines logical relationships. Joining a car table and an item table by a shared color attribute &quot;wouldn't make any sense&quot; for data integrity. However, from a strategic standpoint, Cross Joins are powerful for generating permutations—such as creating a master grid of every possible product-color combination for an inventory audit.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;5-window-functions-grouping-without-the-collapse-&quot;&gt;5. Window Functions: Grouping Without the &quot;Collapse&quot;&lt;/h3&gt;
&lt;p&gt;The true &quot;game-changer&quot; for intermediate learners is the OVER() clause. Traditional GROUP BY operations &quot;collapse&quot; your data, rolling multiple rows into a single aggregate level. While useful for summaries, this loses the individual row detail.&lt;/p&gt;
&lt;p&gt;Window Functions allow you to perform calculations across a result set while keeping every unique row intact. This allows you to view an individual's salary right next to the department average, or calculate a Rolling Total.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strategic Use Case&lt;/strong&gt;: The Rolling Total In finance and healthcare, tracking cumulative sums is vital. By adding an ORDER BY clause inside the OVER() window, you transform a static sum into a running balance.&lt;/p&gt;
&lt;p&gt;Sample Query: Rolling Totals and Averages&lt;br&gt;
&lt;code&gt;-- Calculating a cumulative salary sum and a static department average
SELECT
  first_name,
  gender,
  salary,
  SUM(salary) OVER(PARTITION BY gender ORDER BY employee_id) AS rolling_total,
  AVG(salary) OVER(PARTITION BY gender) AS avg_dept_salary
FROM employees;&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;6-the-ranking-trio-row-number-rank-and-dense-rank&quot;&gt;6. The Ranking Trio: Row Number, Rank, and Dense Rank&lt;/h3&gt;
&lt;p&gt;Sequencing data is a core requirement for leaderboards and performance tracking. SQL offers three nuances for handling ties within a window:&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;- Row Number&lt;/strong&gt;: Assigns a unique, sequential integer to every row (1, 2, 3, 4). Even in the event of a tie, the numbers will not repeat.&lt;br&gt;
**&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;- Rank&lt;/strong&gt;: Assigns the same number to ties but skips the next position based on the count of duplicates. If two rows tie for 1st, the next is 3rd (1, 1, 3). This is &quot;positional&quot; ranking.&lt;br&gt;
**- &lt;/p&gt;
&lt;p&gt; &lt;strong&gt;- Dense Rank&lt;/strong&gt;: Assigns the same number to ties but keeps the next number sequential (1, 1, 2). &lt;/p&gt;
&lt;p&gt;This is &quot;numerical&quot; ranking.&lt;br&gt;
Architectural Preference: DENSE_RANK is typically preferred for professional reporting. It ensures there are no &quot;gaps&quot; in your leaderboard, maintaining a clean hierarchy regardless of how many entities share the same value.7. &lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;conclusion-levelling-up-your-query-game&quot;&gt;Conclusion: Levelling Up Your Query Game&lt;/h3&gt;
&lt;p&gt;Moving from a beginner to an advanced analyst is less about learning syntax and more about understanding the logic of relationships. Every time you approach a new dataset, you must make a strategic choice: do you need to collapse your data into an aggregate summary with a Join or Group By, or do you need to partition it with a Window Function to maintain row-level detail?&lt;/p&gt;
&lt;p&gt;The absolute grounding rule of SQL is that it is a language of relationships. By mastering the nuances of how data stacks vertically via Unions or expands horizontally via Joins, you ensure the relational integrity of your architecture.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/12308/beyond-the-basics-5-game-changing-secrets-of-sql-joins-and-window-functions</guid>
<pubDate>Mon, 02 Mar 2026 07:40:25 +0000</pubDate>
</item>
<item>
<title>Hydrolix buys Quesma tech to keep Kibana dashboards running on cost-efficient data lakes.</title>
<link>https://coderlegion.com/5517/hydrolix-buys-quesma-tech-to-keep-kibana-dashboards-running-on-cost-efficient-data-lakes</link>
<description>&lt;h2 id=&quot;hydrolix-secures-kibana-support-by-acquiring-quesma-gateway-technology&quot;&gt;Hydrolix Secures Kibana Support by Acquiring Quesma Gateway Technology&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Acquisition ensures seamless dashboard integration as data lake platform expands ecosystem reach.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hydrolix has made a strategic move to protect its customers' existing workflows by acquiring intellectual property from Quesma, specifically the gateway proxy technology that enables Kibana integration. This acquisition comes after Quesma announced it would discontinue support for the product, potentially leaving Hydrolix customers without their familiar dashboard interface.&lt;/p&gt;
&lt;h3 id=&quot;why-this-matters-for-developers&quot;&gt;Why This Matters for Developers&lt;/h3&gt;
&lt;p&gt;The acquisition addresses a common challenge in the data analytics space: maintaining familiar tools while upgrading underlying infrastructure. Many organizations have invested heavily in Kibana dashboards, queries, and workflows. When they migrate to more cost-effective platforms like Hydrolix, they want to preserve these investments rather than rebuilding everything from scratch.&lt;/p&gt;
&lt;p&gt;&quot;Many of our customers rely on Kibana as a familiar and powerful interface for monitoring and alerting,&quot; said Marty Kagan, CEO of Hydrolix. &quot;By bringing Quesma's gateway proxy IP in-house, we can guarantee that customers will continue to enjoy seamless interoperability between Kibana dashboards and Hydrolix data.&quot;&lt;/p&gt;
&lt;h3 id=&quot;the-technical-solution&quot;&gt;The Technical Solution&lt;/h3&gt;
&lt;p&gt;Quesma's gateway proxy acts as an intelligent intermediary between Kibana and Hydrolix. When users run queries through Kibana, the gateway translates these requests into the appropriate format for Hydrolix's streaming data lake platform. This translation happens transparently, so users can continue working with their existing dashboards while benefiting from Hydrolix's cost advantages and performance improvements.&lt;/p&gt;
&lt;p&gt;The technology has been integrated into Hydrolix since 2024, giving the company nearly a year of operational experience with the solution. This integration allows organizations to redirect queries from expensive Elasticsearch clusters to Hydrolix's more efficient storage and query engine without changing their front-end tools.&lt;/p&gt;
&lt;h3 id=&quot;beyond-kibana-integration&quot;&gt;Beyond Kibana Integration&lt;/h3&gt;
&lt;p&gt;This acquisition reflects Hydrolix's broader ecosystem strategy. The company doesn't just support Kibana—it also integrates with Splunk, Databricks, Microsoft Fabric, and various machine learning exploration tools. This approach recognizes that different teams within organizations often prefer different tools, and forcing standardization can create adoption barriers.&lt;/p&gt;
&lt;p&gt;The move also demonstrates how Hydrolix is positioning itself in the competitive data lake market. Rather than requiring customers to abandon their existing toolchains, the company is building bridges that make migration easier and less risky.&lt;/p&gt;
&lt;h3 id=&quot;market-context-and-timing&quot;&gt;Market Context and Timing&lt;/h3&gt;
&lt;p&gt;The acquisition comes at a time when organizations are increasingly focused on data infrastructure costs. Traditional log analytics platforms like Elasticsearch can become expensive at scale, particularly when organizations need to retain data for extended periods or handle high-volume ingestion.&lt;/p&gt;
&lt;p&gt;Hydrolix has built its platform specifically to address these cost concerns. The company's streaming data lake can handle up to 20 million events per second while keeping data &quot;hot&quot; and queryable for 15 months or more—something that would be prohibitively expensive with traditional solutions.&lt;/p&gt;
&lt;h3 id=&quot;customer-impact&quot;&gt;Customer Impact&lt;/h3&gt;
&lt;p&gt;For existing Hydrolix customers using the Kibana integration, this acquisition means business as usual. They won't need to worry about losing access to their dashboards or having to rewrite queries. The transition should be seamless, with Hydrolix taking over support and development responsibilities.&lt;/p&gt;
&lt;p&gt;New customers evaluating Hydrolix can also feel confident that their Kibana investments are protected. This removes a significant barrier to adoption, especially for organizations with large teams already trained on Kibana.&lt;/p&gt;
&lt;h3 id=&quot;what-s-next-for-quesma&quot;&gt;What's Next for Quesma&lt;/h3&gt;
&lt;p&gt;While Quesma is exiting the gateway proxy business, the company isn't disappearing entirely. According to Jacek Migdał, founder and CEO of Quesma, the transaction allows his company to focus on its next chapter of product development. The partnership between the companies will continue, though in a different capacity.&lt;/p&gt;
&lt;h3 id=&quot;industry-implications&quot;&gt;Industry Implications&lt;/h3&gt;
&lt;p&gt;This acquisition highlights a broader trend in the data infrastructure market: the importance of ecosystem integration. Companies that build walls around their platforms often struggle to gain adoption, while those that embrace interoperability can capture market share more effectively.&lt;/p&gt;
&lt;p&gt;It also shows how smaller, specialized companies like Quesma can have outsized impact by solving specific integration challenges. Even though Quesma is stepping back from this particular product, their technology will continue to benefit users through Hydrolix.&lt;/p&gt;
&lt;h3 id=&quot;the-bottom-line&quot;&gt;The Bottom Line&lt;/h3&gt;
&lt;p&gt;For developers and data engineers working with log analytics, this acquisition removes uncertainty about Kibana support on the Hydrolix platform. It also demonstrates Hydrolix's commitment to protecting customer investments in existing tools and workflows.&lt;/p&gt;
&lt;p&gt;As organizations continue to grapple with rising data infrastructure costs, solutions that offer both economic advantages and tool compatibility become increasingly valuable. By securing the Quesma technology, Hydrolix has strengthened its position in this competitive market while ensuring its customers can continue using the tools they know and trust.&lt;/p&gt;
</description>
<category>Data Science</category>
<guid isPermaLink="true">https://coderlegion.com/5517/hydrolix-buys-quesma-tech-to-keep-kibana-dashboards-running-on-cost-efficient-data-lakes</guid>
<pubDate>Tue, 23 Sep 2025 13:11:07 +0000</pubDate>
</item>
</channel>
</rss>