Python - Подгонка распределения GEV из этих значений - PullRequest
0 голосов
/ 22 сентября 2018

Я очень плохо знаком с 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

1 Ответ

0 голосов
/ 22 сентября 2018

Я пытался уместить ваши данные

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

UPDATE

Хорошо, я обновил код и добавил прорисовку, выглядит несколько разумно.Это то, что вы ищете?По сути, уловка заключается в том, чтобы гистограммировать его и построить графики плотности, перекрывающиеся с PDF

enter image description here

...