开发商#
这一部分将重点介绍Pandas的下游应用。
以ApacheParquet格式存储Pandas DataFrame对象#
这个 Apache Parquet Format提供文件和列级别的键值元数据,存储在Parquet文件的页脚中:
5: optional list<KeyValue> key_value_metadata
哪里 KeyValue 是
struct KeyValue {
1: required string key
2: optional string value
}
这样一来, pandas.DataFrame 可以被忠实地重建,我们存储一个 pandas 中的元数据关键字 FileMetaData 其中的值存储为:
{'index_columns': [<descr0>, <descr1>, ...],
'column_indexes': [<ci0>, <ci1>, ..., <ciN>],
'columns': [<c0>, <c1>, ...],
'pandas_version': $VERSION,
'creator': {
'library': $LIBRARY,
'version': $LIBRARY_VERSION
}}
“描述符”值 <descr0> 在 'index_columns' 字段是字符串(引用一列)或具有值的字典,如下所述。
这个 <c0>/<ci0> 等等是包含每一列的元数据的词典, 包括索引列 。它具有JSON格式:
{'name': column_name,
'field_name': parquet_column_name,
'pandas_type': pandas_type,
'numpy_type': numpy_type,
'metadata': metadata}
有关这些产品的详细规格,请参见下文。
索引元数据描述符#
RangeIndex 只能存储为元数据,不需要序列化。它们的描述符格式如下:
index = pd.RangeIndex(0, 10, 2)
{
"kind": "range",
"name": index.name,
"start": index.start,
"stop": index.stop,
"step": index.step,
}
其他索引类型必须与其他DataFrame列一起序列化为数据列。这些元素的元数据是指示数据列中的字段名称的字符串,例如 '__index_level_0__' 。
如果索引具有非None name 属性,并且没有其他列的名称与该值匹配,则 index.name 值可以用作描述符。否则(对于未命名的索引和名称与其他列名冲突的索引)使用模式匹配消除歧义的名称 __index_level_\d+__ 应该使用。在命名索引作为数据列的情况下, name 属性始终存储在如上所述的列描述符中。
列元数据#
pandas_type 是列的逻辑类型,是以下类型之一:
布尔值:
'bool'整数:
'int8', 'int16', 'int32', 'int64', 'uint8', 'uint16', 'uint32', 'uint64'花车:
'float16', 'float32', 'float64'日期和时间类型:
'datetime', 'datetimetz','timedelta'字符串:
'unicode', 'bytes'绝对的:
'categorical'其他Python对象:
'object'
这个 numpy_type 是列的物理存储类型,它是 str(dtype) 用于保存数据的基础NumPy数组。因此,对于 datetimetz 这是 datetime64[ns] 对于分类,它可以是任何受支持的整型分类类型。
这个 metadata 字段为 None 但以下情况除外:
datetimetz:{{'timezone': zone, 'unit': 'ns'}},例如{{'timezone', 'America/New_York', 'unit': 'ns'}}。这个'unit'是可选的,如果省略,则假定为纳秒。categorical:{'num_categories': K, 'ordered': is_ordered, 'type': $TYPE}这里
'type'是可选的,在这里可以是嵌套的Pandas类型规范(但不是绝对的)
unicode:{'encoding': encoding}编码是可选的,如果不存在,则为UTF-8
object:{{'encoding': encoding}}。对象可以序列化并存储在BYTE_ARRAY镶木木柱。编码可以是以下之一:'pickle''bson''json'
timedelta:{{'unit': 'ns'}}。这个'unit'是可选的,如果省略,则假定为纳秒。此元数据完全是可选的
对于这些以外的类型, 'metadata' 可以省略键。实现可以假定 None 如果密钥不存在。
作为完全形成的元数据的一个例子:
{'index_columns': ['__index_level_0__'],
'column_indexes': [
{'name': None,
'field_name': 'None',
'pandas_type': 'unicode',
'numpy_type': 'object',
'metadata': {'encoding': 'UTF-8'}}
],
'columns': [
{'name': 'c0',
'field_name': 'c0',
'pandas_type': 'int8',
'numpy_type': 'int8',
'metadata': None},
{'name': 'c1',
'field_name': 'c1',
'pandas_type': 'bytes',
'numpy_type': 'object',
'metadata': None},
{'name': 'c2',
'field_name': 'c2',
'pandas_type': 'categorical',
'numpy_type': 'int16',
'metadata': {'num_categories': 1000, 'ordered': False}},
{'name': 'c3',
'field_name': 'c3',
'pandas_type': 'datetimetz',
'numpy_type': 'datetime64[ns]',
'metadata': {'timezone': 'America/Los_Angeles'}},
{'name': 'c4',
'field_name': 'c4',
'pandas_type': 'object',
'numpy_type': 'object',
'metadata': {'encoding': 'pickle'}},
{'name': None,
'field_name': '__index_level_0__',
'pandas_type': 'int64',
'numpy_type': 'int64',
'metadata': None}
],
'pandas_version': '1.4.0',
'creator': {
'library': 'pyarrow',
'version': '0.13.0'
}}