我刚开始学习pandas,并尝试学习如何处理我的多维数据。
我的数据是一个包含 ['A', 'B', 'C', 'D', 'E', 'F', 'G'] 列的大型CSV文件。这些数据描述了一些模拟结果,其中 ['A', 'B', ..., 'F'] 是模拟参数,而 'G' 是其中的一个输出(在此示例中仅存在一个输出!)。
编辑/更新:如评论中所建议的 Boud,让我们生成一些与我的数据兼容的数据:
由于参数 ['A','B',...,'F'] 是作为笛卡尔积(即嵌套的for循环;先验)生成的,我希望在分析输出之前使用groupby获取每个可能的“模拟场景”。
参数“F”描述了每个场景的多次运行(每个场景由“A”,“B”,...,“E”定义;假设“F”是随机种子),因此我的代码变成了:
我的数据是一个包含 ['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
由于参数 ['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
现在我想做什么?
I: 显示这些组中每个场景参数的所有(唯一)值 -> grouped_agg给我一个元组的可迭代对象,例如每个位置0处的所有条目都为“ A”的所有值(因此使用几行python代码即可获得唯一值,但可能有一个函数可以做到这一点)
- 更新:我的方法
list(set(grouped_agg.index.get_level_values('A')))
(对于“ A”感兴趣时;使用set获取唯一值;如果需要高性能,则可能不是您想要执行的操作)- =>
[0, 1, 2, 3, 6]
II: 生成一些低维度的图表 -> 在绘制之前需要使一些变量恒定并过滤/选择数据(因此需要步骤I)=>
- 'B' 恒定
- 'C' 恒定
- 'E' 恒定
- 'D' = x轴
- 'G' = y轴/聚合输出
- 'A' = 多个颜色的另一个维度= 2d-plot中的每个'A'值有一个G/y轴
如何生成这样的图表?
我认为,重塑我的数据是关键步骤,然后pandas绘图功能将处理它。也许实现一种形状,其中有5列(每个参数A的一个),并且对于每个索引选择+ param-A选择的相应G值就足够了,但我还没有达到那种形式。
感谢您的帮助!
(我正在使用enthought canopy中的pandas 0.12)
Sascha
DataFrame
的二维性质固有的。也许你最好只是将数据存储在numpy数组中。 - user2379410