Получить плавный график, заполнив пропущенные значения - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть несколько 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()

Результат выглядит следующим образом.Coverage over time

Однако кривая никогда не должна уменьшаться, так как значения "покрытия" также никогда не могут уменьшаться.Я подозреваю, что причиной этого является то, что в определенные моменты времени у меня есть записи только некоторых Фреймов Данных с более низкими значениями, и поэтому среднее значение / медиана также ниже.

Я попытался исправить это, выровняв индексывсех 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

Результат, однако, сильно меняется и уменьшается в определенные моменты времени.Это выглядит так:

Coverage over time with forward filling

Это неправильный подход или я просто что-то упустил?

...