Tafra:数据框的内部结构
项目描述
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 |
构造函数 |
|
SQL 阅读器 |
|
析构函数 |
to_records , to_list , to_tuple , to_array , to_pandas |
特性 |
|
迭代方法 |
|
函数式方法 |
|
类字典方法 |
键、 值、 项目、 获取、 更新、 update_inplace、 update_dtypes、 update_dtypes_inplace |
其他辅助方法 |
选择, 头部, 复制, 重命名, rename_inplace, coalesce, coalesce_inplace, _coalesce_dtypes, 删除, delete_inplace |
打印机方法 |
|
索引方法 |
入门
使用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.data或 Tafra._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_map和key_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_sql和read_sql_chunks
添加to_tuple和to_pandas
清理构造函数数据验证
1.0.2
添加 object_formatter 以公开 dtype=object 的用户格式
索引和切片的改进
1.0.1
添加迭代函数
添加地图功能
各种构造函数改进
1.0.0
初始发行
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。