Power BI Power Query मध्ये messy sales data clean कसा करायचा
तुम्ही orders ची file download करता, Power BI मध्ये load करता आणि chart बनवता. Total बरोबर वाटतो म्हणून पाठवून देता. दुसऱ्या दिवशी कोणीतरी विचारतं: एक order दोनदा का मोजलाय? Table च्या पहिल्या row मध्ये "Blinkit Maharashtra orders export" का लिहिलंय? Sales column add up का होत नाही? Problem chart मध्ये नव्हता, data मध्ये होता. या chapter मध्ये आपण कोणताही visual बनवण्याआधी Power Query मध्ये file clean करणार, आणि कोणते rows delete करायचे आणि कोणते ठेवायचेच, हे ठरवणारा एक नियम शिकणार.
या chapter मध्ये काय शिकणार
- Get data › Text/CSV › Transform Data
- Remove Top Rows आणि Use First Row as Headers
- ID columns आणि metric columns: काय delete करायचं
- Blank आणि duplicate order IDs काढणं
- NA ऐवजी null, 0 नाही
- "$" च्या आधीचा number काढणं
- Whole Number, Decimal आणि Date types
- Close & Apply नंतर row count check
Practice files: blinkit-orders-small-raw.csv (या page वरचे 12 rows) आणि blinkit-orders-raw.csv (असाच गोंधळ असलेले 315 rows, practice साठी).
काल्पनिक data: इथले सगळे orders, products, stores आणि आकडे practice साठी बनवलेले आहेत. File Maharashtra मधल्या शहरांतल्या Blinkit सारख्या quick-commerce app च्या export सारखी दिसते, पण कोणताही खरा order, दुकान किंवा माणूस वापरलेला नाही. Amounts ₹ मध्ये आणि dates DD-MM-YYYY मध्ये आहेत.
1. Problem काय आहे
Notepad मध्ये उघडली की file अशी दिसते:
| Line | काय दिसतं |
|---|---|
| 1 | Blinkit Maharashtra orders export (fictional practice data),,,,,,,,,,,, – हे title आहे, data नाही |
| 2 | order_id,product_id,store_id,city,order_date,sales,price,revenue,stock,promo_type,promo_bin,delivery_date,Column13 – खरे headers |
| 3 पासून | 12 order rows: काही blank, काही repeat, काहींमध्ये NA |
अशीच report मध्ये load केली तर:
- पहिली line title असल्यामुळे Power BI columns ना Column1, Column2 … म्हणतो.
- BLK1003 आणि BLK1006 दोनदा मोजले जातात.
- "2$" हा text आहे, म्हणून sales चा sum होत नाही.
- Price मधल्या "NA" मुळे column text राहतो, किंवा number केल्यावर errors येतात.
2. सोप्या भाषेत idea
Power Query म्हणजे स्वयंपाकघर, report म्हणजे जेवणाचं टेबल. भाज्या एकदाच स्वयंपाकघरात धुवायच्या आणि चिरायच्या; मग पुढे जे वाढाल ते clean असतं. प्रत्येक cleaning action step म्हणून save होते, आणि refresh केल्यावर Power BI ते steps परत चालवतो.
काय delete करायचं, ते हा एक नियम ठरवतो:
| Column type | उदाहरण | Blank / NA | Duplicates |
|---|---|---|---|
| Primary ID (एक row = एक order) | order_id | row delete | जास्तीचे rows delete |
| Foreign ID (दुसऱ्या table कडे बोट) | product_id, store_id | row delete | ठेवा (एक product अनेक वेळा विकला जातो) |
| Metric (add किंवा average करायचे आकडे) | price, revenue, stock, sales | row ठेवा, NA ऐवजी null | ठेवा |
Metric missing असेल तरी row का ठेवायचा? कारण order तर झालाय ना. एका order चा revenue माहीत नसला तरी तो order "Total orders" मध्ये मोजला जातो, त्याचे units "Sales" मध्ये जातात आणि त्याचं city chart मध्ये दिसतं. Row delete केला तर हे सगळंच जातं.
0 का नाही, null का? Null म्हणजे "माहीत नाही". Power BI चे SUM आणि AVERAGE null सोडून देतात. 0 हा खरा आकडा आहे: तो सांगतो की price शून्य होती, आणि प्रत्येक average खाली ओढतो.
Figure 1. कोणते rows delete करायचे: blank किंवा duplicate primary ID आणि blank foreign ID जातात; metric missing असलेले rows राहतात, रिकाम्या cell मध्ये null (चित्र).
3. Data
12 order rows (line 1 आणि header line दाखवलेली नाही). लक्ष द्यायचे cells bold मध्ये:
| # | order_id | product_id | store_id | city | order_date | sales | price | revenue | stock |
|---|---|---|---|---|---|---|---|---|---|
| 1 | BLK1001 | P101 | PUN01 | Pune | 05-04-2025 | 2$ | 120 | 240 | 35 |
| 2 | BLK1002 | P102 | NSK01 | Nashik | 05-04-2025 | 1$ | 450 | 450 | 12 |
| 3 | BLK1003 | P103 | SLP01 | Solapur | 18-04-2025 | 3$ | NA | 270 | 20 |
| 4 | BLK1003 | P103 | SLP01 | Solapur | 18-04-2025 | 3$ | NA | 270 | 20 |
| 5 | (blank) | P104 | PUN01 | Pune | 20-04-2025 | 1$ | 60 | 60 | 50 |
| 6 | BLK1004 | NA | KOP01 | Kolhapur | 02-05-2025 | 2$ | 80 | 160 | 18 |
| 7 | BLK1005 | P101 | PUN01 | Pune | 05-05-2025 | 4$ | 120 | NA | 33 |
| 8 | BLK1006 | P105 | NSK01 | Nashik | 05-05-2025 | 1$ | 999 | 999 | 7 |
| 9 | BLK1007 | (blank) | SLP01 | Solapur | 12-06-2025 | 2$ | 90 | 180 | 25 |
| 10 | BLK1008 | P102 | KOP01 | Kolhapur | 21-06-2025 | 2$ | 450 | 900 | 10 |
| 11 | BLK1009 | P103 | PUN01 | Pune | 05-07-2025 | 5$ | 90 | 450 | NA |
| 12 | BLK1006 | P105 | NSK01 | Nashik | 05-05-2025 | 1$ | 999 | 999 | 7 |
File मध्ये promo_type, promo_bin, delivery_date आणि रिकामा Column13 पण आहे. promo_bin आणि Column13 कोणत्याच report ला लागत नाहीत, म्हणून ते काढून टाकायचे.
काहीही click करण्याआधी pencil घेऊन अंदाज लावा: कोणते rows उरतील? (उत्तर section 5 मध्ये.)
4. Step by step
File load करा
- Power BI Desktop उघडा. Home › Get data › Text/CSV.
blinkit-orders-small-raw.csvनिवडा आणि Open करा.- Preview window मध्ये Transform Data वर click करा (Load नाही). Power Query Editor उघडतो.
Table चा वरचा भाग नीट करा
- Home › Remove Rows › Remove Top Rows,
1टाका, OK. Title line गेली. - Home › Use First Row as Headers. आता columns ची नावं order_id, product_id वगैरे झाली.
Primary ID: order_id
- order_id चा filter arrow उघडा, (blank) untick करा, OK. Row 5 गेला.
- order_id header select करा. Home › Remove Rows › Remove Duplicates. दुसरा BLK1003 आणि दुसरा BLK1006 गेले.
Foreign ID: product_id
- product_id चा filter arrow उघडा, (blank) आणि NA untick करा, OK. Rows 6 आणि 9 गेले.
- इथे duplicates काढायचे नाहीत. P101, P102, P103, P105 एकापेक्षा जास्त वेळा विकले गेलेत, आणि ते बरोबरच आहे.
नको असलेले columns काढा
- Ctrl+click करून promo_bin आणि Column13 headers select करा, right-click › Remove Columns.
Metric columns: rows ठेवा, values fix करा
- sales header वर right-click › Transform › Extract › Text Before Delimiter,
$टाका, OK. "2$" चा "2" झाला. - sales header च्या डावीकडचा type icon (ABC) › Whole Number.
- price header वर right-click › Replace Values. Value To Find:
NA. Replace With: रिकामं ठेवा. Advanced options उघडून Match entire cell contents tick करा. OK. - price चा type Decimal Number करा. रिकाम्या cell मध्ये आता null दिसतो.
- revenue साठी steps 13 आणि 14 करा.
- stock साठी step 13 करा, आणि type Whole Number करा.
DD-MM-YYYY मधल्या dates
- order_date वर right-click › Change Type › Using Locale…. Data Type: Date. Locale: English (India). OK.
- delivery_date साठी पण तेच करा.
Load करा आणि check करा
- Home › Close & Apply.
- Table view मध्ये जा (डावीकडचा grid icon) आणि screen च्या खाली row count वाचा.
Figure 2. Cleaning steps क्रमाने, आणि प्रत्येक step नंतर 12-row file चा row count (चित्र).
5. तुमचा result असा दिसला पाहिजे
Table view मध्ये 7 rows:
| order_id | product_id | store_id | city | order_date | sales | price | revenue | stock |
|---|---|---|---|---|---|---|---|---|
| BLK1001 | P101 | PUN01 | Pune | 05-04-2025 | 2 | 120 | 240 | 35 |
| BLK1002 | P102 | NSK01 | Nashik | 05-04-2025 | 1 | 450 | 450 | 12 |
| BLK1003 | P103 | SLP01 | Solapur | 18-04-2025 | 3 | null | 270 | 20 |
| BLK1005 | P101 | PUN01 | Pune | 05-05-2025 | 4 | 120 | null | 33 |
| BLK1006 | P105 | NSK01 | Nashik | 05-05-2025 | 1 | 999 | 999 | 7 |
| BLK1008 | P102 | KOP01 | Kolhapur | 21-06-2025 | 2 | 450 | 900 | 10 |
| BLK1009 | P103 | PUN01 | Pune | 05-07-2025 | 5 | 90 | 450 | null |
(Table view तुमच्या computer च्या date format मध्ये dates दाखवतो; dates त्याच असतात.)
हाताने check करा:
| Check | Value |
|---|---|
| Rows | 7 |
| Sales (units) चा sum | 2 + 1 + 3 + 4 + 1 + 2 + 5 = 18 |
| Revenue चा sum | 240 + 450 + 270 + 999 + 900 + 450 = ₹3,309 (BLK1005 null आहे, तो सोडला जातो) |
| Average price | (120 + 450 + 120 + 999 + 450 + 90) ÷ 6 = ₹371.50 |
6. काय झालं
| Step | उरलेले rows | का |
|---|---|---|
| Headers नंतर | 12 | title line गेली, सगळे orders आहेत |
| Blank order_id काढले | 11 | order number नसलेला row order म्हणून मोजता येत नाही |
| Duplicate order_id काढले | 9 | BLK1003 आणि BLK1006 दोनदा होते |
| Blank / NA product_id काढले | 7 | product नसलेली order line product table शी जोडता येत नाही |
| Metric steps (sales, price, revenue, stock) | 7 | values fix झाल्या; एकही row delete झाला नाही |
शेवटची line लक्षात ठेवा: metric steps values बदलतात, rows ची संख्या कधीच नाही.
Classroom line
Never leave NA in an ID column. Never leave null there either.
Class मधलं वाक्य
"ID column madhe kadich NA thevayche nahit. Null thevayche nahit."
ID column मध्ये कधीच NA ठेवायचे नाहीत. Null पण ठेवायचे नाहीत.
Classroom line
Never leave NA in an ID column. Never leave null there either.
7. अजून थोडं खोलात
- प्रत्येक click एक step आहे. उजवीकडे Applied Steps बघा: Source, Promoted Headers, Filtered Rows, Removed Duplicates… कोणत्याही step वर click केलं की त्या क्षणाचा data दिसतो. पुढच्या chapter मध्ये error fix करायला हेच वापरणार आहोत.
- रिकामे cells आपोआप null होतात. Number column मध्ये रिकामा cell असेल तर type बदलल्यावर तो null होतो. "NA", "-" किंवा "n/a" सारखा text तसा होत नाही; तो आधी replace करावा लागतो.
- "Match entire cell contents" का? ते नसेल तर त्याच column मधल्या मोठ्या value मधले NA अक्षरं पण replace होतात, जसं "NA-12" चं "-12" होईल. Tick केलं की फक्त पूर्ण NA असलेले cells बदलतात.
- Dates साठी Using Locale का? English (United States) वर set असलेला computer 05-04-2025 ला 4 May वाचतो. File English (India) आहे असं सांगितलं की ती 5 April होते. बदलल्यानंतर तुम्हाला माहीत असलेली एक date check करा.
- मोठ्या files साठी computer महत्त्वाचा. Power BI Desktop Windows वर चालतो आणि data memory मध्ये ठेवतो, म्हणून मोठ्या files ना RAM लागते. Hexa-core processor म्हणजे 6 cores असलेला एक CPU; जास्त cores आणि जास्त RAM मुळे refresh fast होतो. Power BI अडकला तर Task Manager (Ctrl+Shift+Esc) उघडा, आणि तो सतत "Not responding" असेल तरच Power BI चा task end करा, कारण save न केलेलं काम जातं.
8. नेहमीच्या चुका
| चुकीचा result | कारण | उपाय |
|---|---|---|
| Columns ची नावं Column1, Column2 … | Title line header म्हणून वापरली | Remove Top Rows (1), मग Use First Row as Headers |
| 7 ऐवजी 6 rows | price मधला NA filter arrow ने काढला, त्यामुळे BLK1003 delete झाला | तो Filtered Rows step delete करा; price वर Replace Values वापरा |
| 7 ऐवजी 5 rows | price आणि revenue दोन्हीमधून NA filter केला | दोन्ही columns साठी तोच उपाय |
| Average price ₹371.50 ऐवजी ₹318.43 | NA ऐवजी 0 टाकला, म्हणून 2,229 ला 6 ऐवजी 7 ने भागलं | NA रिकाम्या value ने replace करा, म्हणजे null होईल |
| P101, P102 … एकदाच दिसतात आणि orders गायब | product_id वर Remove Duplicates चालवलं | Duplicates फक्त primary ID वर काढा |
| sales अजून डावीकडे (text) | "$" काढला पण type बदलला नाही | sales Whole Number करा |
| 05-04-2025 ही 4 May दिसते | Computer च्या US locale ने type बदलला | Change Type › Using Locale › English (India) |
Classroom line
If you filter this out, the whole row goes, not just the one cell.
Class मधलं वाक्य
"Jar tumi he kadhun taklat... tar akkha row nighun jato."
जर तुम्ही हे काढून टाकलं, तर फक्त एक cell नाही, अख्खा row निघून जातो.
Classroom line
If you filter this out, the whole row goes, not just the one cell.
Ravindra Bagale's Tip
Before you click Close & Apply, write down how many rows you expect and why. If Table view shows fewer, open Applied Steps and click each step from the top until the count drops: the step where it drops is the step that deleted good rows.
Ravindra Bagale's Tip – मराठी
Close & Apply करण्याआधी किती rows यायला पाहिजेत आणि का, ते लिहून ठेवा. Table view मध्ये कमी rows दिसले, तर Applied Steps उघडा आणि वरून एक एक step वर click करा. ज्या step ला count कमी होतो, त्याच step ने चांगले rows delete केलेत.
Ravindra Bagale's Tip – हिंदी
Close & Apply करने से पहले लिखकर रखिए कि कितने rows आने चाहिए और क्यों. Table view में कम rows दिखें, तो Applied Steps खोलिए और ऊपर से एक-एक step पर click कीजिए. जिस step पर count कम होता है, उसी step ने अच्छे rows delete किए हैं.
9. स्वतः practice करा
Practice task
blinkit-orders-raw.csv (315 order rows) याच steps ने clean करा.
- Table view मध्ये किती rows दिसतात?
- Sales (units) चा sum किती?
- Revenue चा sum किती?
- price, revenue आणि stock मध्ये किती nulls आहेत?
Hints: file मध्ये 12 blank order IDs आणि 15 repeat झालेले order rows आहेत. काही revenue cells NA नाहीत, रिकामे आहेत: ते replace न करताच null होतात.
Solution बघा
| Step | Rows |
|---|---|
| Headers नंतर | 315 |
| Blank order_id काढले | 303 |
| Duplicates काढले | 288 |
| Blank / NA product_id काढले | 274 |
- 274 rows.
- Sales चा sum: 664 units.
- Revenue चा sum: ₹1,69,509 (default format मध्ये Power BI 169,509 दाखवतो).
- price: 18 nulls, revenue: 22 nulls (14 NA होते, 8 रिकामे), stock: 10 nulls.
256 rows आले तर तुम्ही price मधून NA filter केलाय. 234 आले तर price आणि revenue दोन्हीमधून.
10. Professional सारखा विचार करा
- Business view. Revenue missing असणं हा source team साठी प्रश्न आहे, order घालवण्याचं कारण नाही. Row ठेवा, notes मध्ये null count लिहा ("22 orders चा revenue export मध्ये नाही") आणि team ला source मध्येच fix करायला सांगा.
- Performance. नको असलेले columns लवकर काढा. कमी columns म्हणजे छोटं model आणि fast refresh.
- Maintenance. पुन्हा शोधावे लागतील ते steps rename करा (step वर right-click › Rename, उदा. "Removed blank order_id"). पुढच्या महिन्याची file refresh वर याच steps मधून जाते.
- प्रत्येक refresh ला check. Hidden check page वर row-count card ठेवा. Refresh नंतर count अचानक कमी झाला, तर export बदललाय.
Interview questions
- ID blank असेल तर कोणते rows delete करता, आणि metric blank असेल तर? Primary किंवा foreign ID blank असलेले rows delete; metric blank असलेले rows ठेवायचे, metric null ठेवायचा.
- NA ऐवजी 0 का नाही, null का? SUM आणि AVERAGE null सोडून देतात; 0 मोजला जातो आणि averages चुकतात.
- Duplicates कुठे काढता? फक्त primary key वर, उदा. order_id.
- Locale ने Change Type का? Computer चं region काहीही असो, DD-MM-YYYY dates day-month म्हणूनच वाचल्या जाव्यात म्हणून.
Recap
थोडक्यात
- Transform Data ने load करा, मग Remove Top Rows आणि Use First Row as Headers.
- Primary ID: blanks आणि duplicates काढा. Foreign ID: blanks काढा, duplicates ठेवा.
- Metric columns: rows कधीच delete नाहीत; NA ऐवजी null.
- "$" च्या आधीचा number काढा, बरोबर types लावा; dates साठी English (India).
- Row count check करा: छोट्या file साठी 12 → 11 → 9 → 7.
उजळणी card