day79-数据加载、存储和文件格式
1读写数据
1.1excel中csv文件转excel文件方法
excel中csv转excel文件:数据 -自文本- 选择文件导入-分隔符号-下一步-分隔符(其他选|) - 下一步
sys.stdout标准输出
sys.stdin标准输入
linux中查看历史命令
cd并回车进入home
vim .bash_histroy -查看历史命令
1.2pandas读取文件简介
pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,其中read_csv和 read_table用得最多;此外还有read_excel,read_html,read_json,read_pickle,read_sql等。
将⽂本数据转换为DataFrame时所需要⽤到的一些技术:
索引:将一个或多个列当做返回的DataFrame处理,以及是否从⽂件、⽤户获取列名
类型推断和数据转换:包括⽤户定义值的转换、和⾃定义的缺失值标记列表等
⽇期解析:包括组合功能,⽐如将分散在多个列中的⽇期时间信息组合成结果中的单个列
迭代:⽀持对⼤⽂件进⾏逐块迭代
不规整数据问题:跳过一些⾏、页脚、注释或其他一些不重要的东⻄(⽐如由成千上万个逗号 隔开的数值数据)
1.3逗号(csv)分隔文件读取
在linux中使用!cat直接读取;在windows中使用!type读取;下面皆以linux系统描述
!cat examples/ex1.csv # 查看并不读取
df = pd.read_csv('examples/ex1.csv') #读取为pandas中的series或者dataframe格式
在读取时,可以指定被读取文件中以什么符号作为分隔
pd.read_table('examples/ex1.csv', sep=',')
读取文件时,可以给表指定列名
pd.read_csv('examples/ex2.csv', header=None) #使用默认列名0,1,2
pd.read_csv('examples/ex2.csv', names=['a', 'b', 'c', 'd', 'message']) # 使用自定义列名
假设你希望将message列做成DataFrame的索引。你可以明确表示要将该列放到索引4的位置 上,也可以通过index_col参数指定”message”
names = ['a', 'b', 'c', 'd', 'message']
#列名为abcd,行名为message对应的列中的数据
pd.read_csv('examples/ex2.csv', names=names, index_col='message')
将多个列做成一个层次化索引,只需传⼊由列编号或列名组成的列表即可
parsed = pd.read_csv('examples/csv_mindex.csv', index_col=['key1', 'key2'])
有些表格可能不是⽤固定的分隔符去分隔字段的(⽐如空⽩符或其它模式)虽然可以⼿动对数据进⾏规整,这⾥的字段是被数量不同的空⽩字符间隔开的。这种情况下, 你可以传递一个正则表达式作为read_table的分隔符。可以⽤正则表达式表达为\s+
result = pd.read_table('examples/ex3.txt', sep='\s+')
# 由于列名⽐数据⾏的数量少,所以read_table推断第一列应该是DataFrame的索引
# 故输出后,之前的第一列将变成索引
异形⽂件格式处理,你可以⽤skiprows跳过⽂件的第一⾏、第三⾏和第四⾏;
pd.read_csv('examples/ex4.csv', skiprows=[0, 2, 3])
缺失值处理是⽂件解析任务中的一个重要组成部分。缺失数据经常是要么没有(空字符串), 要么⽤某个标记值表示。默认情况下,pandas会⽤一组经常出现的标记值进⾏识别,⽐如NA 及NULL
na_values可以⽤一个列表或集合的字符串表示缺失值
result = pd.read_csv('examples/ex5.csv', na_values=['NULL'])
字典的各列可以使⽤不同的NA标记值
sentinels = {'message': ['foo', 'NA'], 'something': ['two']} # 将foo及two也标记为na
pd.read_csv('examples/ex5.csv', na_values=sentinels)
1.4逗号分隔模式逐块读取
在处理很⼤的⽂件时,或找出⼤⽂件中的参数集以便于后续处理时,可以读取⽂件的一小部分 或逐块对⽂件进⾏迭代
# 屏幕上展示10行,如果大于10行就展示最前和最后5行,中间以.....展示
pd.options.display.max_rows = 10
result = pd.read_csv('examples/ex6.csv')
如果只想读取几⾏(避免读取整个⽂件),通过nrows进⾏指定即可
pd.read_csv('examples/ex6.csv', nrows=5) #读取最开始的5行
要逐块读取⽂件,可以指定chunksize(⾏数)
chunker = pd.read_csv('examples/ex6.csv', chunksize=1000)#一次读1000行
tot = pd.Series([])
for piece in chunker: #对整个文件进行迭代
# 统计key列各字符出现的次数,没有出现过的填充为0(不然就是na,影响后面add函数添加);
tot = tot.add(piece['key'].value_counts(), fill_value=0)
tot = tot.sort_values(ascending=False) # 给读取的文件结果tot按降序排序
tot[:10] # 对结果进行切片(查看前10行)
2将数据写出到文本格式
数据也可以被输出为分隔符格式的文本;DataFrame的to_csv方法,我们可以将数据写到一个以逗号分隔的文件中
data = pd.read_csv('examples/ex5.csv') # 打开文件
# 在写入时,会原样将索引及列名写入,没有值的地方填充为空
data.to_csv('examples/out.csv') # 将文件写入
使⽤其他分隔符(由于这⾥直接写出到sys.stdout,所以仅是打印出⽂本结果⽽已)
import sys
data.to_csv(sys.stdout, sep='|') # 文件中将以|作为分隔
缺失值在输出结果中会被表示为空字符串。你可能希望将其表示为别的标记值
data.to_csv(sys.stdout, na_rep='NULL') # 将nan表示成null
没有设置其他选项,则会写出⾏和列的标签。当然,它们也都可以被禁⽤
data.to_csv(sys.stdout, index=False, header=False)
你还可以只写出一部分的列,并以你指定的顺序排列
data.to_csv(sys.stdout, index=False, columns=['a', 'b', 'c'])
dates = pd.date_range('1/1/2000', periods=7)
ts = pd.Series(np.arange(7), index=dates)
# 将保存为2000-01-01,0 到2000-01-07,6的文符
ts.to_csv('examples/tseries.csv')
3json数据读取与操作
pandas.read_json可以⾃动将特别格式的JSON数据集转换为Series或DataFrame
!cat examples/example.json # 查看json文件
data = pd.read_json('examples/example.json') # 读取json文件
从pandas输出到JSON,使⽤to_json⽅法
print(data.to_json()) # 以columns作为作为每列的键,列中分别以索引作键
#{"a":{"0":1,"1":4,"2":7},"b":{"0":2,"1":5,"2":8},"c":{"0":3,"1":6,"2":9}}
print(data.to_json(orient='records'))#以columns分别作为每行的键
# [{"a":1,"b":2,"c":3},{"a":4,"b":5,"c":6},{"a":7,"b":8,"c":9}]
4XML和HTML:Web信息收集
pandas有一个内置的功能,read_html,它可以使⽤lxml和Beautiful Soup⾃动将HTML⽂件 中的表格解析为DataFrame对象。
需要先安装三方库,安装前,需要先退出ipython环境,然后在窗口中输入
conda install lxml
pip install beautifulsoup4 html5lib
然后进入ipython环境
tables = pd.read_html('examples/fdic_failed_bank_list.html')
failures = tables[0]
failures.head() #获得表格中的数据
做一些数据清洗和分析,⽐如计算按年份计算倒闭的银⾏数
close_timestamps = pd.to_datetime(failures['Closing Date'])
close_timestamps.dt.year.value_counts()
pd.to_datetime(failures['Closing Date']):用to_datetime函数将failures中的Closing Date字符转化为标准日期(能够通过属性拿到年月日及星期等属性)
close_time.dt.year.value_counts() 通过对close_time对象获取年并统计这个年下面的对象个数(统计某一年倒闭银行的个数)
5二进制数据格式
pandas对象都有一个⽤于将数据以pickle格式保存到磁盘上的to_pickle⽅法;但仅建议⽤于短期存储格式。其原因是很难保证该格式永远是稳定的。
frame.to_pickle('examples/frame_pickle')
pd.read_pickle('examples/frame_pickle')
6HDF5格式
HDF5是一种存储大规模科学数组数据的⾮常好的文件格式。与其他简单格式相⽐,HDF5支持多种压缩器的即时压缩, 还能更⾼效地存储重复模式数据。对于那些⾮常⼤的无法直接放⼊内存的数据集,HDF5就是不错的选择,因为它可以⾼效地分块读写。
frame = pd.DataFrame({'a': np.random.randn(100)}) #产生数据
store = pd.HDFStore('mydata.h5') #新建hdf5文件
store['obj1'] = frame#将frame内容写到store的obj1键中,只是写在缓存中,并没有写入本地
store['obj1_col'] = frame['a']# 将第a列的数据写入obj1_col列中
store.close()关闭stroe文件,文件正式写入
HDF5⽂件中的对象可以通过与字典一样的API进⾏获取
store['obj1']
HDFStore支持两种存储模式,’fixed’和’table’。后者通常会更慢,但是支持使⽤特殊语法进⾏查询操作
store.put('obj2', frame, format='table')# 使用put的table形式写入,用put写入是实时写入
store.select('obj2', where=['index >= 10 and index <= 15']) # 查询index在10-15之间的数据
pandas.read_hdf函数可以快捷使⽤这些⼯具
frame.to_hdf('mydata.h5', 'obj3', format='table')
pd.read_hdf('mydata.h5', 'obj3', where=['index < 5'])
7读取excel文件
pandas的ExcelFile类或pandas.read_excel函数⽀持读取存储在Excel 2003(或更⾼版本)中的表格型数据。这两个⼯具分别使⽤扩展包xlrd和openpyxl读取XLS和XLSX⽂件。你可以⽤pip或conda安装它们
xlsx = pd.ExcelFile('examples/ex1.xlsx')
pd.read_excel(xlsx, 'Sheet1') #读取被读取的excel文件中的sheet1表格
也可以这样读
frame = pd.read_excel('examples/ex1.xlsx', 'Sheet1')
将文件写入excel文件
writer = pd.ExcelWriter('examples/ex2.xlsx')
frame.to_excel(writer, 'Sheet1')
writer.save()
也可以这样存
frame.to_excel('examples/ex2.xlsx')
8Web APIs交互
多用于web页面返回的json数据网址
import requests
url = 'https://api.github.com/repos/pandas-dev/pandas/issues'
resp = requests.get(url)
data = resp.json()
data[0]['title']
# 取number、title、labels及state列并赋值给issues
issues = pd.DataFrame(data, columns=['number', 'title', 'labels', 'state'])
9数据库交互
9.1使用普通方式与数据库交互
下面以python中自带的sqlite3数据库作为例子演示,sqlite3数据库与mysql操作方法在python中基本相同,使用这种方式每查询一次就要写一次
import sqlite3
query = """ CREATE TABLE test (a VARCHAR(20), b VARCHAR(20), c REAL, d INTEGER );"""
con = sqlite3.connect('mydata.sqlite')
con.execute(query)
con.commit()
data = [('Atlanta', 'Georgia', 1.25, 6), ('Tallahassee', 'Florida', 2.6, 3), ('Sacramento', 'California', 1.7, 5)]
stmt = "INSERT INTO test VALUES(?, ?, ?, ?)"
con.executemany(stmt, data)
cursor = con.execute('select * from test')
rows = cursor.fetchall()
cursor.description
pd.DataFrame(rows, columns=[x[0] for x in cursor.description])
9.2使用SQLAlchemy连接数据库
SQLAlchemy项⽬是一个流⾏的Python SQL⼯具,它抽象出了SQL数据库中的许多常⻅差异。pandas有一个read_sql 函数,可以让你轻松的从SQLAlchemy连接读取数据。
import sqlalchemy as sqla
# 连接数据库
db= sqla.create_engine('mysql+pymysql://root:123456@127.0.0.1/u17?charset=utf8')
# 从数据库中读数据
result = pd.read_sql('select * from product', db)
# 将数据写入数据库
result.to_excel('examples/u17.xlsx', encoding='utf8')