Real-world data नेहमी perfect नसतो. CSV किंवा text file मध्ये एखाद्या student चे age, employee चे salary, sensor चे reading किंवा product चे price missing असू शकते.
NumPy मध्ये clean numeric text data load करण्यासाठी np.loadtxt() उपयोगी आहे. पण missing values असलेल्या text data साठी np.genfromtxt() जास्त flexible आहे.
1. Learning Outcomes#
या chapter नंतर तुम्हाला:
- text data मधील missing value म्हणजे काय ते समजेल
np.genfromtxt()कधी आणि का वापरायचे ते समजेलdelimiterवापरून columns योग्य प्रकारे parse करता येतीलskip_headerवापरून header rows skip करता येतीलusecolsवापरून आवश्यक columns निवडता येतीलmissing_valuesवापरूनNAसारखे missing markers ओळखता येतीलfilling_valuesवापरून missing data साठी replacement देता येईल- missing numeric values
NaNम्हणून load करता येतील - loading करताना
dtypeची भूमिका समजेल dtype=Noneकधी उपयोगी पडू शकते याची basic awareness मिळेलnp.loadtxt()आणिnp.genfromtxt()मधील practical फरक समजेल- inconsistent rows आणि genuine missing fields यातील फरक समजेल
- loaded array चे
shapeआणिdtypeतपासता येतील np.isnan()वापरून missing values शोधता येतील- analysis सुरू करण्यापूर्वी parsed data validate करता येईल
2. Text Data मध्ये Missing Value म्हणजे काय?#
समजा आपल्याकडे student data आहे:
| Name | Age | Score |
|---|---|---|
| Asha | 21 | 88 |
| Ravi | missing | 74 |
| Neha | 23 | missing |
पहिल्या student ची दोन्ही numeric values उपलब्ध आहेत.
पण Ravi चे Age नाही.
Neha चा Score नाही.
ही unavailable values म्हणजे missing values.
Text file मध्ये missing value वेगवेगळ्या प्रकारे दिसू शकते:
| Source value | Meaning |
|---|---|
| रिकामी field | value दिलेली नाही |
NA |
Not Available |
N/A |
Not Available |
? |
unknown value |
missing |
explicitly missing |
| custom marker | system-specific missing indicator |
उदाहरणार्थ comma-separated row Ravi,,74 मध्ये दोन commas मधली जागा रिकामी आहे.
याचा अर्थ त्या column ची value missing आहे.
Missing value आणि 0 एकच गोष्ट नाही. 0 ही valid numeric value असू शकते. Missing म्हणजे value उपलब्ध नाही.
3. Missing Values असताना Normal Loading का अवघड होते?#
NumPy array मध्ये साधारणपणे एका array मधील values एक consistent dtype follow करतात.
जर data पूर्णपणे numeric असेल तर parsing सोपे असते.
पण file मध्ये numeric value च्या जागी NA आले तर parser समोर problem येते:
88 हे number आहे.
पण NA number नाही.
त्यामुळे loader ला सांगावे लागते:
- columns कसे वेगळे करायचे
- header कुठे आहे
- कोणते columns load करायचे
- कोणती value missing समजायची
- missing value च्या जागी काय ठेवायचे
- final numeric type कोणता असावा
हा पूर्ण flow असा समजा:
Rendering diagram…
Diagram could not be rendered.
यात np.genfromtxt() अनेक parsing decisions एकाच loading operation मध्ये manage करू शकते.
4. np.genfromtxt()#
np.genfromtxt() ही NumPy function text-based data load करण्यासाठी वापरली जाते.
विशेषतः data मध्ये missing values किंवा mixed parsing requirements असतील तर ती उपयोगी पडते.
Basic form:
import numpy as np
data = np.genfromtxt("students.csv")पण real files साठी फक्त filename पुरेसे नसते.
आपल्याला अनेकदा delimiter, skip_header, usecols, missing_values, filling_values आणि dtype सांगावे लागतात.
एक practical form:
import numpy as np
data = np.genfromtxt(
"students.csv",
delimiter=",",
skip_header=1,
usecols=(1, 2),
dtype=float,
missing_values="NA",
filling_values=np.nan
)आत्ता प्रत्येक parameter step-by-step समजून घेऊ.
5. delimiter Parameter#
delimiter parser ला सांगतो की एका row मधील वेगवेगळ्या fields कोणत्या character ने separate केल्या आहेत.
Comma-separated file असेल तर:
delimiter=","Semicolon-separated file असेल तर:
delimiter=";"Tab-separated data साठी tab delimiter वापरता येतो.
छोटा Example#
Source data conceptually असा आहे:
| Name | Age | Score |
|---|---|---|
| Asha | 21 | 88 |
| Ravi | missing | 74 |
| Neha | 23 | missing |
जर text source मध्ये fields comma ने separated असतील तर loader ला comma सांगणे आवश्यक आहे.
data = np.genfromtxt(
"students.csv",
delimiter=","
)File comma-separated असताना delimiter=";" दिला तर parser योग्य columns तयार करू शकणार नाही.
म्हणून delimiter अंदाजाने देऊ नका.
Source file प्रत्यक्षात कोणता separator वापरतो ते तपासा.
6. skip_header#
CSV files मध्ये पहिली row अनेकदा column names ठेवते.
उदाहरण:
| student | age | score |
|---|---|---|
| Asha | 21 | 88 |
| Ravi | missing | 74 |
इथे student, age, score ही data values नाहीत.
ते headers आहेत.
जर आपल्याला numeric data load करायचा असेल तर header skip करणे आवश्यक असू शकते.
data = np.genfromtxt(
"students.csv",
delimiter=",",
skip_header=1
)skip_header=1 म्हणजे सुरुवातीची एक line ignore करा.
जर file च्या सुरुवातीला दोन metadata lines असतील तर:
skip_header=2skip_header columns skip करत नाही. तो file च्या सुरुवातीच्या rows किंवा lines skip करतो.
7. usecols#
कधी file मध्ये अनेक columns असतात, पण आपल्याला फक्त काही numeric columns आवश्यक असतात.
समजा file मध्ये:
| Column Position | Column |
|---|---|
| 0 | Name |
| 1 | Age |
| 2 | Score |
| 3 | City |
आपल्याला फक्त Age आणि Score load करायचे आहेत.
मग:
usecols=(1, 2)Complete example:
data = np.genfromtxt(
"students.csv",
delimiter=",",
skip_header=1,
usecols=(1, 2),
dtype=float
)इथे:
- column
1म्हणजेAge - column
2म्हणजेScore
usecols मुळे unnecessary columns load करण्याची गरज राहत नाही. विशेषतः text columns असलेल्या file मधून फक्त numeric columns काढताना हे खूप उपयोगी आहे.
8. Missing Numeric Fields Load करणे#
आता actual missing fields पाहू.
आपला source data असा आहे:
| Name | Age | Score |
|---|---|---|
| Asha | 21 | 88 |
| Ravi | missing | 74 |
| Neha | 23 | missing |
Learning example runnable ठेवण्यासाठी आपण StringIO वापरणार आहोत.
StringIO string ला file सारखे वाचण्यास मदत करते.
हा NumPy concept नाही; फक्त example साठी convenient source आहे.
import numpy as np
from io import StringIO
raw_data = """name,age,score
Asha,21,88
Ravi,,74
Neha,23,
"""
data = np.genfromtxt(
StringIO(raw_data),
delimiter=",",
skip_header=1,
usecols=(1, 2),
dtype=float
)
print(data)Expected Output#
[[21. 88.]
[nan 74.]
[23. nan]]आता हे output समजून घेऊ.
पहिली row:
21 आणि 88 दोन्ही values उपलब्ध आहेत.
म्हणून array मध्ये 21. आणि 88. आले.
दुसऱ्या row मध्ये age missing होती.
म्हणून त्या जागी nan आले.
तिसऱ्या row मध्ये score missing होती.
म्हणून त्या जागीही nan आले.
nan म्हणजे Not a Number.
पण इथे त्याचा practical उपयोग missing numeric value represent करण्यासाठी होत आहे.
9. NaN चा Mental Model#
NaN ला अशी temporary information समजा:
"या numeric position वर सध्या usable number उपलब्ध नाही."
त्यामुळे आपण actual 0 टाकून data चा अर्थ बदलत नाही.
Missing value handling चा flow असा दिसतो:
Rendering diagram…
Diagram could not be rendered.
NaN म्हणजे zero नाही. NaN म्हणजे missing किंवा undefined numeric information represent करणारी special floating-point value.
10. missing_values#
Real files मध्ये missing value नेहमी blank field म्हणून येईलच असे नाही.
काही datasets मध्ये:
NA
किंवा:
N/A
किंवा:
?
असा marker असू शकतो.
missing_values parameter वापरून आपण parser ला सांगू शकतो की कोणती value missing म्हणून treat करायची.
उदाहरण:
| ID | Score |
|---|---|
| 101 | 88 |
| 102 | NA |
| 103 | 76 |
Code:
import numpy as np
from io import StringIO
raw_data = """id,score
101,88
102,NA
103,76
"""
data = np.genfromtxt(
StringIO(raw_data),
delimiter=",",
skip_header=1,
dtype=float,
missing_values="NA",
filling_values=np.nan
)
print(data)Expected Output#
[[101. 88.]
[102. nan]
[103. 76.]]इथे NA हा text आहे.
पण आपण:
missing_values="NA"असे सांगितले.
म्हणून NumPy ने NA ला normal numeric value म्हणून convert करण्याचा प्रयत्न केला नाही.
त्याने ती missing value म्हणून ओळखली.
11. filling_values#
Missing value ओळखल्यानंतर पुढचा प्रश्न असतो:
त्या जागी ठेवायचे काय?
यासाठी filling_values वापरतो.
उदाहरण:
filling_values=np.nanयाचा अर्थ:
missing value आढळली तर np.nan वापरा.
काही परिस्थितीत:
filling_values=0असेही करता येते.
पण इथे मोठी practical काळजी आहे.
Missing value ला blindly 0 ने replace करू नका. 0 हा genuine observation असू शकतो. त्यामुळे average, total आणि इतर analysis चुकीचे होऊ शकतात.
उदाहरणार्थ salary missing आहे म्हणजे salary zero आहे असा अर्थ होत नाही.
Sensor reading missing आहे म्हणजे sensor ने zero measure केले असा अर्थ होत नाही.
म्हणून numeric analytical data मध्ये np.nan अनेकदा safer representation असते.
12. Blank Fields ला Custom Value ने Fill करणे#
खाली missing fields च्या जागी 0 intentionally वापरले आहे, फक्त filling_values चे behavior समजण्यासाठी.
import numpy as np
from io import StringIO
raw_data = """age,score
21,88
,74
23,
"""
data = np.genfromtxt(
StringIO(raw_data),
delimiter=",",
skip_header=1,
dtype=float,
filling_values=0
)
print(data)Expected Output#
[[21. 88.]
[ 0. 74.]
[23. 0.]]Code technically योग्य आहे.
पण analysis योग्य आहे की नाही हे business meaning वर अवलंबून आहे.
"Code चालला" म्हणजे "data decision योग्य आहे" असे नाही.
13. dtype During Loading#
dtype parser ला final values कोणत्या data type मध्ये ठेवायच्या याबद्दल direction देतो.
Numeric data आणि missing values साठी आपण अनेकदा:
dtype=floatवापरतो.
याचे महत्त्व असे आहे की np.nan ही floating-point special value आहे.
म्हणून missing numeric data NaN म्हणून ठेवायचा असेल तर floating-point representation practical आहे.
Complete example:
data = np.genfromtxt(
"scores.csv",
delimiter=",",
skip_header=1,
dtype=float,
missing_values="NA",
filling_values=np.nan
)When numeric data can contain missing values represented as NaN, a floating-point dtype is commonly used because NaN is a floating-point value.
14. dtype=None — Basic Awareness#
कधी text file मध्ये mixed columns असतात.
उदाहरण:
| Name | Score |
|---|---|
| Asha | 88 |
| Ravi | 74 |
पहिला column string आहे.
दुसरा numeric आहे.
अशा situation मध्ये dtype=None वापरल्यास NumPy available data पाहून suitable types infer करण्याचा प्रयत्न करू शकतो.
उदाहरण:
import numpy as np
from io import StringIO
raw_data = """name,score
Asha,88
Ravi,74
"""
data = np.genfromtxt(
StringIO(raw_data),
delimiter=",",
skip_header=1,
dtype=None,
encoding="utf-8"
)Mixed types असल्यामुळे result साध्या homogeneous 2D float array सारखा असेलच असे नाही.
तो structured representation होऊ शकतो.
या chapter मध्ये एवढे लक्षात ठेवा:
dtype=float— pure numeric analysis साठी simple आणि predictabledtype=None— NumPy ला type inference करू द्यायची असल्यास उपयोगी- mixed-type files हाताळताना resulting structure तपासणे आवश्यक
dtype=None म्हणजे "dtype नाही" असा अर्थ नाही. NumPy data पाहून dtype infer करण्याचा प्रयत्न करतो.
15. delimiter + skip_header + usecols एकत्र वापरणे#
आता तीन important parameters एकत्र वापरू.
समजा source:
| Name | Age | Score | City |
|---|---|---|---|
| Asha | 21 | 88 | Pune |
| Ravi | missing | 74 | Nashik |
| Neha | 23 | missing | Mumbai |
आपल्याला फक्त Age आणि Score पाहिजेत.
import numpy as np
from io import StringIO
raw_data = """name;age;score;city
Asha;21;88;Pune
Ravi;;74;Nashik
Neha;23;;Mumbai
"""
data = np.genfromtxt(
StringIO(raw_data),
delimiter=";",
skip_header=1,
usecols=(1, 2),
dtype=float
)
print(data)Expected Output#
[[21. 88.]
[nan 74.]
[23. nan]]या एका example मध्ये:
delimiter=";" ने semicolon-separated fields split केले.
skip_header=1 ने header काढला.
usecols=(1, 2) ने Age आणि Score निवडले.
dtype=float ने numeric floating-point array तयार केला.
रिकाम्या numeric fields nan म्हणून आल्या.
हा pattern real data-loading tasks मध्ये खूप common आहे.
16. Complete Missing Marker Example#
आता file blank fields वापरत नाही.
तो NA marker वापरतो.
import numpy as np
from io import StringIO
raw_data = """student,age,score
Asha,21,88
Ravi,NA,74
Neha,23,NA
"""
data = np.genfromtxt(
StringIO(raw_data),
delimiter=",",
skip_header=1,
usecols=(1, 2),
dtype=float,
missing_values="NA",
filling_values=np.nan
)
print(data)
print(data.shape)
print(data.dtype)Expected Output#
[[21. 88.]
[nan 74.]
[23. nan]]
(3, 2)
float64float64 हा common NumPy result आहे. Exact floating dtype platform किंवा explicit configuration वर अवलंबून बदलू शकतो, म्हणून practical code मध्ये dtype inspect करणे चांगली सवय आहे.
17. np.loadtxt() vs np.genfromtxt()#
दोन्ही functions text files मधून data load करू शकतात.
पण त्यांचा practical use वेगळा आहे.
| Point | np.loadtxt() |
np.genfromtxt() |
|---|---|---|
| Clean numeric text | Excellent choice | Works |
| Missing fields | Less suitable | Designed for flexible handling |
| Missing markers | Limited compared with genfromtxt | missing_values available |
| Replacement values | Not the main use case | filling_values available |
| Simple clean files | Simple and direct | Slightly more flexible |
| Messy text data | Often inconvenient | Better choice |
सोप्या भाषेत:
Clean numeric file असेल तर np.loadtxt() पुरेसे असू शकते.
Missing values किंवा parsing flexibility लागणार असेल तर np.genfromtxt() जास्त suitable आहे.
Function "better" किंवा "worse" नसते. Source data च्या nature नुसार योग्य loader निवडायचा असतो.
18. Missing Field आणि Inconsistent Row वेगळे आहेत#
हा फरक खूप महत्त्वाचा आहे.
Expected तीन columns आहेत:
Name, Age, Score
Valid row:
Asha,21,88
Missing age असलेली पण structurally valid row:
Ravi,,74
इथे अजूनही तीन fields आहेत:
- Ravi
- blank
- 74
पण ही row:
Ravi,74
वेगळी आहे.
Parser च्या दृष्टीने आता फक्त दोन fields दिसू शकतात.
हे missing field representation नसून row structure mismatch असू शकते.
| Row | Interpretation |
|---|---|
Asha,21,88 |
complete row |
Ravi,,74 |
three fields, middle value missing |
Ravi,74 |
fewer fields than expected |
np.genfromtxt() missing fields handle करण्यास flexible आहे.
पण malformed किंवा inconsistent rows हा वेगळा data-quality problem आहे.
Missing values handle करणारी function वापरली म्हणून malformed rows automatically trustworthy होत नाहीत.
जर inconsistent rows मुळे parsing error मिळाला तर source data inspect करा.
Wrong row structure silently ignore करून analysis सुरू करणे dangerous ठरू शकते.
19. Loaded Array चे Shape तपासणे#
Data successfully load झाला म्हणजे काम संपले नाही.
पहिली validation:
print(data.shape)जर आपल्याला 3 rows आणि 2 columns अपेक्षित असतील तर:
Expected Result#
(3, 2)Shape चुकीचा असेल तर शक्य कारणे:
- wrong delimiter
- unexpected header lines
- wrong
usecols - malformed rows
- source file अपेक्षेपेक्षा वेगळी
Analysis करण्यापूर्वी shape तपासणे ही छोटी पण खूप useful habit आहे.
20. Loaded Array चा dtype तपासणे#
दुसरी basic validation:
print(data.dtype)Numeric missing-value example मध्ये आपल्याला floating dtype अपेक्षित असतो.
यामुळे दोन गोष्टी समजतात:
- parsing expected type मध्ये झाले का
NaNसारख्या missing numeric values represent होऊ शकतात का
जर expected numeric data unexpected string-like किंवा structured form मध्ये आला असेल तर पुढे जाण्यापूर्वी loading configuration तपासा.
21. np.isnan() ने Missing Values शोधणे#
NaN values load झाल्यानंतर त्या positions शोधण्यासाठी:
np.isnan(data)वापरता येते.
Example:
import numpy as np
data = np.array([
[21.0, 88.0],
[np.nan, 74.0],
[23.0, np.nan]
])
missing_mask = np.isnan(data)
print(missing_mask)Expected Output#
[[False False]
[ True False]
[False True]]False म्हणजे त्या position वर value missing नाही.
True म्हणजे त्या position वर NaN आहे.
याला boolean mask म्हणतात.
22. Array मध्ये एक तरी Missing Value आहे का ते तपासणे#
print(np.isnan(data).any())Expected Output#
Trueइथे कमीतकमी एक NaN असल्यामुळे result True आहे.
23. किती Missing Values आहेत ते मोजणे#
Boolean values मध्ये True गणनेत 1 सारखे count होते.
त्यामुळे:
print(np.isnan(data).sum())Expected Output#
2आपल्या array मध्ये दोन missing positions आहेत.
हा check analysis सुरू करण्यापूर्वी useful आहे.
24. कोणत्या Rows मध्ये Missing Values आहेत?#
Row-level validation साठी:
print(np.isnan(data).any(axis=1))Expected Output#
[False True True]याचा अर्थ:
- पहिल्या row मध्ये missing value नाही
- दुसऱ्या row मध्ये किमान एक missing value आहे
- तिसऱ्या row मध्ये किमान एक missing value आहे
इथे axis=1 row मधील columns तपासण्यासाठी वापरले आहे.
या chapter साठी एवढे लक्षात ठेवा की row-wise missing detection करता येते.
25. Analysis Before Validation#
Real data workflow मध्ये loading नंतर लगेच average किंवा statistical calculation करू नका.
पहिले data validate करा.
Practical flow:
Rendering diagram…
Diagram could not be rendered.
यात एक important lesson आहे:
Parsing आणि analysis हे दोन वेगळे stages आहेत.
पहिले data योग्य parse झाला आहे याची खात्री करा.
नंतरच analysis करा.
26. Practical Validation Example#
import numpy as np
from io import StringIO
raw_data = """student,age,score
Asha,21,88
Ravi,NA,74
Neha,23,NA
"""
data = np.genfromtxt(
StringIO(raw_data),
delimiter=",",
skip_header=1,
usecols=(1, 2),
dtype=float,
missing_values="NA",
filling_values=np.nan
)
print("Shape:", data.shape)
print("Dtype:", data.dtype)
print("Missing values:", np.isnan(data).sum())
print("Has missing:", np.isnan(data).any())Expected Output#
Shape: (3, 2)
Dtype: float64
Missing values: 2
Has missing: Trueया चार checks मधून आपल्याला लगेच useful information मिळते:
- किती rows आणि columns load झाले
- final dtype काय आहे
- किती missing values आहेत
- missing data आहे की नाही
27. Real File साठी Practical Pattern#
Actual CSV file वापरताना code असा दिसू शकतो:
import numpy as np
data = np.genfromtxt(
"students.csv",
delimiter=",",
skip_header=1,
usecols=(1, 2),
dtype=float,
missing_values="NA",
filling_values=np.nan
)
print(data.shape)
print(data.dtype)
print(np.isnan(data).sum())इथे प्रत्येक parameter चा clear purpose आहे.
| Parameter | Purpose |
|---|---|
"students.csv" |
source file |
delimiter="," |
comma-separated fields |
skip_header=1 |
header row ignore करणे |
usecols=(1, 2) |
specific columns load करणे |
dtype=float |
numeric float array तयार करणे |
missing_values="NA" |
NA ला missing समजणे |
filling_values=np.nan |
missing positions वर NaN ठेवणे |
ही parameter list memorize करण्यापेक्षा प्रत्येक parameter कोणती problem solve करतो ते समजणे महत्त्वाचे आहे.
28. Common Mistakes#
Wrong delimiter#
Source comma-separated आहे पण code:
delimiter=";"असे वापरतो.
Result चुकीचा parse होऊ शकतो.
Fix:
delimiter=","Header skip न करणे#
पहिली row text headers ठेवते, पण numeric loader ती data म्हणून process करण्याचा प्रयत्न करतो.
Fix:
skip_header=1Wrong usecols indexes#
Columns zero-based positions ने select करताना index चुकीचा घेणे common आहे.
Name, Age, Score साठी:
- Name →
0 - Age →
1 - Score →
2
Age आणि Score:
usecols=(1, 2)Missing marker mismatch#
File मध्ये:
NA
आहे.
पण code मध्ये:
missing_values="MISSING"आहे.
Marker match होत नाही.
Correct:
missing_values="NA"Missing ला blindly zero करणे#
filling_values=0technically चालू शकते.
पण zero आणि missing यांचा अर्थ वेगळा असल्यास analysis distort होईल.
Validation न करता analysis सुरू करणे#
Data load झाला म्हणून:
data.mean()लगेच करणे योग्य workflow नाही.
पहिले:
- shape
- dtype
- missing count
- suspicious rows
तपासा.
"घाईचे काम शैतानाचे" ही म्हण data analysis मध्ये अगदी लागू पडते.
29. Job-Ready Loading Checklist#
Text data load करताना हा छोटा checklist वापरा:
- Source delimiter ओळखा.
- Header lines आहेत का ते तपासा.
- आवश्यक columns ठरवा.
- Missing representation पहा.
- योग्य
dtypeठरवा. - Missing replacement consciously निवडा.
- Data load करा.
shapeतपासा.dtypeतपासा.NaNdetect करा.- Missing count तपासा.
- मगच analysis सुरू करा.
30. Quick Recap#
या chapter मधून मुख्य गोष्टी:
- missing value म्हणजे unavailable data
- blank field,
NA,?इत्यादी missing representation असू शकतात np.genfromtxt()missing text data handle करण्यासाठी flexible आहेdelimiterfield separator सांगतोskip_headerसुरुवातीच्या rows skip करतोusecolsspecific columns निवडतोmissing_valuesmissing markers define करतोfilling_valuesmissing position वर replacement ठरवतो- numeric missing values साठी
np.nanuseful आहे dtype=floatआणिNaNpractical combination आहेdtype=Nonetype inference साठी वापरता येतोnp.loadtxt()clean data साठी simple आहेnp.genfromtxt()missing-data scenarios साठी जास्त flexible आहे- blank field आणि malformed row एकच गोष्ट नाही
- loading नंतर
shape,dtypeआणि missing values validate करणे आवश्यक आहे np.isnan()वापरूनNaNdetect करता येतो
Reliable analysis ची सुरुवात calculation पासून होत नाही. ती data योग्य प्रकारे load आणि validate करण्यापासून होते.