寻找用于清理/注释大型数据集的 python 数据结构
Posted
技术标签:
【中文标题】寻找用于清理/注释大型数据集的 python 数据结构【英文标题】:Looking for a python datastructure for cleaning/annotating large datasets 【发布时间】:2015-05-01 20:23:23 【问题描述】:我正在对非常大的 twitter 数据集(约 5000 万条消息)进行大量清理、注释和简单转换。我正在寻找某种数据结构,它会像 pandas 那样包含列信息,但与迭代器一起工作,而不是一次将整个数据集读入内存。我正在考虑编写自己的,但我想知道是否有类似功能的东西。我知道我不是唯一一个这样做的人!
所需功能:
>>> ds = DataStream.read_sql("SELECT id, message from dataTable WHERE epoch < 129845")
>>> ds.columns
['id', 'message']
>>> ds.iterator.next()
[2385, "Hi it's me, Sally!"]
>>> ds = datastream.read_sql("SELECT id, message from dataTable WHERE epoch < 129845")
>>> ds_tok = get_tokens(ds)
>>> ds_tok.columns
['message_id', 'token', 'n']
>>> ds_tok.iterator.next()
[2385, "Hi", 0]
>>> ds_tok.iterator.next()
[2385, "it's", 1]
>>> ds_tok.iterator.next()
[2385, "me", 2]
>>> ds_tok.to_sql(db_info)
更新:我已经确定了 dict 迭代器和 pandas 数据帧的组合来满足这些需求。
【问题讨论】:
fwiw,您不必一次将其全部读入内存。您可以使用 chunk_size,例如你看到这个了吗? ***.com/questions/11622652/… 感谢您的链接!我在 read_sql 中看不到任何给我一个迭代器的选项:/ pandas.pydata.org/pandas-docs/stable/generated/… read_sql 也有块大小:pandas.pydata.org/pandas-docs/stable/generated/… 好点。谢谢。 【参考方案1】:正如评论的那样,read_sql
有一个 chunksize 参数,这意味着您可以零碎地处理 sql 结果。我可能会使用 HDF5Store 来保存中间结果...或者您可以将其附加回另一个 sql 表。
dfs = pd.read_sql(..., chunksize=100000)
store = pd.HDF5Store("store.h5")
for df in dfs:
clean_df = ... # whatever munging you have to do
store.append("df", clean_df)
(参见文档的hdf5 section),或
dfs = pd.read_sql(..., chunksize=100000)
for df in dfs:
clean_df = ...
clean_df.to_sql(..., if_exists='append')
查看文档的sql section。
【讨论】:
那么在实践中用 pandas 读取 chunksize =1 的东西会不会效率低下? @Selah 那太可怕了。块大小需要相当大 IIRC 至少 50000 是一个很好的经验法则。但是尝试几个不同的值并进行比较(使用 %timeit)。以上是关于寻找用于清理/注释大型数据集的 python 数据结构的主要内容,如果未能解决你的问题,请参考以下文章