You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Data-Science-For-Beginners/translations/mr/2-Working-With-Data/08-data-preparation/notebook.ipynb

4241 lines
157 KiB

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "rQ8UhzFpgRra"
},
"source": [
"# डेटा तयारी\n",
"\n",
"[मूळ नोटबुक स्रोत *डेटा सायन्स: डेटासायन्ससाठी मशीन लर्निंगसाठी परिचय - पायथन आणि मशीन लर्निंग स्टुडिओ बाय ली स्टॉट*](https://github.com/leestott/intro-Datascience/blob/master/Course%20Materials/4-Cleaning_and_Manipulating-Reference.ipynb)\n",
"\n",
"## `DataFrame` माहिती शोधणे\n",
"\n",
"> **शिकण्याचे उद्दिष्ट:** या उपविभागाच्या शेवटी, तुम्हाला pandas DataFrames मध्ये संग्रहित डेटा बद्दल सामान्य माहिती शोधण्यात सोय होईल.\n",
"\n",
"तुम्ही तुमचा डेटा pandas मध्ये लोड केल्यानंतर, तो बहुधा `DataFrame` स्वरूपात असेल. परंतु, जर तुमच्या `DataFrame` मध्ये 60,000 ओळी आणि 400 स्तंभ असतील, तर तुम्ही काय काम करत आहात याची कल्पना कशी कराल? सुदैवाने, pandas काही सोयीस्कर साधने प्रदान करते ज्यामुळे `DataFrame` बद्दल एकूण माहिती तसेच सुरुवातीच्या काही आणि शेवटच्या काही ओळी पटकन पाहता येतात.\n",
"\n",
"या कार्यक्षमतेचा अभ्यास करण्यासाठी, आपण Python scikit-learn लायब्ररी आयात करू आणि एक प्रसिद्ध डेटासेट वापरू जो प्रत्येक डेटा सायंटिस्टने शेकडो वेळा पाहिला आहे: ब्रिटिश जीवशास्त्रज्ञ रोनाल्ड फिशर यांचा *Iris* डेटा सेट, जो त्यांच्या 1936 च्या \"The use of multiple measurements in taxonomic problems\" या पेपरमध्ये वापरला होता:\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true,
"id": "hB1RofhdgRrp",
"trusted": false
},
"outputs": [],
"source": [
"import pandas as pd\n",
"from sklearn.datasets import load_iris\n",
"\n",
"iris = load_iris()\n",
"iris_df = pd.DataFrame(data=iris['data'], columns=iris['feature_names'])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "AGA0A_Y8hMdz"
},
"source": [
"### `DataFrame.shape`\n",
"आम्ही Iris Dataset `iris_df` या व्हेरिएबलमध्ये लोड केले आहे. डेटामध्ये खोलवर जाण्यापूर्वी, आपल्याकडे किती डेटा पॉइंट्स आहेत आणि डेटासेटचा एकूण आकार काय आहे हे जाणून घेणे उपयुक्त ठरेल. आपण ज्या डेटाच्या प्रमाणावर काम करत आहोत ते पाहणे उपयुक्त आहे.\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "LOe5jQohhulf",
"outputId": "fb0577ac-3b4a-4623-cb41-20e1b264b3e9"
},
"outputs": [
{
"data": {
"text/plain": [
"(150, 4)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"iris_df.shape"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "smE7AGzOhxk2"
},
"source": [
"म्हणजे, आपल्याकडे 150 ओळी आणि 4 स्तंभांचा डेटा आहे. प्रत्येक ओळ एक डेटा पॉइंट दर्शवते आणि प्रत्येक स्तंभ डेटा फ्रेमशी संबंधित एक वैशिष्ट्य दर्शवतो. तर मूलतः, 150 डेटा पॉइंट्स आहेत ज्यामध्ये प्रत्येकामध्ये 4 वैशिष्ट्ये आहेत.\n",
"\n",
"`shape` येथे डेटा फ्रेमचे एक गुणधर्म आहे आणि एक फंक्शन नाही, म्हणूनच ते जोडलेल्या कंसांनी संपत नाही.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "d3AZKs0PinGP"
},
"source": [
"### `DataFrame.columns`\n",
"आता आपण डेटा फ्रेममधील 4 स्तंभांकडे जाऊया. प्रत्येक स्तंभ नेमके काय दर्शवतो? `columns` गुणधर्म आपल्याला डेटा फ्रेममधील स्तंभांची नावे देईल.\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "YPGh_ziji-CY",
"outputId": "74e7a43a-77cc-4c80-da56-7f50767c37a0"
},
"outputs": [
{
"data": {
"text/plain": [
"Index(['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)',\n",
" 'petal width (cm)'],\n",
" dtype='object')"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"iris_df.columns"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TsobcU_VjCC_"
},
"source": [
"जसे आपण पाहू शकतो, येथे चार(4) स्तंभ आहेत. `columns` गुणधर्म आपल्याला स्तंभांची नावे सांगतो आणि मूलत: त्यापेक्षा काहीही नाही. जेव्हा आपल्याला डेटासेटमध्ये असलेल्या वैशिष्ट्यांची ओळख पटवायची असते तेव्हा हा गुणधर्म महत्त्वाचा ठरतो.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2UTlvkjmgRrs"
},
"source": [
"### `DataFrame.info`\n",
"डेटामधील माहिती (`shape` गुणधर्माने दिलेली) आणि वैशिष्ट्ये किंवा स्तंभांची नावे (`columns` गुणधर्माने दिलेली) आपल्याला डेटासेटबद्दल काहीतरी सांगतात. आता, आपल्याला डेटासेटमध्ये अधिक सखोल जाणून घ्यायचे आहे. `DataFrame.info()` फंक्शन यासाठी खूप उपयुक्त आहे.\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "dHHRyG0_gRrt",
"outputId": "d8fb0c40-4f18-4e19-da48-c8db77d1d3a5",
"trusted": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 150 entries, 0 to 149\n",
"Data columns (total 4 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 sepal length (cm) 150 non-null float64\n",
" 1 sepal width (cm) 150 non-null float64\n",
" 2 petal length (cm) 150 non-null float64\n",
" 3 petal width (cm) 150 non-null float64\n",
"dtypes: float64(4)\n",
"memory usage: 4.8 KB\n"
]
}
],
"source": [
"iris_df.info()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1XgVMpvigRru"
},
"source": [
"येथून, आपण काही निरीक्षणे करू शकतो:\n",
"1. प्रत्येक स्तंभाचा डेटा प्रकार: या डेटासेटमध्ये, सर्व डेटा 64-बिट फ्लोटिंग-पॉइंट संख्यांमध्ये संग्रहित केला आहे.\n",
"2. नॉन-नल मूल्यांची संख्या: नल मूल्यांशी व्यवहार करणे हा डेटा तयारीतील महत्त्वाचा टप्पा आहे. यावर नंतर नोटबुकमध्ये विचार केला जाईल.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IYlyxbpWFEF4"
},
"source": [
"### DataFrame.describe()\n",
"म्हणून समजा आपल्या डेटासेटमध्ये बरीच संख्यात्मक माहिती आहे. प्रत्येक स्तंभावर स्वतंत्रपणे सरासरी, मध्यक, चतुर्थांश इत्यादीसारख्या एकच चल सांख्यिकी गणना करता येतात. `DataFrame.describe()` फंक्शन आपल्याला डेटासेटमधील संख्यात्मक स्तंभांचे सांख्यिकी सारांश प्रदान करते.\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 297
},
"id": "tWV-CMstFIRA",
"outputId": "4fc49941-bc13-4b0c-a412-cb39e7d3f289"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sepal length (cm)</th>\n",
" <th>sepal width (cm)</th>\n",
" <th>petal length (cm)</th>\n",
" <th>petal width (cm)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>150.000000</td>\n",
" <td>150.000000</td>\n",
" <td>150.000000</td>\n",
" <td>150.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>5.843333</td>\n",
" <td>3.057333</td>\n",
" <td>3.758000</td>\n",
" <td>1.199333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>0.828066</td>\n",
" <td>0.435866</td>\n",
" <td>1.765298</td>\n",
" <td>0.762238</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>4.300000</td>\n",
" <td>2.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.100000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>5.100000</td>\n",
" <td>2.800000</td>\n",
" <td>1.600000</td>\n",
" <td>0.300000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>5.800000</td>\n",
" <td>3.000000</td>\n",
" <td>4.350000</td>\n",
" <td>1.300000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>6.400000</td>\n",
" <td>3.300000</td>\n",
" <td>5.100000</td>\n",
" <td>1.800000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>7.900000</td>\n",
" <td>4.400000</td>\n",
" <td>6.900000</td>\n",
" <td>2.500000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)\n",
"count 150.000000 150.000000 150.000000 150.000000\n",
"mean 5.843333 3.057333 3.758000 1.199333\n",
"std 0.828066 0.435866 1.765298 0.762238\n",
"min 4.300000 2.000000 1.000000 0.100000\n",
"25% 5.100000 2.800000 1.600000 0.300000\n",
"50% 5.800000 3.000000 4.350000 1.300000\n",
"75% 6.400000 3.300000 5.100000 1.800000\n",
"max 7.900000 4.400000 6.900000 2.500000"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"iris_df.describe()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zjjtW5hPGMuM"
},
"source": [
"वरील आउटपुट प्रत्येक स्तंभाचा डेटा पॉइंट्सची एकूण संख्या, सरासरी, मानक विचलन, किमान, खालचा चतुर्थांश (25%), मध्यम (50%), वरचा चतुर्थांश (75%) आणि जास्तीत जास्त मूल्य दर्शवतो.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-lviAu99gRrv"
},
"source": [
"### `DataFrame.head`\n",
"वरील सर्व फंक्शन्स आणि गुणधर्मांसह, आपल्याला डेटासेटचा एक उच्चस्तरीय आढावा मिळाला आहे. आपल्याला माहित आहे की किती डेटा पॉइंट्स आहेत, किती वैशिष्ट्ये आहेत, प्रत्येक वैशिष्ट्याचा डेटा प्रकार काय आहे आणि प्रत्येक वैशिष्ट्यासाठी किती नॉन-नल मूल्ये आहेत.\n",
"\n",
"आता प्रत्यक्ष डेटाकडे पाहण्याची वेळ आली आहे. आपल्या `DataFrame` च्या पहिल्या काही ओळी (पहिले काही डेटा पॉइंट्स) कशा दिसतात ते पाहूया:\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 204
},
"id": "DZMJZh0OgRrw",
"outputId": "d9393ee5-c106-4797-f815-218f17160e00",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sepal length (cm)</th>\n",
" <th>sepal width (cm)</th>\n",
" <th>petal length (cm)</th>\n",
" <th>petal width (cm)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>5.1</td>\n",
" <td>3.5</td>\n",
" <td>1.4</td>\n",
" <td>0.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>4.9</td>\n",
" <td>3.0</td>\n",
" <td>1.4</td>\n",
" <td>0.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>4.7</td>\n",
" <td>3.2</td>\n",
" <td>1.3</td>\n",
" <td>0.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4.6</td>\n",
" <td>3.1</td>\n",
" <td>1.5</td>\n",
" <td>0.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5.0</td>\n",
" <td>3.6</td>\n",
" <td>1.4</td>\n",
" <td>0.2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)\n",
"0 5.1 3.5 1.4 0.2\n",
"1 4.9 3.0 1.4 0.2\n",
"2 4.7 3.2 1.3 0.2\n",
"3 4.6 3.1 1.5 0.2\n",
"4 5.0 3.6 1.4 0.2"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"iris_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EBHEimZuEFQK"
},
"source": [
"आउटपुटमध्ये, आपण डेटासेटच्या पाच(5) नोंदी पाहू शकतो. जर आपण डाव्या बाजूला असलेल्या अनुक्रमणिका पाहिल्या, तर आपल्याला कळते की या पहिल्या पाच ओळी आहेत.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "oj7GkrTdgRry"
},
"source": [
"### व्यायाम:\n",
"\n",
"वरील उदाहरणावरून स्पष्ट होते की, `DataFrame.head` डिफॉल्टनुसार `DataFrame` च्या पहिल्या पाच ओळी परत करते. खालील कोड सेलमध्ये, तुम्ही पाचपेक्षा जास्त ओळी दाखवण्याचा मार्ग शोधू शकता का?\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true,
"id": "EKRmRFFegRrz",
"trusted": false
},
"outputs": [],
"source": [
"# Hint: Consult the documentation by using iris_df.head?"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BJ_cpZqNgRr1"
},
"source": [
"### `DataFrame.tail`\n",
"डेटा पाहण्याचा आणखी एक मार्ग म्हणजे शेवटापासून (सुरुवातीऐवजी). `DataFrame.head` च्या उलट म्हणजे `DataFrame.tail`, जे `DataFrame` च्या शेवटच्या पाच ओळी परत करते:\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"id": "heanjfGWgRr2",
"outputId": "6ae09a21-fe09-4110-b0d7-1a1fbf34d7f3",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sepal length (cm)</th>\n",
" <th>sepal width (cm)</th>\n",
" <th>petal length (cm)</th>\n",
" <th>petal width (cm)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>145</th>\n",
" <td>6.7</td>\n",
" <td>3.0</td>\n",
" <td>5.2</td>\n",
" <td>2.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>146</th>\n",
" <td>6.3</td>\n",
" <td>2.5</td>\n",
" <td>5.0</td>\n",
" <td>1.9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>147</th>\n",
" <td>6.5</td>\n",
" <td>3.0</td>\n",
" <td>5.2</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>148</th>\n",
" <td>6.2</td>\n",
" <td>3.4</td>\n",
" <td>5.4</td>\n",
" <td>2.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>149</th>\n",
" <td>5.9</td>\n",
" <td>3.0</td>\n",
" <td>5.1</td>\n",
" <td>1.8</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)\n",
"145 6.7 3.0 5.2 2.3\n",
"146 6.3 2.5 5.0 1.9\n",
"147 6.5 3.0 5.2 2.0\n",
"148 6.2 3.4 5.4 2.3\n",
"149 5.9 3.0 5.1 1.8"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"iris_df.tail()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "31kBWfyLgRr3"
},
"source": [
"प्रत्यक्षात, `DataFrame` मधील पहिल्या काही ओळी किंवा शेवटच्या काही ओळी सहजपणे तपासणे उपयुक्त ठरते, विशेषतः जेव्हा तुम्ही क्रमबद्ध डेटासेटमध्ये अपवाद शोधत असता.\n",
"\n",
"वरील कोड उदाहरणांच्या मदतीने दाखवलेल्या सर्व फंक्शन्स आणि गुणधर्म आपल्याला डेटाचा लुक आणि फील मिळविण्यास मदत करतात.\n",
"\n",
"> **महत्त्वाचे:** फक्त `DataFrame` मधील माहितीबद्दलची मेटाडेटा किंवा त्यातील पहिल्या आणि शेवटच्या काही मूल्यांकडे पाहूनही, तुम्ही डेटाचा आकार, स्वरूप आणि सामग्रीबद्दल त्वरित कल्पना करू शकता.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TvurZyLSDxq_"
},
"source": [
"### हरवलेला डेटा\n",
"चला हरवलेल्या डेटामध्ये खोलवर जाऊया. हरवलेला डेटा तेव्हा होतो, जेव्हा काही स्तंभांमध्ये कोणतीही मूल्ये संग्रहित केलेली नसतात.\n",
"\n",
"उदाहरण घेऊया: एखादी व्यक्ती त्याच्या/तिच्या वजनाबद्दल जागरूक आहे आणि सर्वेक्षणामध्ये वजनाचा फील्ड भरत नाही. अशा परिस्थितीत त्या व्यक्तीसाठी वजनाचे मूल्य हरवलेले असेल.\n",
"\n",
"बहुतेक वेळा, वास्तविक जगातील डेटासेट्समध्ये हरवलेली मूल्ये आढळतात.\n",
"\n",
"**पांडास हरवलेल्या डेटाचा कसा सामना करतो**\n",
"\n",
"पांडास हरवलेल्या मूल्यांचा दोन प्रकारे सामना करतो. पहिला प्रकार तुम्ही याआधीच्या विभागांमध्ये पाहिला आहे: `NaN`, म्हणजेच Not a Number. हे प्रत्यक्षात IEEE फ्लोटिंग-पॉइंट स्पेसिफिकेशनचा एक विशेष मूल्य आहे आणि ते फक्त हरवलेल्या फ्लोटिंग-पॉइंट मूल्ये दर्शवण्यासाठी वापरले जाते.\n",
"\n",
"फ्लोट्स व्यतिरिक्त हरवलेल्या मूल्यांसाठी, पांडास Python चा `None` ऑब्जेक्ट वापरतो. दोन वेगवेगळ्या प्रकारच्या मूल्यांचा सामना करावा लागतो हे गोंधळात टाकणारे वाटू शकते, परंतु या डिझाइन निवडीसाठी ठोस प्रोग्रामिंग कारणे आहेत आणि प्रत्यक्षात, या मार्गाने जाणे पांडासला बहुतेक प्रकरणांमध्ये चांगला तडजोड देण्यास सक्षम करते. तरीही, `None` आणि `NaN` दोन्हीवर काही मर्यादा आहेत ज्यांचा वापर करताना तुम्हाला लक्षात ठेवणे आवश्यक आहे.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lOHqUlZFgRr5"
},
"source": [
"### `None`: नॉन-फ्लोट गहाळ डेटा\n",
"`None` हा Python मधून येतो, त्यामुळे तो NumPy आणि pandas च्या अशा arrays मध्ये वापरता येत नाही ज्यांचा डेटा प्रकार `'object'` नाही. लक्षात ठेवा, NumPy arrays (आणि pandas मधील डेटा संरचना) फक्त एकाच प्रकारचा डेटा ठेवू शकतात. यामुळेच ते मोठ्या प्रमाणावर डेटा आणि computational कामासाठी जबरदस्त शक्तिशाली ठरतात, पण त्याच वेळी त्यांची लवचिकता मर्यादित होते. अशा arrays ला “lowest common denominator” मध्ये बदलावे लागते, म्हणजेच त्या array मधील सर्व गोष्टींना सामावून घेणारा डेटा प्रकार. जेव्हा `None` array मध्ये असतो, तेव्हा तुम्ही Python objects सोबत काम करत आहात असे मानले जाते.\n",
"\n",
"हे कृतीत पाहण्यासाठी, खालील उदाहरण array विचारात घ्या (त्याचा `dtype` लक्षात घ्या):\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "QIoNdY4ngRr7",
"outputId": "92779f18-62f4-4a03-eca2-e9a101604336",
"trusted": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([2, None, 6, 8], dtype=object)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"\n",
"example1 = np.array([2, None, 6, 8])\n",
"example1"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pdlgPNbhgRr7"
},
"source": [
"अपकास्ट डेटा प्रकारांची वास्तविकता दोन साइड इफेक्ट्ससह येते. पहिले, ऑपरेशन्स संकलित NumPy कोडऐवजी इंटरप्रेटेड Python कोडच्या स्तरावर चालवले जातील. याचा अर्थ असा की `Series` किंवा `DataFrames` मध्ये `None` असलेल्या कोणत्याही ऑपरेशन्ससाठी गती कमी होईल. तुम्हाला कदाचित ही कार्यक्षमता कमी झाल्याची जाणीव होणार नाही, परंतु मोठ्या डेटासेटसाठी हे एक समस्या बनू शकते.\n",
"\n",
"दुसरा साइड इफेक्ट पहिल्यापासून उद्भवतो. कारण `None` मुळात `Series` किंवा `DataFrame`s ला व्हॅनिला Python च्या जगात परत आणते, त्यामुळे NumPy/pandas चे `sum()` किंवा `min()` सारखे ऍग्रीगेशन फंक्शन्स अशा ऍरेवर वापरणे ज्यामध्ये ``None`` मूल्य आहे, सामान्यतः एक त्रुटी निर्माण करेल:\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 292
},
"id": "gWbx-KB9gRr8",
"outputId": "ecba710a-22ec-41d5-a39c-11f67e645b50",
"trusted": false
},
"outputs": [
{
"ename": "TypeError",
"evalue": "ignored",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-10-ce9901ad18bd>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mexample1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/numpy/core/_methods.py\u001b[0m in \u001b[0;36m_sum\u001b[0;34m(a, axis, dtype, out, keepdims, initial, where)\u001b[0m\n\u001b[1;32m 45\u001b[0m def _sum(a, axis=None, dtype=None, out=None, keepdims=False,\n\u001b[1;32m 46\u001b[0m initial=_NoValue, where=True):\n\u001b[0;32m---> 47\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mumr_sum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeepdims\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minitial\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwhere\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 48\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 49\u001b[0m def _prod(a, axis=None, dtype=None, out=None, keepdims=False,\n",
"\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'int' and 'NoneType'"
]
}
],
"source": [
"example1.sum()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "LcEwO8UogRr9"
},
"source": [
"**महत्त्वाचा मुद्दा**: पूर्णांक आणि `None` मूल्यांमधील बेरीज (आणि इतर क्रिया) अनिर्दिष्ट आहे, ज्यामुळे अशा डेटासेट्ससह काय करता येईल यावर मर्यादा येऊ शकते.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pWvVHvETgRr9"
},
"source": [
"### `NaN`: गहाळ फ्लोट मूल्ये\n",
"\n",
"`None` च्या विरोधात, NumPy (आणि त्यामुळे pandas) त्याच्या जलद, व्हेक्टराइज्ड ऑपरेशन्स आणि ufuncs साठी `NaN` ला समर्थन देते. वाईट बातमी म्हणजे `NaN` वर केलेली कोणतीही अंकगणितीय क्रिया नेहमी `NaN` देते. उदाहरणार्थ:\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "rcFYfMG9gRr9",
"outputId": "699e81b7-5c11-4b46-df1d-06071768690f",
"trusted": false
},
"outputs": [
{
"data": {
"text/plain": [
"nan"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.nan + 1"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "BW3zQD2-gRr-",
"outputId": "4525b6c4-495d-4f7b-a979-efce1dae9bd0",
"trusted": false
},
"outputs": [
{
"data": {
"text/plain": [
"nan"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.nan * 0"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fU5IPRcCgRr-"
},
"source": [
"चांगली बातमी: `NaN` असलेल्या arrays वर चालणाऱ्या aggregations त्रुटी निर्माण करत नाहीत. वाईट बातमी: परिणाम सर्वत्र उपयुक्त नसतात:\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "LCInVgSSgRr_",
"outputId": "fa06495a-0930-4867-87c5-6023031ea8b5",
"trusted": false
},
"outputs": [
{
"data": {
"text/plain": [
"(nan, nan, nan)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example2 = np.array([2, np.nan, 6, 8]) \n",
"example2.sum(), example2.min(), example2.max()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nhlnNJT7gRr_"
},
"source": [
"### व्यायाम:\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true,
"id": "yan3QRaOgRr_",
"trusted": false
},
"outputs": [],
"source": [
"# What happens if you add np.nan and None together?\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_iDvIRC8gRsA"
},
"source": [
"लक्षात ठेवा: `NaN` फक्त गहाळ फ्लोटिंग-पॉइंट मूल्यांसाठी आहे; पूर्णांक, स्ट्रिंग्स किंवा बूलियनसाठी `NaN` समानार्थी नाही.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kj6EKdsAgRsA"
},
"source": [
"### `NaN` आणि `None`: pandas मधील null मूल्ये\n",
"\n",
"जरी `NaN` आणि `None` काही प्रमाणात वेगळ्या प्रकारे वागू शकतात, तरीही pandas त्यांना एकसारखे हाताळण्यासाठी तयार केले आहे. याचा अर्थ काय आहे हे पाहण्यासाठी, integers चा एक `Series` विचार करा:\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Nji-KGdNgRsA",
"outputId": "36aa14d2-8efa-4bfd-c0ed-682991288822",
"trusted": false
},
"outputs": [
{
"data": {
"text/plain": [
"0 1\n",
"1 2\n",
"2 3\n",
"dtype: int64"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"int_series = pd.Series([1, 2, 3], dtype=int)\n",
"int_series"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WklCzqb8gRsB"
},
"source": [
"### व्यायाम:\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true,
"id": "Cy-gqX5-gRsB",
"trusted": false
},
"outputs": [],
"source": [
"# Now set an element of int_series equal to None.\n",
"# How does that element show up in the Series?\n",
"# What is the dtype of the Series?\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WjMQwltNgRsB"
},
"source": [
"`Series` आणि `DataFrame` मध्ये डेटा प्रकारांची एकसंधता स्थापित करण्यासाठी डेटा अपकास्ट करताना, pandas सहजपणे `None` आणि `NaN` दरम्यान गहाळ मूल्ये बदलतो. या डिझाइन वैशिष्ट्यामुळे, pandas मध्ये `None` आणि `NaN` हे \"null\" चे दोन वेगळे प्रकार म्हणून विचार करणे उपयुक्त ठरू शकते. खरंच, pandas मध्ये गहाळ मूल्यांशी व्यवहार करण्यासाठी तुम्ही वापरणाऱ्या काही मुख्य पद्धती त्यांच्या नावांमध्ये या कल्पनेचे प्रतिबिंब दाखवतात:\n",
"\n",
"- `isnull()`: गहाळ मूल्ये दर्शविणारा Boolean मास्क तयार करते\n",
"- `notnull()`: `isnull()` चा उलट\n",
"- `dropna()`: डेटा फिल्टर केलेला आवृत्ती परत करते\n",
"- `fillna()`: गहाळ मूल्ये भरून किंवा अंदाज लावून डेटा कॉपी परत करते\n",
"\n",
"या पद्धतींवर प्रभुत्व मिळवणे आणि त्यांचा आत्मविश्वासाने वापर करणे महत्त्वाचे आहे, त्यामुळे चला प्रत्येकावर सविस्तरपणे चर्चा करूया.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Yh5ifd9FgRsB"
},
"source": [
"### शून्य मूल्य शोधणे\n",
"\n",
"आता आपल्याला गहाळ मूल्यांचे महत्त्व समजले आहे, त्यामुळे त्यांच्याशी व्यवहार करण्यापूर्वी आपल्याला आपल्या डेटासेटमध्ये त्यांना शोधणे आवश्यक आहे. \n",
"`isnull()` आणि `notnull()` हे शून्य डेटा शोधण्यासाठी तुमचे प्राथमिक पद्धती आहेत. दोन्ही तुमच्या डेटावर Boolean मास्क परत करतात.\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": true,
"id": "e-vFp5lvgRsC",
"trusted": false
},
"outputs": [],
"source": [
"example3 = pd.Series([0, np.nan, '', None])"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "1XdaJJ7PgRsC",
"outputId": "92fc363a-1874-471f-846d-f4f9ce1f51d0",
"trusted": false
},
"outputs": [
{
"data": {
"text/plain": [
"0 False\n",
"1 True\n",
"2 False\n",
"3 True\n",
"dtype: bool"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example3.isnull()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PaSZ0SQygRsC"
},
"source": [
"आउटपुटकडे बारकाईने पाहा. त्यात काही आश्चर्य वाटतंय का? जरी `0` हे अंकगणितीय शून्य असले तरी, ते एक पूर्णांक आहे आणि pandas त्याला तसंच मानतो. `''` थोडं अधिक सूक्ष्म आहे. जरी आपण ते विभाग 1 मध्ये रिक्त स्ट्रिंग मूल्य दर्शवण्यासाठी वापरले असले तरी, ते एक स्ट्रिंग ऑब्जेक्ट आहे आणि pandas च्या दृष्टीने null चे प्रतिनिधित्व नाही.\n",
"\n",
"आता, हे उलटं करून पाहूया आणि या पद्धतींचा वापर जसा तुम्ही प्रत्यक्षात कराल तसा करूया. Boolean मास्कचा वापर थेट ``Series`` किंवा ``DataFrame`` इंडेक्स म्हणून करता येतो, जे गहाळ (किंवा विद्यमान) मूल्यांसोबत काम करताना उपयुक्त ठरू शकते.\n",
"\n",
"जर आपल्याला गहाळ मूल्यांची एकूण संख्या हवी असेल, तर आपण `isnull()` पद्धतीने तयार केलेल्या मास्कवर फक्त sum करू शकतो.\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "JCcQVoPkHDUv",
"outputId": "001daa72-54f8-4bd5-842a-4df627a79d4d"
},
"outputs": [
{
"data": {
"text/plain": [
"2"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example3.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PlBqEo3mgRsC"
},
"source": [
"### व्यायाम:\n"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true,
"id": "ggDVf5uygRsD",
"trusted": false
},
"outputs": [],
"source": [
"# Try running example3[example3.notnull()].\n",
"# Before you do so, what do you expect to see?\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "D_jWN7mHgRsD"
},
"source": [
"**महत्त्वाचा मुद्दा**: `isnull()` आणि `notnull()` या दोन्ही पद्धती DataFrames मध्ये वापरल्यास समान परिणाम देतात: त्या परिणाम आणि त्या परिणामांचे निर्देशांक दाखवतात, जे तुम्हाला तुमच्या डेटासह काम करताना खूप मदत करतील.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BvnoojWsgRr4"
},
"source": [
"### हरवलेल्या डेटाशी सामना करणे\n",
"\n",
"> **शिकण्याचे उद्दिष्ट:** या उपविभागाच्या शेवटी, तुम्हाला DataFrames मधून null मूल्ये कधी आणि कशी बदलायची किंवा काढायची हे माहित असावे.\n",
"\n",
"मशीन लर्निंग मॉडेल्स स्वतः हरवलेल्या डेटाशी सामना करू शकत नाहीत. त्यामुळे, डेटा मॉडेलमध्ये पाठवण्यापूर्वी, आपल्याला या हरवलेल्या मूल्यांशी सामना करावा लागतो.\n",
"\n",
"हरवलेल्या डेटाशी कसे व्यवहार करायचे यामध्ये सूक्ष्म तडजोडी असतात, ज्याचा तुमच्या अंतिम विश्लेषणावर आणि वास्तविक जगातील परिणामांवर प्रभाव पडू शकतो.\n",
"\n",
"हरवलेल्या डेटाशी सामना करण्याचे मुख्यतः दोन मार्ग आहेत:\n",
"\n",
"1. हरवलेल्या मूल्य असलेली पंक्ती काढून टाका\n",
"2. हरवलेल्या मूल्याला दुसऱ्या काही मूल्याने बदला\n",
"\n",
"आम्ही या दोन्ही पद्धती आणि त्यांचे फायदे व तोटे सविस्तरपणे चर्चा करू.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3VaYC1TvgRsD"
},
"source": [
"### शून्य मूल्य काढून टाकणे\n",
"\n",
"आपण आपल्या मॉडेलला जितका डेटा पुरवतो, त्याचा त्याच्या कार्यक्षमतेवर थेट परिणाम होतो. शून्य मूल्ये काढून टाकणे म्हणजे आपण डेटापॉइंट्सची संख्या कमी करत आहोत आणि त्यामुळे डेटासेटचा आकारही कमी होत आहे. त्यामुळे, जेव्हा डेटासेट खूप मोठा असेल, तेव्हा शून्य मूल्य असलेल्या रकाने काढून टाकणे योग्य ठरते.\n",
"\n",
"आणखी एक उदाहरण म्हणजे एखाद्या विशिष्ट रकान्यात किंवा स्तंभात खूप शून्य मूल्ये असणे. अशावेळी, ती रकाने किंवा स्तंभ काढून टाकले जाऊ शकतात कारण त्या रकान्यात/स्तंभात बहुतेक डेटा गहाळ असल्यामुळे ते आपल्या विश्लेषणात फारसा उपयोगी ठरणार नाहीत.\n",
"\n",
"गहाळ मूल्ये ओळखण्यापलीकडे, pandas `Series` आणि `DataFrame`s मधून शून्य मूल्ये काढून टाकण्यासाठी सोयीस्कर साधन उपलब्ध करून देते. हे प्रत्यक्षात कसे कार्य करते ते पाहण्यासाठी, आपण `example3` कडे परत जाऊ. `DataFrame.dropna()` फंक्शन शून्य मूल्य असलेल्या रकाने काढून टाकण्यासाठी मदत करते.\n"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "7uIvS097gRsD",
"outputId": "c13fc117-4ca1-4145-a0aa-42ac89e6e218",
"trusted": false
},
"outputs": [
{
"data": {
"text/plain": [
"0 0\n",
"2 \n",
"dtype: object"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example3 = example3.dropna()\n",
"example3"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "hil2cr64gRsD"
},
"source": [
"लक्षात घ्या की हे तुमच्या `example3[example3.notnull()]` च्या आउटपुटसारखे दिसले पाहिजे. येथे फरक असा आहे की, फक्त मास्क केलेल्या मूल्यांवर इंडेक्सिंग करण्याऐवजी, `dropna` ने `Series` `example3` मधील ती गहाळ मूल्ये काढून टाकली आहेत.\n",
"\n",
"कारण DataFrames दोन परिमाण असतात, त्यामुळे डेटा काढून टाकण्यासाठी अधिक पर्याय उपलब्ध होतात.\n"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 142
},
"id": "an-l74sPgRsE",
"outputId": "340876a0-63ad-40f6-bd54-6240cdae50ab",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>NaN</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>NaN</td>\n",
" <td>6.0</td>\n",
" <td>9</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2\n",
"0 1.0 NaN 7\n",
"1 2.0 5.0 8\n",
"2 NaN 6.0 9"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example4 = pd.DataFrame([[1, np.nan, 7], \n",
" [2, 5, 8], \n",
" [np.nan, 6, 9]])\n",
"example4"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "66wwdHZrgRsE"
},
"source": [
"(आपण लक्षात घेतले का की pandas ने `NaN`s accommodate करण्यासाठी दोन स्तंभ float मध्ये बदलले?)\n",
"\n",
"आपण `DataFrame` मधून एकच मूल्य काढून टाकू शकत नाही, त्यामुळे आपल्याला संपूर्ण पंक्ती किंवा स्तंभ काढून टाकावे लागतील. आपण काय करत आहात यावर अवलंबून, आपल्याला एक किंवा दुसरे करायचे असू शकते, आणि म्हणून pandas आपल्याला दोन्ही पर्याय देतो. कारण डेटा सायन्समध्ये, स्तंभ सामान्यतः बदल दर्शवतात आणि पंक्ती निरीक्षणे दर्शवतात, आपण डेटा पंक्ती काढून टाकण्याची अधिक शक्यता असते; `dropna()` साठी डिफॉल्ट सेटिंग म्हणजे अशा सर्व पंक्ती काढून टाकणे ज्यामध्ये कोणतीही null मूल्ये असतात:\n"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 80
},
"id": "jAVU24RXgRsE",
"outputId": "0b5e5aee-7187-4d3f-b583-a44136ae5f80",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>8</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2\n",
"1 2.0 5.0 8"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example4.dropna()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TrQRBuTDgRsE"
},
"source": [
"जर आवश्यक असेल, तर तुम्ही स्तंभांमधून NA मूल्ये काढून टाकू शकता. असे करण्यासाठी `axis=1` वापरा:\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 142
},
"id": "GrBhxu9GgRsE",
"outputId": "ff4001f3-2e61-4509-d60e-0093d1068437",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>9</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 2\n",
"0 7\n",
"1 8\n",
"2 9"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example4.dropna(axis='columns')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "KWXiKTfMgRsF"
},
"source": [
"लक्षात घ्या की यामुळे तुम्हाला ठेवायचा असलेला डेटा, विशेषतः लहान डेटासेटमध्ये, मोठ्या प्रमाणात गमवावा लागू शकतो. जर तुम्हाला फक्त अशा पंक्ती किंवा स्तंभ काढून टाकायचे असतील ज्यामध्ये अनेक किंवा अगदी सर्व null मूल्ये असतील, तर तुम्ही `dropna` मध्ये `how` आणि `thresh` पॅरामीटर्स सेट करू शकता.\n",
"\n",
"डिफॉल्टनुसार, `how='any'` असते (जर तुम्हाला स्वतः तपासायचे असेल किंवा या मेथडमध्ये कोणते इतर पॅरामीटर्स आहेत ते पाहायचे असेल, तर कोड सेलमध्ये `example4.dropna?` चालवा). पर्यायाने, तुम्ही `how='all'` असे सेट करू शकता, ज्यामुळे फक्त अशा पंक्ती किंवा स्तंभ काढून टाकले जातील ज्यामध्ये सर्व null मूल्ये असतील. पुढील व्यायामात हे प्रत्यक्षात कसे कार्य करते ते पाहण्यासाठी आपण आपले उदाहरण `DataFrame` विस्तृत करूया.\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 142
},
"id": "Bcf_JWTsgRsF",
"outputId": "72e0b1b8-52fa-4923-98ce-b6fbed6e44b1",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <th>3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>NaN</td>\n",
" <td>7</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>8</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>NaN</td>\n",
" <td>6.0</td>\n",
" <td>9</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2 3\n",
"0 1.0 NaN 7 NaN\n",
"1 2.0 5.0 8 NaN\n",
"2 NaN 6.0 9 NaN"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example4[3] = np.nan\n",
"example4"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pNZer7q9JPNC"
},
"source": [
"> मुख्य मुद्दे:\n",
"1. डेटासेट पुरेसा मोठा असेल तेव्हाच null मूल्ये काढून टाकणे योग्य ठरते.\n",
"2. पूर्ण रांगा किंवा स्तंभ काढून टाकता येतात जर त्यामध्ये बहुतेक डेटा गायब असेल.\n",
"3. `DataFrame.dropna(axis=)` पद्धत null मूल्ये काढून टाकण्यासाठी मदत करते. `axis` युक्तिवाद सूचित करतो की रांगा काढून टाकायच्या आहेत की स्तंभ.\n",
"4. `how` युक्तिवाद देखील वापरता येतो. डीफॉल्टनुसार ते `any` वर सेट केलेले असते. त्यामुळे, फक्त त्या रांगा/स्तंभ काढून टाकले जातात ज्यामध्ये कोणतेही null मूल्ये असतात. ते `all` वर सेट करून आपण फक्त त्या रांगा/स्तंभ काढून टाकू शकतो जिथे सर्व मूल्ये null आहेत.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "oXXSfQFHgRsF"
},
"source": [
"### व्यायाम:\n"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": true,
"id": "ExUwQRxpgRsF",
"trusted": false
},
"outputs": [],
"source": [
"# How might you go about dropping just column 3?\n",
"# Hint: remember that you will need to supply both the axis parameter and the how parameter.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "38kwAihWgRsG"
},
"source": [
"`thresh` पॅरामीटर तुम्हाला अधिक सूक्ष्म नियंत्रण देते: तुम्ही सेट करता की एखाद्या पंक्ती किंवा स्तंभामध्ये ठेवण्यासाठी किती *नॉन-नल* मूल्ये असणे आवश्यक आहे:\n"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 80
},
"id": "M9dCNMaagRsG",
"outputId": "8093713a-54d2-4e54-c73f-4eea315cb6f2",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <th>3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>8</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2 3\n",
"1 2.0 5.0 8 NaN"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example4.dropna(axis='rows', thresh=3)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fmSFnzZegRsG"
},
"source": [
"येथे, पहिली आणि शेवटची ओळ वगळली गेली आहे, कारण त्यामध्ये फक्त दोन नॉन-नल मूल्ये आहेत.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mCcxLGyUgRsG"
},
"source": [
"### रिक्त मूल्ये भरणे\n",
"\n",
"कधी कधी हरवलेल्या मूल्यांना अशा मूल्यांनी भरणे योग्य ठरते जे वैध असू शकतात. रिक्त मूल्ये भरण्यासाठी काही तंत्रे आहेत. पहिले तंत्र म्हणजे डोमेन ज्ञान (डेटासेट ज्या विषयावर आधारित आहे त्याचे ज्ञान) वापरून हरवलेल्या मूल्यांचा अंदाज लावणे.\n",
"\n",
"तुम्ही `isnull` वापरून हे थेट करू शकता, परंतु जर तुम्हाला भरायची अनेक मूल्ये असतील तर ते श्रमसाध्य होऊ शकते. कारण डेटा सायन्समध्ये ही एक सामान्य प्रक्रिया आहे, pandas `fillna` प्रदान करते, जे `Series` किंवा `DataFrame` ची एक प्रत परत करते ज्यामध्ये हरवलेली मूल्ये तुमच्या निवडीच्या मूल्यांनी बदललेली असतात. हे प्रत्यक्षात कसे कार्य करते हे पाहण्यासाठी आणखी एक उदाहरण `Series` तयार करूया.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CE8S7louLezV"
},
"source": [
"### श्रेणीसंबंधी डेटा (असंख्यात्मक)\n",
"सुरुवातीला आपण असंख्यात्मक डेटा विचारात घेऊ. डेटासेटमध्ये, आपल्याकडे श्रेणीसंबंधी डेटा असलेले स्तंभ असतात. उदा. लिंग, खरे किंवा खोटे इत्यादी.\n",
"\n",
"बहुतेक वेळा, अशा परिस्थितीत, आम्ही गहाळ मूल्ये त्या स्तंभाच्या `mode` ने बदलतो. उदाहरणार्थ, आपल्याकडे 100 डेटा पॉइंट्स आहेत आणि त्यापैकी 90 जणांनी खरे म्हटले आहे, 8 जणांनी खोटे म्हटले आहे आणि 2 जणांनी काहीही भरलेले नाही. अशा वेळी, आपण त्या 2 गहाळ मूल्यांना खरेने भरू शकतो, संपूर्ण स्तंभ विचारात घेऊन.\n",
"\n",
"पुन्हा, येथे आपण डोमेन ज्ञानाचा उपयोग करू शकतो. `mode` ने भरल्याचा एक उदाहरण विचार करू.\n"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 204
},
"id": "MY5faq4yLdpQ",
"outputId": "19ab472e-1eed-4de8-f8a7-db2a3af3cb1a"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>5</td>\n",
" <td>6</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>7</td>\n",
" <td>8</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>9</td>\n",
" <td>10</td>\n",
" <td>True</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2\n",
"0 1 2 True\n",
"1 3 4 None\n",
"2 5 6 False\n",
"3 7 8 True\n",
"4 9 10 True"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fill_with_mode = pd.DataFrame([[1,2,\"True\"],\n",
" [3,4,None],\n",
" [5,6,\"False\"],\n",
" [7,8,\"True\"],\n",
" [9,10,\"True\"]])\n",
"\n",
"fill_with_mode"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MLAoMQOfNPlA"
},
"source": [
"आता, प्रथम `None` मूल्य मोडने भरून टाकण्यापूर्वी मोड शोधूया.\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "WKy-9Y2tN5jv",
"outputId": "8da9fa16-e08c-447e-dea1-d4b1db2feebf"
},
"outputs": [
{
"data": {
"text/plain": [
"True 3\n",
"False 1\n",
"Name: 2, dtype: int64"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fill_with_mode[2].value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6iNz_zG_OKrx"
},
"source": [
"म्हणून, आम्ही None च्या जागी True ठेवू.\n"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"id": "TxPKteRvNPOs"
},
"outputs": [],
"source": [
"fill_with_mode[2].fillna('True',inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 204
},
"id": "tvas7c9_OPWE",
"outputId": "ec3c8e44-d644-475e-9e22-c65101965850"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>5</td>\n",
" <td>6</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>7</td>\n",
" <td>8</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>9</td>\n",
" <td>10</td>\n",
" <td>True</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2\n",
"0 1 2 True\n",
"1 3 4 True\n",
"2 5 6 False\n",
"3 7 8 True\n",
"4 9 10 True"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fill_with_mode"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SktitLxxOR16"
},
"source": [
"जसे आपण पाहू शकतो, null मूल्य बदलले गेले आहे. निःसंशयपणे, आपण `'True'` च्या जागी काहीही लिहू शकतो आणि ते बदलले जाईल.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "heYe1I0dOmQ_"
},
"source": [
"### संख्यात्मक डेटा\n",
"आता, संख्यात्मक डेटाकडे वळूया. येथे, गहाळ मूल्ये बदलण्यासाठी दोन सामान्य पद्धती आहेत:\n",
"\n",
"1. पंक्तीच्या माध्याने बदलणे \n",
"2. पंक्तीच्या सरासरीने बदलणे \n",
"\n",
"आम्ही माध्याने बदलतो, जेव्हा डेटा आउटलायर्ससह तिर्यक असतो. कारण माध्य आउटलायर्ससाठी मजबूत असते.\n",
"\n",
"जेव्हा डेटा सामान्यीकृत (normalized) असतो, तेव्हा आपण सरासरी वापरू शकतो, कारण अशा परिस्थितीत सरासरी आणि माध्य जवळजवळ समान असतात.\n",
"\n",
"सर्वप्रथम, आपण एक स्तंभ घेऊ जो सामान्य वितरणात आहे आणि त्या स्तंभाच्या सरासरीने गहाळ मूल्य भरूया.\n"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 204
},
"id": "09HM_2feOj5Y",
"outputId": "7e309013-9acb-411c-9b06-4de795bbeeff"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-2.0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-1.0</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>NaN</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1.0</td>\n",
" <td>6</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2.0</td>\n",
" <td>8</td>\n",
" <td>9</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2\n",
"0 -2.0 0 1\n",
"1 -1.0 2 3\n",
"2 NaN 4 5\n",
"3 1.0 6 7\n",
"4 2.0 8 9"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fill_with_mean = pd.DataFrame([[-2,0,1],\n",
" [-1,2,3],\n",
" [np.nan,4,5],\n",
" [1,6,7],\n",
" [2,8,9]])\n",
"\n",
"fill_with_mean"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ka7-wNfzSxbx"
},
"source": [
"स्तंभाचा सरासरी आहे\n"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "XYtYEf5BSxFL",
"outputId": "68a78d18-f0e5-4a9a-a959-2c3676a57c70"
},
"outputs": [
{
"data": {
"text/plain": [
"0.0"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.mean(fill_with_mean[0])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "oBSRGxKRS39K"
},
"source": [
"मध्यमाने भरत आहे\n"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 204
},
"id": "FzncQLmuS5jh",
"outputId": "00f74fff-01f4-4024-c261-796f50f01d2e"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-2.0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-1.0</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.0</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1.0</td>\n",
" <td>6</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2.0</td>\n",
" <td>8</td>\n",
" <td>9</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2\n",
"0 -2.0 0 1\n",
"1 -1.0 2 3\n",
"2 0.0 4 5\n",
"3 1.0 6 7\n",
"4 2.0 8 9"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fill_with_mean[0].fillna(np.mean(fill_with_mean[0]),inplace=True)\n",
"fill_with_mean"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CwpVFCrPTC5z"
},
"source": [
"जसे आपण पाहू शकतो, गहाळ मूल्य त्याच्या सरासरीने बदलले गेले आहे.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "jIvF13a1i00Z"
},
"source": [
"आता आपण दुसरा डेटा फ्रेम वापरूया, आणि यावेळी आम्ही None मूल्ये स्तंभाच्या मध्यमानाने बदलू.\n"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 204
},
"id": "DA59Bqo3jBYZ",
"outputId": "85dae6ec-7394-4c36-fda0-e04769ec4a32"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-2</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-1</td>\n",
" <td>2.0</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>6.0</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2</td>\n",
" <td>8.0</td>\n",
" <td>9</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2\n",
"0 -2 0.0 1\n",
"1 -1 2.0 3\n",
"2 0 NaN 5\n",
"3 1 6.0 7\n",
"4 2 8.0 9"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fill_with_median = pd.DataFrame([[-2,0,1],\n",
" [-1,2,3],\n",
" [0,np.nan,5],\n",
" [1,6,7],\n",
" [2,8,9]])\n",
"\n",
"fill_with_median"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mM1GpXYmjHnc"
},
"source": [
"दुसऱ्या स्तंभाचा मध्यक आहे\n"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "uiDy5v3xjHHX",
"outputId": "564b6b74-2004-4486-90d4-b39330a64b88"
},
"outputs": [
{
"data": {
"text/plain": [
"4.0"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fill_with_median[1].median()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "z9PLF75Jj_1s"
},
"source": [
"मध्यक मूल्याने भरत आहे\n"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 204
},
"id": "lFKbOxCMkBbg",
"outputId": "a8bd18fb-2765-47d4-e5fe-e965f57ed1f4"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-2</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-1</td>\n",
" <td>2.0</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>4.0</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>6.0</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2</td>\n",
" <td>8.0</td>\n",
" <td>9</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2\n",
"0 -2 0.0 1\n",
"1 -1 2.0 3\n",
"2 0 4.0 5\n",
"3 1 6.0 7\n",
"4 2 8.0 9"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fill_with_median[1].fillna(fill_with_median[1].median(),inplace=True)\n",
"fill_with_median"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8JtQ53GSkKWC"
},
"source": [
"जसे आपण पाहू शकतो, NaN मूल्य स्तंभाच्या मध्यमाने बदलले गेले आहे.\n"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "0ybtWLDdgRsG",
"outputId": "b8c238ef-6024-4ee2-be2b-aa1f0fcac61d",
"trusted": false
},
"outputs": [
{
"data": {
"text/plain": [
"a 1.0\n",
"b NaN\n",
"c 2.0\n",
"d NaN\n",
"e 3.0\n",
"dtype: float64"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example5 = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))\n",
"example5"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yrsigxRggRsH"
},
"source": [
"आपण सर्व रिक्त नोंदी एका मूल्याने भरू शकता, जसे की `0`:\n"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "KXMIPsQdgRsH",
"outputId": "aeedfa0a-a421-4c2f-cb0d-183ce8f0c91d",
"trusted": false
},
"outputs": [
{
"data": {
"text/plain": [
"a 1.0\n",
"b 0.0\n",
"c 2.0\n",
"d 0.0\n",
"e 3.0\n",
"dtype: float64"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example5.fillna(0)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "RRlI5f_hkfKe"
},
"source": [
"> मुख्य मुद्दे:\n",
"1. गहाळ मूल्ये भरताना तेव्हा करावे जेव्हा डेटा कमी असेल किंवा गहाळ डेटा भरण्याची काही रणनीती असेल.\n",
"2. गहाळ मूल्ये अंदाजे भरण्यासाठी डोमेन ज्ञानाचा उपयोग केला जाऊ शकतो.\n",
"3. श्रेणीबद्ध डेटासाठी, प्रामुख्याने, गहाळ मूल्ये स्तंभाच्या मोडने बदलली जातात.\n",
"4. संख्यात्मक डेटासाठी, गहाळ मूल्ये सामान्यतः स्तंभांच्या सरासरी (सामान्यीकृत डेटासेटसाठी) किंवा माध्याने भरली जातात.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FI9MmqFJgRsH"
},
"source": [
"### व्यायाम:\n"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": true,
"id": "af-ezpXdgRsH",
"trusted": false
},
"outputs": [],
"source": [
"# What happens if you try to fill null values with a string, like ''?\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kq3hw1kLgRsI"
},
"source": [
"आपण **फॉरवर्ड-फिल** शून्य मूल्ये करू शकता, म्हणजेच शेवटच्या वैध मूल्याचा वापर करून शून्य भरू शकता:\n"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "vO3BuNrggRsI",
"outputId": "e2bc591b-0b48-4e88-ee65-754f2737c196",
"trusted": false
},
"outputs": [
{
"data": {
"text/plain": [
"a 1.0\n",
"b 1.0\n",
"c 2.0\n",
"d 2.0\n",
"e 3.0\n",
"dtype: float64"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example5.fillna(method='ffill')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nDXeYuHzgRsI"
},
"source": [
"तुम्ही null भरण्यासाठी पुढील वैध मूल्य मागे नेऊन **back-fill** देखील करू शकता:\n"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "4M5onHcEgRsI",
"outputId": "8f32b185-40dd-4a9f-bd85-54d6b6a414fe",
"trusted": false
},
"outputs": [
{
"data": {
"text/plain": [
"a 1.0\n",
"b 2.0\n",
"c 2.0\n",
"d 3.0\n",
"e 3.0\n",
"dtype: float64"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example5.fillna(method='bfill')"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"id": "MbBzTom5gRsI"
},
"source": [
"जसे तुम्ही अंदाज लावू शकता, हे DataFrames सोबत देखील तसेच कार्य करते, परंतु तुम्ही null मूल्ये भरण्यासाठी `axis` देखील निर्दिष्ट करू शकता:\n"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 142
},
"id": "aRpIvo4ZgRsI",
"outputId": "905a980a-a808-4eca-d0ba-224bd7d85955",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <th>3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>NaN</td>\n",
" <td>7</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>8</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>NaN</td>\n",
" <td>6.0</td>\n",
" <td>9</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2 3\n",
"0 1.0 NaN 7 NaN\n",
"1 2.0 5.0 8 NaN\n",
"2 NaN 6.0 9 NaN"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example4"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 142
},
"id": "VM1qtACAgRsI",
"outputId": "71f2ad28-9b4e-4ff4-f5c3-e731eb489ade",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <th>3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>7.0</td>\n",
" <td>7.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>8.0</td>\n",
" <td>8.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>NaN</td>\n",
" <td>6.0</td>\n",
" <td>9.0</td>\n",
" <td>9.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2 3\n",
"0 1.0 1.0 7.0 7.0\n",
"1 2.0 5.0 8.0 8.0\n",
"2 NaN 6.0 9.0 9.0"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example4.fillna(method='ffill', axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZeMc-I1EgRsI"
},
"source": [
"लक्षात घ्या की जेव्हा पूर्वीचे मूल्य पुढे भरण्यासाठी उपलब्ध नसते, तेव्हा रिक्त मूल्य तसेच राहते.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eeAoOU0RgRsJ"
},
"source": [
"### व्यायाम:\n"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": true,
"id": "e8S-CjW8gRsJ",
"trusted": false
},
"outputs": [],
"source": [
"# What output does example4.fillna(method='bfill', axis=1) produce?\n",
"# What about example4.fillna(method='ffill') or example4.fillna(method='bfill')?\n",
"# Can you think of a longer code snippet to write that can fill all of the null values in example4?\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YHgy0lIrgRsJ"
},
"source": [
"आपण `fillna` कसे वापरता याबद्दल सर्जनशील होऊ शकता. उदाहरणार्थ, पुन्हा `example4` पाहूया, पण यावेळी `DataFrame` मधील सर्व मूल्यांचा सरासरी वापरून गहाळ मूल्ये भरूया:\n"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 142
},
"id": "OtYVErEygRsJ",
"outputId": "708b1e67-45ca-44bf-a5ee-8b2de09ece73",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <th>3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>5.5</td>\n",
" <td>7</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>8</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.5</td>\n",
" <td>6.0</td>\n",
" <td>9</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2 3\n",
"0 1.0 5.5 7 NaN\n",
"1 2.0 5.0 8 NaN\n",
"2 1.5 6.0 9 NaN"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example4.fillna(example4.mean())"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zpMvCkLSgRsJ"
},
"source": [
"लक्षात घ्या की स्तंभ 3 अजूनही रिक्त आहे: डीफॉल्ट दिशा म्हणजे मूल्ये पंक्तीवार भरणे.\n",
"\n",
"> **महत्त्वाचे:** तुमच्या डेटासेटमधील हरवलेल्या मूल्यांशी व्यवहार करण्याचे अनेक मार्ग आहेत. तुम्ही वापरलेली विशिष्ट रणनीती (त्यांना काढून टाकणे, त्यांची जागा घेणे, किंवा त्यांना कसे बदलायचे) त्या डेटाच्या विशिष्टतेनुसार ठरवली पाहिजे. तुम्ही जितके अधिक डेटासेट हाताळाल आणि त्यांच्याशी संवाद साधाल तितके हरवलेल्या मूल्यांशी व्यवहार करण्याची चांगली समज विकसित होईल.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bauDnESIl9FH"
},
"source": [
"### श्रेणीसंबंधी डेटा एन्कोड करणे\n",
"\n",
"मशीन लर्निंग मॉडेल्स फक्त संख्यात्मक डेटा आणि कोणत्याही प्रकारच्या संख्यात्मक माहितीशी व्यवहार करतात. ते \"होय\" आणि \"नाही\" यामधील फरक ओळखू शकत नाहीत, परंतु ते 0 आणि 1 मधील फरक ओळखू शकतील. त्यामुळे, गहाळ मूल्ये भरल्यानंतर, आपल्याला श्रेणीसंबंधी डेटा काही संख्यात्मक स्वरूपात एन्कोड करणे आवश्यक आहे जेणेकरून मॉडेलला ते समजेल.\n",
"\n",
"एन्कोडिंग दोन प्रकारे करता येते. पुढे आपण त्याबद्दल चर्चा करू.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uDq9SxB7mu5i"
},
"source": [
"**लेबल एन्कोडिंग**\n",
"\n",
"लेबल एन्कोडिंग म्हणजे प्रत्येक श्रेणीला एका संख्येमध्ये रूपांतरित करणे. उदाहरणार्थ, समजा आपल्याकडे विमान प्रवाशांचा डेटासेट आहे आणि त्यामध्ये त्यांच्या वर्गाची माहिती असलेला एक स्तंभ आहे ['बिझनेस क्लास', 'इकॉनॉमी क्लास', 'फर्स्ट क्लास']. जर लेबल एन्कोडिंग केले गेले, तर हे [0,1,2] मध्ये रूपांतरित होईल. चला कोडच्या माध्यमातून एक उदाहरण पाहूया. कारण आपण पुढील नोटबुक्समध्ये `scikit-learn` शिकणार आहोत, त्यामुळे येथे आपण ते वापरणार नाही.\n"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 235
},
"id": "1vGz7uZyoWHL",
"outputId": "9e252855-d193-4103-a54d-028ea7787b34"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>ID</th>\n",
" <th>class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>10</td>\n",
" <td>business class</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20</td>\n",
" <td>first class</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>30</td>\n",
" <td>economy class</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>40</td>\n",
" <td>economy class</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>50</td>\n",
" <td>economy class</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>60</td>\n",
" <td>business class</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" ID class\n",
"0 10 business class\n",
"1 20 first class\n",
"2 30 economy class\n",
"3 40 economy class\n",
"4 50 economy class\n",
"5 60 business class"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"label = pd.DataFrame([\n",
" [10,'business class'],\n",
" [20,'first class'],\n",
" [30, 'economy class'],\n",
" [40, 'economy class'],\n",
" [50, 'economy class'],\n",
" [60, 'business class']\n",
"],columns=['ID','class'])\n",
"label"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IDHnkwTYov-h"
},
"source": [
"पहिल्या स्तंभावर लेबल एन्कोडिंग करण्यासाठी, प्रत्येक वर्गासाठी एका संख्येची मॅपिंग तयार करावी लागते, त्यानंतर बदल करावा लागतो.\n"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 235
},
"id": "ZC5URJG3o1ES",
"outputId": "aab0f1e7-e0f3-4c14-8459-9f9168c85437"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>ID</th>\n",
" <th>class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>10</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>30</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>40</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>50</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>60</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" ID class\n",
"0 10 0\n",
"1 20 2\n",
"2 30 1\n",
"3 40 1\n",
"4 50 1\n",
"5 60 0"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"class_labels = {'business class':0,'economy class':1,'first class':2}\n",
"label['class'] = label['class'].replace(class_labels)\n",
"label"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ftnF-TyapOPt"
},
"source": [
"जसे आपण पाहतो, आउटपुट आपल्या अपेक्षेनुसार आहे. तर, लेबल एन्कोडिंग कधी वापरावे? लेबल एन्कोडिंग खालीलपैकी एक किंवा दोन्ही परिस्थितींमध्ये वापरले जाते: \n",
"1. जेव्हा श्रेणींची संख्या मोठी असते \n",
"2. जेव्हा श्रेण्या क्रमाने असतात. \n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eQPAPVwsqWT7"
},
"source": [
"**वन हॉट एनकोडिंग**\n",
"\n",
"एनकोडिंगचा आणखी एक प्रकार म्हणजे वन हॉट एनकोडिंग. या प्रकारात, कॉलममधील प्रत्येक श्रेणीसाठी स्वतंत्र कॉलम जोडला जातो आणि प्रत्येक डेटा पॉइंटमध्ये त्या श्रेणीचा समावेश आहे की नाही यावर आधारित 0 किंवा 1 दिला जातो. त्यामुळे, जर n वेगवेगळ्या श्रेण्या असतील, तर n कॉलम डेटा फ्रेममध्ये जोडले जातील.\n",
"\n",
"उदाहरणार्थ, आपण पुन्हा विमानाच्या वर्गाचे उदाहरण घेऊ. श्रेण्या होत्या: ['बिझनेस क्लास', 'इकॉनॉमी क्लास', 'फर्स्ट क्लास']. त्यामुळे, जर आपण वन हॉट एनकोडिंग केले, तर खालील तीन कॉलम डेटासेटमध्ये जोडले जातील: ['class_business class', 'class_economy class', 'class_first class'].\n"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 235
},
"id": "ZM0eVh0ArKUL",
"outputId": "83238a76-b3a5-418d-c0b6-605b02b6891b"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>ID</th>\n",
" <th>class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>10</td>\n",
" <td>business class</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20</td>\n",
" <td>first class</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>30</td>\n",
" <td>economy class</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>40</td>\n",
" <td>economy class</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>50</td>\n",
" <td>economy class</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>60</td>\n",
" <td>business class</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" ID class\n",
"0 10 business class\n",
"1 20 first class\n",
"2 30 economy class\n",
"3 40 economy class\n",
"4 50 economy class\n",
"5 60 business class"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"one_hot = pd.DataFrame([\n",
" [10,'business class'],\n",
" [20,'first class'],\n",
" [30, 'economy class'],\n",
" [40, 'economy class'],\n",
" [50, 'economy class'],\n",
" [60, 'business class']\n",
"],columns=['ID','class'])\n",
"one_hot"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "aVnZ7paDrWmb"
},
"source": [
"चला पहिल्या स्तंभावर वन हॉट एन्कोडिंग करूया\n"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"id": "RUPxf7egrYKr"
},
"outputs": [],
"source": [
"one_hot_data = pd.get_dummies(one_hot,columns=['class'])"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 235
},
"id": "TM37pHsFr4ge",
"outputId": "7be15f53-79b2-447a-979c-822658339a9e"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>ID</th>\n",
" <th>class_business class</th>\n",
" <th>class_economy class</th>\n",
" <th>class_first class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>10</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>20</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>30</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>50</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>60</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" ID class_business class class_economy class class_first class\n",
"0 10 1 0 0\n",
"1 20 0 0 1\n",
"2 30 0 1 0\n",
"3 40 0 1 0\n",
"4 50 0 1 0\n",
"5 60 1 0 0"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"one_hot_data"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_zXRLOjXujdA"
},
"source": [
"प्रत्येक वन हॉट एन्कोड केलेल्या स्तंभामध्ये 0 किंवा 1 असते, जे त्या डेटापॉइंटसाठी ती श्रेणी अस्तित्वात आहे की नाही हे निर्दिष्ट करते.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bDnC4NQOu0qr"
},
"source": [
"आपण वन हॉट एन्कोडिंग कधी वापरतो? वन हॉट एन्कोडिंग खालीलपैकी एक किंवा दोन्ही परिस्थितींमध्ये वापरले जाते:\n",
"\n",
"1. जेव्हा श्रेणींची संख्या आणि डेटासेटचा आकार लहान असतो.\n",
"2. जेव्हा श्रेणी कोणत्याही विशिष्ट क्रमाचे पालन करत नाहीत.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XnUmci_4uvyu"
},
"source": [
"> मुख्य मुद्दे:\n",
"1. संख्यात्मक नसलेल्या डेटाला संख्यात्मक डेटामध्ये रूपांतरित करण्यासाठी एन्कोडिंग केले जाते.\n",
"2. एन्कोडिंगचे दोन प्रकार आहेत: लेबल एन्कोडिंग आणि वन हॉट एन्कोडिंग, जे डेटासेटच्या गरजेनुसार केले जाऊ शकते.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "K8UXOJYRgRsJ"
},
"source": [
"## डुप्लिकेट डेटा काढणे\n",
"\n",
"> **शिकण्याचे उद्दिष्ट:** या उपविभागाच्या शेवटी, तुम्ही DataFrames मधून डुप्लिकेट मूल्ये ओळखण्यात आणि काढण्यात सहजतेने सक्षम असाल.\n",
"\n",
"गहाळ डेटाशिवाय, तुम्हाला वास्तविक जगातील डेटासेटमध्ये अनेकदा डुप्लिकेट डेटा सापडतो. सुदैवाने, pandas डुप्लिकेट नोंदी शोधण्यासाठी आणि काढण्यासाठी सोपी पद्धत प्रदान करते.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qrEG-Wa0gRsJ"
},
"source": [
"### डुप्लिकेट ओळखणे: `duplicated`\n",
"\n",
"तुम्ही pandas मधील `duplicated` पद्धतीचा वापर करून सहजपणे डुप्लिकेट मूल्ये ओळखू शकता, जी Boolean मास्क परत करते ज्यामध्ये एखादी नोंद `DataFrame` मध्ये आधीच्या नोंदीची डुप्लिकेट आहे का हे दर्शवले जाते. चला याचा उपयोग करून एक उदाहरण `DataFrame` तयार करूया.\n"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 204
},
"id": "ZLu6FEnZgRsJ",
"outputId": "376512d1-d842-4db1-aea3-71052aeeecaf",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>letters</th>\n",
" <th>numbers</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>A</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>A</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" letters numbers\n",
"0 A 1\n",
"1 B 2\n",
"2 A 1\n",
"3 B 3\n",
"4 B 3"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example6 = pd.DataFrame({'letters': ['A','B'] * 2 + ['B'],\n",
" 'numbers': [1, 2, 1, 3, 3]})\n",
"example6"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "cIduB5oBgRsK",
"outputId": "3da27b3d-4d69-4e1d-bb52-0af21bae87f2",
"trusted": false
},
"outputs": [
{
"data": {
"text/plain": [
"0 False\n",
"1 False\n",
"2 True\n",
"3 False\n",
"4 True\n",
"dtype: bool"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example6.duplicated()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0eDRJD4SgRsK"
},
"source": [
"### डुप्लिकेट्स काढणे: `drop_duplicates`\n",
"`drop_duplicates` फक्त अशा डेटाची प्रत परत करते ज्यासाठी सर्व `duplicated` मूल्ये `False` आहेत:\n"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 142
},
"id": "w_YPpqIqgRsK",
"outputId": "ac66bd2f-8671-4744-87f5-8b8d96553dea",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>letters</th>\n",
" <th>numbers</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>A</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" letters numbers\n",
"0 A 1\n",
"1 B 2\n",
"3 B 3"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example6.drop_duplicates()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "69AqoCZAgRsK"
},
"source": [
"`duplicated` आणि `drop_duplicates` डिफॉल्टनं सर्व स्तंभ विचारात घेतात, पण तुम्ही तुमच्या `DataFrame` मधील स्तंभांचा उपसंच तपासण्यासाठी त्यांना निर्दिष्ट करू शकता:\n"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 111
},
"id": "BILjDs67gRsK",
"outputId": "ef6dcc08-db8b-4352-c44e-5aa9e2bec0d3",
"trusted": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>letters</th>\n",
" <th>numbers</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>A</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" letters numbers\n",
"0 A 1\n",
"1 B 2"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example6.drop_duplicates(['letters'])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GvX4og1EgRsL"
},
"source": [
"> **महत्त्वाचे:** डुप्लिकेट डेटा काढून टाकणे हे जवळजवळ प्रत्येक डेटा-सायन्स प्रकल्पाचा महत्त्वाचा भाग आहे. डुप्लिकेट डेटा तुमच्या विश्लेषणाचे परिणाम बदलू शकतो आणि तुम्हाला चुकीचे परिणाम देऊ शकतो!\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## वास्तविक-जगातील डेटा गुणवत्ता तपासणी\n",
"\n",
"> **शिकण्याचे उद्दिष्ट:** या विभागाच्या शेवटी, तुम्हाला असंगत श्रेणीमूल्ये, असामान्य संख्यात्मक मूल्ये (अत्युच्च मूल्ये), आणि थोड्या फरकांसह पुनरावृत्ती असलेल्या घटकांसह सामान्य डेटा गुणवत्ता समस्यांचे शोध आणि सुधार करण्याची सवय होईल.\n",
"\n",
"जरी गहाळ मूल्ये आणि अचूक पुनरावृत्ती सामान्य समस्या असल्या तरी, वास्तविक-जगातील डेटासेटमध्ये अधिक सूक्ष्म समस्या असतात:\n",
"\n",
"1. **असंगत श्रेणीमूल्ये**: समान श्रेणी वेगवेगळ्या प्रकारे लिहिलेली (उदा., \"USA\", \"U.S.A\", \"United States\")\n",
"2. **असामान्य संख्यात्मक मूल्ये**: डेटा नोंदवण्याच्या त्रुटी सूचित करणारी अत्युच्च मूल्ये (उदा., वय = 999)\n",
"3. **जवळपास पुनरावृत्ती असलेल्या ओळी**: थोड्या फरकांसह समान घटकाचे प्रतिनिधित्व करणारे नोंद\n",
"\n",
"या समस्यांचे शोध आणि हाताळण्यासाठी तंत्रे शोधूया.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### \"डर्टी\" डेटासेट तयार करणे\n",
"\n",
"सुरुवातीला, आपण एक नमुना डेटासेट तयार करूया ज्यामध्ये वास्तविक जगातील डेटामध्ये सामान्यतः आढळणाऱ्या समस्या असतील:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"# Create a sample dataset with quality issues\n",
"dirty_data = pd.DataFrame({\n",
" 'customer_id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],\n",
" 'name': ['John Smith', 'Jane Doe', 'John Smith', 'Bob Johnson', \n",
" 'Alice Williams', 'Charlie Brown', 'John Smith', 'Eva Martinez',\n",
" 'Bob Johnson', 'Diana Prince', 'Frank Castle', 'Alice Williams'],\n",
" 'age': [25, 32, 25, 45, 28, 199, 25, 31, 45, 27, -5, 28],\n",
" 'country': ['USA', 'UK', 'U.S.A', 'Canada', 'USA', 'United Kingdom',\n",
" 'United States', 'Mexico', 'canada', 'USA', 'UK', 'usa'],\n",
" 'purchase_amount': [100.50, 250.00, 105.00, 320.00, 180.00, 90.00,\n",
" 102.00, 275.00, 325.00, 195.00, 410.00, 185.00]\n",
"})\n",
"\n",
"print(\"Sample 'Dirty' Dataset:\")\n",
"print(dirty_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. असंगत श्रेणीमूल्य शोधणे\n",
"\n",
"`country` स्तंभामध्ये समान देशांसाठी अनेक प्रकार दिसून येतात. चला या असंगती ओळखूया:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Check unique values in the country column\n",
"print(\"Unique country values:\")\n",
"print(dirty_data['country'].unique())\n",
"print(f\"\\nTotal unique values: {dirty_data['country'].nunique()}\")\n",
"\n",
"# Count occurrences of each variation\n",
"print(\"\\nValue counts:\")\n",
"print(dirty_data['country'].value_counts())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### श्रेणीबद्ध मूल्यांचे मानकीकरण\n",
"\n",
"आपण या मूल्यांचे मानकीकरण करण्यासाठी एक मॅपिंग तयार करू शकतो. एक सोपी पद्धत म्हणजे लहान अक्षरात रूपांतर करणे आणि मॅपिंग डिक्शनरी तयार करणे:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Create a standardization mapping\n",
"country_mapping = {\n",
" 'usa': 'USA',\n",
" 'u.s.a': 'USA',\n",
" 'united states': 'USA',\n",
" 'uk': 'UK',\n",
" 'united kingdom': 'UK',\n",
" 'canada': 'Canada',\n",
" 'mexico': 'Mexico'\n",
"}\n",
"\n",
"# Standardize the country column\n",
"dirty_data['country_clean'] = dirty_data['country'].str.lower().map(country_mapping)\n",
"\n",
"print(\"Before standardization:\")\n",
"print(dirty_data['country'].value_counts())\n",
"print(\"\\nAfter standardization:\")\n",
"print(dirty_data[['country_clean']].value_counts())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**पर्याय: अस्पष्ट जुळणीचा वापर**\n",
"\n",
"अधिक जटिल प्रकरणांसाठी, आपण `rapidfuzz` लायब्ररीसह अस्पष्ट स्ट्रिंग जुळणी वापरू शकतो जेणेकरून समान स्ट्रिंग्स आपोआप ओळखता येतील:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"try:\n",
" from rapidfuzz import process, fuzz\n",
"except ImportError:\n",
" print(\"rapidfuzz is not installed. Please install it with 'pip install rapidfuzz' to use fuzzy matching.\")\n",
" process = None\n",
" fuzz = None\n",
"\n",
"# Get unique countries\n",
"unique_countries = dirty_data['country'].unique()\n",
"\n",
"# For each country, find similar matches\n",
"if process is not None and fuzz is not None:\n",
" print(\"Finding similar country names (similarity > 70%):\")\n",
" for country in unique_countries:\n",
" matches = process.extract(country, unique_countries, scorer=fuzz.ratio, limit=3)\n",
" # Filter matches with similarity > 70 and not identical\n",
" similar = [m for m in matches if m[1] > 70 and m[0] != country]\n",
" if similar:\n",
" print(f\"\\n'{country}' is similar to:\")\n",
" for match, score, _ in similar:\n",
" print(f\" - '{match}' (similarity: {score}%)\")\n",
"else:\n",
" print(\"Skipping fuzzy matching because rapidfuzz is not available.\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. असामान्य संख्यात्मक मूल्य (आउटलायर्स) शोधणे\n",
"\n",
"`age` स्तंभाकडे पाहताना, आपल्याला 199 आणि -5 सारखे काही संशयास्पद मूल्ये दिसतात. चल statistical पद्धतींचा वापर करून या आउटलाईर्स शोधूया.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Display basic statistics\n",
"print(\"Age column statistics:\")\n",
"print(dirty_data['age'].describe())\n",
"\n",
"# Identify impossible values using domain knowledge\n",
"print(\"\\nRows with impossible age values (< 0 or > 120):\")\n",
"impossible_ages = dirty_data[(dirty_data['age'] < 0) | (dirty_data['age'] > 120)]\n",
"print(impossible_ages[['customer_id', 'name', 'age']])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### IQR (इंटरक्वार्टाइल रेंज) पद्धत वापरणे\n",
"\n",
"IQR पद्धत ही बाह्य मूल्य शोधण्यासाठी एक मजबूत सांख्यिकीय तंत्र आहे जी अत्यंत मूल्यांबद्दल कमी संवेदनशील आहे:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Calculate IQR for age (excluding impossible values)\n",
"valid_ages = dirty_data[(dirty_data['age'] >= 0) & (dirty_data['age'] <= 120)]['age']\n",
"\n",
"Q1 = valid_ages.quantile(0.25)\n",
"Q3 = valid_ages.quantile(0.75)\n",
"IQR = Q3 - Q1\n",
"\n",
"# Define outlier bounds\n",
"lower_bound = Q1 - 1.5 * IQR\n",
"upper_bound = Q3 + 1.5 * IQR\n",
"\n",
"print(f\"IQR-based outlier bounds for age: [{lower_bound:.2f}, {upper_bound:.2f}]\")\n",
"\n",
"# Identify outliers\n",
"age_outliers = dirty_data[(dirty_data['age'] < lower_bound) | (dirty_data['age'] > upper_bound)]\n",
"print(f\"\\nRows with age outliers:\")\n",
"print(age_outliers[['customer_id', 'name', 'age']])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Z-स्कोर पद्धत वापरणे\n",
"\n",
"Z-स्कोर पद्धत सरासरीपासून मानक विचलनांवर आधारित अपवाद ओळखते:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"try:\n",
" from scipy import stats\n",
"except ImportError:\n",
" print(\"scipy is required for Z-score calculation. Please install it with 'pip install scipy' and rerun this cell.\")\n",
"else:\n",
" # Calculate Z-scores for age, handling NaN values\n",
" age_nonan = dirty_data['age'].dropna()\n",
" zscores = np.abs(stats.zscore(age_nonan))\n",
" dirty_data['age_zscore'] = np.nan\n",
" dirty_data.loc[age_nonan.index, 'age_zscore'] = zscores\n",
"\n",
" # Typically, Z-score > 3 indicates an outlier\n",
" print(\"Rows with age Z-score > 3:\")\n",
" zscore_outliers = dirty_data[dirty_data['age_zscore'] > 3]\n",
" print(zscore_outliers[['customer_id', 'name', 'age', 'age_zscore']])\n",
"\n",
" # Clean up the temporary column\n",
" dirty_data = dirty_data.drop('age_zscore', axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### अपवाद हाताळणे\n",
"\n",
"एकदा ओळखल्यानंतर, अपवाद अनेक प्रकारे हाताळले जाऊ शकतात:\n",
"1. **काढून टाका**: अपवाद असलेल्या पंक्ती हटवा (जर त्या चुका असतील)\n",
"2. **मर्यादा ठेवा**: सीमा मूल्यांसह बदल करा\n",
"3. **NaN ने बदला**: हरवलेला डेटा म्हणून विचार करा आणि भरपाई तंत्र वापरा\n",
"4. **ठेवा**: जर ते वैध अत्यंत मूल्ये असतील\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Create a cleaned version by replacing impossible ages with NaN\n",
"dirty_data['age_clean'] = dirty_data['age'].apply(\n",
" lambda x: np.nan if (x < 0 or x > 120) else x\n",
")\n",
"\n",
"print(\"Age column before and after cleaning:\")\n",
"print(dirty_data[['customer_id', 'name', 'age', 'age_clean']])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3. जवळजवळ जुळणाऱ्या ओळी शोधणे\n",
"\n",
"लक्षात घ्या की आपल्या डेटासेटमध्ये \"John Smith\" साठी थोड्या वेगळ्या मूल्यांसह अनेक नोंदी आहेत. नावाच्या साम्याच्या आधारे संभाव्य डुप्लिकेट्स ओळखूया.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# First, let's look at exact name matches (ignoring extra whitespace)\n",
"dirty_data['name_normalized'] = dirty_data['name'].str.strip().str.lower()\n",
"\n",
"print(\"Checking for duplicate names:\")\n",
"duplicate_names = dirty_data[dirty_data.duplicated(['name_normalized'], keep=False)]\n",
"print(duplicate_names.sort_values('name_normalized')[['customer_id', 'name', 'age', 'country']])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### फझी मॅचिंगसह जवळपास डुप्लिकेट शोधणे\n",
"\n",
"अधिक प्रगत डुप्लिकेट शोधण्यासाठी, आपण फझी मॅचिंग वापरून समान नाव शोधू शकतो:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"try:\n",
" from rapidfuzz import process, fuzz\n",
"\n",
" # Function to find potential duplicates\n",
" def find_near_duplicates(df, column, threshold=90):\n",
" \"\"\"\n",
" Find near-duplicate entries in a column using fuzzy matching.\n",
" \n",
" Parameters:\n",
" - df: DataFrame\n",
" - column: Column name to check for duplicates\n",
" - threshold: Similarity threshold (0-100)\n",
" \n",
" Returns: List of potential duplicate groups\n",
" \"\"\"\n",
" values = df[column].unique()\n",
" duplicate_groups = []\n",
" checked = set()\n",
" \n",
" for value in values:\n",
" if value in checked:\n",
" continue\n",
" \n",
" # Find similar values\n",
" matches = process.extract(value, values, scorer=fuzz.ratio, limit=len(values))\n",
" similar = [m[0] for m in matches if m[1] >= threshold]\n",
" \n",
" if len(similar) > 1:\n",
" duplicate_groups.append(similar)\n",
" checked.update(similar)\n",
" \n",
" return duplicate_groups\n",
"\n",
" # Find near-duplicate names\n",
" duplicate_groups = find_near_duplicates(dirty_data, 'name', threshold=90)\n",
"\n",
" print(\"Potential duplicate groups:\")\n",
" for i, group in enumerate(duplicate_groups, 1):\n",
" print(f\"\\nGroup {i}:\")\n",
" for name in group:\n",
" matching_rows = dirty_data[dirty_data['name'] == name]\n",
" print(f\" '{name}': {len(matching_rows)} occurrence(s)\")\n",
" for _, row in matching_rows.iterrows():\n",
" print(f\" - Customer {row['customer_id']}: age={row['age']}, country={row['country']}\")\n",
"except ImportError:\n",
" print(\"rapidfuzz is not installed. Skipping fuzzy matching for near-duplicates.\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### डुप्लिकेट्स हाताळणे\n",
"\n",
"ओळखल्यानंतर, तुम्हाला डुप्लिकेट्स कसे हाताळायचे ते ठरवावे लागेल:\n",
"1. **पहिली नोंद ठेवा**: `drop_duplicates(keep='first')` वापरा\n",
"2. **शेवटची नोंद ठेवा**: `drop_duplicates(keep='last')` वापरा\n",
"3. **माहिती एकत्र करा**: डुप्लिकेट रकान्यांमधील माहिती एकत्र करा\n",
"4. **हस्तलिखित पुनरावलोकन**: मानवी पुनरावलोकनासाठी चिन्हांकित करा\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Example: Remove duplicates based on normalized name, keeping first occurrence\n",
"cleaned_data = dirty_data.drop_duplicates(subset=['name_normalized'], keep='first')\n",
"\n",
"print(f\"Original dataset: {len(dirty_data)} rows\")\n",
"print(f\"After removing name duplicates: {len(cleaned_data)} rows\")\n",
"print(f\"Removed: {len(dirty_data) - len(cleaned_data)} duplicate rows\")\n",
"\n",
"print(\"\\nCleaned dataset:\")\n",
"print(cleaned_data[['customer_id', 'name', 'age', 'country_clean']])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### सारांश: संपूर्ण डेटा स्वच्छता प्रक्रिया\n",
"\n",
"चला सर्वकाही एकत्र करून एक व्यापक स्वच्छता प्रक्रिया तयार करूया:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def clean_dataset(df):\n",
" \"\"\"\n",
" Comprehensive data cleaning function.\n",
" \"\"\"\n",
" # Create a copy to avoid modifying the original\n",
" cleaned = df.copy()\n",
" \n",
" # 1. Standardize categorical values (country)\n",
" country_mapping = {\n",
" 'usa': 'USA', 'u.s.a': 'USA', 'united states': 'USA',\n",
" 'uk': 'UK', 'united kingdom': 'UK',\n",
" 'canada': 'Canada', 'mexico': 'Mexico'\n",
" }\n",
" cleaned['country'] = cleaned['country'].str.lower().map(country_mapping)\n",
" \n",
" # 2. Clean abnormal age values\n",
" cleaned['age'] = cleaned['age'].apply(\n",
" lambda x: np.nan if (x < 0 or x > 120) else x\n",
" )\n",
" \n",
" # 3. Remove near-duplicate names (normalize whitespace)\n",
" cleaned['name'] = cleaned['name'].str.strip()\n",
" cleaned = cleaned.drop_duplicates(subset=['name'], keep='first')\n",
" \n",
" return cleaned\n",
"\n",
"# Apply the cleaning pipeline\n",
"final_cleaned_data = clean_dataset(dirty_data)\n",
"\n",
"print(\"Before cleaning:\")\n",
"print(f\" Rows: {len(dirty_data)}\")\n",
"print(f\" Unique countries: {dirty_data['country'].nunique()}\")\n",
"print(f\" Invalid ages: {((dirty_data['age'] < 0) | (dirty_data['age'] > 120)).sum()}\")\n",
"\n",
"print(\"\\nAfter cleaning:\")\n",
"print(f\" Rows: {len(final_cleaned_data)}\")\n",
"print(f\" Unique countries: {final_cleaned_data['country'].nunique()}\")\n",
"print(f\" Invalid ages: {((final_cleaned_data['age'] < 0) | (final_cleaned_data['age'] > 120)).sum()}\")\n",
"\n",
"print(\"\\nCleaned dataset:\")\n",
"print(final_cleaned_data[['customer_id', 'name', 'age', 'country', 'purchase_amount']])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 🎯 आव्हान व्यायाम\n",
"\n",
"आता तुमची पाळी! खाली दिलेली डेटा पंक्ती अनेक गुणवत्तेच्या समस्यांसह आहे. तुम्ही करू शकता का:\n",
"\n",
"1. या पंक्तीतील सर्व समस्या ओळखणे\n",
"2. प्रत्येक समस्येचे निराकरण करण्यासाठी कोड लिहिणे\n",
"3. स्वच्छ केलेली पंक्ती डेटासेटमध्ये जोडणे\n",
"\n",
"येथे समस्याग्रस्त डेटा आहे:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# New problematic row\n",
"new_row = pd.DataFrame({\n",
" 'customer_id': [13],\n",
" 'name': [' Diana Prince '], # Extra whitespace\n",
" 'age': [250], # Impossible age\n",
" 'country': ['U.S.A.'], # Inconsistent format\n",
" 'purchase_amount': [150.00]\n",
"})\n",
"\n",
"print(\"New row to clean:\")\n",
"print(new_row)\n",
"\n",
"# TODO: Your code here to clean this row\n",
"# Hints:\n",
"# 1. Strip whitespace from the name\n",
"# 2. Check if the name is a duplicate (Diana Prince already exists)\n",
"# 3. Handle the impossible age value\n",
"# 4. Standardize the country name\n",
"\n",
"# Example solution (uncomment and modify as needed):\n",
"# new_row_cleaned = new_row.copy()\n",
"# new_row_cleaned['name'] = new_row_cleaned['name'].str.strip()\n",
"# new_row_cleaned['age'] = np.nan # Invalid age\n",
"# new_row_cleaned['country'] = 'USA' # Standardized\n",
"# print(\"\\nCleaned row:\")\n",
"# print(new_row_cleaned)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### मुख्य मुद्दे\n",
"\n",
"1. **असंगत श्रेणी** वास्तव जगातील डेटामध्ये सामान्य आहेत. नेहमी अद्वितीय मूल्ये तपासा आणि त्यांना मॅपिंग किंवा फझी मॅचिंगद्वारे प्रमाणित करा.\n",
"\n",
"2. **आउटलायर्स** तुमच्या विश्लेषणावर मोठा परिणाम करू शकतात. त्यांचा शोध घेण्यासाठी डोमेन ज्ञानासह सांख्यिकीय पद्धती (IQR, Z-score) वापरा.\n",
"\n",
"3. **जवळपासचे डुप्लिकेट** अचूक डुप्लिकेटपेक्षा शोधणे कठीण असते. त्यांना ओळखण्यासाठी फझी मॅचिंग आणि डेटा सामान्यीकरण (लोअरकेसिंग, व्हाइटस्पेस काढणे) विचारात घ्या.\n",
"\n",
"4. **डेटा स्वच्छ करणे पुनरावृत्तीशील आहे**. स्वच्छ डेटा अंतिम करण्यापूर्वी तुम्हाला अनेक तंत्रे लागू करावी लागतील आणि परिणाम पुनरावलोकन करावे लागतील.\n",
"\n",
"5. **तुमचे निर्णय दस्तऐवजीकरण करा**. तुम्ही कोणते स्वच्छता चरण लागू केले आणि का, याचा मागोवा ठेवा, कारण पुनरुत्पादकता आणि पारदर्शकतेसाठी हे महत्त्वाचे आहे.\n",
"\n",
"> **सर्वोत्तम पद्धत:** तुमचा मूळ \"अस्वच्छ\" डेटा नेहमी जतन करा. तुमच्या स्रोत डेटा फाइल्स कधीही अधिलिखित करू नका - `data_cleaned.csv` सारख्या स्पष्ट नावाच्या पद्धतींसह स्वच्छ आवृत्त्या तयार करा.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**अस्वीकरण**: \nहा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी कृपया लक्षात ठेवा की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर करून उद्भवलेल्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही.\n"
]
}
],
"metadata": {
"anaconda-cloud": {},
"colab": {
"name": "notebook.ipynb",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.4"
},
"coopTranslator": {
"original_hash": "6301339d1c9a301b00639c635dc9b731",
"translation_date": "2025-10-03T19:42:34+00:00",
"source_file": "2-Working-With-Data/08-data-preparation/notebook.ipynb",
"language_code": "mr"
}
},
"nbformat": 4,
"nbformat_minor": 0
}