Skip to main content

Tafra:数据框的内部结构

项目描述

https://img.shields.io/pypi/v/tafra.svg https://travis-ci.org/petbox-dev/tafra.svg?branch=master 文件状态 覆盖状态

tafra最初是一个思想实验:我们如何才能将 da tafra me 的想法(如pandas之类的库或 R 之类的语言中所表达的)简化为有用的本质,同时剔除琐碎的东西?最初的概念证明 停留在“group by”。

这个库扩展了概念验证以生成一个实用的tafra,我们希望您会发现它是对pandas某些用途的有用的轻量级替代品。

tafra或多或少是一组命名的维度。其中每一个都是一个长度一致的类型化numpy数组,以rows表示每列的值。

该库提供用于操作行和列的轻量级语法、支持管理数据类型、行和子帧的迭代器、 类似于pandas的“转换”支持和从pandas数据帧转换,以及 SQL 风格的“分组依据”和连接操作。

塔夫拉

塔夫拉

聚合

联合, GroupBy , 变换, IterateBy , InnerJoin , LeftJoin , CrossJoin

聚合助手

union , union_inplace , group_by , transform , iterate_by , inner_join , left_join , cross_join

构造函数

as_tafrafrom_dataframefrom_seriesfrom_records

SQL 阅读器

read_sql , read_sql_chunks

析构函数

to_records , to_list , to_tuple , to_array , to_pandas

特性

数据dtypes大小ndim形状

迭代方法

iterrows , itertuples , itercols

函数式方法

row_maptuple_mapcol_map

类字典方法

项目获取更新update_inplaceupdate_dtypesupdate_dtypes_inplace

其他辅助方法

选择头部复制重命名rename_inplacecoalescecoalesce_inplace_coalesce_dtypes删除delete_inplace

打印机方法

pprint , pformat , to_html

索引方法

_slice , _index , _ndindex

入门

使用pip安装库:

pip install tafra

一个简短的例子

>>> from tafra import Tafra

>>> t = Tafra({
...    'x': np.array([1, 2, 3, 4]),
...    'y': np.array(['one', 'two', 'one', 'two'], dtype='object'),
... })

>>> t.pformat()
Tafra(data = {
 'x': array([1, 2, 3, 4]),
 'y': array(['one', 'two', 'one', 'two'])},
dtypes = {
 'x': 'int', 'y': 'object'},
rows = 4)

>>> print('List:', '\n', t.to_list())
List:
 [array([1, 2, 3, 4]), array(['one', 'two', 'one', 'two'], dtype=object)]

>>> print('Records:', '\n', tuple(t.to_records()))
Records:
 ((1, 'one'), (2, 'two'), (3, 'one'), (4, 'two'))

>>> gb = t.group_by(
...     ['y'], {'x': sum}
... )

>>> print('Group By:', '\n', gb.pformat())
Group By:
Tafra(data = {
 'x': array([4, 6]), 'y': array(['one', 'two'])},
dtypes = {
 'x': 'int', 'y': 'object'},
rows = 2)

灵活性

有一些适用于pandas的代码,或者只是一种你喜欢的做事方式?tafra很灵活:

>>> df = pd.DataFrame(np.c_[
...     np.array([1, 2, 3, 4]),
...     np.array(['one', 'two', 'one', 'two'])
... ], columns=['x', 'y'])

>>> t = Tafra.from_dataframe(df)

回去也很简单:

>>> df = pd.DataFrame(t.data)

计时

在这种情况下,轻量级也意味着高性能。除了添加到库中的任何附加功能之外,tafra 还应该为组织数据结构以进行数值处理提供必要的基础。最重要的方面之一是快速访问数据本身。通过最小化访问底层numpy数组的抽象,tafra提供了一个数量级的性能提升。

  • 导入注释如果直接赋值给Tafra.dataTafra._data属性,之后必须调用Tafra._coalesce_dtypes 以确保键入一致。

构造一个Tafra和一个DataFrame

>>> tf = Tafra({
...     'x': np.array([1., 2., 3., 4., 5., 6.]),
...     'y': np.array(['one', 'two', 'one', 'two', 'one', 'two'], dtype='object'),
...     'z': np.array([0, 0, 0, 1, 1, 1])
... })

>>> df = pd.DataFrame(t.data)

读取操作

直接访问:

>>> %timemit x = t._data['x']
55.3 ns ± 5.64 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

间接支持Tafra切片和numpy的高级索引:

>>> %timemit x = t['x']
219 ns ± 71.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

熊猫时间:

>>> %timemit x = df['x']
1.55 µs ± 105 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

这是 df.values()df.to_numpy()df.loc[]的替代方法中访问 numpy 数组的最快方法。

赋值操作

不建议直接访问,因为它避免了验证步骤,但它确实提供了对数据属性的快速访问:

>>> x = np.arange(6)

>>> %timeit tf._data['x'] = x
65 ns ± 5.55 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

由于验证检查以确保tafra的一致性,间接访问会降低性能:

>>> %timeit tf['x'] = x
7.39 µs ± 950 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

即便如此,与pandas相比还是有相当大的性能提升。

熊猫时间:

>>> %timeit df['x'] = x
47.8 µs ± 3.53 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

分组操作

tafra还擅长聚合方法,其中主要是类似于 SQL 的GROUP BY和 split-apply-combine 等效于类似于 SQL 的 GROUP BY,然后通过LEFT JOIN返回原始表。

>>> %timeit tf.group_by(['y', 'z'], {'x': sum})
138 µs ± 4.03 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit tf.transform(['y', 'z'], {'sum_x': (sum, 'x')})
161 µs ± 2.31 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

下面给出了等效的pandas函数。它们需要多个对象方法链来执行相同的角色,并且转换需要复制操作并分配到复制的DataFrame中以保持不变性。

>>> %timeit df.groupby(['y','z']).agg({'x': 'sum'}).reset_index()
2.5 ms ± 177 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

>>> %%timeit
... tdf = df.copy()
... tdf['x'] = df.groupby(['y', 'z'])[['x']].transform(sum)
2.81 ms ± 143 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

版本历史

1.0.7

  • 处理read_csv()中的缺失值或 NULL 值。

  • 更新 dtype 时将空元素强制转换为 None 以避免np.astype()失败。

  • 更新一些类型,小的重构以提高性能

1.0.6

  • 构造函数中的附加验证,主要用于评估值的迭代

  • 根据参数将col_map拆分为col_mapkey_map作为原始函数的返回签名。

  • 修复一些文档拼写错误

1.0.5

  • 添加tuple_map方法

  • 重构所有迭代器和..._map函数以提高性能

  • 如果将np.ndarray作为构造函数的键给出,则解

  • 如果已知输入有效以提高性能,则在__post_init__中添加validate=False

1.0.4

  • 添加read_csv , to_csv

  • 数据验证的各种重构和改进

  • typing_extensions添加到依赖项

  • 更改 dtype 存储方法,np.dtype()中提取str表示

1.0.3

  • 添加read_sqlread_sql_chunks

  • 添加to_tupleto_pandas

  • 清理构造函数数据验证

1.0.2

  • 添加 object_formatter 以公开 dtype=object 的用户格式

  • 索引和切片的改进

1.0.1

  • 添加迭代函数

  • 添加地图功能

  • 各种构造函数改进

1.0.0

  • 初始发行

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

tafra-1.0.9.tar.gz (45.3 kB 查看哈希

已上传 source

内置分布

tafra-1.0.9-py3-none-any.whl (28.5 kB 查看哈希

已上传 py3