利用python進行數據分析-數據加載、存儲與文件格式2

1.將數據寫出到文本格式

data1=pd.read_csv('data/ex5.csv')
data1.to_csv('data/out.csv')

當然,還可以使用其他分隔符

data1.to_csv('data/sys.stdout',sep='|')

缺失值在輸出結果中會被表示爲空字符串,你可能希望將其表示爲別的標記值

data1.to_csv('data/sys.stdout',na_rep='NULL')

文本的內容爲:

,something,a,b,c,d,message
0,one,1,2,3.0,4,NULL
1,two,5,6,NULL,8,world
2,three,9,10,11.0,12,foo
如果沒有設置其它選項,則會寫出行和列的標籤。當然,它們都可以被禁用

data1.to_csv('data/sys.stdout',index=False,header=False)

文本內容爲:

one,1,2,3.0,4,
two,5,6,,8,world
three,9,10,11.0,12,foo

你還可以只寫出一部分的列,並以你指定的順序排列

data1.to_csv('data/sys.stdout',index=False,cols=['a','b','c'])

Series也有一個to_csv方法

dates=pd.date_range('1/1/2000',periods=7)
ts=Series(np.arange(7),index=dates)
ts.to_csv('data/tseries.csv')

文本內容爲:

2000/1/1 0
2000/1/2 1
2000/1/3 2
2000/1/4 3
2000/1/5 4
2000/1/6 5
2000/1/7 6
雖然只需一點整理工作(無header行,第一列作索引)就能用read_csv將csv文件讀取爲Series,但有一個更爲方便的from_csv方法

print Series.from_csv('data/tseries.csv',parse_dates=True)

結果爲:
2000-01-01    0
2000-01-02    1
2000-01-03    2
2000-01-04    3
2000-01-05    4
2000-01-06    5
2000-01-07    6
dtype: int64


2.手工處理分隔符格式

import csv

f=open('data/ex7.csv')
reader=csv.reader(f)
for line in reader:
    print line

結果爲:

['a', 'b', 'c']
['1', '2', '3']
['1', '2', '3', '4']

現在,爲了使數據格式合乎要求,你需要對其做一些整理工作

lines=list(csv.reader(open('data/ex7.csv')))
print lines
header,values=lines[0],lines[1:]
data_dict={h:v for h,v in zip(header,zip(*values))}
print data_dict

結果爲:

[['a', 'b', 'c'], ['1', '2', '3'], ['1', '2', '3', '4']]
{'a': ('1', '1'), 'c': ('3', '3'), 'b': ('2', '2')}

csv文件的形式有很多。只需定義csv.Dialect的一個子類即可定義出新格式(如專門的分隔符、字符串引用約定、行結束符等)

class my_dialect(csv.Dialect):

    lineterminator='\n'

    delimiter=';'

    quotechar='"'

reader=csv.reader(f,diaect=my_dialect)

各個csv語支的參數也可以關鍵字的形式提供給csv.reader,而無需定義子類

reader=csv.reader(f,delimiter='|')

可用的選項(csv.Dialect的屬性)及其功能如下表

3.JSON數據

通過json.loads即可將JSON字符串轉換成Python形式

import json

obj="""
{"name":"Wes",
 "places_lived":["United States","Spain","Germany"],
 "pet":null,
 "siblings":[{"name":"Scott","age":25,"pet":"Zuko"},
             {"name":"Katie","age":33,"pet":"Cisco"}]
}
"""

result=json.loads(obj)
print result

結果爲:

{u'pet': None, u'siblings': [{u'pet': u'Zuko', u'age': 25, u'name': u'Scott'}, {u'pet': u'Cisco', u'age': 33, u'name': u'Katie'}], u'name': u'Wes', u'places_lived': [u'United States', u'Spain', u'Germany']}

相反,json.dumps則將Python對象轉換成JSON格式

print json.dumps(result)

結果爲:

{"pet": null, "siblings": [{"pet": "Zuko", "age": 25, "name": "Scott"}, {"pet": "Cisco", "age": 33, "name": "Katie"}], "name": "Wes", "places_lived": ["United States", "Spain", "Germany"]}

如何將JSON對象轉化爲DataFrame或其他便於分析的數據結構就由你決定。最簡單的方式是:向DataFrame構造器中傳入一組JSON對象,並選取數據字段的子集

siblings=DataFrame(result['siblings'],columns=['name','age'])
print siblings

結果爲:

    name  age
0  Scott   25
1  Katie   33


4.XML和HTML:Web信息收集

首先,找到希望獲取數據的URL,利用urllib2將其打開,然後用lxml解析得到的數據流

from lxml.html import parse
from urllib2 import urlopen

parsed=parse(urlopen('http://finance.yahoo.com/q/op?s=AAPL+Options'))
doc=parsed.getroot()

通過這個對象,你可以獲取特定類型的所有HTML標籤(tag),假設你想得到該文檔中所有URL鏈接。HTML中的鏈接是a標籤,使用文檔跟節點的findall方法以及一個XPath(對文檔的“查詢”的一種表示手段)

links=doc.findall('.//a')
print links[15:20]

結果爲:

[<Element a at 0x9876d68>, <Element a at 0x9876db8>, <Element a at 0x9876e08>, <Element a at 0x9876e58>, <Element a at 0x9876ea8>]

但這些表示HTML元素的對象。要得到URL和鏈接文本,必須使用各對象的get方法和text_content方法

print lnk.get('href')
print lnk.text_content()

結果爲:

https://help.yahoo.com/l/us/yahoo/finance/
Help

因此,編寫下面這條列表推導式即可獲取文檔中的全部URL

urls=[lnk1.get('href') for lnk1 in doc.findall('.//a')]
print urls[-10:]

結果爲:

Help
['/q/op?s=AAPL&strike=185.00', '/q?s=AAPL160617P00185000', '/q/op?s=AAPL&strike=190.00', '/q?s=AAPL160617P00190000', '/q/op?s=AAPL&strike=195.00', '/q?s=AAPL160617P00195000', '/q/op?s=AAPL&strike=200.00', '/q?s=AAPL160617P00200000', '/q/op?s=AAPL&strike=220.00', '/q?s=AAPL160617P00220000']

現在從文檔中找出正確表格

tables=doc.findall('.//table')
print tables
calls=tables[2]
puts=tables[0]
rows=calls.findall('.//tr')
def _unpack(row,kind='td'):
    elts=row.findall('.//%s' % kind)
    return [val.text_content() for val in elts]
    
print _unpack(rows[0],kind='th')
print _unpack(rows[1],kind='td')


5.二進制數據格式


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章