Спасибо за внимание к моему вопросу. Я создал скрипт с помощью 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-адрес из сценария, чтобы попытаться сделать его максимально чистым. Конечно, я был бы рад поделиться URL. Это Federalreserve.gov/monetarypolicy/fomccalendars.htm Наконец, соответствующие ссылки на этой веб-странице действительно содержат данные о дате/времени. Например, последняя релевантная для этого ссылка — Federalreserve.govmonetarypolicy/fomcprojtabl20190320.htm. Дата и время в этой ссылке — 20.03.2019.
Хьюберт, я добавил URL-адрес и ключ ссылки обратно в код по вашей рекомендации.
Я отредактировал код для вас. Теперь он получает дату из 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')
Можете ли вы поделиться URL с данными? Возможно, оттуда можно получить дату/время с помощью BeautifulSoap и добавить их вместе (url и дату) к прогнозам.