我有一个csv文件,其中有多个由Simulation(索引)条目分隔的Simulation。每个条目都有一条时间线和3条特征线。基本上,第一列仅包含模拟(索引)条目,而第二列则具有该模拟的“标题”(时间+功能1,n),然后只有数值。
我想将其包含在某些数据帧或某种numpy数组中,以便绘制每个模拟的图形,并且显然可以更好地控制数据。
作为对这类挑战比较陌生的人,我求助于pandas快速解决方案,但我也欢迎任何python(numpy /其他库)实现。
数据格式示例:
谢谢
答案 0 :(得分:1)
您的数据示例看起来像Excel,所以我尝试了一个Excel工作表,并使用了pandas的read_excel(CSV有类似的命令):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df0 = pd.read_excel('testdata.xlsx',header=None)
df0.head()
给予
0 1 2 3 4 5 6 7 8 9 10 11 12
0 sim1 time 1 2 3 4 5 6 7 8 9 10 11
1 NaN feat1 1 0 -1 0 1 0 -1 0 1 0 -1
2 NaN feat2 2 0 -2 0 2 0 -2 0 2 0 -2
3 NaN feat3 3 0 -3 0 3 0 -3 0 3 0 -3
4 sim2 time 1 2 3 4 5 6 7 8 9 10 11
您可以将1个模型的数据提取为pandas数据框或numpy数组:
def get_data_numpy(df,j):
i = j * (nFeats+1)
t = np.array(df.iloc[i,2:])
y0 = np.array(df.iloc[i+1,2:])
y1 = np.array(df.iloc[i+2,2:])
y2 = np.array(df.iloc[i+3,2:])
return t,y0,y1,y2
def get_data_pandas(df,j):
i = j * (nFeats+1)
t = np.array(df.iloc[i,2:])
dfy = df.iloc[i+1:i+nFeats+1,2:]
return t,dfy
nModels = 1 # run for 1 model
nFeats = 3
for jModel in range(nModels):
tn,y0,y1,y2 = get_data_numpy(df0,jModel)
tp,dfy = get_data_pandas(df0,jModel)
#--- graphics ---
plt.style.use('fast')
fig, ax0 = plt.subplots(figsize=(20,4))
plt.plot(tp,dfy.T, lw=4, alpha=0.4); # plot pandas dfy with 1 command
plt.plot(tn,-y0,lw=6,ls='--') # plot each numpy time series
plt.plot(tn,-y1,lw=6,ls=':')
plt.plot(tn,-y2,lw=6,ls='-')
plt.show()
fig.savefig('plot_model_1.png', transparency=True)
给予
在数据显示(df0.head()
)中,在图中仅显示第一个模型。为nModels
设置大于1的数字,就可以遍历所有模型。