利用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.二进制数据格式


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