python - 如何存储 pandas Panel 实例?

标签 python pandas

有很多情况我需要将一个小型的 pandas Panel 实例输出到磁盘以供以后使用。目前,我将其存储为 pickle 对象,因为 pandas.read_pickle 可以直接将其检索为 Panel 对象。但这样做有两个陷阱:首先,我必须始终在文件名中注明这是Panel对象,否则我可能会忘记。第二,这对 future 有没有风险?例如,pandas 的 future 版本可能不支持这一点,我可能会失去作为直接面板访问数据的权限?还有哪些其他替代方法可以安全地存储面板对象,同时仍然可以轻松地直接将其作为面板再次读取?我也可以将面板写入 Excel 格式,但我必须一一读取成员 Dataframe,并在获取数据时将它们再次组合到面板中。

最佳答案

您可以使用HDF作为存储。

演示:

让我们生成一个包含财务数据的面板:

import pandas as pd
import pandas_datareader.data as wb

stocks = ['AAPL', 'GOOG', 'FB']
p = wb.DataReader(stocks, 'yahoo', '2016-01-01')

现在我们有以下面板:

In [10]: p.axes
Out[10]:
[Index(['Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close'], dtype='object'),
 DatetimeIndex(['2016-01-04', '2016-01-05', '2016-01-06', '2016-01-07', '2016-01-08', '2016-01-11', '2016-01-12', '2016-01-13', '2016-01-14',
                '2016-01-15',
                ...
                '2017-02-02', '2017-02-03', '2017-02-06', '2017-02-07', '2017-02-08', '2017-02-09', '2017-02-10', '2017-02-13', '2017-02-14',
                '2017-02-15'],
               dtype='datetime64[ns]', name='Date', length=283, freq=None),
 Index(['AAPL', 'FB', 'GOOG'], dtype='object')]

保存到HDF5文件:

In [12]: p.to_hdf('c:/temp/panel.h5', 'p', format='t')

检查:

In [13]: store = pd.HDFStore('c:/temp/panel.h5')

In [14]: store
Out[14]:
<class 'pandas.io.pytables.HDFStore'>
File path: c:/temp/panel.h5
/p            wide_table   (typ->appendable,nrows->849,ncols->6,indexers->[major_axis,minor_axis])

In [15]: store.get_storer('p')
Out[15]: wide_table   (typ->appendable,nrows->849,ncols->6,indexers->[major_axis,minor_axis])

In [16]: store.get_storer('p').table
Out[16]:
/p/table (Table(849,)) ''
  description := {
  "major_axis": Int64Col(shape=(), dflt=0, pos=0),
  "minor_axis": StringCol(itemsize=4, shape=(), dflt=b'', pos=1),
  "values_block_0": Float64Col(shape=(6,), dflt=0.0, pos=2)}
  byteorder := 'little'
  chunkshape := (1092,)
  autoindex := True
  colindexes := {
    "major_axis": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "minor_axis": Index(6, medium, shuffle, zlib(1)).is_csi=False}

In [17]: x = store['p']

In [18]: x
Out[18]:
<class 'pandas.core.panel.Panel'>
Dimensions: 6 (items) x 283 (major_axis) x 3 (minor_axis)
Items axis: Open to Adj Close
Major_axis axis: 2016-01-04 00:00:00 to 2017-02-15 00:00:00
Minor_axis axis: AAPL to GOOG

In [20]: x.loc[:,:,'GOOG']
Out[20]:
                  Open        High         Low       Close     Volume   Adj Close
2016-01-04  743.000000  744.059998  731.257996  741.840027  3272800.0  741.840027
2016-01-05  746.450012  752.000000  738.640015  742.580017  1950700.0  742.580017
2016-01-06  730.000000  747.179993  728.919983  743.619995  1947000.0  743.619995
2016-01-07  730.309998  738.500000  719.059998  726.390015  2963700.0  726.390015
2016-01-08  731.450012  733.229980  713.000000  714.469971  2450900.0  714.469971
2016-01-11  716.609985  718.854980  703.539978  716.030029  2090600.0  716.030029
2016-01-12  721.679993  728.750000  717.317017  726.070007  2024500.0  726.070007
2016-01-13  730.849976  734.739990  698.609985  700.559998  2501700.0  700.559998
2016-01-14  705.380005  721.924988  689.099976  714.719971  2225800.0  714.719971
2016-01-15  692.289978  706.739990  685.369995  694.450012  3592400.0  694.450012

...

关于python - 如何存储 pandas Panel 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42274687/

相关文章:

python - 如何使用 Python 清理 Excel 文件中的文本?

python - Django 无效 block 标记 : 'static'

python-3.x - 无法解析 pandas 系列到日期时间

python - 在 Pandas DataFrame Python 中添加新列

python - 使用 Matplotlib 更改图形中的颜色以绘制 Pandas 数据框

python - pandas 按 block 分组

python - 如何使用 matlab.engine 在 Matlab 和 python 之间传递变量

python pandas滚动窗口并重新创建数据框

Python tkFileDialog.asksaveasfile - 获取文件路径

python - Pandas 时间序列分析 - 总结数据帧中的状态变化/删除冗余日期