У меня есть несколько Dataframes (до 30), которые все содержат временные метки со связанными значениями.Временная метка в кадрах данных не обязательно перекрывается, и записанные значения могут только оставаться неизменными или увеличиваться.DataFrame может выглядеть следующим образом:
time coverage
0 0.000000 32.111748
1 0.875050 32.482579
2 1.850576 32.784133
3 3.693440 34.205134
...
Я загрузил пару файлов CSV с данными здесь 1 , 2 , 3 , 4 .
Итак, я пытаюсь построить график увеличения среднего и среднего значений охвата во времени для всех записей следующим образом:
# data is a list of dataframes
keys = ["Run " + str(i) for i in range(len(data))]
glued = pd.concat(data, keys=keys).reset_index(level=0).rename(columns={'level_0': 'Run'})
glued["roundtime"] = glued["time"] / 60
glued["roundtime"] = glued["roundtime"].round(0) # 1 significant digit
f, (ax1, ax2) = plt.subplots(2)
my_dpi = 96
stepsize = 5
start = 0
end = 60
ax1.set_title("Mean")
ax2.set_title("Median")
f.set_size_inches(1980 / my_dpi, 1080 / my_dpi)
ax1 = sns.lineplot(x="roundtime", y="coverage", ci="sd", estimator="mean", data=glued, ax=ax1)
ax1.set(xlabel="Time", ylabel="Coverage in percent")
ax1.xaxis.set_ticks(np.arange(start, end, stepsize))
ax1.set_xlim(0, 70)
ax2 = sns.lineplot(x="roundtime", y="coverage", ci="sd", estimator='median', data=glued, ax=ax2)
ax2.set(xlabel="Time", ylabel="Coverage in percent")
ax2.xaxis.set_ticks(np.arange(start, end, stepsize))
ax2.set_xlim(0, 70)
plt.show()
Результат выглядит следующим образом.
Однако кривая никогда не должна уменьшаться, так как значения "покрытия" также никогда не могут уменьшаться.Я подозреваю, что причиной этого является то, что в определенные моменты времени у меня есть записи только некоторых Фреймов Данных с более низкими значениями, и поэтому среднее значение / медиана также ниже.
Я попытался исправить это, выровняв индексывсех DataFrames и заполнение пропущенных значений с предыдущими записями, прежде чем делать любой из предыдущего кода.Например:
#create a common index
index = None
for df in data:
df.set_index("time", inplace=True, drop=False)
if index is not None:
index = index.union(df.index)
else:
index = df.index
# reindex all dataframes and fill missing values
new_data = []
for df in data:
print(df)
new_df = df.reindex(index, fill_value=np.NaN)
new_df = new_df.fillna(method="ffill")
new_data.append(new_df)
data = new_data
Результат, однако, сильно меняется и уменьшается в определенные моменты времени.Это выглядит так:
Это неправильный подход или я просто что-то упустил?