在我看来,PandasExtensionArray将是一个简单的入门示例真正有帮助的情况之一。但是,我还没有在任何地方找到足够简单的示例。
ExtensionArray要创建ExtensionArray,您需要
ExtensionDtype并注册它ExtensionArray通过实现所需的方法来创建一个。Pandas 文档中还有一个部分提供了简要概述。
有很多实现的例子:
GeometryArrayStringSupportingExtensionArray尽管研究了以上所有内容,我仍然发现扩展数组难以理解。所有示例都有很多细节和自定义功能,这使得很难确定实际需要什么。我怀疑很多人都遇到过类似的问题。
因此,我要求提供一个简单且最小的工作ExtensionArray.
举一个具体的例子,假设我想扩展ExtensionArray以获得一个能够保存 NA 值的整数数组。这本质上是IntegerArray,但剥离了超出ExtensionArray.
如何使用ParquetDatasetpyarrow 将自定义元数据存储?
例如,如果我使用 Dask 创建 Parquet 数据集
import dask
dask.datasets.timeseries().to_parquet('temp.parq')
Run Code Online (Sandbox Code Playgroud)
然后我可以使用 pyarrow 阅读它
import pyarrow.parquet as pq
dataset = pq.ParquetDataset('temp.parq')
Run Code Online (Sandbox Code Playgroud)
但是,我用于为单个 parquet 文件编写元数据的相同方法(在如何使用 pyarrow 编写 Parquet 元数据?中概述)不适用于 a ParquetDataset,因为没有replace_schema_metadata函数或类似的函数。
我想我可能想编写一个自定义_custom_metadata文件,因为我想存储的元数据与整个数据集有关。我想这个过程会类似于:
meta = pq.read_metadata('temp.parq/_common_metadata')
custom_metadata = { b'type': b'mydataset' }
merged_metadata = { **custom_metadata, **meta.metadata }
# TODO: Construct FileMetaData object with merged_metadata
new_meta.write_metadata_file('temp.parq/_common_metadata')
Run Code Online (Sandbox Code Playgroud) 如果我有一个简单的查询
SELECT row FROM table WHERE id=my_id
如果my_id找不到,我想要一行带有 NULL 而不是空行,我可以使用coalesce
COALESCE( (SELECT row FROM table WHERE id=my_id), NULL)
Run Code Online (Sandbox Code Playgroud)
如果我的查询返回多列并且我想要一行 NULL,我该怎么办?
SELECT row1,row2,row3 FROM table WHERE id=my_id
Run Code Online (Sandbox Code Playgroud) 根据经验,每当您set_index使用 Dask 数据帧时,Dask 总是会将具有相同索引的行放入单个分区中,即使这会导致分区严重不平衡。
这是一个演示:
import pandas as pd
import dask.dataframe as dd
users = [1]*1000 + [2]*1000 + [3]*1000
df = pd.DataFrame({'user': users})
ddf = dd.from_pandas(df, npartitions=1000)
ddf = ddf.set_index('user')
counts = ddf.map_partitions(lambda x: len(x)).compute()
counts.loc[counts > 0]
# 500 1000
# 999 2000
# dtype: int64
Run Code Online (Sandbox Code Playgroud)
然而,我在任何地方都找不到这种行为的保证。
我曾尝试自己筛选代码,但放弃了。我相信这些相互关联的函数之一可能包含答案:
当您时set_index,单个索引是否永远不能位于两个不同的分区中?如果不是,那么该财产在什么条件下成立?
赏金:我将向来自信誉良好的来源的答案授予赏金。例如,引用实现来表明该属性必须成立。
一般来说,关于抑制 Pandas 中的科学记数法存在许多问题
然而,它们似乎都不适用于该to_markdown功能。例如:
import pandas as pd
df = pd.DataFrame({'val': 3e10}, index=[0]) # print(df) gives 3.000000e+10
pd.set_option('float_format', '{:f}'.format) # print(df) gives 30000000000.000000
Run Code Online (Sandbox Code Playgroud)
然而,df.to_markdown()仍然有产出
| | val |
|---:|------:|
| 0 | 3e+10 |
Run Code Online (Sandbox Code Playgroud)
如何禁用 中的科学记数法to_markdown()?
在阅读了有关基于文件目标的输出缓存的 文档后,我认为此工作流程应该是输出缓存的示例:
from time import sleep
from prefect import Flow, task
from prefect.engine.results import LocalResult
@task(target="func_task_target.txt", checkpoint=True,
result=LocalResult(dir="~/.prefect"))
def func_task():
sleep(5)
return 99
with Flow("Test-cache") as flow:
func_task()
if __name__ == '__main__':
flow.run()
Run Code Online (Sandbox Code Playgroud)
我希望func_task运行一次,进行缓存,然后在下次运行流程时使用缓存的值。然而,似乎func_task每次都会运行。
我哪里出错了?或者我误解了文档?