Получение и отображение экономических показателей с помощью Python и Plotly

Экономисты и финансовые аналитики часто используют экономические показатели для прогнозирования экономического цикла. Этот анализ очень важен перед принятием инвестиционных решений.

В этой статье мы собираемся автоматизировать извлечение данных экономических показателей с помощью Python. Все, что нам понадобится, это Python и Pandas. Проанализируем данные по Евросоюзу.

Экономические показатели - Категории

Во-первых, давайте начнем с теории. Есть три основные категории экономических показателей, которые я хотел бы представить в этом посте. запаздывающие индикаторы, совпадающие индикаторы и опережающие индикаторы.

  • Запаздывающие индикаторы - это индикаторы, которые изменяются после начала нового экономического цикла.
  • Совпадающие индикаторы меняются одновременно с пиками цикла.
  • Опережающие индикаторы действительно предвосхищают изменения, поскольку они происходят до изменения экономического цикла.

Эти показатели имеют разные меры и публикуются разными источниками, такими как OECD и Conference Board. Посмотрев на сайт Conference Board, мы легко можем найти несколько из этих экономических показателей для каждой из трех категорий:

В опережающих индикаторах мы находим среднее количество часов в неделю на производстве, разрешения на строительство, цены на акции и ведущий кредитный индекс среди прочего.

В рамках совпадающих показателей мы находим промышленное производство и производство, торговые продажи и т. Д.

Наконец, среди запаздывающих показателей мы находим среднюю продолжительность безработицы, коммерческие и промышленные ссуды, потребительские индекс цен на услуги и товарно-материальные запасы по отношению к продажам.

Вы можете найти определение для каждого из этих индикаторов на сайте Conference-Board.

Давайте представим несколько из них с помощью Python, чтобы проанализировать текущую экономическую ситуацию в Европейском Союзе. Все индикаторы извлекаются с помощью бесплатного API, доступного в DBnomics.

С помощью Python мы получим следующие экономические показатели: инфляция, процент, рост ВВП, уровень безработицы. , изменения розничной торговли и кривые доходности в евро за 10 лет. Хорошо, перейдем к кодированию!

Скрипт Python для получения экономических показателей

Первым делом нужно импортировать все необходимые библиотеки, которые мы будем использовать. А именно, Pandas, Json, Requests и Plotly.

Мы будем использовать Json и запросы для получения данных из API. Затем мы будем использовать Pandas для обработки данных. Наконец, Plotly для создания нашего графика.

import pandas as pd 
import requests 
import json 
import plotly.graph_objects as go

После того, как мы импортировали все необходимые библиотеки, мы можем перейти к извлечению экономических показателей. Поскольку мы будем извлекать более одного индикатора, мы создадим функцию, которую сможем повторно использовать для извлечения всех индикаторов. Я назвал функцию checkindicator:

def checkindicator(url):
    r= requests.get(url)
    r = r.json()
    periods = r['series']['docs'][0]['period']
    values = r['series']['docs'][0]['value']
    dataset = r['series']['docs'][0]['dataset_name']
    indicators = pd.DataFrame(values,index=periods)
    indicators.columns = [dataset]
    return indicators

Наша функция делает запрос к URL-адресу API, который возвращает экономические данные. URL извлекается из DBnomics. Просто заходим на сайт DBnomics, ищем индикатор, выбираем его и копируем ссылку API.

Затем мы передаем ссылку API в качестве аргумента нашей функции checkindicator, как показано ниже, чтобы получить выбранный индикатор для Европейского Союза. В нашем первом примере мы извлечем процентные ставки.

Поскольку наш ответ API возвращает большой объект json, мы анализируем его, чтобы извлечь периоды и значения, как показано в приведенном выше коде. Затем мы создаем фрейм данных Pandas, содержащий даты и значения процентных ставок.

interest = checkindicator('https://api.db.nomics.world/v22/series/Eurostat/ei_mfir_m/M.NSA.NAP.MF-LTGBY-RT.EU28?observations=1')

После запуска кода наша функция контрольный список вернет Pandas DataFrame, содержащий информацию о процентах за месяц. Что-то вроде ниже:

Теперь мы готовы извлечь все остальные индикаторы. Мы будем хранить их в переменных в виде фрейма данных Pandas. Теперь, когда у нас есть экономические показатели, мы можем перейти к их построению вместе.

euro_yields_10y = checkindicator('https://api.db.nomics.world/v22/series/Eurostat/irt_euryld_m/M.EA.INS_FWD.CGB_EA.Y10?observations=1')
unemployment = checkindicator('https://api.db.nomics.world/v22/series/Eurostat/une_rt_m/M.NSA.TOTAL.PC_ACT.T.EA19?observations=1')
interest = checkindicator('https://api.db.nomics.world/v22/series/Eurostat/ei_mfir_m/M.NSA.NAP.MF-LTGBY-RT.EU28?observations=1')
inflation = checkindicator('https://api.db.nomics.world/v22/series/WB/WDI/FP.CPI.TOTL.ZG-EU?observations=1')
GDPgrowth = checkindicator('https://api.db.nomics.world/v22/series/WB/WDI/NY.GDP.MKTP.KD.ZG-EU?observations=1')
monthly_change_retail_trade = checkindicator('https://api.db.nomics.world/v22/series/Eurostat/sts_trtu_m/M.TOVT.G47.CA.PCH_SM.EA19?observations=1')

Построение экономических показателей с помощью Python

Чтобы построить наши экономические индикаторы с помощью Python, мы будем использовать библиотеку под названием Plotly.

Прежде всего, нам нужно его импортировать. Затем нам нужно создать объект Fig, куда мы будем добавлять следы. В нашем случае след будет представлять собой экономический индикатор. Следовательно, у нас будет столько трасс, сколько индикаторов мы хотим включить в график.

Для простоты пока построим график процентной ставки ставки. В нашем объекте add_trace мы указываем x, который будет индексом нашего DataFrame (т.е. index представляет даты). В то время как y будет представлять наши значения (т. Е. Процентные ставки, связанные с каждой датой).

Затем мы используем рис. updated_layout, чтобы фигура выглядела лучше и включала ползунок даты и заголовок :

import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(
                x=interest.index,
                y=interest['Interest rates - monthly data'],
                name="interest",
                line_color='deepskyblue',
                opacity=0.8))
fig.update_layout(xaxis_range=['2003-07-01','2020-12-31'],
                  title_text="Interest Rates, Unemployment, 10y    yields, inflation UE, volume sales",xaxis_rangeslider_visible=True)
fig.show()

Если мы запустим наш код сейчас, мы получим следующую диаграмму, содержащую более 15 лет процентных ставок в Европейском Союзе:

Все идет нормально. Теперь давайте добавим к нашему графику Python все другие экономические показатели, такие как безработица, рост ВВП и т. Д.

Мы можем просто сделать это, добавив новые следы. См. Ниже код, чтобы построить вместе все наши макроэкономические индикаторы. Как упоминалось выше, каждая кривая представляет отдельный индикатор. Мы меняем имя и цвет для каждой из трасс:

fig = go.Figure()
fig.add_trace(go.Scatter(
                x=interest.index,
                y=interest['Interest rates - monthly data'],
                name="interest",
                line_color='deepskyblue',
                opacity=0.8))
fig.add_trace(go.Scatter(
                x=unemployment.index,
                y=unemployment['Unemployment by sex and age - monthly average'],
                name="unemployment",
                line_color='red',
                opacity=0.8))
fig.add_trace(go.Scatter(
                x=euro_yields_10y.index,
                y=euro_yields_10y['Euro yield curves - monthly data'],
                name="euro_yields_10y",
                line_color='green',
                opacity=0.8))
fig.add_trace(go.Scatter(
                x=inflation.index,
                y=inflation['World Development Indicators'],
                name="inflation",
                line_color='orange',
                opacity=0.8))
fig.add_trace(go.Scatter(
                x=GDPgrowth.index,
                y=GDPgrowth['World Development Indicators'],
                name="GDP growth",
                line_color='pink',
                opacity=0.8))
fig.add_trace(go.Scatter(
                x=monthly_change_retail_trade.index,
                y=monthly_change_retail_trade['Turnover and volume of sales in wholesale and retail trade - monthly data'],
                name="% Monthly Change Volume Sales",
                line_color='black',
                opacity=0.8))
fig.update_layout(xaxis_range=['2003-07-01','2020-12-31'],
                  title_text="Interest Rates, Unemployment, 10y yields, inflation UE, volume sales",xaxis_rangeslider_visible=True)
fig.show()

Отлично! Мы можем использовать ползунок под областью диаграммы для динамического изменения дат графика.

Подведение итогов

Мы создали скрипт для получения экономических показателей с помощью Python. Затем мы построили их вместе с помощью Plotly.

Вы можете изменить или добавить новые показатели в зависимости от области экономики, которую вы хотите анализировать. Аналогичный анализ можно провести для разных стран. Для этого поста мы выбрали Еврозону. Но вы можете легко изменить его, изменив параметры URL.

Для справки см. Ниже окончательный код для построения диаграммы, показывающей экономические индикаторы с помощью Python и Plotly.

Если у вас возникли проблемы с пониманием кода, у меня есть видео на Youtube, в котором код и API рассматриваются поэтапно:

import pandas as pd
import requests
import json
import plotly.graph_objects as go
def checkindicator(url):
    r= requests.get(url)
    r = r.json()
    periods = r['series']['docs'][0]['period']
    values = r['series']['docs'][0]['value']
    dataset = r['series']['docs'][0]['dataset_name']
    indicators = pd.DataFrame(values,index=periods)    
    indicators.columns = [dataset]
    return indicators   
    
euro_yields_10y = checkindicator('https://api.db.nomics.world/v22/series/Eurostat/irt_euryld_m/M.EA.INS_FWD.CGB_EA.Y10?observations=1')
unemployment = checkindicator('https://api.db.nomics.world/v22/series/Eurostat/une_rt_m/M.NSA.TOTAL.PC_ACT.T.EA19?observations=1')
interest = checkindicator('https://api.db.nomics.world/v22/series/Eurostat/ei_mfir_m/M.NSA.NAP.MF-LTGBY-RT.EU28?observations=1')
inflation = checkindicator('https://api.db.nomics.world/v22/series/WB/WDI/FP.CPI.TOTL.ZG-EU?observations=1')
#inflation.columns
GDPgrowth = checkindicator('https://api.db.nomics.world/v22/series/WB/WDI/NY.GDP.MKTP.KD.ZG-EU?observations=1')
monthly_change_retail_trade = checkindicator('https://api.db.nomics.world/v22/series/Eurostat/sts_trtu_m/M.TOVT.G47.CA.PCH_SM.EA19?observations=1')
monthly_change_retail_trade.columns
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(
                x=interest.index,
                y=interest['Interest rates - monthly data'],
                name="interest",
                line_color='deepskyblue',
                opacity=0.8))
fig.add_trace(go.Scatter(
                x=unemployment.index,
                y=unemployment['Unemployment by sex and age - monthly average'],
                name="unemployment",
                line_color='red',
                opacity=0.8))
fig.add_trace(go.Scatter(
                x=euro_yields_10y.index,
                y=euro_yields_10y['Euro yield curves - monthly data'],
                name="euro_yields_10y",
                line_color='green',
                opacity=0.8))
fig.add_trace(go.Scatter(
                x=inflation.index,
                y=inflation['World Development Indicators'],
                name="inflation",
                line_color='orange',
                opacity=0.8))
fig.add_trace(go.Scatter(
                x=GDPgrowth.index,
                y=GDPgrowth['World Development Indicators'],
                name="GDP growth",
                line_color='pink',
                opacity=0.8))
fig.add_trace(go.Scatter(
                x=monthly_change_retail_trade.index,
                y=monthly_change_retail_trade['Turnover and volume of sales in wholesale and retail trade - monthly data'],
                name="% Monthly Change Volume Sales",
                line_color='black',
                opacity=0.8))
# Use date string to set xaxis range
fig.update_layout(xaxis_range=['2003-07-01','2020-12-31'],
                  title_text="Interest Rates, Unemployment, 10y yields, inflation UE, volume sales",xaxis_rangeslider_visible=True)
fig.show()

Первоначально опубликовано на https://codingandfun.com 1 февраля 2020 г.