当字符串列内容比已有内容长时,HDFStore.append(string, DataFrame) 失败

2024-02-27

我有一个通过 HDFStore 存储的 Pandas DataFrame,它本质上存储有关我正在执行的测试运行的摘要行。

每行中的几个字段包含可变长度的描述性字符串。

当我进行测试运行时,我创建一个新的 DataFrame,其中包含一行:

def export_as_df(self):
    return pd.DataFrame(data=[self._to_dict()], index=[datetime.datetime.now()])

然后打电话HDFStore.append(string, DataFrame)将新行添加到现有的 DataFrame 中。

这工作正常,除了字符串列内容之一大于已存在的最长实例之外,因此我收到以下错误:

File "<ipython-input-302-a33c7955df4a>", line 516, in save_pytables
store.append('tests', test.export_as_df())
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/io/pytables.py", line 532, in append
self._write_to_group(key, value, table=True, append=True, **kwargs)
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/io/pytables.py", line 788, in _write_to_group
s.write(obj = value, append=append, complib=complib, **kwargs)
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/io/pytables.py", line 2491, in write
min_itemsize=min_itemsize, **kwargs)
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/io/pytables.py", line 2254, in create_axes
raise Exception("cannot find the correct atom type -> [dtype->%s,items->%s] %s" % (b.dtype.name, b.items, str(detail)))
Exception: cannot find the correct atom type -> [dtype->object,items->Index([bp, id, inst, per, sp, st, title], dtype=object)] [values_block_3] column has a min_itemsize of [51] but itemsize [46] is required!

我找不到任何有关创建 DataFrame 时如何指定字符串长度的文档。这里的解决方案是什么?

Update:

失败的代码:

        store = pd.HDFStore(pytables_store)            
        for test in self.backtests:
            try:
                min_itemsizes = { 'buy_pattern' : 60, 'sell_pattern': 60, 'strategy': 60, 'title': 60 }
                store.append('tests', test.export_as_df(), min_itemsize = min_itemsizes)

这是 0.11rc1 下的错误:

File "<ipython-input-110-492b7b6603d7>", line 522, in save_pytables
  store.append('tests', test.export_as_df(), min_itemsize = min_itemsizes)
File "/Users/admin/dev/pandas/pandas-0.11.0rc1/pandas/io/pytables.py", line 610, in append
  self._write_to_group(key, value, table=True, append=True, **kwargs)
File "/Users/admin/dev/pandas/pandas-0.11.0rc1/pandas/io/pytables.py", line 871, in _write_to_group
  s.write(obj = value, append=append, complib=complib, **kwargs)
File "/Users/admin/dev/pandas/pandas-0.11.0rc1/pandas/io/pytables.py", line 2707, in write
  min_itemsize=min_itemsize, **kwargs)
File "/Users/admin/dev/pandas/pandas-0.11.0rc1/pandas/io/pytables.py", line 2447, in create_axes
  self.validate_min_itemsize(min_itemsize)
File "/Users/admin/dev/pandas/pandas-0.11.0rc1/pandas/io/pytables.py", line 2184, in validate_min_itemsize
  raise ValueError("min_itemsize has [%s] which is not an axis or data_column" % k)
ValueError: min_itemsize has [buy_pattern] which is not an axis or data_column

数据样本:

                           all_day              buy_pattern  \
2013-04-14 12:11:44.377695   False  Hammer() and LowerLow()   

                                                           id instrument  \
2013-04-14 12:11:44.377695  tafdcc96ba4eb11e2a86d14109fcecd49     EURUSD   

                            open_margin periodicity sell_pattern strategy  \
2013-04-14 12:11:44.377695       0.0001     1:00:00                 Tsl()   

                           title  top_bottom  wick_body  
2013-04-14 12:11:44.377695   tsl         0.5          2 

dtypes:

print prob_test.export_as_df().get_dtype_counts() 

    bool       1
    float64    2
    int64      1
    object     7
    dtype: int64

我每次都会删除 h5 文件,因为我想要干净的结果。想知道是否有像失败一样愚蠢的事情,因为在第一次追加时 h5 中不存在 df (因此也不存在任何列)?


以下是有关此内容的新文档部分的链接:http://pandas.pydata.org/pandas-docs/stable/io.html#string-columns http://pandas.pydata.org/pandas-docs/stable/io.html#string-columns

此问题是您在 min_itemsize 中指定的列不是 data_column。简单的解决方法是添加data_columns=True到您的附加语句,但我还更新了代码,以便在您传递有效的列名称时自动创建 data_columns 。我认为这是有道理的,你想要最小的列大小,所以就让它发生吧。

还创建了一个新的文档部分“字符串列”以显示更完整的示例和解释(文档将很快更新)。

# this is the new behavior (after code updates)
n [340]: dfs = DataFrame(dict(A = 'foo', B = 'bar'),index=range(5))

In [341]: dfs
Out[341]: 
     A    B
0  foo  bar
1  foo  bar
2  foo  bar
3  foo  bar
4  foo  bar

# A and B have a size of 30
In [342]: store.append('dfs', dfs, min_itemsize = 30)

In [343]: store.get_storer('dfs').table
Out[343]: 
/dfs/table (Table(5,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": StringCol(itemsize=30, shape=(2,), dflt='', pos=1)}
  byteorder := 'little'
  chunkshape := (963,)
  autoIndex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_CSI=False}

# A is created as a data_column with a size of 30
# B is size is calculated
In [344]: store.append('dfs2', dfs, min_itemsize = { 'A' : 30 })

In [345]: store.get_storer('dfs2').table
Out[345]: 
/dfs2/table (Table(5,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": StringCol(itemsize=3, shape=(1,), dflt='', pos=1),
  "A": StringCol(itemsize=30, shape=(), dflt='', pos=2)}
  byteorder := 'little'
  chunkshape := (1598,)
  autoIndex := True
  colindexes := {
    "A": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
    "index": Index(6, medium, shuffle, zlib(1)).is_CSI=False}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当字符串列内容比已有内容长时,HDFStore.append(string, DataFrame) 失败 的相关文章

随机推荐

  • 如何使用 Zend DB 执行 MySQL IN 子句?

    我正在尝试使用 Zend Framework 1 11 获取整数数组中的行 this gt dbSelect gt from table prefix product link gt joinLeft table prefix produc
  • Qt如何连接rubberBandChanged信号

    我尝试将 QChartView 类中的 ruby BandChanged 信号链接到 MainWindow 类中的特定函数 主窗口 h class MainWindow public QMainWindow Q OBJECT public
  • Python paramiko 线程安全吗?

    我想在并行执行某些命令时轮询系统状态 例如内存负载或 CPU 负载 我可以在多个 Python 线程中使用一个 Paramiko 客户端还是必须连接多个 Paramiko 客户端 我找不到任何有关 Paramiko 线程安全的文档 感谢您的
  • System.getProperty("os.arch") 在 M1 Mac 上的价值?

    有什么价值System getProperty os arch 返回运行的 Apple Silicon M1 Macaarch64JDK 的端口 例如Liberica https bell sw com端口 即not使用罗塞塔2 基于thi
  • 从已知点对照片进行白平衡

    白平衡是一个相当广泛的主题 但我看到的大多数答案都涵盖了整个图像的自动白平衡技术 该技术没有已知的白色 灰色和黑色点 我似乎找不到很多从已知点涵盖白平衡的内容 我有一个脚本 如下 它拍摄色卡 Spyder Checkr 48 的图像并返回白
  • 从 GitHub 上的 Pull Request 中删除文件

    我已经在 git 上发出了 Pull 请求 使用 xcodeproj project pbxproj 文件 我的错 那么我可以从创建的 Pull 请求中删除这个文件吗 谢谢 您可能会在 master 上合并这个拉取请求 这样你就可以从mas
  • 捕获 R 输出并替换为 LaTeX 代码

    我正在尝试捕获一些 R 代码的输出并将其替换为乳胶代码 如果您运行此代码 library stargazer x lt capture output stargazer mtcars 1 5 1 3 summary FALSE title
  • 如何获取弹性搜索中嵌套对象的数组计数

    有人可以帮助我获取弹性搜索中嵌套对象的聚合计数 假设我的弹性搜索对象映射为 employe dynamic strict properties empId type keyword entities type nested 实体是带有其他对
  • 防止文本表突出显示

    我有一个表 我允许用户 选择 多行 这一切都是使用 jQuery 事件和一些 CSS 来处理的 以直观地指示该行已被 选择 当用户按下 Shift 键时 可以选择多行 有时这会导致文本突出显示 有什么办法可以防止这种情况发生吗 CSS3 有
  • 什么是静态嵌套类? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 静态内部类与非静态内部类 https stackoverflow com questions 1353309 java static vs non static inner class 什么
  • OS X 上的 Pthread 和 gcc 编译问题

    我有一个脚本可以在 Linux Ubuntu 11 04 上编译良好 但不能在 OS X Lion 上编译 gcc pthread o hw1 hw1 c hw1 c 22 error expected asm or attribute b
  • 线程 6,RECV TLSv1 警报:致命,握手失败

    这段代码有什么问题 它应该信任所有主机 但事实并非如此 例如 它可以在 google com 上正常运行 但不能在我的计算机上本地运行的 API 网关服务上运行 为什么 SSL 调试输出 触发 SecureRandom 的播种 完成播种 S
  • 通过 istringstream 进行 C++ 字符串标记化的性能开销

    我想知道性能开销是多少 string line word while std getline cin line istringstream istream line while istream gt gt word parse word h
  • Cordova/phonegap 跟踪应用程序通过 Facebook SDK 安装

    相关问题 如何在 Phonegap Cordova 项目中实施 Facebook 移动安装广告跟踪 https stackoverflow com questions 20305956 我有一个有效的 cordova phonegap 应用
  • 在groovy中动态执行代码

    我正在尝试在 groovy 中动态运行代码 我有someNode 0 这是变量中的值var1 然后我像这样添加双引号 var2 var1 然后我尝试运行这个 request abc var2 Value I saw here https s
  • 如何在 Swift 中返回 Array 的前 5 个对象?

    在 Swift 中 是否有一种巧妙的方法可以使用 Array 上的高阶方法来返回前 5 个对象 obj c 的做法是保存一个索引 然后通过数组循环递增索引 直到索引为 5 并返回新数组 有没有办法做到这一点filter map or red
  • 检查 URL 是否包含我已单击的链接的 href

    在列表中我有一些链接 ul class dropdowner li a href black Black a li li a href white White a li li a href blue Blue a li ul 我的另一个输出
  • 从 Joda 时间库迁移到 Java 时间(Java 8)

    我正在尝试从 Joda 时间库迁移到 Java 时间 Java 8 我无法找到相当于ISODateTimeFormat dateOptionalTimeParser in java time Joda ISO 格式化程序有很好的解析器 IS
  • Google 图表工具截断 y 轴标签

    与一个谷歌条形图 http code google com apis chart interactive docs gallery barchart html 这是我得到的 这是我的自定义选项 var options width 500 h
  • 当字符串列内容比已有内容长时,HDFStore.append(string, DataFrame) 失败

    我有一个通过 HDFStore 存储的 Pandas DataFrame 它本质上存储有关我正在执行的测试运行的摘要行 每行中的几个字段包含可变长度的描述性字符串 当我进行测试运行时 我创建一个新的 DataFrame 其中包含一行 def