优雅地将数据添加到正在运行的模拟中的pandas.Panel

时间:2017-04-27 08:45:21

标签: python pandas panel

声明

这是来自here的后续问题,其中我有一个pandas.Panel,其中有几个项目由pandas.DataFrames组成。我想在一个命令中的每个项目的DataFramePanel中的minor_axis)中绘制某个列,避免像代码群一样 plt.plot(x, DataFrame1[y1]) plt.plot(x, DataFrame2[y1]) ... 它作为一个答案,我可以在Panel中切换我的轴,以便不是一个项目包含一个数据集的所有信息(具有某个起始参数的模拟),而只是一个信息(例如yvalue y1)对于所有不同的模拟,将其他参数存储在其他项目中(DataFrames)。

我的基本模拟代码

即使我的代码是模拟钟摆的行为,我也会将其分解为具有返回值y1-y3而不是真实物理参数的通用模拟代码。该模拟将针对2个不同的起始参数k进行。

import pandas as pd

data = pd.Panel(major_axis=[], minor_axis=['x', 'sim1', 'sim2'])

# some kind of simulation resulting in 3 simulated values and with a
# starting parameter for different simulation "strengths"
# not sure whether to use a list or dict here
ks = {'sim1' = 0.5, 'sim2' = 1.0}
for k in ks:
    x, y1, y2, y3 = 0, 0, 0, 0
    while x<100:
        x += 1
        y1 += 1*ks[k]*x
        y2 += 2*ks[k]*x
        y3 += 3*ks[k]*x
        ...

# for example the y2 value for the different k values should be plottable like this 
data['y2'].plot()

问题

现在我的问题是如何优雅地(尽可能少的代码行)将每个模拟的每个值添加/附加到data,考虑到每个模拟可能有5个或更多个模拟具有10个或更多值步骤

E.g。在我的问题mentioned before中,我创建了一个新的DataFrame并将其附加到我现有的数据集中以进行给定的模拟 - 类似于data.append(pd.DataFrame([[x, y1, y2, y3]], columns=['x', 'y1', 'y2', 'y3']))。但是从那里我无法使用单个命令正确绘图,而是必须手动为每个模拟添加新图形。

如果有人可以帮助我了解如何在跑步中建立Panel这样的话,我会很高兴 - 从我之前的问题我已经知道如何策划一个:)

<小时/> 更新我被问到一些示例数据,但由于我想连续将我的模拟值添加到Panel / item而不是先生成列表,我只能显示数据在结束。小组一开始应该是这样的:

In [1]: print(data)
Out[1]:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 0 (major_axis) x 3 (minor_axis)
Items axis: y1 to y2
Major_axis axis: None
Minor_axis axis: x to sim2

下面显示了模拟的工作原理以及例如y1-item最终应该如何显示

In [2]: ks = {'sim1' : 0.5, 'sim2' : 1.0}
Out[2]: {'sim1': 0.5, 'sim2': 1.0}

In [3]:
for k in ks:
    x, y1, y2 = 0, 0, 0

    while x<3:
        x += 1
        y1 += 1*ks[k]*x
        y2 += 2*ks[k]*x
        # HERE is missing what I'm looking for
        # it should append e.g. the y1 value to data['y1'] for both k
Out[3]: ...

In [4]: print(data['y1'])
Out[4]:         
     x    sim1    sim2
0    1    0.5     1.0
1    2    1.5     3.0
2    3    3.0     6.0

我希望通过这个我现在更清楚我正在寻找 - 如果不让我知道

1 个答案:

答案 0 :(得分:2)

我认为构建Pandas.Panel的简单方法是构建以下形式的字典:

d = {
    'items_axis_element0': DataFrame0,
    'items_axis_element1': DataFrame1,
    'items_axis_element2': DataFrame2,
    ...
}

现在您可以轻松构建一个Panel:

p = pd.Panel(d)

您可以在Pandas Cookbook

中找到一些有用的示例

更新:这是Pandas Cookbook的略微修改示例:

rng = pd.date_range('1/1/2013',periods=100,freq='D')
data = np.random.randn(100, 4)
cols = ['A','B','C','D']
df1, df2, df3 = pd.DataFrame(data, rng, cols), pd.DataFrame(data, rng, cols), pd.DataFrame(data, rng, cols)

pf = pd.Panel({'df1':df1,'df2':df2})

In [21]: pf
Out[21]:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 100 (major_axis) x 4 (minor_axis)
Items axis: df1 to df2
Major_axis axis: 2013-01-01 00:00:00 to 2013-04-10 00:00:00
Minor_axis axis: A to D

现在我们可以添加df3,如下所示:

In [22]: pf.join(pd.Panel({'df3':df3}))
Out[22]:
<class 'pandas.core.panel.Panel'>
Dimensions: 3 (items) x 100 (major_axis) x 4 (minor_axis)
Items axis: df1 to df3
Major_axis axis: 2013-01-01 00:00:00 to 2013-04-10 00:00:00
Minor_axis axis: A to D