Как выполнить итерацию веб-скрипта над объектом ежедневного временного ряда, чтобы создать ежедневный временной ряд данных с веб-страницы

Спасибо за внимание к моему вопросу. Я создал скрипт с помощью BeautifulSoup и Pandas, который собирает данные о прогнозах с веб-сайта Федеральной резервной системы. Прогнозы выходят раз в квартал (~ 3 мес.). Я хотел бы написать сценарий, который создает ежедневные временные ряды и проверяет веб-сайт Федеральной резервной системы один раз в день, и если будет опубликован новый прогноз, сценарий добавит его во временные ряды. Если обновления не было, сценарий просто добавит к временному ряду последний действительный обновленный прогноз.

Из моих первоначальных копаний кажется, что есть внешние источники, которые я могу использовать для ежедневного «запуска» скрипта, но я бы предпочел, чтобы все было чисто на питоне.

Код, который я написал для очистки, выглядит так:

from bs4 import BeautifulSoup
import requests
import re
import wget
import pandas as pd 

# Starting url and the indicator (key) for links of interest
url = "https://www.federalreserve.gov/monetarypolicy/fomccalendars.htm" 
key = '/monetarypolicy/fomcprojtabl'

# Cook the soup
page = requests.get(url)
data = page.text
soup = BeautifulSoup(data)

# Create the tuple of links for projection pages
projections = []
for link in soup.find_all('a', href=re.compile(key)):
    projections.append(link["href"])

# Create a tuple to store the projections 
decfcasts = []
for i in projections:
    url = "https://www.federalreserve.gov{}".format(i)
    file = wget.download(url)
    df_list = pd.read_html(file)
    fcast = df_list[-1].iloc[:,0:2]
    fcast.columns = ['Target', 'Votes']
    fcast.fillna(0, inplace = True)
    decfcasts.append(fcast)

До сих пор код, который я написал, помещает все в кортеж, но для данных нет индекса времени/даты. Я думал о написании псевдокода, и я предполагаю, что он будет выглядеть примерно так

Create daily time series object
    for each day in time series:
        if day in time series = day in link:
            run webscraper
        other wise, append time series with last available observation

По крайней мере, это то, что я имею в виду. Окончательный временной ряд, вероятно, должен в конечном итоге выглядеть довольно «комковатым» в том смысле, что будет много дней с одним и тем же наблюдением, а затем, когда выйдет новый прогноз, будет «скачок», а затем еще много повторение до тех пор, пока не выйдет следующая проекция.

Очевидно, что любая помощь чрезвычайно ценится. Спасибо заранее, в любом случае!

Можете ли вы поделиться URL с данными? Возможно, оттуда можно получить дату/время с помощью BeautifulSoap и добавить их вместе (url и дату) к прогнозам.

Hubert Dudek 07.04.2019 00:44

Дорогой Хьюберт, спасибо, что заглянули. Я пропустил URL-адрес из сценария, чтобы попытаться сделать его максимально чистым. Конечно, я был бы рад поделиться URL. Это Federalreserve.gov/monetarypolicy/fomccalendars.htm Наконец, соответствующие ссылки на этой веб-странице действительно содержат данные о дате/времени. Например, последняя релевантная для этого ссылка — Federalreserve.govmonetarypolicy/fomcprojtabl20190320.htm. Дата и время в этой ссылке — 20.03.2019.

Chris L. 07.04.2019 07:39

Хьюберт, я добавил URL-адрес и ключ ссылки обратно в код по вашей рекомендации.

Chris L. 07.04.2019 08:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я отредактировал код для вас. Теперь он получает дату из URL-адреса. Дата сохраняется как период в фрейме данных. Только когда дата отсутствует в фрейме данных (восстановленном из рассола), она обрабатывается и добавляется.

from bs4 import BeautifulSoup
import requests
import re
import wget
import pandas as pd

# Starting url and the indicator (key) for links of interest
url = "https://www.federalreserve.gov/monetarypolicy/fomccalendars.htm"
key = '/monetarypolicy/fomcprojtabl'

# Cook the soup
page = requests.get(url)
data = page.text
soup = BeautifulSoup(data)

# Create the tuple of links for projection pages
projections = []
for link in soup.find_all('a', href=re.compile(key)):
    projections.append(link["href"])

# past results from pickle, when no pickle init empty dataframe
try:
    decfcasts = pd.read_pickle('decfcasts.pkl')
except FileNotFoundError:
    decfcasts = pd.DataFrame(columns=['target', 'votes', 'date'])


for i in projections:

    # parse date from url
    date = pd.Period(''.join(re.findall(r'\d+', i)), 'D')

    # process projection if it wasn't included in data from pickle
    if date not in decfcasts['date'].values:

        url = "https://www.federalreserve.gov{}".format(i)
        file = wget.download(url)
        df_list = pd.read_html(file)
        fcast = df_list[-1].iloc[:, 0:2]
        fcast.columns = ['target', 'votes']
        fcast.fillna(0, inplace=True)

        # set date time
        fcast.insert(2, 'date', date)
        decfcasts = decfcasts.append(fcast)

# save to pickle
pd.to_pickle(decfcasts, 'decfcasts.pkl')

Другие вопросы по теме