gpt4 book ai didi

python - 在 Matplotlib 散点图中突出显示数据间隙 (NaN)

转载 作者:行者123 更新时间:2023-12-04 08:00:49 27 4
gpt4 key购买 nike

我正在 matplotlib 中绘制来自 Pandas 的一些基于时间的数据(可以是数万行),我想突出显示数据中存在 NaN 的时期。我虽然实现这一点的方法是使用 axvspan 在有数据空白的地方开始和停止的绘图上绘制一个红色框。我确实考虑过每次使用 axvline 出现 NaN 时只画一条垂直线,但这可能会在绘图上创建数千个对象,并导致生成的 PNG 需要很长时间才能写入。所以我认为使用 axvspan 更合适。但是,我遇到的问题是找到 NaN 组的开始和停止索引。
下面的代码不是来自我的实际代码,只是一个基本的模型来展示我想要实现的目标。

import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import matplotlib.pyplot as plt

days = pd.date_range(datetime.now(), datetime.now() + timedelta(13), freq='D')
data = [2,2.3,3,np.nan, np.nan,4.7,3.4,3.1,2.7,np.nan,np.nan,np.nan,4,4.5]
df = pd.DataFrame({'idx': days, 'col': data})
df = df.set_index('idx')
print(df)

#Code to find the start index and stop index of the groups of NaNs
# resuls in list which contains lists of each gap start and stop datetime
gaps = []

plt.plot(df.index, df['col'])

for gap in gaps:
plt.axvspan(gap[0], gap[1], facecolor='r', alpha=0.5)

plt.show()
结果将类似于下面的模型:
enter image description here
其他可视化差距的建议也将不胜感激。例如使用某种填充物连接跨越间隙的数据的不同颜色的直线?

最佳答案

要找到 NaN 组的开始和停止索引,您可以首先创建一个变量来保存 bool 值,其中 colNaN .使用此变量,您可以找到在 valid 之间存在转换的行。和 NaN值。这可以使用 shift 来完成。 (在数据框上错位一行)和 ne ,这样您就可以比较两个连续的行并确定值交替的位置。之后,申请 cumsum 创建 valid 的连续数据的不同组和 NaN值。
现在,仅使用带有 NaN 的行值 ( df[is_nan] ) 使用 groupbyn_groups收集同一组内的差距。接下来,申请 aggregate 返回带有每个组的开始和结束时间戳的单个元组。 DateOffset的使用这里是将矩形显示扩展到所需图像输出后的相邻点。您现在可以使用 ['col'].values访问 aggregate 返回的数据帧并将其转换为列表。

...
...
df = df.set_index('idx')
print(df)

# Code to find the start index and stop index of the groups of NaNs
is_nan = df['col'].isna()
n_groups = is_nan.ne(is_nan.shift()).cumsum()
gap_list = df[is_nan].groupby(n_groups).aggregate(
lambda x: (
x.index[0] + pd.DateOffset(days=-1),
x.index[-1] + pd.DateOffset(days=+1)
)
)["col"].values

# resuls in list which contains tuples of each gap start and stop datetime
gaps = gap_list

plt.plot(df.index, df['col'], marker='o' )
plt.xticks(df.index, rotation=45)

for gap in gaps:
plt.axvspan(gap[0], gap[1], facecolor='r', alpha=0.5)

plt.grid()
plt.show()
plot_nan_gaps

关于python - 在 Matplotlib 散点图中突出显示数据间隙 (NaN),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66483363/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com