वेब स्क्रैपिंग वह प्रक्रिया है जिसमें किसी प्रोग्राम या एल्गोरिदम का उपयोग करके वेब से बड़े पैमाने पर डेटा निकाला और प्रोसेस किया जाता है। चाहे आप डेटा साइंटिस्ट हों, इंजीनियर हों, या बड़े डेटासेट का विश्लेषण करने वाले कोई भी पेशेवर हों—वेब से डेटा स्क्रैप करने की क्षमता एक उपयोगी कौशल है। मान लीजिए आपको वेब पर डेटा मिलता है और उसे सीधे डाउनलोड करने का कोई तरीका नहीं है, तो Python का उपयोग करके वेब स्क्रैपिंग ऐसा कौशल है जिसकी मदद से आप डेटा को ऐसे रूप में निकाल सकते हैं जिसे आयात किया जा सके।
इस ट्यूटोरियल में, आप निम्नलिखित सीखेंगे:
- Python के Beautiful Soup मॉड्यूल का उपयोग करके वेब से डेटा निकालना
- Python की Pandas लाइब्रेरी का उपयोग करके डेटा में बदलाव और सफाई
- Python की Matplotlib लाइब्रेरी का उपयोग करके डेटा विज़ुअलाइज़ेशन
इस ट्यूटोरियल में उपयोग किया गया डेटासेट जून 2017 में Hillsboro, OR में आयोजित 10K रेस से लिया गया है। विशेष रूप से, आप 10K धावकों के प्रदर्शन का विश्लेषण करेंगे और निम्नलिखित प्रश्नों के उत्तर देंगे:
- धावकों का औसत फिनिश समय क्या था?
- क्या धावकों के फिनिश समय सामान्य वितरण का पालन करते थे?
- क्या विभिन्न आयु समूहों में पुरुषों और महिलाओं के प्रदर्शन में कोई अंतर था?
Beautiful Soup का उपयोग करके वेब स्क्रैपिंग
Jupyter Notebook का उपयोग करते हुए, आपको आवश्यक मॉड्यूल (pandas, numpy, matplotlib.pyplot, Seaborn) इम्पोर्ट करके शुरू करना चाहिए। यदि आपके पास Jupyter Notebook इंस्टॉल नहीं है, तो मैं इंटरनेट पर उपलब्ध Anaconda Python डिस्ट्रीब्यूशन के जरिए इसे इंस्टॉल करने की सलाह देता/देती हूं। प्लॉट्स को आसानी से दिखाने के लिए, नीचे दिखाए अनुसार लाइन %matplotlib inline शामिल करना सुनिश्चित करें।
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
वेब स्क्रैपिंग करने के लिए, आपको नीचे दिखाए गए लाइब्रेरी भी इम्पोर्ट करनी चाहिए। urllib.request मॉड्यूल URLs खोलने के लिए उपयोग किया जाता है। BeautifulSoup पैकेज html फाइलों से डेटा निकालने के लिए उपयोग होता है। BeautifulSoup लाइब्रेरी का नाम bs4 है, जिसका अर्थ है BeautifulSoup, संस्करण 4।
from urllib.request import urlopen
from bs4 import BeautifulSoup
आवश्यक मॉड्यूल इम्पोर्ट करने के बाद, आपको डेटासेट वाला URL निर्दिष्ट करना चाहिए और पेज का html पाने के लिए उसे urlopen() में पास करना चाहिए।
url = "http://www.hubertiming.com/results/2017GPTR10K"
html = urlopen(url)
पेज का html पाना सिर्फ पहला चरण है। अगला चरण html से एक BeautifulSoup ऑब्जेक्ट बनाना है। यह BeautifulSoup() फंक्शन में html पास करके किया जाता है। BeautifulSoup पैकेज html को पार्स करने के लिए उपयोग होता है, यानी कच्चे html टेक्स्ट को लेकर उसे Python ऑब्जेक्ट्स में तोड़ना। दूसरा आर्ग्युमेंट lxml एक html पार्सर है, जिसकी बारीकियों की चिंता आपको अभी करने की ज़रूरत नहीं है।
soup = BeautifulSoup(html, 'lxml')
type(soup)
bs4.BeautifulSoup
soup ऑब्जेक्ट आपको उस वेबसाइट के बारे में रोचक जानकारी निकालने देता है जिसे आप स्क्रैप कर रहे हैं—जैसे कि नीचे दिखाए अनुसार पेज का शीर्षक प्राप्त करना।
# Get the title
title = soup.title
print(title)
<title>2017 Intel Great Place to Run 10K \ Urban Clash Games Race Results</title>
आप वेबपेज का टेक्स्ट भी ले सकते हैं और जल्दी से प्रिंट कर सकते हैं ताकि जांच सकें कि यह वैसा ही है जैसा आप अपेक्षा करते हैं।
# Print out the text
text = soup.get_text()
#print(soup.text)
आप वेबपेज का html देखने के लिए वेबपेज पर कहीं भी राइट-क्लिक करके "Inspect" चुन सकते हैं। परिणाम कुछ ऐसा दिखता है।

आप वेबपेज के भीतर उपयोगी html टैग्स निकालने के लिए soup की find_all() मेथड का उपयोग कर सकते हैं। उपयोगी टैग्स के उदाहरणों में हाइपरलिंक के लिए < a >, तालिकाओं के लिए < table >, टेबल रो के लिए < tr >, टेबल हेडर के लिए < th >, और टेबल सेल्स के लिए < td > शामिल हैं। नीचे दिया गया कोड वेबपेज के भीतर सभी हाइपरलिंक्स निकालना दिखाता है।
soup.find_all('a')
[<a class="btn btn-primary btn-lg" href="/results/2017GPTR" role="button">5K</a>,
<a href="http://hubertiming.com">Huber Timing Home</a>,
<a href="#individual">Individual Results</a>,
<a href="#team">Team Results</a>,
<a href="mailto:timing@hubertiming.com">timing@hubertiming.com</a>,
<a href="#tabs-1" style="font-size: 18px">Results</a>,
<a name="individual"></a>,
<a name="team"></a>,
<a href="http://www.hubertiming.com"><img height="65" src="/sites/all/themes/hubertiming/images/clockWithFinishSign_small.png" width="50"/>Huber Timing</a>,
<a href="http://facebook.com/hubertiming"><img src="/results/FB-f-Logo__blue_50.png"/></a>]
जैसा कि आप ऊपर के आउटपुट से देख सकते हैं, html टैग्स कभी-कभी class, src आदि जैसे एट्रिब्यूट्स के साथ आते हैं। ये एट्रिब्यूट्स html एलिमेंट्स के बारे में अतिरिक्त जानकारी प्रदान करते हैं। आप एक for लूप और get("href") मेथड का उपयोग करके केवल हाइपरलिंक्स निकालकर प्रिंट कर सकते हैं।
all_links = soup.find_all("a")
for link in all_links:
print(link.get("href"))
/results/2017GPTR
http://hubertiming.com/
#individual
#team
mailto:timing@hubertiming.com
#tabs-1
None
None
http://www.hubertiming.com/
http://facebook.com/hubertiming/
सिर्फ टेबल की रो प्रिंट करने के लिए, soup.find_all() में tr आर्ग्युमेंट पास करें।
# Print the first 10 rows for sanity check
rows = soup.find_all('tr')
print(rows[:10])
[<tr><td>Finishers:</td><td>577</td></tr>, <tr><td>Male:</td><td>414</td></tr>, <tr><td>Female:</td><td>163</td></tr>, <tr class="header">
<th>Place</th>
<th>Bib</th>
<th>Name</th>
<th>Gender</th>
<th>City</th>
<th>State</th>
<th>Chip Time</th>
<th>Chip Pace</th>
<th>Gender Place</th>
<th>Age Group</th>
<th>Age Group Place</th>
<th>Time to Start</th>
<th>Gun Time</th>
<th>Team</th>
</tr>, <tr>
<td>1</td>
<td>814</td>
<td>JARED WILSON</td>
<td>M</td>
<td>TIGARD</td>
<td>OR</td>
<td>00:36:21</td>
<td>05:51</td>
<td>1 of 414</td>
<td>M 36-45</td>
<td>1 of 152</td>
<td>00:00:03</td>
<td>00:36:24</td>
<td></td>
</tr>, <tr>
<td>2</td>
<td>573</td>
<td>NATHAN A SUSTERSIC</td>
<td>M</td>
<td>PORTLAND</td>
<td>OR</td>
<td>00:36:42</td>
<td>05:55</td>
<td>2 of 414</td>
<td>M 26-35</td>
<td>1 of 154</td>
<td>00:00:03</td>
<td>00:36:45</td>
<td>INTEL TEAM F</td>
</tr>, <tr>
<td>3</td>
<td>687</td>
<td>FRANCISCO MAYA</td>
<td>M</td>
<td>PORTLAND</td>
<td>OR</td>
<td>00:37:44</td>
<td>06:05</td>
<td>3 of 414</td>
<td>M 46-55</td>
<td>1 of 64</td>
<td>00:00:04</td>
<td>00:37:48</td>
<td></td>
</tr>, <tr>
<td>4</td>
<td>623</td>
<td>PAUL MORROW</td>
<td>M</td>
<td>BEAVERTON</td>
<td>OR</td>
<td>00:38:34</td>
<td>06:13</td>
<td>4 of 414</td>
<td>M 36-45</td>
<td>2 of 152</td>
<td>00:00:03</td>
<td>00:38:37</td>
<td></td>
</tr>, <tr>
<td>5</td>
<td>569</td>
<td>DEREK G OSBORNE</td>
<td>M</td>
<td>HILLSBORO</td>
<td>OR</td>
<td>00:39:21</td>
<td>06:20</td>
<td>5 of 414</td>
<td>M 26-35</td>
<td>2 of 154</td>
<td>00:00:03</td>
<td>00:39:24</td>
<td>INTEL TEAM F</td>
</tr>, <tr>
<td>6</td>
<td>642</td>
<td>JONATHON TRAN</td>
<td>M</td>
<td>PORTLAND</td>
<td>OR</td>
<td>00:39:49</td>
<td>06:25</td>
<td>6 of 414</td>
<td>M 18-25</td>
<td>1 of 34</td>
<td>00:00:06</td>
<td>00:39:55</td>
<td></td>
</tr>]
इस ट्यूटोरियल का लक्ष्य किसी वेबपेज से एक तालिका लेकर उसे Python के जरिए आसान हेरफेर हेतु एक डेटाफ़्रेम में बदलना है। वहां तक पहुंचने के लिए, पहले आपको सभी टेबल रो एक सूची के रूप में लेनी चाहिए और फिर उस सूची को डेटाफ़्रेम में बदलना चाहिए। नीचे एक for लूप दिया गया है जो टेबल रो पर इटेरेट करता है और रो की कोशिकाओं (सेल्स) को प्रिंट करता है।
for row in rows:
row_td = row.find_all('td')
print(row_td)
type(row_td)
[<td>14TH</td>, <td>INTEL TEAM M</td>, <td>04:43:23</td>, <td>00:58:59 - DANIELLE CASILLAS</td>, <td>01:02:06 - RAMYA MERUVA</td>, <td>01:17:06 - PALLAVI J SHINDE</td>, <td>01:25:11 - NALINI MURARI</td>]
bs4.element.ResultSet
ऊपर का आउटपुट दिखाता है कि प्रत्येक रो html टैग्स के साथ प्रिंट होती है। यह वह नहीं है जो आप चाहते हैं। आप Beautiful Soup या रेगुलर एक्सप्रेशंस का उपयोग करके html टैग्स हटा सकते हैं।
html टैग्स हटाने का सबसे आसान तरीका BeautifulSoup का उपयोग करना है, और यह सिर्फ एक लाइन कोड से हो जाता है। इच्छित स्ट्रिंग को BeautifulSoup() में पास करें और get_text() मेथड का उपयोग करके बिना html टैग्स के टेक्स्ट निकालें।
str_cells = str(row_td)
cleantext = BeautifulSoup(str_cells, "lxml").get_text()
print(cleantext)
[14TH, INTEL TEAM M, 04:43:23, 00:58:59 - DANIELLE CASILLAS, 01:02:06 - RAMYA MERUVA, 01:17:06 - PALLAVI J SHINDE, 01:25:11 - NALINI MURARI]
रेगुलर एक्सप्रेशंस का उपयोग करना काफ़ी हतोत्साहित किया जाता है क्योंकि इसमें कई लाइनों का कोड लगता है और गलती करना आसान है। इसके लिए re (रेगुलर एक्सप्रेशंस) मॉड्यूल इम्पोर्ट करना होता है। नीचे दिया गया कोड दिखाता है कि कैसे एक रेगुलर एक्सप्रेशन बनाया जाए जो < td > html टैग्स के भीतर के सभी कैरेक्टर्स ढूंढे और हर टेबल रो के लिए उन्हें खाली स्ट्रिंग से बदल दे। पहले, re.compile() में मिलान करने वाली स्ट्रिंग पास करके रेगुलर एक्सप्रेशन कम्पाइल करें। डॉट, स्टार और प्रश्नचिह्न (.*?) एक प्रारंभिक एंगल ब्रैकेट, उसके बाद कुछ भी, और फिर समापन एंगल ब्रैकेट से मेल खाएगा। यह नॉन-ग्रीडी ढंग से टेक्स्ट मैच करता है, यानी सबसे छोटा संभव स्ट्रिंग। यदि आप प्रश्नचिह्न हटा दें, तो यह पहले ओपनिंग एंगल ब्रैकेट और आखिरी क्लोज़िंग एंगल ब्रैकेट के बीच का सारा टेक्स्ट मैच करेगा। रेगुलर एक्सप्रेशन कम्पाइल करने के बाद, आप re.sub() मेथड का उपयोग करके उन सभी सबस्ट्रिंग्स को खोजते हैं जहां रेगुलर एक्सप्रेशन मैच करता है और उन्हें खाली स्ट्रिंग से बदलते हैं। नीचे दिया गया पूरा कोड एक खाली सूची बनाता है, प्रत्येक रो के html टैग्स के बीच का टेक्स्ट निकालता है, और उसे निर्दिष्ट सूची में जोड़ता है।
import re
list_rows = []
for row in rows:
cells = row.find_all('td')
str_cells = str(cells)
clean = re.compile('<.*?>')
clean2 = (re.sub(clean, '',str_cells))
list_rows.append(clean2)
print(clean2)
type(clean2)
[14TH, INTEL TEAM M, 04:43:23, 00:58:59 - DANIELLE CASILLAS, 01:02:06 - RAMYA MERUVA, 01:17:06 - PALLAVI J SHINDE, 01:25:11 - NALINI MURARI]
str
अगला चरण सूची को डेटाफ़्रेम में बदलना है और Pandas का उपयोग करके पहले 10 रो का एक त्वरित दृश्य प्राप्त करना है।
df = pd.DataFrame(list_rows)
df.head(10)
| 0 | |
|---|---|
| 0 | [Finishers:, 577] |
| 1 | [Male:, 414] |
| 2 | [Female:, 163] |
| 3 | [] |
| 4 | [1, 814, JARED WILSON, M, TIGARD, OR, 00:36:21... |
| 5 | [2, 573, NATHAN A SUSTERSIC, M, PORTLAND, OR, ... |
| 6 | [3, 687, FRANCISCO MAYA, M, PORTLAND, OR, 00:3... |
| 7 | [4, 623, PAUL MORROW, M, BEAVERTON, OR, 00:38:... |
| 8 | [5, 569, DEREK G OSBORNE, M, HILLSBORO, OR, 00... |
| 9 | [6, 642, JONATHON TRAN, M, PORTLAND, OR, 00:39... |
लोकप्रिय कोर्स
Matplotlib के साथ डेटा विज़ुअलाइज़ेशन परिचय
डेटा में बदलाव और सफाई
डेटाफ़्रेम मनचाहे प्रारूप में नहीं है। इसे साफ करने के लिए, आपको "0" कॉलम को कॉमा की स्थिति पर कई कॉलम में विभाजित करना चाहिए। यह str.split() मेथड का उपयोग करके किया जाता है।
df1 = df[0].str.split(',', expand=True)
df1.head(10)

यह अब बेहतर दिखता है, लेकिन काम अभी बाकी है। डेटाफ़्रेम की प्रत्येक रो के चारों ओर अवांछित स्क्वेयर ब्रैकेट हैं। आप कॉलम "0" पर ओपनिंग स्क्वेयर ब्रैकेट हटाने के लिए strip() मेथड का उपयोग कर सकते हैं।
df1[0] = df1[0].str.strip('[')
df1.head(10)

तालिका में टेबल हेडर नहीं हैं। आप टेबल हेडर प्राप्त करने के लिए find_all() मेथड का उपयोग कर सकते हैं।
col_labels = soup.find_all('th')
टेबल रो की तरह ही, आप टेबल हेडर के लिए भी BeautifulSoup का उपयोग करके html टैग्स के बीच का टेक्स्ट निकाल सकते हैं।
all_header = []
col_str = str(col_labels)
cleantext2 = BeautifulSoup(col_str, "lxml").get_text()
all_header.append(cleantext2)
print(all_header)
['[Place, Bib, Name, Gender, City, State, Chip Time, Chip Pace, Gender Place, Age Group, Age Group Place, Time to Start, Gun Time, Team]']
इसके बाद आप हेडर की सूची को pandas डेटाफ़्रेम में बदल सकते हैं।
df2 = pd.DataFrame(all_header)
df2.head()
| 0 | |
|---|---|
| 0 | [Place, Bib, Name, Gender, City, State, Chip T... |
इसी तरह, आप सभी रो के लिए कॉलम "0" को कॉमा की स्थिति पर कई कॉलम में विभाजित कर सकते हैं।
df3 = df2[0].str.split(',', expand=True)
df3.head()

नीचे दर्शाए अनुसार concat() मेथड का उपयोग करके दोनों डेटाफ़्रेम को एक में जोड़ा जा सकता है।
frames = [df3, df1]
df4 = pd.concat(frames)
df4.head(10)

नीचे दिखाया गया है कि पहली रो को टेबल हेडर कैसे असाइन करें।
df5 = df4.rename(columns=df4.iloc[0])
df5.head()

इस बिंदु पर, तालिका लगभग सही ढंग से फॉर्मेट हो चुकी है। विश्लेषण शुरू करने के लिए, आप नीचे दिखाए अनुसार डेटा का एक अवलोकन प्राप्त कर सकते हैं।
df5.info()
df5.shape
<class 'pandas.core.frame.DataFrame'>
Int64Index: 597 entries, 0 to 595
Data columns (total 14 columns):
[Place 597 non-null object
Bib 596 non-null object
Name 593 non-null object
Gender 593 non-null object
City 593 non-null object
State 593 non-null object
Chip Time 593 non-null object
Chip Pace 578 non-null object
Gender Place 578 non-null object
Age Group 578 non-null object
Age Group Place 578 non-null object
Time to Start 578 non-null object
Gun Time 578 non-null object
Team] 578 non-null object
dtypes: object(14)
memory usage: 70.0+ KB
(597, 14)
तालिका में 597 रो और 14 कॉलम हैं। आप उन सभी रो को हटा सकते हैं जिनमें कोई भी मान गायब है।
df6 = df5.dropna(axis=0, how='any')
साथ ही, देखें कि df5 में पहली रो के रूप में टेबल हेडर की प्रतिलिपि है। इसे नीचे दी गई लाइन से हटाया जा सकता है।
df7 = df6.drop(df6.index[0])
df7.head()

आप '[Place' और ' Team]' कॉलम के नाम बदलकर और सफाई कर सकते हैं। Python स्पेस के मामले में बहुत सख्त है। ' Team]' में उद्धरण चिह्न के बाद स्पेस शामिल करना सुनिश्चित करें।
df7.rename(columns={'[Place': 'Place'},inplace=True)
df7.rename(columns={' Team]': 'Team'},inplace=True)
df7.head()

अंतिम डेटा सफाई चरण में ' Team' कॉलम की कोशिकाओं के लिए क्लोज़िंग ब्रैकेट हटाना शामिल है।
df7['Team'] = df7['Team'].str.strip(']')
df7.head()

यहां तक पहुंचने में थोड़ा समय लगा, लेकिन अब डेटाफ़्रेम वांछित प्रारूप में है। अब आप रोमांचक हिस्से पर जा सकते हैं—डेटा प्लॉट करना और दिलचस्प सांख्यिकीय मान निकालना शुरू करें।
डेटा विश्लेषण और विज़ुअलाइज़ेशन
पहला प्रश्न है: धावकों के लिए औसत फिनिश समय (मिनटों में) क्या था? आपको "Chip Time" कॉलम को सिर्फ मिनटों में बदलना होगा। ऐसा करने का एक तरीका यह है कि पहले कॉलम को हेरफेर हेतु एक सूची में बदल दें।
time_list = df7[' Chip Time'].tolist()
# You can use a for loop to convert 'Chip Time' to minutes
time_mins = []
for i in time_list:
h, m, s = i.split(':')
math = (int(h) * 3600 + int(m) * 60 + int(s))/60
time_mins.append(math)
#print(time_mins)
अगला चरण सूची को वापस डेटाफ़्रेम में बदलना और केवल मिनटों में व्यक्त धावकों के चिप समय के लिए एक नया कॉलम (Runner_mins) बनाना है।
df7['Runner_mins'] = time_mins
df7.head()

नीचे दिया गया कोड डेटाफ़्रेम में केवल संख्यात्मक कॉलम्स के लिए सांख्यिकी कैसे निकाली जाए, यह दिखाता है।
df7.describe(include=[np.number])
| Runner_mins | |
|---|---|
| count | 577.000000 |
| mean | 60.035933 |
| std | 11.970623 |
| min | 36.350000 |
| 25% | 51.000000 |
| 50% | 59.016667 |
| 75% | 67.266667 |
| max | 101.300000 |
दिलचस्प रूप से, सभी धावकों के लिए औसत चिप समय लगभग 60 मिनट था। सबसे तेज 10K धावक ने 36.35 मिनट में फिनिश किया, और सबसे धीमे धावक ने 101.30 मिनट में।
बॉक्सप्लॉट सारांश सांख्यिकी (अधिकतम, न्यूनतम, माध्यिका, प्रथम चतुर्थक, तृतीय चतुर्थक, तथा बाह्य मान) को देखने का एक और उपयोगी साधन है। नीचे धावकों के लिए एक बॉक्सप्लॉट में दिखाए गए डेटा सारांश सांख्यिकी हैं। डेटा विज़ुअलाइज़ेशन के लिए, matplotlib के साथ आने वाले pylab मॉड्यूल से पैरामीटर्स इम्पोर्ट करना और सभी फिगर्स के लिए एक ही साइज सेट करना सुविधाजनक है ताकि हर फिगर के लिए अलग से न करना पड़े।
from pylab import rcParams
rcParams['figure.figsize'] = 15, 5
df7.boxplot(column='Runner_mins')
plt.grid(True, axis='y')
plt.ylabel('Chip Time')
plt.xticks([1], ['Runners'])
([<matplotlib.axis.XTick at 0x570dd106d8>],
<a list of 1 Text xticklabel objects>)

दूसरा प्रश्न है: क्या धावकों के फिनिश समय सामान्य वितरण का पालन करते थे?
नीचे seaborn लाइब्रेरी का उपयोग करके धावकों के चिप समय का वितरण प्लॉट दिया गया है। वितरण लगभग सामान्य प्रतीत होता है।
x = df7['Runner_mins']
ax = sns.distplot(x, hist=True, kde=True, rug=False, color='m', bins=25, hist_kws={'edgecolor':'black'})
plt.show()

तीसरा प्रश्न इस बारे में है कि क्या विभिन्न आयु समूहों में पुरुषों और महिलाओं के बीच प्रदर्शन में कोई अंतर था। नीचे पुरुषों और महिलाओं के चिप समय का वितरण प्लॉट है।
f_fuko = df7.loc[df7[' Gender']==' F']['Runner_mins']
m_fuko = df7.loc[df7[' Gender']==' M']['Runner_mins']
sns.distplot(f_fuko, hist=True, kde=True, rug=False, hist_kws={'edgecolor':'black'}, label='Female')
sns.distplot(m_fuko, hist=False, kde=True, rug=False, hist_kws={'edgecolor':'black'}, label='Male')
plt.legend()
<matplotlib.legend.Legend at 0x570e301fd0>

वितरण से संकेत मिलता है कि औसतन महिलाएं पुरुषों की तुलना में धीमी थीं। आप नीचे दिखाए अनुसार groupby() मेथड का उपयोग करके पुरुषों और महिलाओं के लिए अलग-अलग सारांश सांख्यिकी निकाल सकते हैं।
g_stats = df7.groupby(" Gender", as_index=True).describe()
print(g_stats)
Runner_mins \
count mean std min 25% 50%
Gender
F 163.0 66.119223 12.184440 43.766667 58.758333 64.616667
M 414.0 57.640821 11.011857 36.350000 49.395833 55.791667
75% max
Gender
F 72.058333 101.300000
M 64.804167 98.516667
सभी महिलाओं और पुरुषों के लिए औसत चिप समय क्रमशः ~66 मिनट और ~58 मिनट था। नीचे पुरुष और महिला फिनिश समय की साइड-बाय-साइड बॉक्सप्लॉट तुलना है।
df7.boxplot(column='Runner_mins', by=' Gender')
plt.ylabel('Chip Time')
plt.suptitle("")
C:\Users\smasango\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\fromnumeric.py:57: FutureWarning: reshape is deprecated and will raise in a subsequent release. Please use .values.reshape(...) instead
return getattr(obj, method)(*args, **kwds)
Text(0.5,0.98,'')

निष्कर्ष
इस ट्यूटोरियल में, आपने Python का उपयोग करके वेब स्क्रैपिंग की। आपने Beautiful Soup लाइब्रेरी से html डेटा पार्स किया और उसे ऐसे रूप में बदला जिसे विश्लेषण के लिए उपयोग किया जा सके। आपने Python में डेटा की सफाई की और Python की matplotlib और seaborn लाइब्रेरी का उपयोग करते हुए रोचक रुझानों को उजागर करने के लिए उपयोगी प्लॉट्स (बॉक्स प्लॉट्स, बार प्लॉट्स, और वितरण प्लॉट्स) बनाए। इस ट्यूटोरियल के बाद, आपको वेब से आसानी से डेटा स्क्रैप करने, सफाई तकनीकें लागू करने और डेटा से उपयोगी अंतर्दृष्टियाँ निकालने में सक्षम होना चाहिए।
यदि आप Python के बारे में और सीखना चाहें, तो DataCamp का निःशुल्क Intro to Python for Data Science कोर्स लें और हमारा ट्यूटोरियल देखें जिसमें बताया गया है कि Python का उपयोग करके Amazon को कैसे स्क्रैप करें।