pyo3-arrowは、PythonのArrowデータをPyO3で受け取ることが出来るクレート。
(PandasのDataFrameをArrowのTableに変換して、pyo3-arrowで受け取ることが出来る)
〜
[dependencies]
pyo3 = { version = "0.27.2" }
pyo3-arrow = "0.15.0"
pyo3のバージョンに応じて、pyo3-arrowのバージョンを決める。
対応バージョンはpyo3-arrowのVersion
compatibilityに書かれている。
pyo3 0.27ではpyo3-arrow 0.15を使用する。
ArrowのTableを受け取る例。
use pyo3::prelude::*;
use pyo3_arrow::PyTable;
#[pyfunction]
pub fn arrow_example(table: PyTable) {
let (batches, schema) = table.into_inner();
// batches: Vec<RecordBatch>
// schema: Arc<Schema>
let fields = schema.fields(); // &Fields
for field in fields {
let name = field.name(); // &String
let data_type = field.data_type(); // &DataType
println!("name={}, type={}", name, data_type);
}
for batch in batches {
let columns = batch.columns(); // &[Arc<Array>]
for (field, array) in fields.iter().zip(columns) {
let name = field.name();
let data_type = field.data_type();
println!("name={}, type={:?}, values={:?}", name, data_type, array);
}
}
}
columnsはデータ本体で、Arrayの配列。
Arrayの実体としてはPrimitiveArray<Int32>やStringArray等。
Pythonプロジェクト側で、pyarrowモジュールを依存ライブラリーに追加しておく。
(ついでにpandasも追加しておく)
cd call-pyo3 uv add pyarrow uv add pandas
import example_pyo3
def arrow_example():
import pandas as pd
import pyarrow as pa
df = pd.DataFrame(
{
"foo": pd.Series([0, 1, 2, 3], dtype="int32"),
"bar": pd.Series([None, 100, 200, 900], dtype="Int64"),
"zzz": pd.Series([None, "abc", "def", "ghi"], dtype="string"),
}
).convert_dtypes(dtype_backend="pyarrow")
table = pa.Table.from_pandas(df)
example_pyo3.arrow_example(table)