【问题标题】:Grow a pandas panel along major_axis with a stream of new data?使用新数据流沿major_axis 扩展pandas 面板?
【发布时间】:2017-06-18 16:08:06
【问题描述】:

我的应用程序有一个表单的传入数据流

name, datetime, {x, y, z}

或者换句话说,我收到单行数据,列name, datetime, x, y, z。我每隔几分钟就会收到大量数据,其中一些是新的。

我想将此数据存储在熊猫Panel 中。这个存储面板的结构是这样的

panel.items       - [name_1,name_2,...,name_n]
panel.major_axis  - [datetime1,datetime2,...datetime_m]
panel.minor_axis  - [x, y, z]

出于效率原因,Panel 对象的大小似乎不是很可调整。但是,不可能知道datetimes major_axis 将包含什么。我什至有可能在之前的datetime 之间收到一个新的datetime

知道知道itemsminor_axis 将包含什么(尽管没有这个限制我会更快乐)。

我想根据需要增加这个存储面板。速度不是问题。向其他使用可转换为面板的其他容器类型开放。有什么建议吗?


想法

我正在尝试将数据临时存储到 dict-of-dict-of-dict 结构中,可能在每次突发后转换为 Panel,然后以某种方式将其与存储 Panel 结合起来。

old_panel = old_panel.set_value(item, major, minor, value) 似乎并没有像文档中那样工作,而且每次创建一个新面板似乎都非常激烈(因为旧面板可能很大)。

【问题讨论】:

    标签: python pandas time-series containers panel


    【解决方案1】:

    我会说现在废弃面板并使用带有 pd.Multi-Index 的数据框

    样本数据
    假设'x', 'y', 'z' 出现在一个元组中

    data = [
        ['a', pd.Timestamp('2016-03-31'), (1, 2, 3)],
        ['a', pd.Timestamp('2016-04-30'), (1, 2, 3)],
        ['a', pd.Timestamp('2016-07-31'), (1, 2, 3)],
        ['a', pd.Timestamp('2016-05-31'), (1, 2, 3)],
        ['b', pd.Timestamp('2016-03-31'), (1, 2, 3)],
        ['b', pd.Timestamp('2016-05-31'), (1, 2, 3)],
        ['b', pd.Timestamp('2016-08-31'), (1, 2, 3)],
    ]
    

    构建空数据框

    mux = pd.MultiIndex.from_product([list('abc'), list('xyz')])
    df = pd.DataFrame(columns=mux)
    

    迭代数据以模拟流数据

    for d in data:
        df.loc[d[1], pd.IndexSlice[d[0], list('xyz')]] = d[2]
    

    结果

    print(df)
    
                  a              b              c          
                  x    y    z    x    y    z    x    y    z
    2016-03-31    1    2    3    1    2    3  NaN  NaN  NaN
    2016-04-30    1    2    3  NaN  NaN  NaN  NaN  NaN  NaN
    2016-07-31    1    2    3  NaN  NaN  NaN  NaN  NaN  NaN
    2016-05-31    1    2    3    1    2    3  NaN  NaN  NaN
    2016-08-31  NaN  NaN  NaN    1    2    3  NaN  NaN  NaN
    

    你总是可以得到这样的面板

    df.stack().to_panel()
    
    <class 'pandas.core.panel.Panel'>
    Dimensions: 3 (items) x 5 (major_axis) x 3 (minor_axis)
    Items axis: a to c
    Major_axis axis: 2016-03-31 00:00:00 to 2016-08-31 00:00:00
    Minor_axis axis: x to z
    

    【讨论】:

    • 像魅力一样工作。我唯一无法开始工作的是,在现实生活中,我的列不是['x','y','z'],而是实际上my_col = ['high','low','close',....],并且使用您的代码我无法使用df.loc[d[1], pd.IndexSlice[d[0],my_col]] = d[2]',而不会抛出关于索引“完全lexsorted”的错误”。相反,我只是扔掉了“,my_col”部分,它工作得很好。
    • 对任何尝试遵循此方法的人的提示:确保在您的数据框上使用.sort_values() 您的mux.sort_values(axis=1),因为IndexSlice 仅适用于完全排序的轴。另外,请注意,以上述方式添加行将不管时间顺序将它们添加到底部,因此如果您需要对时间顺序索引进行排序,请致电.sort_values(axis=0, inplace=True)
    猜你喜欢
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多