欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Python中利用Into包整潔地進(jìn)行數(shù)據(jù)遷移的教程

 更新時(shí)間:2015年03月30日 11:26:32   作者:mrocklin  
這篇文章主要介紹了在Python中如何利用Into包整潔地進(jìn)行數(shù)據(jù)遷移,在數(shù)據(jù)格式的任意兩個(gè)格式之間高效地遷移數(shù)據(jù),需要的朋友可以參考下

動(dòng)機(jī)

我們花費(fèi)大量的時(shí)間將數(shù)據(jù)從普通的交換格式(比如CSV),遷移到像數(shù)組、數(shù)據(jù)庫(kù)或者二進(jìn)制存儲(chǔ)等高效的計(jì)算格式。更糟糕的是,許多人沒有將數(shù)據(jù)遷移到高效的格式,因?yàn)樗麄儾恢涝趺矗ɑ蛘卟荒埽樗麄兊墓ぞ吖芾硖囟ǖ倪w移方法。

你所選擇的數(shù)據(jù)格式很重要,它會(huì)強(qiáng)烈地影響程序性能(經(jīng)驗(yàn)規(guī)律表明會(huì)有10倍的差距),以及那些輕易使用和理解你數(shù)據(jù)的人。

當(dāng)提倡Blaze項(xiàng)目時(shí),我經(jīng)常說:“Blaze能幫助你查詢各種格式的數(shù)據(jù)?!边@實(shí)際上是假設(shè)你能夠?qū)?shù)據(jù)轉(zhuǎn)換成指定的格式。

進(jìn)入into項(xiàng)目

into函數(shù)能在各種數(shù)據(jù)格式之間高效的遷移數(shù)據(jù)。這里的數(shù)據(jù)格式既包括內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),比如:

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

也包括存在于Python程序之外的持久化數(shù)據(jù),比如:

CSV、JSON、行定界的JSON,以及以上各類的遠(yuǎn)程版本

HDF5 (標(biāo)準(zhǔn)格式與Pandas格式皆可)、 BColz、 SAS、 SQL 數(shù)據(jù)庫(kù) ( SQLAlchemy支持的皆可)、 Mongo

into項(xiàng)目能在上述數(shù)據(jù)格式的任意兩個(gè)格式之間高效的遷移數(shù)據(jù),其原理是利用一個(gè)成對(duì)轉(zhuǎn)換的網(wǎng)絡(luò)(該文章底部有直觀的解釋)。

如何使用它

into函數(shù)有兩個(gè)參數(shù):source和target。它將數(shù)據(jù)從source轉(zhuǎn)換成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

所以,下邊是對(duì)into函數(shù)的合法調(diào)用:
 

>>> 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函數(shù)是一個(gè)單一的函數(shù)。雖然我們習(xí)慣于在各種類型上使用to_csv, from_sql等方法來完成這樣的功能,但接口into非常簡(jiǎn)單。開始使用into函數(shù)前,你需要:
 

$ pip install into
 
>>> from into import into

在Github上查看into工程

實(shí)例

現(xiàn)在我們展示一些更深層次的相同的實(shí)例。

將Python中的list類型轉(zhuǎn)換成numpy中的array類型
 

>>> import numpy as np
 
>>> into(np.ndarray, [1, 2, 3])
 
array([1, 2, 3])

加載CSV文件,并轉(zhuǎn)換成Python中的list類型
 

>>> into(list, 'accounts.csv')
 
[(1, 'Alice', 100),
 
(2, 'Bob', 200),
 
(3, 'Charlie', 300),
 
(4, 'Denis', 400),
 
(5, 'Edith', 500)]

將CSV文件轉(zhuǎn)換成JSON格式
 

>>> 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格式轉(zhuǎn)換成Pandas中的DataFrame格式
 

>>> import pandas as pd
 
>>> into(pd.DataFrame, 'accounts.json')
 
balance id name
 
0 100 1 Alice
 
1 200 2 Bob
 
2 300 3 Charlie
 
3 400 4 Denis
 
4 500 5 Edith

 它是如何工作的?

格式轉(zhuǎn)換是有挑戰(zhàn)性的。任意兩個(gè)數(shù)據(jù)格式之間的健壯、高效的格式轉(zhuǎn)換,都充滿了特殊情況和奇怪的庫(kù)。常見的解決方案是通過一個(gè)通用格式,例如DataFrame或流內(nèi)存列表、字典等,進(jìn)行格式轉(zhuǎn)換。(見dat)或者通過序列化格式,例如ProtoBufThrift,進(jìn)行格式轉(zhuǎn)換。這些都是很好的選擇,往往也是你想要的。然而有時(shí)候這樣的轉(zhuǎn)換是比較慢的,特別是當(dāng)你在實(shí)時(shí)計(jì)算系統(tǒng)上轉(zhuǎn)換,或面對(duì)苛刻的存儲(chǔ)解決方案時(shí)。

2015330111948621.jpg (419×390)

考慮一個(gè)例子,在numpy.recarray和pandas.DataFrame之間進(jìn)行數(shù)據(jù)遷移。我們可以非常快速地,適當(dāng)?shù)剡w移這些數(shù)據(jù)。數(shù)據(jù)的字節(jié)不需要更改,只更改其周圍的元數(shù)據(jù)即可。我們不需要將數(shù)據(jù)序列化到一個(gè)交換格式,或轉(zhuǎn)換為中間的純Python對(duì)象。

考慮從CSV文件遷移數(shù)據(jù)到一個(gè)PostgreSQL數(shù)據(jù)庫(kù)。通過SQLAlchemy(注:一個(gè)Python環(huán)境下的數(shù)據(jù)庫(kù)工具箱)使用Python迭代器,我們的遷移速度不太可能超過每秒2000條記錄。然而使用PostgreSQL自帶的CSV加載器,我們的遷移速度可以超過每秒50000條記錄?;ㄙM(fèi)一整晚的時(shí)間和花費(fèi)一杯咖啡的時(shí)間進(jìn)行數(shù)據(jù)遷移,是有很大區(qū)別的。然而這需要我們?cè)谔厥馇闆r下,能足夠靈活的使用特殊代碼。

專門的兩兩互換工具往往比通用解決方案快一個(gè)數(shù)量級(jí)。

Into項(xiàng)目是那些成對(duì)地?cái)?shù)據(jù)遷移組成的一個(gè)網(wǎng)絡(luò)。我們利用下圖展示這個(gè)網(wǎng)絡(luò):

2015330112051754.jpg (690×430)

每個(gè)節(jié)點(diǎn)是一種數(shù)據(jù)格式。每個(gè)定向的邊是一個(gè)在兩種數(shù)據(jù)格式之間轉(zhuǎn)換數(shù)據(jù)的函數(shù)。into函數(shù)的一個(gè)調(diào)用,可能會(huì)遍歷多個(gè)邊和多個(gè)中間格式。例如,當(dāng)我們將CSV文件遷移到Mongo數(shù)據(jù)庫(kù)時(shí),我們可以采取以下路徑:

?將CSV文件加載到DataFrame中(利用pandas.read_csv)

?然后轉(zhuǎn)換為np.recarray(利用DataFrame.to_records)

?接著轉(zhuǎn)換為一個(gè)Python的迭代器類型(利用np.ndarray.tolist)

?最終轉(zhuǎn)換成Mongo中的數(shù)據(jù)(利用pymongo.Collection.insert)

或者我們可以使用MongoDB自帶的CSV加載器,編寫一個(gè)特殊函數(shù),用一個(gè)從CSV到Mongo的定向邊縮短整個(gè)處理過程。

為了找到最有效的路線,我們利用相對(duì)成本(引入權(quán)重的ad-hoc)給這個(gè)網(wǎng)絡(luò)的所有邊賦予權(quán)重值。然后我們使用networkx找到最短路徑,進(jìn)而進(jìn)行數(shù)據(jù)遷移。如果某個(gè)邊由于某種原因失敗了(引發(fā)NotImplementedError),我們可以自動(dòng)重新尋找路徑。這樣我們的遷移方法是既高效又健壯的。

注意,我們給某些節(jié)點(diǎn)涂上紅色。這些節(jié)點(diǎn)的數(shù)據(jù)量可以大于內(nèi)存。當(dāng)我們?cè)趦蓚€(gè)紅色節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)遷移時(shí)(輸入和輸出的數(shù)據(jù)量都可能大于內(nèi)存),我們限制我們的路徑始終在紅色子圖中,以確保遷移路徑中間的數(shù)據(jù)不會(huì)溢出。需要注意的一種格式是chunks(…),例如chunks(DataFrame)是一個(gè)可迭代的,在內(nèi)存中的DataFrames。這個(gè)方便的元格式允許我們?cè)诖髷?shù)據(jù)上使用緊湊的數(shù)據(jù)結(jié)構(gòu),例如numpy的arrays和pandas的DataFrames,同時(shí)保持在內(nèi)存中數(shù)據(jù)的只有幾十兆字節(jié)。

這種網(wǎng)絡(luò)化的方法允許開發(fā)者對(duì)于特殊情況編寫專門的代碼,同時(shí)確信這段代碼只在正確的情況下使用。這種方法允許我們利用一個(gè)獨(dú)立的、可分離的方式處理一個(gè)非常復(fù)雜的問題。中央調(diào)度系統(tǒng)讓我們保持頭腦清醒。

歷史

很久以前,我寫過into鏈接到Blaze的文章,然后我立即就沉默了。這是因?yàn)榕f的實(shí)現(xiàn)方法(網(wǎng)絡(luò)方法之前)很難擴(kuò)展或維護(hù),也沒有準(zhǔn)備好進(jìn)入其黃金期。

我很滿意這個(gè)網(wǎng)絡(luò)。意想不到的應(yīng)用程序經(jīng)常能夠正常運(yùn)行,into工程現(xiàn)在也準(zhǔn)備好進(jìn)入其黃金期了。Into工程可以通過conda和pip得到,而獨(dú)立于Blaze。它主要的依賴為NumPy、Pandas和NetworkX,所以對(duì)于閱讀我博客的大部分人來說,它算是相對(duì)輕量級(jí)的。如果你想利用一些性能更好的格式,例如HDF5,你將同樣需要安裝這些庫(kù)(pro-tip,使用conda安裝)。

如何開始使用into函數(shù)

你應(yīng)該下載一個(gè)最近版本的into工程。
 

$ pip install --upgrade git+https://github.com/ContinuumIO/into
 
or
 
$ conda install into --channel blaze

然后你可能想要通過該教程的上半部分,或者閱讀該文檔。

又或者不閱讀任何東西,只是試一試。我的希望是,這個(gè)接口很簡(jiǎn)單(只有一個(gè)函數(shù)?。?,用戶可以自然地使用它。如果你運(yùn)行中出現(xiàn)了問題,那么我很愿意在blaze-dev@continuum.io中聽到它們。

相關(guān)文章

  • 合并Excel工作薄中成績(jī)表的VBA代碼,非常適合教育一線的朋友

    合并Excel工作薄中成績(jī)表的VBA代碼,非常適合教育一線的朋友

    每次學(xué)生考試,評(píng)分完畢之后,把每個(gè)科的成績(jī)收集起來,就得到了一個(gè)有若干工作表,每個(gè)表有學(xué)生學(xué)號(hào)、分?jǐn)?shù)等列的Excel工作薄。
    2009-04-04
  • Python for 循環(huán)語句的使用

    Python for 循環(huán)語句的使用

    這篇文章主要介紹了Python for 循環(huán)語句,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-06-06
  • Python多進(jìn)程的使用詳情

    Python多進(jìn)程的使用詳情

    本篇重點(diǎn)介紹Python多進(jìn)程的使用,主要介紹其的一些方法及進(jìn)程的創(chuàng)建等,想進(jìn)一步了解的小伙伴請(qǐng)跟小編一起進(jìn)入下文吧
    2021-09-09
  • Python網(wǎng)絡(luò)爬蟲四大選擇器用法原理總結(jié)

    Python網(wǎng)絡(luò)爬蟲四大選擇器用法原理總結(jié)

    這篇文章主要介紹了Python網(wǎng)絡(luò)爬蟲四大選擇器用法原理總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 基于Python實(shí)現(xiàn)人臉識(shí)別相似度對(duì)比功能

    基于Python實(shí)現(xiàn)人臉識(shí)別相似度對(duì)比功能

    人臉識(shí)別技術(shù)是一種通過計(jì)算機(jī)對(duì)人臉圖像進(jìn)行分析和處理,從而實(shí)現(xiàn)自動(dòng)識(shí)別和辨認(rèn)人臉的技術(shù),隨著計(jì)算機(jī)視覺和模式識(shí)別領(lǐng)域的快速發(fā)展,人臉識(shí)別技術(shù)取得了長(zhǎng)足的進(jìn)步,本文給大家介紹了基于Python實(shí)現(xiàn)人臉識(shí)別相似度對(duì)比功能,感興趣的朋友可以參考下
    2024-01-01
  • python實(shí)現(xiàn)斷點(diǎn)調(diào)試的方法

    python實(shí)現(xiàn)斷點(diǎn)調(diào)試的方法

    本文主要介紹了python實(shí)現(xiàn)斷點(diǎn)調(diào)試的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python 模塊EasyGui詳細(xì)介紹

    Python 模塊EasyGui詳細(xì)介紹

    這篇文章主要介紹了Python 模塊EasyGui詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 詳解Python裝飾器

    詳解Python裝飾器

    這篇文章主要介紹了Python裝飾器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Python中的兩個(gè)內(nèi)置模塊介紹

    Python中的兩個(gè)內(nèi)置模塊介紹

    這篇文章主要介紹了Python中的兩個(gè)內(nèi)置模塊介紹,本文講解Python啟動(dòng)后默認(rèn)會(huì)加載的兩個(gè)內(nèi)建模塊,需要的朋友可以參考下
    2015-04-04
  • 關(guān)于pytorch訓(xùn)練分類器

    關(guān)于pytorch訓(xùn)練分類器

    這篇文章主要介紹了關(guān)于pytorch訓(xùn)練分類器問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論