Заполнить график под определенным значением y во временном ряду — Python и Matplotlib

Я создаю функцию, которая берет временные ряды для стоимости недвижимости, вычисляет прибыль по сравнению с инвестициями с отставанием в 2, 5 и 10 лет, а затем отображает эти прибыли. Мой временной ряд имеет дату и время в качестве индекса и только один столбец с именем «значение» со значениями, например:

временной ряд со временем в качестве индекса и одним столбцом со значением

Это моя функция:


def gain(ts):
    roi_2 = (ts - ts.shift(periods=24))/ts.shift(periods=24)*100
    roi_5 = (ts - ts.shift(periods=60))/ts.shift(periods=60)*100
    roi_10 = (ts - ts.shift(periods=120))/ts.shift(periods=120)*100
    plt.figure(figsize = (12,8))
    ax = plt.subplot(111)
    ax.spines["top"].set_visible(False)  
    ax.spines["right"].set_visible(False)
    ax.plot(roi_2, label='Return in 2 Years')
    ax.plot(roi_5, label='Return in 5 Years')
    ax.plot(roi_10, label='Return in 10 Years')
    ax.set_ylabel('Gain Percentage')
    ax.set_xlabel('Year')
    plt.yticks([-10,0,10,25,50,75,100,125,150,175,200], [str(x) + "%" for x in [-10,0,10,25,50,75,100,125,150,175,200]], fontsize=10)
    ax.grid(which='major', axis='y', linestyle= "--", lw=0.5, color="black", alpha=0.3)
    plt.title('Mean Zillow Home Value Index (ZHVI) - ROI Over Time Invested', fontsize=14)
    plt.legend()
    plt.show()
    return roi_2, roi_5, roi_10

Когда я называю это передачей моего временного ряда, я получаю следующее:

график с тремя линиями, показывающий рентабельность инвестиций в недвижимость

То, что я пытаюсь сделать, это как-то выделить момент, когда доход отрицательный - это убыток. Это будут любые значения под 0-й строкой на графике. Я пытался заполнить весь график при y = 0 или покрасить линии в другой цвет, когда они окажутся ниже 0, но все коды, которые я пробовал для этого, не работают. Я думаю, что моя основная трудность заключается в том, чтобы получить x и y для этих точек? Я не уверен, что я делаю неправильно, но я уверен, что это просто, я просто мало знаю о временных рядах и имею данные в качестве индекса, чтобы понять это.

Я считаю, что подойдет простой ax.fill_between(x, y1, 0), но я не могу использовать его в своей функции, потому что не могу понять, как установить для нее x и y1...


person Giovanna Fernandes    schedule 20.10.2019    source источник
comment
X - df.time. Затем вы сможете использовать fill_between   -  person Jody Klymak    schedule 20.10.2019
comment
df.time не работал, но df.index работал: ax.fill_between(roi_2.index, roi_2.value<0, -20, color='red', alpha=.2) единственная незначительная проблема заключается в том, что это заполняло весь график между 0 и -20, а не только область между сюжетными линиями и 0...   -  person Giovanna Fernandes    schedule 20.10.2019


Ответы (1)


Я полагаю, вы могли бы разделить каждую область интересов на группы больше >= 0 и ‹0:

def gain(ts):
    def split_roi(roi):
        return roi[roi.value >= 0], roi[roi.value <0]
    roi_2_gain, roi_2_loss = split_roi(roi_2)
    # rest of code here ...

И просто нарисуйте их отдельно

person adrianp    schedule 20.10.2019