动机

我们花费大量的时间将数据从普通的交换格式(比如CSV),迁移到像数组、数据库或者二进制存储等高效的计算格式。更糟糕的是,许多人没有将数据迁移到高效的格式,因为他们不知道怎么(或者不能)为他们的工具管理特定的迁移方法。

你所选择的数据格式很重要,它会强烈地影响程序性能(经验规律表明会有10倍的差距),以及那些轻易使用和理解你数据的人。

当提倡Blaze项目时,我经常说:“Blaze能帮助你查询各种格式的数据。”这实际上是假设你能够将数据转换成指定的格式。

进入into项目

into函数能在各种数据格式之间高效的迁移数据。这里的数据格式既包括内存中的数据结构,比如:

列表、集合、元组、迭代器、numpy中的ndarray、pandas中的DataFrame、dynd中的array,以及上述各类的流式序列。

也包括存在于Python程序之外的持久化数据,比如:

CSV、JSON、行定界的JSON,以及以上各类的远程版本

HDF5 (标准格式与Pandas格式皆可)、 BColz、 SAS、 SQL 数据库 ( SQLAlchemy支持的皆可)、 Mongo

into项目能在上述数据格式的任意两个格式之间高效的迁移数据,其原理是利用一个成对转换的网络(该文章底部有直观的解释)。

如何使用它

into函数有两个参数:source和target。它将数据从source转换成target。source和target能够使用如下的格式:

Target     Source     Example

Object    Object      A particular DataFrame or list

String     String      ‘file.csv’, ‘postgresql://hostname::tablename’

Type                   Like list or pd.DataFrame

所以,下边是对into函数的合法调用:

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

>>>into(list,df)# create new list from Pandas DataFrame

>>>into([],df)# append onto existing list

>>>into('myfile.json',df)# Dump dataframe to line-delimited JSON

>>>into(Iterator,'myfiles.*.csv')# Stream through many CSV files

>>>into('postgresql://hostname::tablename',df)# Migrate dataframe to Postgres

>>>into('postgresql://hostname::tablename','myfile.*.csv')# Load CSVs to Postgres

>>>into('myfile.json','postgresql://hostname::tablename')# Dump Postgres to JSON

>>>into(pd.DataFrame,'mongodb://hostname/db::collection')# Dump Mongo to DataFrame

Note that into is a single function. We’re used to doing this with various to_csv, from_sql methods on various types. The into api is very small; Here is what you need in order to get started:

注意,into函数是一个单一的函数。虽然我们习惯于在各种类型上使用to_csv, from_sql等方法来完成这样的功能,但接口into非常简单。开始使用into函数前,你需要:

Python

1

2

3

$pip install into

>>>frominto importinto

在Github上查看into工程。

实例

现在我们展示一些更深层次的相同的实例。

将Python中的list类型转换成numpy中的array类型

Python

1

2

3

4

5

>>>importnumpy asnp

>>>into(np.ndarray,[1,2,3])

array([1,2,3])

加载CSV文件,并转换成Python中的list类型

Python

1

2

3

4

5

6

7

8

9

10

11

>>>into(list,'accounts.csv')

[(1,'Alice',100),

(2,'Bob',200),

(3,'Charlie',300),

(4,'Denis',400),

(5,'Edith',500)]

将CSV文件转换成JSON格式

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

>>>into('accounts.json','accounts.csv')

$head accounts.json

{"balance":100,"id":1,"name":"Alice"}

{"balance":200,"id":2,"name":"Bob"}

{"balance":300,"id":3,"name":"Charlie"}

{"balance":400,"id":4,"name":"Denis"}

{"balance":500,"id":5,"name":"Edith"}

将行定界的JSON格式转换成Pandas中的DataFrame格式

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

>>>importpandas aspd

>>>into(pd.DataFrame,'accounts.json')

balance idname

01001Alice

12002Bob

23003Charlie

34004Denis

45005Edith

它是如何工作的?

格式转换是有挑战性的。任意两个数据格式之间的健壮、高效的格式转换,都充满了特殊情况和奇怪的库。常见的解决方案是通过一个通用格式,例如DataFrame或流内存列表、字典等,进行格式转换。(见dat)或者通过序列化格式,例如ProtoBuf或Thrift,进行格式转换。这些都是很好的选择,往往也是你想要的。然而有时候这样的转换是比较慢的,特别是当你在实时计算系统上转换,或面对苛刻的存储解决方案时。

考虑一个例子,在numpy.recarray和pandas.DataFrame之间进行数据迁移。我们可以非常快速地,适当地迁移这些数据。数据的字节不需要更改,只更改其周围的元数据即可。我们不需要将数据序列化到一个交换格式,或转换为中间的纯Python对象。

考虑从CSV文件迁移数据到一个PostgreSQL数据库。通过SQLAlchemy(注:一个Python环境下的数据库工具箱)使用Python迭代器,我们的迁移速度不太可能超过每秒2000条记录。然而使用PostgreSQL自带的CSV加载器,我们的迁移速度可以超过每秒50000条记录。花费一整晚的时间和花费一杯咖啡的时间进行数据迁移,是有很大区别的。然而这需要我们在特殊情况下,能足够灵活的使用特殊代码。

专门的两两互换工具往往比通用解决方案快一个数量级。

Into项目是那些成对地数据迁移组成的一个网络。我们利用下图展示这个网络:

每个节点是一种数据格式。每个定向的边是一个在两种数据格式之间转换数据的函数。into函数的一个调用,可能会遍历多个边和多个中间格式。例如,当我们将CSV文件迁移到Mongo数据库时,我们可以采取以下路径:

•将CSV文件加载到DataFrame中(利用pandas.read_csv)

•然后转换为np.recarray(利用DataFrame.to_records)

•接着转换为一个Python的迭代器类型(利用np.ndarray.tolist)

•最终转换成Mongo中的数据(利用pymongo.Collection.insert)

或者我们可以使用MongoDB自带的CSV加载器,编写一个特殊函数,用一个从CSV到Mongo的定向边缩短整个处理过程。

为了找到最有效的路线,我们利用相对成本(引入权重的ad-hoc)给这个网络的所有边赋予权重值。然后我们使用networkx找到最短路径,进而进行数据迁移。如果某个边由于某种原因失败了(引发NotImplementedError),我们可以自动重新寻找路径。这样我们的迁移方法是既高效又健壮的。

注意,我们给某些节点涂上红色。这些节点的数据量可以大于内存。当我们在两个红色节点之间进行数据迁移时(输入和输出的数据量都可能大于内存),我们限制我们的路径始终在红色子图中,以确保迁移路径中间的数据不会溢出。需要注意的一种格式是chunks(…),例如chunks(DataFrame)是一个可迭代的,在内存中的DataFrames。这个方便的元格式允许我们在大数据上使用紧凑的数据结构,例如numpy的arrays和pandas的DataFrames,同时保持在内存中数据的只有几十兆字节。

这种网络化的方法允许开发者对于特殊情况编写专门的代码,同时确信这段代码只在正确的情况下使用。这种方法允许我们利用一个独立的、可分离的方式处理一个非常复杂的问题。中央调度系统让我们保持头脑清醒。

历史

很久以前,我写过into链接到Blaze的文章,然后我立即就沉默了。这是因为旧的实现方法(网络方法之前)很难扩展或维护,也没有准备好进入其黄金期。

我很满意这个网络。意想不到的应用程序经常能够正常运行,into工程现在也准备好进入其黄金期了。Into工程可以通过conda和pip得到,而独立于Blaze。它主要的依赖为NumPy、Pandas和NetworkX,所以对于阅读我博客的大部分人来说,它算是相对轻量级的。如果你想利用一些性能更好的格式,例如HDF5,你将同样需要安装这些库(pro-tip,使用conda安装)。

如何开始使用into函数

你应该下载一个最近版本的into工程。

Python

1

2

3

4

5

$pip install--upgrade git+https://github.com/ContinuumIO/into

or

$conda install into--channel blaze

然后你可能想要通过该教程的上半部分,或者阅读该文档。

又或者不阅读任何东西,只是试一试。我的希望是,这个接口很简单(只有一个函数!),用户可以自然地使用它。如果你运行中出现了问题,那么我很愿意在blaze-dev@continuum.io中听到它们。

python 文件格式转换器_python数据转换工具Into相关推荐

  1. python 文件格式转换器_python文件格式转换

    一.文件的基本操作 1.打开文件 1 f=open('text.txt',r) 2.读取文件 print(f.read) 3.关闭文件 f.close() 比较好用的是运用with with open ...

  2. python 文件格式转换_Python的处理数据,如何进行数据转换,学会三种方式

    平时我们在处理数据的时候,有些数据类型不是我们想要的,怎么办? 如: python数据转换 num01,num02是str类型,但是我们需要的是整型,所以通过int转换成了整数. 数据转换 如何完成数 ...

  3. python 状态机教程_python 实用工具状态机transitions

    说明 1. 状态机是一个非常实用的理论.在涉及到复杂的场景,建立状态机模型,能带来极大的方便.比如,网络连接.模型状态.业务逻辑. 2. 状态机并不复杂, 重要的是它的思想,能够极大减轻复杂度.使用时 ...

  4. python 文件格式转换_python实现txt文件格式转换为arff格式

    本文实例为大家分享了python实现txt文件格式转换为arff格式的具体代码,供大家参考,具体内容如下 将文件读取出来的时候默认都是字符型的,所以有转换出来有点问题,但是还是可以用的. 文件要求第一 ...

  5. python数据分析软件_Python数据分析工具

    Numpy Python没有提供数组功能,虽然列表可以完成基本的数组功能,但他不是真正的数组.Numpy内置函数处理速度是c语言级别,因此尽量使用内置函数,避免出现效率瓶颈的现象. Numpy的安装: ...

  6. python画国际象棋_python图形工具turtle绘制国际象棋棋盘

    本文实例为大家分享了python图形工具turtle绘制国际象棋棋盘的具体代码,供大家参考,具体内容如下 #编写程序绘制一个国际象棋的棋盘 import turtle turtle.speed(30) ...

  7. python 表示图论_Python 图论工具 | 学步园

    networkx: 一个用Python语言开发的图论与复杂网络建模工具, 内置了常用的图与复杂网络分析 可以方便的进行复杂网络数据分析.仿真建模等工作. 依赖工具: numpy pyparsing d ...

  8. python图论库_Python 图论工具

    networkx: 一个用Python语言开发的图论与复杂网络建模工具, 内置了常用的图与复杂网络分析算法, 可以方便的进行复杂网络数据分析.仿真建模等工作. 依赖工具: numpy pyparsin ...

  9. python图像几何变换_python 图像工具opencv3实例(对象识别和增强现实)1-图像几何转换...

    安装OpenCV-Python安装 本教程基于python3,ubuntu 16,在windows环境可能可以运行. Linux#!pythonpip3 install opencv-python W ...

最新文章

  1. 5GtoB即将迎来规模商用,如何共创行业新价值?
  2. lync 2013 企业版部署 (四)安装office web app server
  3. notepad设置中文
  4. WebSen!NT的行业分类说明
  5. 使用Cucumber+Rspec玩转BDD(2)——邮件激活
  6. 有人问现在做自媒体还有前途吗?还有钱赚吗?
  7. Windows下PowerShell监控Keepalived
  8. 兄弟打印机内存已满清零方法_brother打印机怎么清零?brother打印机清零方法
  9. 【读点论文】ViTGAN: Training GANs with Vision Transformers 将视觉transformer和gan结合起来
  10. mysql创建book表_【mysql】表的创建以及基本操作
  11. Python实战回归模型-消费者人群画像-信用智能评分(基于中国移动用户数据)
  12. java-net-php-python-jspm智守护学生健康管理系统软件设计与开发计算机毕业设计程序
  13. PMP证书含金量再次提升,纳入北京工作居住证办理范围
  14. 软考-高级-信息系统项目管理师
  15. linux 绑定腾讯域名解析,一步步配置腾讯云服务器ubuntu 通过域名访问自己的网页tomcat(详细基础)...
  16. 安卓手机小说阅读器_百万小说阅读器app免费版下载-百万小说阅读器app手机版下载v1.4...
  17. 【Python 实战基础】Pandas如何输出表格数据标题名称列表
  18. 程序员晋升答辩的3个大坑!
  19. 【陀螺财经】数字货币每日行情简报0213
  20. 如何让谷歌、百度和雅虎收录你的网站,编入索引

热门文章

  1. 京东自动秒杀抢券php,京东秒杀抢购的小脚本和chorme的一个开发者插件
  2. vue项目使用微信jssdk做分享
  3. 有关树的常见算法汇总【持续更新中】
  4. H5互动的正确打开方式
  5. 我的产品经理入门之路
  6. 从根上彻底理解各种变换之二:傅里叶变换
  7. 2019年全国安全生产活动主题防风险、除隐患、遏事故宣传教育片 安全月活动主题挂图视频、挂图、宣传单、折页、安全知识小手册、展板等
  8. Spring六:Spring AOP API 上
  9. poi 获取excel列宽度_JAVA使用POI获取Excel的列数与行数
  10. 浅谈质量管理五大工具