python pandas初学者:多维数据分析工作流程(groupby + agg + plot)

sas*_*cha 7 python data-analysis pandas

我是熊猫的新手,并尝试学习如何处理我的多维数据.

我的数据

我们假设,我的数据是列['A','B','C','D','E','F','G']的大CSV.该数据描述了一些模拟结果,其中['A','B',...,'F']是模拟参数,'G'是输出之一(本例中只有现有输出!).

编辑/更新: 正如Boud在评论中建议的那样,让我们​​生成一些与我的数据兼容的数据:

import pandas as pd
import itertools
import numpy as np

npData = np.zeros(5000, dtype=[('A','i4'),('B','f4'),('C','i4'), ('D', 'i4'), ('E', 'f4'), ('F', 'i4'), ('G', 'f4')])

A = [0,1,2,3,6] # param A: int
B = [1000.0, 10.000] # param B: float
C = [100,150,200,250,300] # param C: int
D = [10,15,20,25,30] # param D: int
E = [0.1, 0.3] # param E: float
F = [0,1,2,3,4,5,6,7,8,9] # param F = random-seed = int -> 10 runs per scenario

# some beta-distribution parameters for randomizing the results in column "G"
aDistParams = [ (6,1),
                (5,2),
                (4,3),
                (3,4),
                (2,5),
                (1,6),
                (1,7) ]

counter = 0
for i in itertools.product(A,B,C,D,E,F):
    npData[counter]['A'] = i[0]
    npData[counter]['B'] = i[1]
    npData[counter]['C'] = i[2]
    npData[counter]['D'] = i[3]
    npData[counter]['E'] = i[4]
    npData[counter]['F'] = i[5]

    np.random.seed = i[5]
    npData[counter]['G'] = np.random.beta(a=aDistParams[i[0]][0], b=aDistParams[i[0]][1])
    counter += 1

data = pd.DataFrame(npData)
data = data.reindex(np.random.permutation(data.index)) # shuffle rows because my original data doesn't give any guarantees
Run Code Online (Sandbox Code Playgroud)

因为参数['A','B',...,'F']是作为笛卡尔积生成的(意思是:嵌套for循环;先验),我想使用groupby来获得每个可能的'模拟场景'在分析输出之前.

参数'F'描述了每个场景的多次运行(每个场景由'A','B',......,'E'定义;让我们假设,'F'是随机种子),所以我的代码变为:

grouped = data.groupby(['A','B','C','D','E'])
# -> every group defines one simulation scenario

grouped_agg = grouped.agg(({'G' : np.mean}))
# -> the mean of the simulation output in 'G' over 'F' is calculated for each group/scenario
Run Code Online (Sandbox Code Playgroud)

我现在想做什么?

  • I:显示这些组中每个场景参数的所有(唯一)值 - > grouped_agg给我一个可迭代的元组,例如,每个位置0的所有条目都给出了'A'的所有值(所以有一个几行python我会得到我的独特价值,但也许有一个功能)

    • 更新:我的方法
    • list(set(grouped_agg.index.get_level_values('A'))) (当对'A'感兴趣时;使用set来获取唯一值;如果你需要高性能,可能不是你想要做的事情)
    • => [0, 1, 2, 3, 6]
  • II:生成一些图(较低维度) - >我需要使一些变量保持不变并在绘图之前过滤/选择我的数据(因此我需要的步骤)=>

    • 'B'const
    • 'C',const
    • 'E'const
    • 'D'= x轴
    • 'G'=我的聚合的y轴/输出
    • 'A'=一个维度= 2d-plot内的多个颜色 - >'A'的每个值的一个G/y轴

    我如何生成这样的情节?

    我认为,重塑我的数据是关键步骤,大熊猫绘图功能将处理它.也许实现一个形状,其中有5列(参数A的每个值一个)和每个索引选择+ param-A选择的相应G值就足够了,但我还没有能够实现那种形式.

感谢您的输入!

(我在enthought冠层内使用熊猫0.12)

萨沙

Dan*_*lan 2

I:如果我理解你的例子和期望的输出,我不明白为什么分组是必要的。

data.A.unique()
Run Code Online (Sandbox Code Playgroud)

二:更新了……

我将实现您上面所描绘的示例。假设我们对随机种子(“F”)求“G”的平均值,如下所示:

data = data.groupby(['A','B','C','D','E']).agg(({'G' : np.mean})).reset_index()
Run Code Online (Sandbox Code Playgroud)

首先选择 B、C 和 E 具有您指定的一些常量值的行。

df1 = data[(data['B'] == const1) & (data['C'] == const2) & (data['E'] == const3)]
Run Code Online (Sandbox Code Playgroud)

现在我们想要将“G”绘制为“D”的函数,并为“A”的每个值使用不同的颜色。

df1.set_index('D').groupby('A')['G'].plot(legend=True)
Run Code Online (Sandbox Code Playgroud)

我在一些虚拟数据上测试了上面的内容,它的工作原理正如你所描述的那样。与每个“A”相对应的“G”范围在同一轴上以不同的颜色绘制。

III:我不知道如何回答这个广泛的问题。

IV:不,我认为这对你来说不是问题。

我建议使用更简单的小数据集并更加熟悉 pandas。