Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过填充缺少的值获得平滑的线图_Python_Pandas_Seaborn_Line Plot - Fatal编程技术网

Python 通过填充缺少的值获得平滑的线图

Python 通过填充缺少的值获得平滑的线图,python,pandas,seaborn,line-plot,Python,Pandas,Seaborn,Line Plot,我有多个数据帧(最多30个),它们都包含带有关联值的时间戳。数据帧中的时间戳不一定重叠,记录的值只能保持不变或增加。数据帧可能如下所示: time coverage 0 0.000000 32.111748 1 0.875050 32.482579 2 1.850576 32.784133 3 3.693440 34.205134 ... 我上传了两个csv文件,其中包含数据 所以我要

我有多个数据帧(最多30个),它们都包含带有关联值的时间戳。数据帧中的时间戳不一定重叠,记录的值只能保持不变或增加。数据帧可能如下所示:

            time   coverage  
0       0.000000  32.111748   
1       0.875050  32.482579   
2       1.850576  32.784133    
3       3.693440  34.205134 
...
我上传了两个csv文件,其中包含数据

所以我要做的是绘制所有记录的平均和中值覆盖值随时间的增加,如下所示:

# 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()
结果是这样的。

但是,曲线不应减小,因为“覆盖率”值也不能减小。我怀疑,这是因为在某些时间点,我只记录了一些数据帧的较低值,因此平均值/中值也较低

在执行之前的任何代码之前,我试图通过对齐所有数据帧的索引并用以前的记录填充缺少的值来修复此问题。像这样:

#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
然而,结果确实发生了很大变化,并在某些时候有所下降。看起来是这样的:


这种方法是错误的还是我只是遗漏了什么?

你说“用以前的记录填充缺失的值”,但你不是只是用
nan
s来代替吗?好吧,我首先用
nan
填充它们,然后想用合理的值覆盖它们,这样我就可以计算平均值/中值。我认为在当前时间戳之前或之后获取值是有意义的。在将值替换为NaN后,列上的
.interpolate()
函数是否是您要查找的函数?我将尝试:-)。然而,我不明白为什么即使填充了数据,直线图中也会出现下降,因为平均值应该保持不变。你说“用以前的记录填充缺失的值”,但你不只是用
nan
s来填充吗,我首先用
NaN
填充它们,然后用合理的值覆盖它们,以便计算平均值/中值。我认为在当前时间戳之前或之后获取值是有意义的。在将值替换为NaN后,列上的
.interpolate()
函数是否是您要查找的函数?我将尝试:-)。然而,我不明白为什么即使有填充的数据,线形图中也会出现下降,因为平均值应该保持不变。