乾貨丨Orca 數據加載入門教程

本文介紹在Orca中加載數據的方法。html

1 創建數據庫鏈接python

在Orca中經過connect函數鏈接到DolphinDB服務器:git

>>> import dolphindb.orca as orca
>>> orca.connect(MY_HOST, MY_PORT, MY_USERNAME, MY_PASSWORD)

2 導入數據github

下面的教程使用了一個數據文件:quotes.csvsql

2.1 read_csv函數數據庫

Orca提供read_csv函數,用於導入數據集。須要說明的是,Orca的read_csv函數的engine參數的取值能夠是{‘c’, ‘python’, ‘dolphindb’},且該參數默認取值爲‘dolphindb’。當取值爲‘dolphindb’時,read_csv函數會在DolphinDB服務器目錄下尋找要導入的數據文件。當取值爲‘python’或‘c’時,read_csv函數會在python客戶端的目錄下尋找要導入的數據文件。json

請注意,當engine參數設置爲‘python’或者‘c’時,Orca的 read_csv函數至關於調用了pandas的 read_csv函數進行導入。本節是基於engine參數取值爲‘dolphindb’的前提下對Orca的 read_csv函數進行講解。

當engine參數設置爲‘dolphindb’時,Orca的read_csv函數目前支持的參數以下:api

  • path:文件路徑
  • sep:分隔符
  • delimiter:分隔符
  • names:指定列名
  • index_col:指定做爲index的列
  • engine:進行導入的引擎
  • usecols:指定要導入的列
  • squeeze:當數據文件只有一行或者一列時,是否將DataFrame壓縮成Series
  • prefix:給每列加上的前綴字符串
  • dtype:指定數據類型導入
  • partitioned:是否容許以分區的方式導入數據
  • db_handle:要導入的數據庫路徑
  • table_name:要導入的表名
  • partition_columns:進行分區的列名

下面詳細介紹Orca與pandas實現有所不一樣的幾個參數。服務器

  • dtype參數

Orca在導入csv的時候會自動識別要導入文件的數據類型,支持各類通用時間格式。用戶也能夠經過dtype參數來強制指定數據類型。session

須要說明的是,Orca的read_csv函數不只支持指定各類numpy的數據類型(np.bool, np.int8, np.float32, etc.),還支持支持以字符串的方式指定DolphinDB的提供的全部數據類型,包括全部時間類型和字符串類型。

例如:

dfcsv = orca.read_csv("DATA_DIR/quotes.csv", dtype={"TIME": "NANOTIMESTAMP", "Exchange": "SYMBOL", "SYMBOL": "SYMBOL", "Bid_Price": np.float64, "Bid_Size": np.int32, "Offer_Price": np.float64, "Offer_Size": np.int32})
  • partitioned參數

bool類型,默認爲True。該參數爲True時,在數據規模達到必定程度時,會將數據導入爲分區內存表,若是設置爲False,會直接將csv導入爲未經分區的DolphinDB普通內存表。

請注意:Orca的分區表與Orca的內存表相比,在操做時也存在許多差別,具體見 Orca分區表的特殊差別。若您的數據量不是很大,且在使用Orca時對Orca與pandas的一致性要求更高,請儘可能不要將數據以分區的方式導入。若您數據量極大,對性能要求極高,則建議您採用分區方式導入數據。
  • db_handle,table_name以及partition_columns參數

Orca的read_csv還支持db_handle,table_name和partition_columns這3個參數,這些參數用於在導入數據的時經過指定DolphinDB的數據庫和表等相關信息,將數據導入到DolphinDB的分區表。

DolphinDB支持經過多種方式將數據導入DolphinDB數據庫,Orca在調用read_csv函數時指定db_handle, table_name以及partition_columns參數,本質上是調用DolphinDB的loadTextEx函數,經過這種方式,咱們能夠直接將數據直接導入DolphinDB的分區表。

2.1.1 導入到內存表

  • 導入爲內存分區表

直接調用read_csv函數,數據會並行導入。因爲採用並行導入,導入速度快,可是對內存佔用是普通表的兩倍。下面的例子中'DATA_DIR'爲數據文件存放的路徑。

>>> DATA_DIR = "dolphindb/database" # e.g. data_dir
>>> df = orca.read_csv(DATA_DIR + "/quotes.csv")
>>> df.head()
# output

                        time Exchange Symbol  Bid_Price  Bid_Size  \
0 2017-01-01 04:40:11.686699        T   AAPL       0.00         0   
1 2017-01-01 06:42:50.247631        P   AAPL      26.70        10   
2 2017-01-01 07:00:12.194786        P   AAPL      26.75         5   
3 2017-01-01 07:15:03.578071        P   AAPL      26.70        10   
4 2017-01-01 07:59:39.606882        K   AAPL      26.90         1   
   Offer_Price  Offer_Size  
0        27.42           1  
1        27.47           1  
2        27.47           1  
3        27.47           1  
4         0.00           0
  • 導入爲普通內存表

partitioned參數取值爲False,導入爲普通內存表。導入對內存要求低,可是計算速度略低於上面的導入方式:

df = orca.read_csv(DATA_DIR + "/quotes.csv", partitioned=False)

2.1.2 導入到磁盤表

DolphinDB的分區表能夠保存在本地磁盤,也能夠保存在dfs上,磁盤分區表與分佈式表的區別就在於分佈式表的數據庫路徑以"dfs://"開頭,而磁盤分區表的數據庫路徑是本地路徑。

示例

咱們在DolphinDB服務端建立一個磁盤分區表,下面的腳本中,'YOUR_DIR'爲保存磁盤數據庫的路徑:

dbPath=YOUR_DIR + "/demoOnDiskPartitionedDB"
login('admin', '123456')
if(existsDatabase(dbPath))
   dropDatabase(dbPath)
db=database(dbPath, RANGE, datehour(2017.01.01 00:00:00+(0..24)*3600))
請注意:以上兩段腳本須要在DolphinDB服務端執行,在Python客戶端中則能夠經過DolphinDB Python API執行腳本。

在Python客戶端中調用Orca的read_csv函數,指定數據庫db_handle爲磁盤分區數據庫YOUR_DIR + "/demoOnDiskPartitionedDB",指定表名table_name爲"quotes"和進行分區的列partition_columns爲"time",將數據導入到DolphinDB的磁盤分區表,並返回一個表示DolphinDB數據表的對象給df,用於後續計算。

>>> df = orca.read_csv(path=DATA_DIR+"/quotes.csv", dtype={"Exchange": "SYMBOL", "SYMBOL": "SYMBOL"}, db_handle=YOUR_DIR + "/demoOnDiskPartitionedDB", table_name="quotes", partition_columns="time")
>>> df
# output
<'dolphindb.orca.core.frame.DataFrame' object representing a column in a DolphinDB segmented table>
>>> df.head()
# output
                        time Exchange Symbol  Bid_Price  Bid_Size  \
0 2017-01-01 04:40:11.686699        T   AAPL       0.00         0   
1 2017-01-01 06:42:50.247631        P   AAPL      26.70        10   
2 2017-01-01 07:00:12.194786        P   AAPL      26.75         5   
3 2017-01-01 07:15:03.578071        P   AAPL      26.70        10   
4 2017-01-01 07:59:39.606882        K   AAPL      26.90         1   
   Offer_Price  Offer_Size  
0        27.42           1  
1        27.47           1  
2        27.47           1  
3        27.47           1  
4         0.00           0

將上述過程整合成的Python中可執行的腳本以下:

>>> s = orca.default_session()
>>> DATA_DIR = "/dolphindb/database" # e.g. data_dir
>>> YOUR_DIR = "/dolphindb/database" # e.g. database_dir
>>> create_onDiskPartitioned_database = """
dbPath="{YOUR_DIR}" + "/demoOnDiskPartitionedDB"
login('admin', '123456')
if(existsDatabase(dbPath))
   dropDatabase(dbPath)
db=database(dbPath, RANGE, datehour(2017.01.01 00:00:00+(0..24)*3600))
""".format(YOUR_DIR=YOUR_DIR)
>>> s.run(create_onDiskPartitioned_database)
>>> df = orca.read_csv(path=DATA_DIR+"/quotes.csv", dtype={"Exchange": "SYMBOL", "SYMBOL": "SYMBOL"}, db_handle=YOUR_DIR + "/demoOnDiskPartitionedDB", table_name="quotes", partition_columns="time")

上述腳本中,咱們使用的defalut_session實際上就是經過orca.connect函數建立的會話,在Python端,咱們能夠經過這個會話與DolphinDB服務端進行交互。關於更多功能,請參見DolphinDB Python API

請注意:在經過 read_csv函數指定數據庫導入數據以前,須要確保在DolphinDB服務器上已經建立了對應的數據庫。 read_csv函數根據指定的數據庫,表名和分區字段導入數據到DolphinDB數據庫中,若表存在則追加數據,若表不存在則建立表而且導入數據。

2.1.3 導入到分佈式表

read_csv函數若指定db_handle參數爲dfs數據庫路徑,則數據將直接導入到DolphinDB的dfs數據庫中。

示例

請注意只有啓用enableDFS=1的集羣環境或者DolphinDB單例模式才能使用分佈式表。

與磁盤分區表相似,首先須要在DolphinDB服務器上建立分佈式表,只須要將數據庫路徑改成"dfs://"開頭的字符串便可。

dbPath="dfs://demoDB"
login('admin', '123456')
if(existsDatabase(dbPath))
   dropDatabase(dbPath)
db=database(dbPath, RANGE, datehour(2017.01.01 00:00:00+(0..24)*3600))

在Python客戶端中調用Orca的read_csv函數,指定數據庫db_handle爲分佈式數據庫"dfs://demoDB",指定表名table_name爲"quotes"和進行分區的列partition_columns爲"time",將數據導入到DolphinDB的分佈式表。

>>> df = orca.read_csv(path=DATA_DIR+"/quotes.csv", dtype={"Exchange": "SYMBOL", "SYMBOL": "SYMBOL"}, db_handle="dfs://demoDB", table_name="quotes", partition_columns="time")
>>> df
# output
<'dolphindb.orca.core.frame.DataFrame' object representing a column in a DolphinDB segmented table>
>>> df.head()
# output
                        time Exchange Symbol  Bid_Price  Bid_Size  \
0 2017-01-01 04:40:11.686699        T   AAPL       0.00         0   
1 2017-01-01 06:42:50.247631        P   AAPL      26.70        10   
2 2017-01-01 07:00:12.194786        P   AAPL      26.75         5   
3 2017-01-01 07:15:03.578071        P   AAPL      26.70        10   
4 2017-01-01 07:59:39.606882        K   AAPL      26.90         1   
   Offer_Price  Offer_Size  
0        27.42           1  
1        27.47           1  
2        27.47           1  
3        27.47           1  
4         0.00           0

將上述過程整合成的Python中可執行的腳本以下:

>>> s = orca.default_session()
>>> DATA_DIR = "/dolphindb/database" # e.g. data_dir
>>> create_dfs_database = """
dbPath="dfs://demoDB"
login('admin', '123456')
if(existsDatabase(dbPath))
   dropDatabase(dbPath)
db=database(dbPath, RANGE, datehour(2017.01.01 00:00:00+(0..24)*3600))
"""
>>> s.run(create_dfs_database)
>>> df = orca.read_csv(path=DATA_DIR+"/quotes.csv", dtype={"Exchange": "SYMBOL", "SYMBOL": "SYMBOL"}, db_handle="dfs://demoDB", table_name="quotes", partition_columns="time")

2.2 read_table函數

Orca提供read_table函數,經過該函數指定DolphinDB數據庫和表名來加載DolphinDB數據表的數據,能夠用於加載DolphinDB的磁盤表、磁盤分區表和分佈式表。若您已在DolphinDB中建立了數據庫和表,則能夠直接在Orca中調用該函數加載存放在DolphinDB服務端中的數據,read_table函數支持的參數以下:

  • database:數據庫名稱
  • table:表名
  • partition:須要導入的分區,可選參數

加載DolphinDB的磁盤表

read_table函數能夠用於加載DolphinDB的磁盤表,首先在DolphinDB服務端建立一個本地磁盤表:

>>> s = orca.default_session()
>>> YOUR_DIR = "/dolphindb/database" # e.g. database_dir
>>> create_onDisk_database="""
saveTable("{YOUR_DIR}"+"/demoOnDiskDB", table(2017.01.01..2017.01.10 as date, rand(10.0,10) as prices), "quotes")
""".format(YOUR_DIR=YOUR_DIR)
>>> s.run(create_onDisk_database)

經過read_table函數加載磁盤表:

>>> df = orca.read_table(YOUR_DIR + "/demoOnDiskDB", "quotes")
>>> df.head()
# output
      date    prices
0 2017-01-01  8.065677
1 2017-01-02  2.969041
2 2017-01-03  3.688191
3 2017-01-04  4.773723
4 2017-01-05  5.567130
請注意: read_table函數要求所要導入的數據庫和表在DolphinDB服務器上已經存在,若只存在數據庫和沒有建立表,則不能將數據成功導入到Python中。

加載DolphinDB的磁盤分區表

對於已經在DolphinDB上建立的數據表,能夠經過read_table函數直接加載。例如,加載2.1.2小節中建立的磁盤分區表:

>>> df = orca.read_table(YOUR_DIR + "/demoOnDiskPartitionedDB", "quotes")

加載DolphinDB的分佈式表

分佈式表一樣能夠經過read_table函數加載。例如,加載2.1.3小節中建立的分佈式表:

>>> df = orca.read_table("dfs://demoDB", "quotes")

2.3 from_pandas函數

Orca提供from_pandas函數,該函數接受一個pandas的DataFrame做爲參數,返回一個Orca的DataFrame,經過這個方式,Orca能夠直接加載原先存放在pandas的DataFrame中的數據。

>>> import pandas as pd
>>> import numpy as np

>>> pdf = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),  columns=['a', 'b', 'c'])
>>> odf = orca.from_pandas(pdf)

3 對其它格式文件的支持

對於其它數據格式的導入,Orca也提供了與pandas相似的接口。這些方法包括:read_pickleread_fwfread_msgpackread_clipboardread_excelread_json, json_normalize,build_table_schemaread_htmlread_hdfread_featherread_parquetread_sasread_sql_tableread_sql_queryread_sqlread_gbqread_stata

相關文章
相關標籤/搜索