#python #matplotlib
#питон #matplotlib
Вопрос:
У меня есть следующая проблема. Я хотел бы построить три коробочных графика из трех разных наборов данных. Мой код:
fig, (ax1, ax2, ax3) = plt.subplots(1, 3) fig.suptitle(f'Pocet requestu (podobne IP dohromady). 2021{koncovka}') ax1.boxplot(data_count_G["ip_count"]) ax1.set_xlabel(f"Google bot, n = {len(data_count_G)}") ax1.set_ylabel("requests from ip") ax2.boxplot(data_count_S["ip_count"]) ax2.set_xlabel(f"Seznam bot, n = {len(data_count_S)}") ax2.set_ylabel("requests from ip") ax3.boxplot(data_count_nGS["ip_count"]) ax3.set_xlabel(f"Bez Google bota, n = {len(data_count_nGS)}") ax3.set_ylabel("requests from ip") plt.tight_layout() plt.savefig('box_request_count_GSnG.png', bbox_inches='tight') plt.close()
Однако результаты выглядят следующим образом:
Когда я это сделаю data_count_nGS.info()
:
lt;class 'pandas.core.frame.DataFrame'gt; Int64Index: 92774 entries, 0 to 20899956 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 zacatek_ip 92773 non-null object 1 ip_count 92773 non-null float64 dtypes: float64(1), object(1) memory usage: 2.1 MB
Когда я это сделаю data_count_nGS.describe()
:
ip_count count 92773.000000 mean 209.073351 std 1430.188719 min 1.000000 25% 70.000000 50% 107.000000 75% 194.000000 max 253248.000000
Возможно ли, что проблема в размере последнего кадра данных (92774)? Как я могу это исправить, пожалуйста?
Комментарии:
1. Нет, такой размер не должен быть проблемой. Может быть, фрейм данных содержит строки или что-то в этом роде? Не могли бы вы добавить вывод
data_count_nGS.info()
иdata_count_nGS.describe()
?2. @JohanC смотрите мою правку, пожалуйста
3. @JohanC, это помогло, спасибо!
Ответ №1:
Вероятно, вам нужно удалить значения NaN. Как в ax3.boxplot(data_count_nGS["ip_count"].dropna())
. Вы также можете попробовать boxplot seaborn, который автоматически удаляет NaNs.
При максимальном удалении от 75 — го процентиля поле сократится до очень тонкой линии, так как некоторые выбросы будут находиться далеко. Возможно, вам захочется изменить ограничения на данные, чтобы лучше видеть основную схему.
Следующий пример кода пытается имитировать ситуацию:
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np df = pd.DataFrame({"ip_count": np.round(((np.random.rand(100_000) ** 3) 1) ** 19)}) df.iloc[-1, :] = np.nan fig, (ax1, ax2, ax3) = plt.subplots(ncols=3, figsize=(12, 5)) ax1.boxplot(df["ip_count"].dropna()) ax1.set_title('default ylim, full range') ax2.boxplot(df["ip_count"].dropna()) ax2.set_ylim(np.percentile(df["ip_count"].dropna(), [0, 80])) ax2.set_title('ylim from 0th to 80th percentile') sns.boxplot(y=df["ip_count"], ax=ax3) ax3.set_ylim(np.percentile(df["ip_count"].dropna(), [0, 80])) ax3.set_title('seaborn with ylimnfrom 0th to 80th percentile') plt.tight_layout() plt.show()