您的位置:首页 > 编程语言 > Python开发

利用python进行数据分析-数据加载、存储与文件格式2

2016-06-15 14:46 435 查看
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/10
2000/1/21
2000/1/32
2000/1/43
2000/1/54
2000/1/65
2000/1/76
虽然只需一点整理工作(无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.二进制数据格式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据分析 python