Я очень новичок в Python, и я огляделся по интернету, но не смог найти ничего логичного, что могло бы помочь мне с моей проблемой.
У меня есть значения осадков на графике, и теперь мне нужно установить распределение GEV из этих значений на графике. Каждое значение равно максимальному значению года, начиная с 1974 по 2017 год (так что всего 43 значения).
Это значения:
max_precip = [9.4, 38.0, 12.5, 35.3, 17.6, 12.9, 12.4, 19.6, 15.0, 13.2, 12.3, 16.9, 16.9, 29.4, 13.6, 11.1, 8.0, 16.6, 12.0, 13.1, 9.1, 9.7, 21.0, 11.2, 14.4, 18.8, 14.0, 19.9, 12.4, 10.8, 21.6, 15.4, 17.4, 14.8, 22.7, 11.5, 10.5, 11.8, 12.4, 16.6, 11.7, 12.9, 17.8]
Я обнаружил, что мне нужно использовать gev.fit, поэтому я подумал использовать следующее:
t = np.linspace(1,43,43)
fit = gev.fit(max_precip,loc=3)
pdf = gev.pdf(t, *fit)
plt.plot(t,pdf)
plt.plot(t, max_precip, "o")
Но это только печатает точки max_precip в графе, а не в распределении GEV.
Кто-нибудь может мне помочь? Извините, если этот вопрос уже задан, я не смог найти ничего подобного.
Я использовал эти импортные товары:
import csv
import matplotlib.pyplot as plt
import numpy as np
from dateutil.rrule import rrule, YEARLY
import datetime
from matplotlib.dates import DateFormatter
from scipy.stats import genextreme as gev
from scipy.stats import genpareto as gpd
from scipy.optimize import minimize
Я попытался подогнать ваши данные
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import genextreme as gev
def main(rvs):
shape, loc, scale = gev.fit(rvs)
return shape, loc, scale
if __name__ == '__main__':
rvs = [9.4, 38.0, 12.5, 35.3, 17.6, 12.9, 12.4, 19.6, 15.0, 13.2, 12.3, 16.9, 16.9, 29.4, 13.6, 11.1, 8.0, 16.6, 12.0, 13.1, 9.1, 9.7, 21.0, 11.2, 14.4, 18.8, 14.0, 19.9, 12.4, 10.8, 21.6, 15.4, 17.4, 14.8, 22.7, 11.5, 10.5, 11.8, 12.4, 16.6, 11.7, 12.9, 17.8]
shape, loc, scale = main(rvs)
print(shape)
print(loc)
print(scale)
l = loc + scale / shape
xx = np.linspace(l+0.00001, l+0.00001+35, num=71)
yy = gev.pdf(xx, shape, loc, scale)
hist, bins = np.histogram(rvs, bins=12, range=(-0.5, 23.5), density=True)
plt.bar(bins[:-1], hist, width = 2, align='edge')
plt.plot(xx, yy, 'ro')
plt.show()
но я вернулся
-0.21989526255575445
12.749780017954315
3.449061347316184
для shape
, loc
и scale
. Если вы посмотрите на распределение GEV, как определено в scipy, когда форма отрицательная, допустимый интервал [loc + scale/shape... +infinity]. Я вычислил последнее значение и равен
-2.935417290135696
должно сработать...
Python3, Anaconda, scipy 1.1, Windows 10 64bit
ОБНОВИТЬ
Хорошо, я обновил код и добавил график, выглядит несколько разумным. Это то, что вы ищете? В принципе, трюк заключается в гистограмме и компоновке ячеек плотности, перекрывающихся с PDF
genextreme
, вы увидите, что параметры формы имеют противоположные знаки. Таким образом, поддержка подгонки, которую вы вычислили: (loc + scale / shape, + ∞) = (-2.9354, + ∞).