Заполните график под определенным значением y во временном ряду - Python и Matplotlib - PullRequest
0 голосов
/ 20 октября 2019

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

time series with time as index and one column with value

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


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

Когда я называю это прохождением моего временного ряда, я получаю это:

graph with three lines showing return on investment in real estate

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

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

1 Ответ

0 голосов
/ 20 октября 2019

Полагаю, вы могли бы разбить каждый рои на группы с большими> = 0 и <0: </p>

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 ...

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

...