獲取數(shù)據(jù)在線的大量數(shù)據(jù)存儲在文本文件中,尤其是在政府網(wǎng)站上,而且通常只是從網(wǎng)站下載文件。例如,讓我們獲取我們可以在這里找到的所有主要聯(lián)盟棒球統(tǒng)計數(shù)據(jù)庫。在頁面上,我們可以看到數(shù)據(jù)有多種格式。三種最常見的格式是csv,xml和json。 我下載了名為“ 2016 - 逗號分隔版 ?- 2017年2月26日更新”的csv數(shù)據(jù)。在查看文件AllstarFull.csv時,前兩行是: playerID,yearID,gameNum,gameID,teamID,lgID,GP,startingPos gomezle01,1933,0,ALS193307060,NYA,AL ,, 1 在csv格式中,我們通常有一系列的行,每行對應(yīng)一個條目。條目以逗號分隔。文件頂部的標(biāo)題行對應(yīng)于標(biāo)識符,例如玩家ID,yearID ......如果我們查看第一個玩家的條目,我們可以按照相同的順序查看相應(yīng)的數(shù)據(jù)。如果數(shù)據(jù)丟失,我們只會看到兩個逗號,因為沒有空格。 在xml文檔的情況下,我們最終得到了與html非常相似的東西。我們可以打開一個文檔元素,并打開一系列表格。該表具有與上述值相對應(yīng)的許多孩子。如果數(shù)據(jù)丟失,該字段在末尾以斜線打開(例如: 使用復(fù)雜查詢提取數(shù)據(jù)很簡單。 它的規(guī)模很好 它確保所有數(shù)據(jù)的格式一致 事實上,為年齡大于50歲,體重<> 擁有數(shù)十萬或數(shù)百萬條目的數(shù)據(jù)庫并不罕見。由于所有信息都理想地存儲在一個位置,因此可以通過可擴展的方式更新,刪除和向數(shù)據(jù)庫添加新數(shù)據(jù)。 最后,關(guān)系數(shù)據(jù)庫總是有一個模式。模式是一個藍(lán)圖,告訴數(shù)據(jù)庫我們計劃如何存儲數(shù)據(jù)。例如,人的年齡不能是一個弦,而其他人的年齡是一個整數(shù)。此外,架構(gòu)表示,對于給定的表,每個單獨的行或條目將具有與相同值相對應(yīng)的完全相同數(shù)量的列,并且每個列的值將以相同方式格式化。 查詢 我們?nèi)绾螐年P(guān)系數(shù)據(jù)庫獲取數(shù)據(jù)?通常使用結(jié)構(gòu)查詢語言(SQL)從關(guān)系數(shù)據(jù)庫中檢索數(shù)據(jù)。如果我們想要選擇所有(*)的數(shù)據(jù),查詢將是: SELECT * FROM database_name; 我們可以通過在SQL命令結(jié)尾添加限制20來限制行數(shù)。 SELECT * FROM database_name LIMIT 20; 我們也可以要求提供具體的專欄,如姓名和年齡。 SELECT name,age FROM database_name LIMIT 20; 讓我們將這個查詢寫入一個python文件,并將數(shù)據(jù)存儲在“database_solution”中。 import pandas as pd import pandasql database_name = pd.read_csv(filename) q = ''' SELECT name, age FROM database_name LIMIT 20; #Execute your SQL command against the pandas frame database_solution = pandasql.sqldf(q, locals()) 我們也可以執(zhí)行更復(fù)雜的查詢。以下查詢選擇與冰島國家相對應(yīng)的所有數(shù)據(jù)。 SELECT * FROM database_name WHERE country =“Iceland”; SQL中存在一些諸如group和aggregate之類的函數(shù)。一個集合函數(shù)需要一些值,通常是數(shù)字,并對它們進(jìn)行數(shù)學(xué)運算。例如sum()是一個聚合函數(shù)。 每個地區(qū)數(shù)據(jù)庫中登記的年齡超過50歲的人總數(shù)是多少?以下查詢首先選擇每個區(qū)域登記了多少名男性和女性。由于我們使用的是聚合函數(shù),因此我們需要包含一個GROUP BY,以及我們的非聚合字段,在這種情況下是區(qū)域和性別。最后,我們希望限制50歲以上的男性和女性。因此,我們在表名之后加入where子句,WHERE age> 50。 SELECT gender, district, sum(database_generated) FROM database_name WHERE age > 50 GROUP BY gender, district API(應(yīng)用程序編程接口)我們現(xiàn)在知道如何從文件或數(shù)據(jù)庫中獲取數(shù)據(jù),但是有些網(wǎng)站中的網(wǎng)站如Twitter的數(shù)據(jù)呢?通過搜索或爬行網(wǎng)站獲取所有數(shù)據(jù)可能會變得復(fù)雜。幸運的是,許多公司允許用戶和開發(fā)人員通過API以簡單的機器可讀格式直接訪問數(shù)據(jù)。有幾種不同類型的API,但最常見的類型之一,以及Twitter使用的類型是代表性狀態(tài)轉(zhuǎn)移或REST API。 現(xiàn)在讓我們在一個使用json和request庫的簡單python程序中實現(xiàn)它。 import json import requests url = 'http://ws./2.0/?method=album.getinfo&api_key=YOUR_API_KEY&=Cher&album=Believe&format=json' data = json.loads(requests.get(url).text) 首先我們指定一個URL,就像我們之前看到的 函數(shù)requests.get()將從.txt中的url中獲取數(shù)據(jù)。查看json對象,我們會發(fā)現(xiàn)字符串格式很難處理,但是json庫允許與json數(shù)據(jù)進(jìn)行非常簡單的交互,這要歸功于json.load()函數(shù)。現(xiàn)在json數(shù)據(jù)被轉(zhuǎn)換成Python字典。 完整性檢查數(shù)據(jù)現(xiàn)在我們已經(jīng)獲得了我們的數(shù)據(jù),無論是非正式平面文件續(xù)集如關(guān)系數(shù)據(jù)庫還是API,我們都需要在進(jìn)行任何分析之前進(jìn)行健全性檢查數(shù)據(jù)。完整性檢查使我們能夠確定數(shù)據(jù)是否有意義。Pandas DataFrames確實有一個有用的方法,叫做describe(),我們不會過分注意細(xì)節(jié),只是做一些簡單的理智檢查。 import pandas as pd baseball_data = pd.read_csv('Master.csv') print (baseball_data.describe()) >>>birthYear birthMonth birthDay deathYear deathMonth count 18973 18803 18656 9441 9440 mean 1931 6 15 1964 6 std 41 3 8 31 3 min 1820 1 1 1872 1 25% 1895 4 8 1942 3 50% 1937 7 16 1967 6 75% 1969 10 23 1990 10 max 1996 12 31 2017 12 deathDay weight height count 9439 18251 18320 mean 15 186 72 std 8 21 2 min 1 65 43 25% 8 170 71 50% 15 185 72 75% 23 200 74 max 31 320 83 函數(shù)describe()返回一個數(shù)據(jù)框。對于每個數(shù)字列,我們都可以看到計數(shù),平均值,標(biāo)準(zhǔn)偏差,平均值。我們可以做一些快速檢查,以確保有數(shù)據(jù)通常有意義,如月份在1到12之間,天數(shù)在1到3之間。有沒有異常值?查看最小值和最大值是否大于與第25或第75百分點相對應(yīng)的值... 你可能會注意到的一件事是,每列的計數(shù)是不同的。這表明我們可能有一堆缺失的值。值可能會丟失的原因很多,例如收集數(shù)據(jù)失敗,數(shù)據(jù)丟失,無響應(yīng)值。缺失值可能會使您的發(fā)現(xiàn)無效,因此設(shè)計數(shù)據(jù)收集方法非常重要??梢允褂貌煌姆椒▉頊p輕這些缺失值對我們分析的影響。 存在兩種方法,部分刪除和插補。部分刪除正是它聽起來的樣子,將我們用于分析的數(shù)據(jù)集限制為我們可用的數(shù)據(jù)。我們可以使用的一種方法稱為Listwise Deletion。在我們執(zhí)行Listwise Deletion的情況下,即使存在一些有用的值,我們也會從所有分析中排除特定的數(shù)據(jù)點。 當(dāng)我們沒有太多的數(shù)據(jù)時,我們使用插補,或者刪除我們?nèi)笔У闹禃绊懳覀儤颖镜拇硇?。僅僅因為缺少值而拋出一堆條目會嚴(yán)重影響我們試圖執(zhí)行的任何分析的統(tǒng)計效力。在這種情況下,對我們的數(shù)據(jù)中的缺失值進(jìn)行智能猜測(如逼近)可能是有意義的。例如,我們可以用所有其他值的平均值替代所有缺失值,或使用線性回歸來估計缺失值。但是,插補會在數(shù)據(jù)集中引入偏見和不準(zhǔn)確性。這是一個非常棘手的問題,新技術(shù)不斷發(fā)展。存在更復(fù)雜和可靠的方法。 在下面的代碼中,我們計算“權(quán)重”數(shù)組的平均值,并通過將它們設(shè)置為平均權(quán)重來計算“權(quán)重”列中的任何缺失值。 import pandas import numpy baseball = pandas.read_csv(filename) baseball['weight'] = baseball['weight'].fillna(numpy.mean(baseball['weight'])) |
|