gpt4 book ai didi

python - 在 Pandas 图中标记内插的 NaN 点

转载 作者:太空狗 更新时间:2023-10-30 02:43:53 26 4
gpt4 key购买 nike

当我在 Pandas 中使用插值(或 fillna,或任何其他生成一些假数据的方法)时,我希望它显示在我的图中。理想情况下,我想为图中的这些点使用不同的标记。对于常规点,我想使用实心圆 ('o'),对于假数据,我想使用十字 ('x')。

当然,我想用一个漂亮的 Pythonic oneliner 来做到这一点。

更复杂的是,我想在 plot 函数中使用 subplots 选项一次绘制所有列。我希望不必使用 Matplotlib 巫术来操纵子图,尽管此时这是我能想到的唯一选择。

我使用的数据如下(放入文件“meterstanden.ssv”):

datum       tijd   gas[m^3]   electra1[kWh] electra2[kWh]  water[m^3]
2015-03-06 09:00 4000.318 10300 9000 300.0
2015-03-24 20:10 4020.220 - 10003 -
2015-08-02 11:15 4120.388 10500 11000 350.5

这是我用来处理它的脚本:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_table("meterstanden.ssv", delim_whitespace=True,
parse_dates=[[0, 1]], index_col=0, na_values=['-'])

df.interpolate(method='time').plot(subplots=True, layout=(2, 2),
figsize=(14, 10), marker='o')
plt.show()

我希望表中的 - 条目用交叉标记绘制。

最佳答案

我想不出 pythonic 的单行代码,但也许这行。 (对于散点图,您会有更多选择,例如使用 s kwarg,尽管我不确定它最终是否比这个解决方案更好。)

np.random.seed(123)
df=pd.DataFrame({ 'x':np.random.choice([1,2,np.nan],20),
'y':np.random.choice([3,4,np.nan],20) },
index=pd.date_range('2015-1-1',periods=20) )

我认为,无论采用何种确切方法,都需要设置两个数据框,这两个数据框在包含估算值方面有所不同。我会这样做。

mask=df.isnull()
df=df.interpolate(method='time')
imputed=df[mask]

那么这只是叠加两个线图的问题。一个是正​​常完成的,但第二个是没有线条的,只包括估算值。您不关心估算值的连接线,但您确实希望看到这些点,因此您给它们一个区分标记。我按照您的要求使用“o”而不是“x”,因为“o”显示得更清楚一些,但您当然可以更改它。

for c in df.columns:
plt.plot(df[c])
plt.plot(imputed[c],linestyle='',marker='o')
plt.show()

enter image description here

enter image description here

您还可以考虑使用线条颜色来传达有关图表的哪些部分基于估算值的信息。有多种方法可以做到这一点,这里是一种方法。

not_imp=df[~mask]

for c in df.columns:
plt.plot(df[c],color='r')
plt.plot(not_imp[c],color='b',marker='o')
plt.plot(imputed[c],color='r',marker='d',linestyle='')
plt.show()

所以这里发生的事情是蓝色(圆圈)标记表示真实(而非推算)值,蓝线连接真实值和真实值。红色(菱形)标记表示估算值,红线将估算值连接到其他估算值或实际值。

enter image description here

enter image description here

关于python - 在 Pandas 图中标记内插的 NaN 点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31774663/

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