gpt4 book ai didi

python - 在箱线图中标记异常值 - Python

转载 作者:行者123 更新时间:2023-12-04 02:36:10 27 4
gpt4 key购买 nike

我正在分析极端天气事件。我的数据框称为 df ,如下所示:

|    Date    |      Qm      |
|------------|--------------|
| 1993-01-01 | 4881.977061 |
| 1993-02-01 | 4024.396839 |
| 1993-03-01 | 3833.664650 |
| 1993-04-01 | 4981.192526 |
| 1993-05-01 | 6286.879798 |
| 1993-06-01 | 6939.726070 |
| 1993-07-01 | 6492.936065 |
| ... | ... |

我想知道极端事件是否与测量的异常值发生在同一年。因此,我使用 seaborn 绘制了箱线图:
# Qm boxplot analysis

boxplot = sns.boxplot(x=df.index.month,y=df['Qm'])
plt.show()

Boxplot obtained

现在,我想在同一个数字中显示与异常值相对应的年份。因此,用日期标记它们。

我已经检查了多个包含箱线图的库,但没有关于如何标记它们的线索。

PD:我在这个例子中使用了 seaborn,但任何可以提供帮助的库都将受到高度赞赏

谢谢!

最佳答案

您可以遍历数据帧并将每个值与异常值的限制进行比较。默认这些限制是 1.5 times IQR超过低四分位数和高四分位数。对于该范围之外的每个值,您可以绘制它旁边的年份。如果您想显示更多或更少的年份,请随意修改此定义。

下面是一些代码来说明这个想法。在代码中,年份的最后两位数字显示在离群值的位置旁边。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns

Y = 26
df = pd.DataFrame({'Date': pd.date_range('1993-01-01', periods=12 * Y, freq='M'),
'Qm': np.random.normal(np.tile(5000 + 1000 * np.sin(np.linspace(0, 2 * np.pi, 12)), Y), 1000)})
df.set_index('Date', inplace=True)
boxplot = sns.boxplot(x=df.index.month, y=df['Qm'])
month_q1 = df.groupby(df.index.month).quantile(0.25)['Qm'].to_numpy()
month_q3 = df.groupby(df.index.month).quantile(0.75)['Qm'].to_numpy()
outlier_top_lim = month_q3 + 1.5 * (month_q3 - month_q1)
outlier_bottom_lim = month_q1 - 1.5 * (month_q3 - month_q1)

for row in df.itertuples():
month = row[0].month - 1
val = row.Qm
if val > outlier_top_lim[month] or val < outlier_bottom_lim[month]:
plt.text(month, val, f' {row[0].year % 100:02d}', ha='left', va='center')
plt.xlabel('Month')
plt.tight_layout()
plt.show()

sample plot

关于python - 在箱线图中标记异常值 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61734304/

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