Запуск вычислений по расписанию в DataSphere
Организовать сценарии регулярных запусков в Yandex DataSphere
В этом практическом руководстве вы соберете информацию о наиболее обсуждаемых на Reddit
Сбор и анализ информации об акциях выполняется в DataSphere, регулярное исполнение ячеек запускается по таймеру, созданному в Cloud Functions.
Чтобы настроить регулярный запуск Jupyter Notebook:
- Подготовьте инфраструктуру.
- Создайте ноутбук.
- Загрузите и обработайте данные.
- Создайте Cloud Functions.
- Создайте таймер.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Перед началом работы нужно зарегистрироваться в Yandex Cloud, настроить сообщество и привязать к нему платежный аккаунт:
- На главной странице DataSphere
нажмите Попробовать бесплатно и выберите аккаунт для входа — Яндекс ID или рабочий аккаунт в федерации (SSO). - Выберите организацию Yandex Cloud Organization, в которой вы будете работать в Yandex Cloud.
- Создайте сообщество.
- Привяжите платежный аккаунт к сообществу DataSphere, в котором вы будете работать. Убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его в интерфейсе DataSphere.
Необходимые платные ресурсы
В стоимость реализации регулярных запусков входят:
- плата за использование вычислительных ресурсов DataSphere;
- плата за количество вызовов функции Cloud Functions.
Подготовьте инфраструктуру
Войдите в консоль управления
Если у вас есть активный платежный аккаунт, на странице облака
Примечание
Если вы работаете с Yandex Cloud через федерацию удостоверений, вам может быть недоступна платежная информация. В этом случае обратитесь к администратору вашей организации в Yandex Cloud.
Создайте каталог
- В консоли управления
выберите облако и нажмите кнопку Создать каталог. - Введите имя каталога, например
data-folder
. - Нажмите кнопку Создать.
Создайте сервисный аккаунт для проекта DataSphere
Для доступа к проекту DataSphere из функции Cloud Functions вам понадобится сервисный аккаунт с ролями datasphere.community-projects.editor
и functions.functionInvoker
.
- Перейдите в каталог
data-folder
. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта, например
reddit-user
. - Нажмите Добавить роль и назначьте сервисному аккаунту роли
datasphere.community-projects.editor
иfunctions.functionInvoker
. - Нажмите кнопку Создать.
Добавьте сервисный аккаунт в проект
Чтобы сервисный аккаунт мог запускать проект DataSphere, добавьте его в список участников проекта.
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - На вкладке Участники нажмите Добавить участника.
- Выберите аккаунт
reddit-user
и нажмите Добавить.
Настройте проект
Чтобы сократить расходы на использование сервиса DataSphere, настройте время, через которое освобождается закрепленная за проектом ВМ.
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - Перейдите на вкладку Настройки.
- В блоке Общие настройки нажмите кнопку
Редактировать - Для настройки Остановить простаивающую ВМ через выберите
Другое
и укажите 5 минут. - Нажмите кнопку Сохранить.
Создайте ноутбук
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - Нажмите кнопку Открыть проект в JupyterLab и дождитесь окончания загрузки.
- На верхней панели нажмите File и выберите New → Notebook.
- Выберите ядро и нажмите Select.
- Нажмите правой кнопкой мыши на ноутбук и выберите Rename. Введите название
test_classifier.ipynb
.
Загрузите и обработайте данные
Чтобы загрузить информацию о наиболее обсуждаемых акциях на Reddit и тональности обсуждения, скопируйте код в ячейки ноутбука test_classifier.ipynb
. С его помощью вы будете выбирать три наиболее обсуждаемые акции и сохранять их в CSV-файл в хранилище проекта.
-
Откройте проект DataSphere:
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - Нажмите кнопку Открыть проект в JupyterLab и дождитесь окончания загрузки.
- Откройте вкладку с ноутбуком.
-
-
Импортируйте библиотеки:
import pandas as pd import requests import os.path
-
Инициализируйте переменные:
REQUEST_URL = "https://tradestie.com/api/v1/apps/reddit" FILE_NAME = "/home/jupyter/datasphere/project/stock_sentiments_data.csv" TICKERS = ['NVDA', 'TSLA', 'AAPL']
-
Создайте функцию, которая отправляет запрос к API tradestie и возвращает результат в виде
pandas.DataFrame
:def load_data(): response = requests.get(REQUEST_URL) stocks = pd.DataFrame(response.json()) stocks = stocks[stocks['ticker'].isin(TICKERS)] stocks.drop('sentiment', inplace=True, axis=1) return stocks
-
Задайте условие, определяющее файл для записи сведений об акциях:
if os.path.isfile(FILE_NAME): stocks = pd.read_csv(FILE_NAME) else: stocks = load_data() stocks['count'] = 1 stocks.to_csv(FILE_NAME, index=False)
-
Загрузите новые данные об акциях:
stocks_update = load_data()
-
Сравните новые данные с имеющимися:
stocks = stocks.merge(stocks_update, how='left', on = 'ticker') stocks['no_of_comments_y'] = stocks['no_of_comments_y'].fillna(stocks['no_of_comments_x']) stocks['sentiment_score_y'] = stocks['sentiment_score_y'].fillna(stocks['sentiment_score_y'])
-
Обновите средние арифметические количества комментариев и оценки тональности:
stocks['count'] += 1 stocks['no_of_comments_x'] += (stocks['no_of_comments_y'] - stocks['no_of_comments_x'])/stocks['count'] stocks['sentiment_score_x'] += (stocks['sentiment_score_y'] - stocks['sentiment_score_x'])/stocks['count'] stocks = stocks[['no_of_comments_x', 'sentiment_score_x', 'ticker', 'count']] stocks.columns = ['no_of_comments', 'sentiment_score', 'ticker', 'count'] print(stocks)
-
Сохраните результаты в файл:
stocks.to_csv(FILE_NAME, index=False)
Создайте Cloud Functions
Чтобы запускать вычисления, не открывая JupyterLab, вам понадобится Cloud Functions, которая будет инициировать запуск вычислений в ноутбуке по API.
- В консоли управления
перейдите в каталог, в котором хотите создать функцию. - Выберите сервис Cloud Functions.
- Нажмите кнопку Создать функцию.
- Введите имя функции, например
my-function
. - Нажмите кнопку Создать функцию.
Создайте версию Cloud Functions
Версия содержит код функции, параметры запуска и все необходимые зависимости.
-
В консоли управления
перейдите в каталог, в котором находится функция. -
Выберите сервис Cloud Functions.
-
Выберите функцию, версию которой хотите создать.
-
В разделе Последняя версия нажмите кнопку Создать в редакторе.
-
Выберите среду выполнения
Python
. Не выбирайте опцию Добавить файлы с примерами кода. -
Выберите способ Редактор кода.
-
Нажмите Создать файл и введите имя файла, например
index
. -
Введите код функции, подставив идентификатор вашего проекта и абсолютный путь к ноутбуку в проекте:
import requests def handler(event, context): url = 'https://datasphere.api.cloud.yandex.net/datasphere/v2/projects/<идентификатор_проекта>:execute' body = {"notebookId": "/home/jupyter/datasphere/project/test_classifier.ipynb"} headers = {"Content-Type" : "application/json", "Authorization": "Bearer {}".format(context.token['access_token'])} resp = requests.post(url, json = body, headers=headers) return { 'body': resp.json(), }
Где:
<идентификатор_проекта>
— идентификатор проекта DataSphere, который расположен на странице проекта под названием.notebookId
— абсолютный путь к ноутбуку в проекте.
-
В блоке Параметры задайте параметры версии:
- Точка входа —
index.handler
. - Сервисный аккаунт —
reddit-user
.
- Точка входа —
-
Нажмите кнопку Сохранить изменения.
Создайте таймер
Для запуска функции каждые 15 минут вам понадобится таймер.
-
В консоли управления
перейдите в каталог, в котором хотите создать таймер. -
Выберите сервис Cloud Functions.
-
На панели слева выберите
Триггеры. -
Нажмите кнопку Создать триггер.
-
В блоке Базовые параметры:
- Введите имя и описание триггера.
- В поле Тип выберите
Таймер
. - В поле Запускаемый ресурс выберите
Функция
.
-
В блоке Настройки таймера укажите расписание вызова функции
Каждые 15 минут
. -
В блоке Настройки функции выберите функцию и укажите:
- Тег версии функции.
- Сервисный аккаунт
reddit-user
, от имени которого будет вызываться функция.
-
Нажмите кнопку Создать триггер.
Теперь файл stock_sentiments_data.csv
будет обновляться каждые 15 минут. Найти его можно рядом с ноутбуком.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: