最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Python中利用Into包整潔地進行數據遷移的教程

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

動機

我們花費大量的時間將數據從普通的交換格式(比如CSV),遷移到像數組、數據庫或者二進制存儲等高效的計算格式。更糟糕的是,許多人沒有將數據遷移到高效的格式,因為他們不知道怎么(或者不能)為他們的工具管理特定的遷移方法。

你所選擇的數據格式很重要,它會強烈地影響程序性能(經驗規(guī)律表明會有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函數的合法調用:
 

>>> 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函數前,你需要:
 

$ pip install into
 
>>> from into import into

在Github上查看into工程。

實例

現在我們展示一些更深層次的相同的實例。

將Python中的list類型轉換成numpy中的array類型
 

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

加載CSV文件,并轉換成Python中的list類型
 

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

將CSV文件轉換成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格式轉換成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

 它是如何工作的?

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

2015330111948621.jpg (419×390)

考慮一個例子,在numpy.recarray和pandas.DataFrame之間進行數據遷移。我們可以非??焖俚?,適當地遷移這些數據。數據的字節(jié)不需要更改,只更改其周圍的元數據即可。我們不需要將數據序列化到一個交換格式,或轉換為中間的純Python對象。

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

專門的兩兩互換工具往往比通用解決方案快一個數量級。

Into項目是那些成對地數據遷移組成的一個網絡。我們利用下圖展示這個網絡:

2015330112051754.jpg (690×430)

每個節(jié)點是一種數據格式。每個定向的邊是一個在兩種數據格式之間轉換數據的函數。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找到最短路徑,進而進行數據遷移。如果某個邊由于某種原因失敗了(引發(fā)NotImplementedError),我們可以自動重新尋找路徑。這樣我們的遷移方法是既高效又健壯的。

注意,我們給某些節(jié)點涂上紅色。這些節(jié)點的數據量可以大于內存。當我們在兩個紅色節(jié)點之間進行數據遷移時(輸入和輸出的數據量都可能大于內存),我們限制我們的路徑始終在紅色子圖中,以確保遷移路徑中間的數據不會溢出。需要注意的一種格式是chunks(…),例如chunks(DataFrame)是一個可迭代的,在內存中的DataFrames。這個方便的元格式允許我們在大數據上使用緊湊的數據結構,例如numpy的arrays和pandas的DataFrames,同時保持在內存中數據的只有幾十兆字節(jié)。

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

歷史

很久以前,我寫過into鏈接到Blaze的文章,然后我立即就沉默了。這是因為舊的實現方法(網絡方法之前)很難擴展或維護,也沒有準備好進入其黃金期。

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

如何開始使用into函數

你應該下載一個最近版本的into工程。
 

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

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

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

相關文章

  • Python入門篇之條件、循環(huán)

    Python入門篇之條件、循環(huán)

    本文的主要內容是 Python 的條件和循環(huán)語句以及與它們相關的部分. 我們會深入探討if, while, for以及與他們相搭配的else,elif,break,continue和pass語句.
    2014-10-10
  • Python判斷有效的數獨算法示例

    Python判斷有效的數獨算法示例

    這篇文章主要介紹了Python判斷有效的數獨算法,結合實例形式分析了Python針對數獨有效性判定的相關操作技巧,需要的朋友可以參考下
    2019-02-02
  • Python中關于property使用的小技巧

    Python中關于property使用的小技巧

    俗話說條條大路通羅馬,同樣是完成一件事,Python 其實提供了好幾個方式供你選擇。property() 是一個比較奇葩的BIF,它的作用把方法當作屬性來訪問,從而提供更加友好訪問方式
    2021-09-09
  • 一文教會你用Python讀取PDF文件

    一文教會你用Python讀取PDF文件

    Python?工程師在日常的工作中,經常會碰到解析和處理PDF文件的情況。本文將pdfplumber進行PDF文件的讀取操作,感興趣的可以了解一下
    2022-08-08
  • python opencv 讀取本地視頻文件 修改ffmpeg的方法

    python opencv 讀取本地視頻文件 修改ffmpeg的方法

    今天小編就為大家分享一篇python opencv 讀取本地視頻文件 修改ffmpeg的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 20行python代碼的入門級小游戲的詳解

    20行python代碼的入門級小游戲的詳解

    這篇文章主要介紹了python入門級小游戲,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • Python?print函數使用由淺入深全面詳解

    Python?print函數使用由淺入深全面詳解

    這篇文章主要為大家介紹了Python?print函數使用由淺入深全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Python常用的日期時間處理方法示例

    Python常用的日期時間處理方法示例

    這篇文章主要介紹了Python常用的日期時間處理方法示例,本文直接給出實現代碼,包含如給定日期向后N天的日期、昨天、今天、將字符串轉換成datetime類型等方法,需要的朋友可以參考下
    2015-02-02
  • Python批量更改文件名的實現方法

    Python批量更改文件名的實現方法

    這篇文章主要介紹了Python批量更改文件名的實現方法的相關資料,希望通過本文能幫助到大家,讓大家掌握這樣的方法,需要的朋友可以參考下
    2017-10-10
  • 完美解決keras 讀取多個hdf5文件進行訓練的問題

    完美解決keras 讀取多個hdf5文件進行訓練的問題

    這篇文章主要介紹了完美解決keras 讀取多個hdf5文件進行訓練的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評論

麻江县| 迁安市| 南汇区| 永新县| 祁门县| 于田县| 资源县| 平利县| 开阳县| 香河县| 泗洪县| 长宁县| 上思县| 太白县| 扶余县| 吉林市| 邯郸市| 沧源| 密云县| 平泉县| 萝北县| 玉田县| 伊宁县| 习水县| 长乐市| 开原市| 华安县| 连山| 蒲城县| 当阳市| 石柱| 青龙| 崇州市| 肥城市| 连云港市| 岢岚县| 泾川县| 扶绥县| 江油市| 汕尾市| 锦州市|