《利用python進行數據分析》讀書筆記--第六章 數據加載、存儲與文件格式


輸入輸出一般分為下面幾類:讀取文本文件和其他更高效的磁盤存儲格式,加載數據庫中的數據。利用Web API操作網絡資源。

1、讀寫文本格式的數據

自己感覺讀寫文件有時候“需要運氣”,經常需要手工調整。因為其簡單的文件交互語法、直觀的數據結構,以及諸如元組打包解包之類的便利功能,Python在文本和文件處理方面已經成為一門招人喜歡的語言。pandas提供了一些用於將表格型數據讀取為DataFrame對象的函數。見下表:

image

下面大致介紹一下這些函數在文本數據轉換為DataFrame時的一些技術。可以分為一下幾類:

  • 索引:將一個或者多個列當作返回的DataFrame處理,以及是否從文件、用戶獲取列名。
  • 類型推斷和數據轉換:包括用戶定義值的轉換、缺失值標記列表等。
  • 日期解析:包括組合功能,比如將分散在多個列中的日期時間信息組合成結果中的單個列。
  • 迭代:支持對大文件進行逐塊迭代。
  • 不規整數據問題:跳過一些行、頁腳、注釋或者其他不要的東西

pandas讀取文件會自動推斷數據類型,不用指定。

read_csv為例

用names重新規定列名,用index_col指定索引,也可以將多個列組合作為層次化索引。可以編寫正則表達式規定分隔符。用skiprows跳過某些行。pandas會用NA、-1.#IND、NULL等進行標記。用na_values用來不同的NA標記值。下面是read_csv/read_table參數:

image

image

逐塊讀取文本文件

處理很大的文件時,或找出大文件中的參數集以便於后續處理時,可能只想讀取一部分或者逐塊對文件進行迭代。nrows指定讀取多少行。要逐塊讀取文件,需要設置chunksize(行數)。

將數據寫出到文本格式

用to_csv方法寫出到csv文件中。參數sep標明分隔符。na_rep標明空白字符串的代替值。index header標明是否寫出行列標簽,默認是寫出。用cols限制並以指定順序寫出某些列。

Series也有to_csv方法。用一些整理工作(無header行,第一列作索引)就能用read_csv讀取為Series,當然還有一個更方便的from_csv,Series.from_csv。

手工處理分隔符格式

有些奇葩文件需要進行處理以后再讀。Python內置的csv模塊可以讀取任何單字符分隔符文件。將打開的文件傳遞給csv.reader。csv文件的形式有很多,只需定義csv.Dialect的一個子類即可定義新格式(如專門的分隔符、字符串引用約定、行結束符等):

#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import pandas.io.data  as web
import csv

f = open('ex6.csv')
reader = csv.reader(f)
for line in reader:
    print line
lines = list(csv.reader(open('ex7.csv')))
header,values = lines[0],lines[1:]
print header
print values
#下面的 * 應該是取出值的意思
data_dict = {h:v for h,v in zip(header,zip(*values))}
print data_dict
class my_dialect(csv.Dialect):
    lineterminator = '\n'
    delimiter = ';'
    quotechar = '"'

reader = csv.reader(f,dialect=my_dialect)
#csv語支的參數也可以用參數的形式給出
reader = csv.reader(f,delimiter = '|')

image

對於那些使用復雜分隔符或多字符分隔符的文件,csv文件就無能為力了。這種情況下用split或者re.split進行拆分合整理工作。要手工輸出分隔符文件,可以使用csv.writer。它接受一個已打開且可寫的文件對象以及跟cav.reader相同的那些語支和格式化選項。

#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import pandas.io.data  as web
import csv

with open('mydata.csv','w') as f:
    writer = csv.writer(f,lineterminator = '\n')
    writer.writerow(('one','two','three'))
    writer.writerow(('1','2','3'))

JSON數據

除空值null和一些其他的細微差別(如列表末尾不允許存在多余的逗號)之外,JSON非常接近有效Python代碼。基本數據類型有對象(字典)、數組(列表)、字符串、數值、布爾值以及NULL。對象中所有的鍵都必須是字符串(非常重要)。用json模塊,json.loads可以將字符串轉換成Python形式,即可以將對象讀取為python字典。

相反的,json.dumps可以將python對象轉換為json格式。

XML和HTML:Web信息收集

lxml可以讀取xml和html格式數據並處理。這部分用到的時候再研究。

2、二進制數據文件

實現數據的二進制格式最簡單的方法之一是使用Python內置的pickle序列化。為了使用方便,pandas對象都有一個用於將數據以pickle形式保存到磁盤上的save方法。

#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import pandas.io.data as web
import csv

frame = pd.read_csv('ex1.csv')
print frame
frame.save('frame_pickle') #存儲為二進制文件
ok = pd.load('frame_pickle') #load函數
#ok1 = pd.read_table('frame_pickle') #不能用read_table函數
#print ok1
print ok

pickle,作者建議用作短期存儲,因為會遇到解析版本問題。

使用HDF5格式

很多工具都能實現高效讀寫磁盤上以二進制格式存儲的科學數據。HDF5就是一個流行工業級庫,是一個C庫,有Java、Python、MATLAB等多種接口。這部分暫時不看。

讀取Excel數據

支持excel2003及更高版本的excel文件。用pandas中的ExcelFile類即可,需要安裝xlrd和openpyxl包。

#-*- encoding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import pandas.io.data as web
import csv

xls_file = pd.ExcelFile('ex1.xlsx')
table = xls_file.parse('ex1')
print table

使用HTML和Web API

許多網站都有一些通過JSON或其他格式提供數據的公共API。用requests包等可以實現。這部分暫時不看。

使用數據庫

數據從SQL中加載到DataFrame比較簡單,此外pandas還有一些能夠簡化該過程的函數。作者是用一款SQLite數據庫,用sqlite3驅動器。作者還舉了MongoDB中數據的例子。暫時不看。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM