Skip to content

Commit 0c5ddd7

Browse files
authored
docs: add Power BI result presentation section
2 parents 1f6f57f + ea8b75a commit 0c5ddd7

352 files changed

Lines changed: 93311 additions & 3 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitattributes

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
# Auto detect text files and perform LF normalization
22
* text=auto
3+
4+
# Power BI LFS
5+
*.pbix filter=lfs diff=lfs merge=lfs -text

README.md

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,40 @@
88
## Overview
99
Small to mid-sized organizations are trapped in a cycle where they outgrow the capabilities of spreadsheets but lack the technical infrastructure to migrate to databases. This creates a "structural debt" where the very tools that allow a business to be agile (spreadsheets) are the same tools that make their data fundamentally untrustworthy for scaling or reporting.
1010

11-
### The Solution
11+
## The Result: Operational Decision Systems
12+
The ultimate purpose of this defensive architecture is to serve the **Presentation Layer** with absolute reliability. By the time data reaches Power BI, it has been stripped of anomalies, structurally validated, and semantically flattened.
13+
14+
Because the pipeline utilizes **Atomic View Swaps** in BigQuery, the semantic models are updated instantaneously. This guarantees that Power BI scheduled refreshes (Import Mode) never encounter locked tables or partial data, resulting in zero downtime for business consumers.
15+
16+
> **Dynamic Sensitivity Calibration**
17+
>
18+
>The reporting suite features interactive "Smoke Detectors." Built with dynamic What-If parameters, these dashboards allow operators to manually adjust alert sensitivity thresholds to match changing business realities (e.g., loosening thresholds during peak holiday seasons).
19+
>
20+
> Explore the **[Power BI Directory](/power_bi)** to read detailed [operational guides](/power_bi/docs) or download the `.pbix` [releases](/power_bi/releases/).
21+
22+
### Customer Experience & Revenue Exposure
23+
A decision-support system designed to monitor financial risk driven by fulfillment failures. It correlates delivery delays with buyer drop-off rates, allowing leadership to quantify the "cost of friction."
24+
25+
* **Calibration Mechanism:** Utilizes a **Delay Threshold Parameter** to dynamically define what constitutes a critical "Danger Zone" for segment and regional prioritization.
26+
27+
![Customer Experince Image](/assets/screenshots/customer-experience-monitor.png)
28+
29+
### Fulfillment Decision Monitor
30+
An operational early-warning system that identifies logistics partners and sellers requiring immediate intervention by focusing on statistical deviations in network speed rather than absolute failure.
31+
32+
* **Calibration Mechanism:** Controlled via **Standard Deviation & Slippage Thresholds** to filter out normal variance and flag true systemic slowdowns.
33+
34+
![Fulfillment Decision Monitor](/assets/screenshots/seller-fulfillment-monitor.png)
35+
36+
### Product Friction Monitor
37+
38+
Designed to identify physical and structural fulfillment bottlenecks driven by product specifications (e.g., weight-driven outliers).
39+
40+
* **Calibration Mechanism:** Leverages **Standard Deviation & Slippage Thresholds** applied to *lead-time volatility*, alerting operations teams to route oversize items to specialized freight before delays impact the customer.
41+
42+
![Product Friction Monitor](/assets/screenshots/product-friction-monitor.png)
43+
44+
## The Solution
1245
This project solves that challenge by delivering a highly resilient, event-driven data pipeline on Google Cloud Platform for reliable operational analytics. It guarantees data integrity through a strict Medallion architecture (Bronze, Silver, Gold) that relies on rigid data contracts and validation gates to catch and isolate bad data early in the lifecycle.
1346

1447
### Defensive Pipeline Architecture
@@ -182,16 +215,20 @@ operations-analytics-pipeline/
182215
│ ├── shared/ # Extractor logic and core I/O utilities
183216
│ └── run_extract.py # The Drive extractor orchestrator
184217
├── data_pipeline/
218+
│ ├── .shared/ # Storage adapters, IO wrappers, and registry configurations
185219
│ ├── assembly/ # Delta merging and event mapping logic (Gold Pre-processing)
186220
│ ├── contract/ # Subtractive filtering logic (Silver Layer)
187221
│ ├── publish/ # Manages the atomic publish lifecycle of semantic datasets
188222
│ ├── semantic/ # Fact/Dimension table builders (Gold Layer)
189-
│ ├── shared/ # Storage adapters, IO wrappers, and registry configurations
190223
│ ├── validation/ # Dual-pass structural data validation gates
191224
│ └── run_pipeline.py # The pipeline orchestrator and state manager
192225
├── docs/ # Detailed architectural and stage-level system contracts
193226
├── runtime/ # Git-ignored ephemeral workspace used by the local pipeline executor
194-
└── tests/ # Pytest suite for pipeline logic and validation rules
227+
├── tests/ # Pytest suite for pipeline logic and validation rules
228+
└── power_bi/
229+
├── .shared/ # Global Dashboards BI assets (e.g. Themes, .json files, etc.)
230+
├── dashboards/ # Source Control (PBIP)
231+
└──releases # Deliverables (PBIX)
195232
```
196233

197234
## CI/CD & Security
458 KB
Loading
601 KB
Loading
743 KB
Loading
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
let
2+
SourceFact = // fact table,
3+
MaxDateInFact = Date.From(List.Max(SourceFact[week_start_date])),
4+
5+
// List of dates
6+
StartDate = #date(2022, 12, 26),
7+
EndDate = MaxDateInFact,
8+
CalendarList = List.Dates(StartDate, Duration.Days(EndDate - StartDate) + 1, #duration(1, 0, 0, 0)),
9+
10+
// Convert to table
11+
#"Converted to Table" = Table.FromList(CalendarList, Splitter.SplitByNothing(), {"Date"}, null, ExtraValues.Error),
12+
#"Changed Type" = Table.TransformColumnTypes(#"Converted to Table",{{"Date", type date}}),
13+
14+
// Date format columns
15+
#"Added Year" = Table.AddColumn(#"Changed Type", "Year", each Date.Year([Date]), Int64.Type),
16+
#"Added Month" = Table.AddColumn(#"Added Year", "Month", each Date.Month([Date]), Int64.Type),
17+
#"Added Month Name" = Table.AddColumn(#"Added Month", "Month Name", each Date.MonthName([Date]), type text),
18+
#"Added Year Month" = Table.AddColumn(#"Added Month Name", "Year Month", each Text.From([Year]) & "-" & Text.PadStart(Text.From([Month]), 2, "0"), type text),
19+
#"Added Week Number" = Table.AddColumn(#"Added Year Month", "Week Number", each " W" & Text.PadStart(Text.From(Date.WeekOfYear([Date])), 2, "0"), type text),
20+
// #"Added Year Week" = Table.AddColumn(#"Added Year Month", "Year Week", each Text.From([Year]) & " W" & Text.PadStart(Text.From(Date.WeekOfYear([Date])), 2, "0"), type text),
21+
#"Added Week Start Date" = Table.AddColumn(#"Added Week Number", "Week Start Date", each Date.StartOfWeek([Date], Day.Monday), type date)
22+
in
23+
#"Added Week Start Date"
Lines changed: 98 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)