Рубрики
Без рубрики

Как создать автоматическое обновление электронных таблиц Excel данных фондовых рынок с Python, AWS и IEX Cloud

Автор оригинала: Nick McCullum.

Многие разработчики Python в финансовом мире поручено создавать документы Excel для анализа нетехниками.

На самом деле это намного сложнее, чем звучит. От Sourceing данных для форматирования электронной таблицы для развертывания окончательного документа в центральном расположении есть много этапов, связанных с использованием процесса.

В этом руководстве я покажу вам, как создавать электронные таблицы Excel, используя Python, который:

  • Использовать данные фондового рынка из облака IEX
  • Развернуты в централизованном ведре S3, чтобы любой с правым URL-адресом может получить доступ к ним
  • Автоматически обновлять ежедневно, используя Cron Утилита командной строки

Шаг 1: Создайте учетную запись с облаком IEX

IEX Облако Является ли дочерняя компания поставщика данных IEX фондовая биржа Отказ

В случае, если вы незнакомы с IEX, это аббревиатура для «обмена инвестора». IEX был основан Брэдом Кацуямой, чтобы построить лучшую фондовую биржу, которая позволяет избежать недружественного поведения инвесторов, таких как передняя и высокочастотная торговля. Экспаиты Кацуямы были знакомыми хронированы в лучшей продаже Майкла Льюиса Flash Boys Отказ

Я исследовал много финансовых поставщиков данных, а IEX Cloud имеет наилучшую комбинацию:

  • Высококачественные данные
  • По доступной цене

Их цены ниже:

$ 9 в месяц Запуск План достаточно для многих случаев использования.

Предупреждение об использовании облака IEX (и любого другого поставщика данных Pay-Per используйте): Очень важно, чтобы вы установили бюджеты использования с самого начала. Эти бюджеты заблокируют вас из вашей учетной записи, как только вы ударили определенные стоимости доллара за месяц.

Когда я впервые начал использовать IEX Cloud, я случайно создал бесконечную петлю в пятницу днем, который содержал вызов API к области IEX. Эти вызовы API по цене оцениваются на основе затратного звонка … что привело к ужасающему электронному письму от IEX:

Это завет для клиента IEX, который они договорились сбросить мое использование, пока я устанавливаю бюджеты использования, движущиеся вперед. Иди, как!

Как и в случае большинства подписок API, основным преимуществом создания облачной учетной записи IEX имеет ключ API.

По понятным причинам я не буду делиться ключом API в этой статье.

Однако вы все еще можете работать через этот учебник с вашим собственным ключом API, если вы назначаете его на следующее имя переменной:

IEX_API_Key

Вы увидите пустые Iex_api_key Переменная в моем кодовых блоках на протяжении всей остальной части этого руководства.

Шаг 2: Напишите свой скрипт Python

Теперь, когда у вас есть доступ к ключу API, который вам нужно будет собирать финансовые данные, пришло время написать ваш сценарий Python.

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

Начать, давайте выложим нашу цели ворот. Мы собираемся написать сценарий Python, который генерирует файл Excel данных фондового рынка со следующими характеристиками:

  • Он будет включать 10 крупнейших акций в Соединенных Штатах
  • Он будет содержать четыре колонны: цикл, название компании, цена акций и доходность дивидендов.
  • Это будет отформатировано так, что цвет фона заголовка # 135485 и текст белый, в то время как фон электронного листа есть #Дадада И цвет шрифта черный (по умолчанию).

Давайте начнем, импортируя наш первый пакет.

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

Мы начнем с помощью Importing Пандас под псевдоним PD как это:

import pandas as pd

Далее мы уточним наш ключ IEX Cloud API. Как я уже упоминал ранее, я не собираюсь включить свой ключ API, поэтому вам придется схватить свой собственный ключ API с вашей учетной записи IEX и включить его здесь:

IEX_API_Key = ''

Наш следующий шаг – определить десять крупнейших компаний в Соединенных Штатах.

Вы можете ответить на этот вопрос с быстрым поиском Google.

Для краткости я включил компании (или, скорее, их циклники) в следующем списке Python:

tickers = [
            'MSFT',
            'AAPL',
            'AMZN',
            'GOOG',
            'FB',
            'BRK.B',
            'JNJ',
            'WMT',
            'V',
            'PG'
            ]

Далее пришло время выяснить, как пинговать API IEX Cloud Pret в метриках, которые нам нужны для каждой компании.

API IEX Cloud возвращает объекты JSON в ответ на запросы HTTP. Поскольку мы работаем с более чем 1 тикером в этом руководстве, мы будем использовать функцию вызовов Call Patch API IEX Cloud’s, которая позволяет запросить данные на более чем одного тикера одновременно. Использование вызовов Batch API имеет два преимущества:

  • Это уменьшает количество HTTP-запросов, которые вам нужно сделать, что сделает ваш код более исполнителем.
  • Ценообразование для вызовов Batch API немного лучше с большинством поставщиков данных.

Вот пример того, как может выглядеть желаемый HTTP-запрос, с несколькими словами заполнителя, где нам нужно будет настроить запрос:

https://cloud.iexapis.com/stable/stock/market/batch?symbols=TICKERS&types=ENDPOINTS&range=RANGE&token=IEX_API_Key

В этом URL мы заменим эти переменные со следующими значениями:

  • Тикеры будет заменен строкой, которая содержит каждый из наших тикеров, разделенных запятой.
  • Конечные точки Будет заменена строкой, которая содержит каждое из конечных точек облачных IEX, мы хотим ударить, разделенные запятой.
  • Диапазон будет заменен 1y Отказ Каждый из этих конечных точек содержит данные о времени, а не данные серии временных серий, поэтому этот диапазон действительно может быть как вы хотите.

Давайте поставим этот URL в переменную под названием Http_request Для нас, чтобы изменить позже:

HTTP_request = 'https://cloud.iexapis.com/stable/stock/market/batch?symbols=TICKERS&types=ENDPOINTS&range=RANGE&token=IEX_API_Key'

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

Для Тикеры Переменная, мы можем генерировать реальную переменную Python (а не просто слово заполнитель) с простым для петля:

#Create an empty string called `ticker_string` that we'll add tickers and commas to
ticker_string = ''

#Loop through every element of `tickers` and add them and a comma to ticker_string
for ticker in tickers:
    ticker_string += ticker
    ticker_string += ','
    
#Drop the last comma from `ticker_string`
ticker_string = ticker_string[:-1]

Теперь мы можем интерполировать наши Ticker_String Переменная в Http_request Переменная, которую мы создали ранее, используя F-строку:

HTTP_request = f'https://cloud.iexapis.com/stable/stock/market/batch?symbols={ticker_string}&types=ENDPOINTS&range=RANGE&token=IEX_API_Key'

Далее нам нужно определить, какие конечные точки IEX Cloud нам нужно пинг.

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

Таким образом, мы можем заменить заполнителю Конечные точки Слово из нашего оригинального HTTP-запроса со следующей переменной:

endpoints = 'price,stats'

Как мы сделали с нашей Ticker_String Переменная, давайте заменим конечные точки Переменная в Ticker_String Переменная:

HTTP_request = f'https://cloud.iexapis.com/stable/stock/market/batch?symbols={ticker_string}&types={endpoints}&range=RANGE&token=IEX_API_Key'

Последний заполнитель, который нам нужно заменить, это Диапазон Отказ Мы не заменим эту переменную. Вместо этого мы можем жесткокодировать 1y прямо в путь URL, как это:

https://cloud.iexapis.com/stable/stock/market/batch?symbols={ticker_string}&types={endpoints}&range=1y&token=IEX_API_Key

До сих пор мы намного сделали, поэтому давайте переправим нашу кодовую базу:

import pandas as pd

IEX_API_Key = ''

#Specify the stock tickers that will be included in our spreadsheet
tickers = [
            'MSFT',
            'AAPL',
            'AMZN',
            'GOOG',
            'FB',
            'BRK.B',
            'JNJ',
            'WMT',
            'V',
            'PG'
            ]


#Create an empty string called `ticker_string` that we'll add tickers and commas to
ticker_string = ''

#Loop through every element of `tickers` and add them and a comma to ticker_string
for ticker in tickers:
    ticker_string += ticker
    ticker_string += ','
    
#Drop the last comma from `ticker_string`
ticker_string = ticker_string[:-1]

#Create the endpoint strings
endpoints = 'price,stats'

#Interpolate the endpoint strings into the HTTP_request string
HTTP_request = f'https://cloud.iexapis.com/stable/stock/market/batch?symbols={ticker_string}&types={endpoints}&range=1y&token={IEX_API_Key}'

В настоящее время время для пинга API и сохранения данных в структуру данных в нашем приложении Python.

Мы можем прочитать объекты JSON с пандами read_json метод. В нашем случае мы сохраним данные JSON к Pandas DataFrame называется Raw_data , как это:

raw_data = pd.read_json(HTTP_request)

Давайте возьмем момент, чтобы убедиться, что данные были импортированы в приятный формат для нашего приложения.

Если вы работаете через этот учебник в Jupyter ноутбук Вы можете просто ввести имя Pandas DataFrame Переменная на последней строке кодовой ячейки и Jupyter будет красиво оказать изображение данных, как это:

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

Метрика 1: цикл тикер

Этот шаг очень просты, поскольку цикл, тикеры содержатся в столбцах Pandas DataFrame Отказ Мы можем получить доступ к ним через Колонны атрибут Pandas DataFrame как это:

raw_data.columns

Чтобы получить доступ к другим метрикам в Raw_data мы создадим для петля, которая петли через каждый тикер в Raw_data.Columns Отказ В каждой итерации цикла мы добавим данные к новому Pandas DataFrame Объект называется yource_data Отказ

Сначала нам нужно создать yource_data , что должно быть пустым Pandas DataFrame с четырьмя колоннами. Вот как это сделать:

output_data = pd.DataFrame(pd.np.empty((0,4)))

Это создает пустую Pandas DataFrame с 0 рядами и 4 столбцами.

Теперь, когда этот объект был создан, вот как мы можем структурировать это для петля:

for ticker in raw_data.columns:
	
    #Parse the company's name - not completed yet
    company_name = ''
    
    #Parse the company's stock price - not completed yet
    stock_price = 0
    
    #Parse the company's dividend yield - not completed yet
    dividend_yield = 0
    
    
    new_column = pd.Series([ticker, company_name, stock_price, dividend_yield])
    output_data = output_data.append(new_column, ignore_index = True)

Далее давайте определимся, как разбирать Company_Name Переменная от Raw_data объект.

Метрика 2: Название компании

Company_Name Переменная – это первая вариабельная вариабена должна быть проанализирована из Raw_data объект. Как быстрый рецидил, вот что Raw_data выглядит как:

Company_Name Переменная проводится в пределах Статистика Конечная точка под ключом словаря Имя компании Отказ Разбирать эту точку данных из Raw_data Мы можем использовать эти индексы:

raw_data[ticker]['stats']['companyName']

В том числе в нашем для петля от раньше дает это:

output_data = pd.DataFrame(pd.np.empty((0,4)))

for ticker in raw_data.columns:
	
    #Parse the company's name - not completed yet
    company_name = raw_data[ticker]['stats']['companyName']
    
    #Parse the company's stock price - not completed yet
    stock_price = 0
    
    #Parse the company's dividend yield - not completed yet
    dividend_yield = 0
    
    
    new_column = pd.Series([ticker, company_name, stock_price, dividend_yield])
    output_data = output_data.append(new_column, ignore_index = True)

Давайте перейдем к разборке Stock_Price Отказ

Метрика 3: акции цена

Stock_Price Переменная содержится в пределах Цена Конечная точка, которая возвращает только одно значение. Это означает, что нам не нужно цепи вместе, такие как мы сделали с Company_Name Отказ

Вот как мы могли разбирать Stock_Price от Raw_data :

raw_data[ticker]['price']

В том числе в нашем для Цикл дает нам:

output_data = pd.DataFrame(pd.np.empty((0,4)))

for ticker in raw_data.columns:
	
    #Parse the company's name - not completed yet
    company_name = raw_data[ticker]['stats']['companyName']
    
    #Parse the company's stock price - not completed yet
    stock_price = raw_data[ticker]['price']
    
    #Parse the company's dividend yield - not completed yet
    dividend_yield = 0
    
    
    new_column = pd.Series([ticker, company_name, stock_price, dividend_yield])
    output_data = output_data.append(new_column, ignore_index = True)

Последняя метрика нам нужна для анализа Disidend_yield Отказ

Метрика 4: Дивидендная доходность

Как Company_Name , Disidend_yield содержится в Статистика конечная точка. Проводится под Диренджилд Словарь ключ.

Вот как мы могли разбирать его из Raw_data :

raw_data[ticker]['stats']['dividendYield']

Добавление этого к нашему для Цикл дает нам:

output_data = pd.DataFrame(pd.np.empty((0,4)))

for ticker in raw_data.columns:
	
    #Parse the company's name - not completed yet
    company_name = raw_data[ticker]['stats']['companyName']
    
    #Parse the company's stock price - not completed yet
    stock_price = raw_data[ticker]['price']
    
    #Parse the company's dividend yield - not completed yet
    dividend_yield = raw_data[ticker]['stats']['dividendYield']
    
    
    new_column = pd.Series([ticker, company_name, stock_price, dividend_yield])
    output_data = output_data.append(new_column, ignore_index = True)

Давайте распечатаем наш yource_data Объект, чтобы увидеть, как выглядит данные:

Все идет нормально! Следующие два шага называть столбцы Pandas DataFrame и изменить свой индекс.

Как назвать столбцы Pandas DataFrame

Мы можем обновить имена столбцов наших yource_data Объект, создавая список имен столбцов и назначением его yump_data.Columns Атрибут, как это:

output_data.columns = ['Ticker', 'Company Name', 'Stock Price', 'Dividend Yield']

Давайте распечатаем наш yource_data Объект, чтобы увидеть, как выглядит данные:

Намного лучше! Давайте изменим индекс yource_data следующий.

Как изменить индекс Pandas DataFrame

Индекс A Pandas DataFrame Это специальный столбец, который несколько похож на первичный ключ таблицы базы данных SQL. В нашем yource_data объект, мы хотим установить Тикер столбец как Dataframe индекс.

Вот как мы можем сделать это, используя set_index Метод:

output_data.set_index('Ticker', inplace=True)

Давайте распечатаем наш yource_data Объект, чтобы увидеть, как выглядит данные:

Еще одно постепенное улучшение!

Далее давайте иметь дело с отсутствующими данными в yource_data Отказ

Как обрабатывать недостающие данные в PandaS DataFrames

Если вы внимательно посмотрите на yource_data Вы заметите, что есть несколько Нет Значения в Дивидендная доходность столбец:

Эти Нет Значения просто указывают на то, что компания для этой строки в настоящее время не платит дивидендов. В то время как Нет Один из способов представления не дивидендного запаса, более распространено, чтобы показать Дивидендная доходность 0 Отказ

К счастью, исправление для этого довольно просто. Пандас Библиотека включает в себя отличное Филна Метод, который позволяет заменить недостающие значения в Pandas DataFrame Отказ

Вот как мы можем использовать Филна Метод заменить наши Дивидендная доходность колонна Нет Значения с 0 :

output_data['Dividend Yield'].fillna(0,inplace=True)

yource_data Объект выглядит очень чище:

Теперь мы готовы экспортировать наше DataFrame в документ Excel! В качестве быстрого RECAP вот наш сценарий Python на сегодняшний день:

import pandas as pd

IEX_API_Key = ''

#Specify the stock tickers that will be included in our spreadsheet
tickers = [
            'MSFT',
            'AAPL',
            'AMZN',
            'GOOG',
            'FB',
            'BRK.B',
            'JNJ',
            'WMT',
            'V',
            'PG'
            ]


#Create an empty string called `ticker_string` that we'll add tickers and commas to
ticker_string = ''

#Loop through every element of `tickers` and add them and a comma to ticker_string
for ticker in tickers:
    ticker_string += ticker
    ticker_string += ','
    
#Drop the last comma from `ticker_string`
ticker_string = ticker_string[:-1]

#Create the endpoint strings
endpoints = 'price,stats'

#Interpolate the endpoint strings into the HTTP_request string
HTTP_request = f'https://cloud.iexapis.com/stable/stock/market/batch?symbols={ticker_string}&types={endpoints}&range=1y&token={IEX_API_Key}'

#Create an empty pandas DataFrame to append our parsed values into during our for loop
output_data = pd.DataFrame(pd.np.empty((0,4)))

for ticker in raw_data.columns:
	
    #Parse the company's name
    company_name = raw_data[ticker]['stats']['companyName']
    
    #Parse the company's stock price
    stock_price = raw_data[ticker]['price']
    
    #Parse the company's dividend yield
    dividend_yield = raw_data[ticker]['stats']['dividendYield']
    
    
    new_column = pd.Series([ticker, company_name, stock_price, dividend_yield])
    output_data = output_data.append(new_column, ignore_index = True)

#Change the column names of output_data
output_data.columns = ['Ticker', 'Company Name', 'Stock Price', 'Dividend Yield']

#Change the index of output_data
output_data.set_index('Ticker', inplace=True)

#Replace the missing values of the 'Dividend Yield' column with 0
output_data['Dividend Yield'].fillna(0,inplace=True)

#Print the DataFrame
output_data

Как экспортировать документ в стиле Excel из PandaFrame Pandas с использованием XLSXWriter

Есть несколько способов экспортировать xlsx Файл из Pandas DataFrame Отказ

Самый простой способ – использовать встроенный функцию to_excel Отказ В качестве примера, вот как мы могли бы экспортировать yource_data к файлу Excel:

output_data.to_excel('my_excel_document.xlsx)

Проблема с таким подходом состоит в том, что файл Excel нет формата вообще. Вывод выглядит так:

Отсутствие форматирования в этом документе трудно интерпретировать.

Каково решение?

Мы можем использовать пакет Python Xlsxwriter генерировать красиво отформатированные файлы Excel. Для начала мы захотите добавить следующий импорт в начало нашего сценария Python:

import xlsxwriter

Далее нам нужно создать наш фактический файл Excel. Пакет XLSXWriter на самом деле имеет выделенную страницу документации для работы с Pandas DataFrames , что доступно здесь Отказ

Наш первый шаг – это позвонить в pd.excelrriter Функция и пройти в желаемом имени нашего xlsx файл как первый аргумент и Двигатель = 'xlsxwriter как второй аргумент. Мы присваиваем это переменной под названием писатель :

writer = pd.ExcelWriter('stock_market_data.xlsx', engine='xlsxwriter')

Оттуда нам нужно позвонить to_excel Метод на нашем Pandas DataFrame Отказ На этот раз вместо того, чтобы проходить во имя файла, который мы пытаемся экспортировать, мы пройдем в писатель Объект, который мы только что создали:

output_data.to_excel(writer, sheet_name='Sheet1')

Наконец, мы позвоним Сохранить Метод на нашем писатель Объект, который сохраняет xlsx Файл в наш текущий рабочий каталог. Когда все это сделано, вот раздел нашего сценария Python, который сохраняет yource_data к файлу Excel.

writer = pd.ExcelWriter('stock_market_data.xlsx', engine='xlsxwriter')

output_data.to_excel(writer, sheet_name='Sheet1')

writer.save()

Весь код форматирования, который мы будем включать в нашу xlsx Файл должен быть содержаться между созданием ExcelWriter Объект и писатель .save () утверждение.

Как стиль файл XLSX, созданный с Python

Это на самом деле сложнее, чем вы можете подумать, чтобы стиль файл Excel с помощью Python.

Это частично из-за некоторых ограничений пакета XLSXWriter. Его документация государства:

По моему опыту самый гибкий способ стиля клеток в xlsx Файл, созданный XLSXWriter – использовать условное форматирование, которое применяется только для стилизации, когда ячейка не равна Нет Отказ

Это имеет три преимущества:

  1. Он обеспечивает более гибкость для стилизации, чем обычные параметры форматирования, доступные в XLSXWriter.
  2. Вам не нужно вручную петлю через каждую точку данных и импортировать их в писатель объект один за другим.
  3. Это позволяет легко увидеть, когда Нет Значения попадают в ваш доработанный xlsx файлы, поскольку они будут отсутствовать требуемое форматирование.

Чтобы применить стиль с использованием условного форматирования, нам сначала нужно создать несколько шаблонов стилей. В частности, нам понадобится четыре шаблоны:

  • Один header_template это будет применено к именам столбцов в верхней части электронной таблицы
  • Один string_template это будет применено к Тикер и Название компании колонны
  • Один dollar_template это будет применено к Цена акций столбец
  • Один Процент_template это будет применено к Дивидендная доходность столбец

Каждый из этих шаблонов формата должен быть добавлен в писатель Объект в словарях, напоминающий синтаксис CSS. Вот что я имею в виду:

header_template = writer.book.add_format(
        {
            'font_color': '#ffffff',
            'bg_color': '#135485',
            'border': 1
        }
    )

string_template = writer.book.add_format(
        {
            'bg_color': '#DADADA',
            'border': 1
        }
    )

dollar_template = writer.book.add_format(
        {
            'num_format':'$0.00',
            'bg_color': '#DADADA',
            'border': 1
        }
    )

percent_template = writer.book.add_format(
        {
            'num_format':'0.0%',
            'bg_color': '#DADADA',
            'border': 1
        }
    )

Чтобы применить эти форматы в определенные ячейки в нашем xlsx Файл, нам нужно позвонить в пакет connectal_format Метод на Писатель. Листы [«Фондовые маркетные данные»] Отказ Вот пример:

writer.sheets['Stock Market Data'].conditional_format('A2:B11', 
                             {
                                'type':     'cell',
                                'criteria': '<>',
                                'value':    '"None"',
                                'format':   string_template
                                }
                            )

Если мы обобщем это форматирование с другими тремя форматами, мы применяем, вот что становится часть форматирования нашего сценария Python:

writer = pd.ExcelWriter('stock_market_data.xlsx', engine='xlsxwriter')

output_data.to_excel(writer, sheet_name='Stock Market Data')

header_template = writer.book.add_format(
        {
            'font_color': '#ffffff',
            'bg_color': '#135485',
            'border': 1
        }
    )

string_template = writer.book.add_format(
        {
            'bg_color': '#DADADA',
            'border': 1
        }
    )

dollar_template = writer.book.add_format(
        {
            'num_format':'$0.00',
            'bg_color': '#DADADA',
            'border': 1
        }
    )

percent_template = writer.book.add_format(
        {
            'num_format':'0.0%',
            'bg_color': '#DADADA',
            'border': 1
        }
    )


#Format the header of the spreadsheet
writer.sheets['Stock Market Data'].conditional_format('A1:D1', 
                             {
                                'type':     'cell',
                                'criteria': '<>',
                                'value':    '"None"',
                                'format':   header_template
                                }
                            )

#Format the 'Ticker' and 'Company Name' columns
writer.sheets['Stock Market Data'].conditional_format('A2:B11', 
                             {
                                'type':     'cell',
                                'criteria': '<>',
                                'value':    '"None"',
                                'format':   string_template
                                }
                            )

#Format the 'Stock Price' column
writer.sheets['Stock Market Data'].conditional_format('C2:C11', 
                             {
                                'type':     'cell',
                                'criteria': '<>',
                                'value':    '"None"',
                                'format':   dollar_template
                                }
                            )

#Format the 'Dividend Yield' column
writer.sheets['Stock Market Data'].conditional_format('D2:D11', 
                             {
                                'type':     'cell',
                                'criteria': '<>',
                                'value':    '"None"',
                                'format':   percent_template
                                }
                            )

writer.save()

Давайте посмотрим на наш документ Excel, чтобы увидеть, как выглядит:

Все идет нормально! Последнее постепенное улучшение, которое мы можем сделать в этом документе, состоит в том, чтобы сделать его колонны немного шире.

Мы можем указать ширины столбца, вызывая set_column Метод на Писатель. Листы [«Фондовые маркетные данные»] Отказ

Вот что мы добавим к нашему сценарию Python, чтобы сделать это:

#Specify all column widths
writer.sheets['Stock Market Data'].set_column('B:B', 32)
writer.sheets['Stock Market Data'].set_column('C:C', 18)
writer.sheets['Stock Market Data'].set_column('D:D', 20)

Вот окончательная версия электронной таблицы:

Вуаля! Мы хорошо, чтобы пойти! Вы можете получить доступ к финальной версии этого сценария Python на GitHub здесь Отказ Файл называется stock_market_data.py Отказ

Шаг 3: Настройте виртуальную машину AWS EC2, чтобы запустить скрипт Python

Ваш сценарий Python завершается и готов к запуску.

Однако мы не хотим просто запустить это на нашей местной машине на специальной основе.

Вместо этого мы собираемся настроить виртуальную машину, используя Упругое вычислительное облако Amazon Web Services (EC2) Сервис.

Вам нужно сначала создать учетную запись AWS, если у вас еще нет. Для этого перейдите к этому URL и нажмите «Создать учетную запись AWS» в правом верхнем углу:

Веб-приложение AWS проведет вас через шаги для создания учетной записи.

Как только ваша учетная запись будет создана, вам необходимо создать экземпляр EC2. Это просто виртуальный сервер для работы в инфраструктуре AWS.

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

Мы будем использовать наименьший сервер AWS, чтобы запустить сценарий Python, который мы написали в этой статье. Чтобы начать работу, перейдите к EC2 в пределах консоли управления AWS. Как только вы прибыли в течение EC2, нажмите Экземпляр запуски :

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

Я выбрал Amazon Linux 2 AMI (HVM) :

Нажмите Выберите продолжать.

На следующей странице AWS попросит вас выбрать спецификации для вашей машины. Поля, которые вы можете выбрать, включают в себя:

  • Семья
  • Тип
  • VCPUS.
  • объем памяти
  • Хранение экземпляра (ГБ)
  • EBS-оптимизирован
  • Производительность сети
  • Поддержка IPv6

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

После того, как вы выбрали дополнительную доступную машину Free Tier, нажмите Отзыв и запустить внизу экрана, чтобы продолжить. Следующий экран представит детали вашего нового экземпляра для просмотра. Быстро просмотрите спецификации машины, затем нажмите Запуск в правом нижнем углу.

Нажав на Запуск Кнопка будет вызвать всплывающее окно, которое просит вас Выберите существующую ключевую пару или создайте новую ключевую пару Отказ Пара ключей состоит из открытого ключа, который удерживает AWS и закрытый ключ, который вы должны загрузить и хранить в A .pem файл. Вы должны иметь доступ к этому .pem файл для доступа к экземпляру EC2 (как правило, через SSH). У вас также есть возможность продолжить без ключевой пары, но это не рекомендуется по соображениям безопасности.

После того, как вы выбрали или создали ключевую пару для этого экземпляра EC2, и нажмите кнопку «Переключатель» для Я признаю, что у меня есть доступ к выбранному файлу закрытого ключа (Data-feeds.cem), и что без этого файла я не смогу войти в мой экземпляр , вы можете нажать Запустить экземпляры продолжать.

Ваш экземпляр теперь начнет запускать. Это может занять некоторое время для загрузки, но однажды его готовы, его Штат экземпляра покажет как Бег в вашей панели инструментов EC2.

Далее вам нужно будет нажать свой скрипт Python в свой экземпляр EC2. Вот универсальное утверждение состояния команды, которое позволяет вам переместить файл в экземпляр EC2:

scp -i path/to/.pem_file path/to/file   username@host_address.amazonaws.com:/path_to_copy

Запустите это утверждение с необходимыми заменами для перемещения stock_market_data.py в экземпляр EC2.

Пытаясь бежать stock_market_data.py На этот момент на самом деле приведет к ошибке, потому что экземпляр EC2 не поставляется с необходимыми пакетами Python.

Чтобы исправить это, вы можете либо экспортировать A требования .txt Файл и импортировать правильные пакеты, используя Пип или вы можете просто запустить следующее:

sudo yum install python3-pip
pip3 install pandas
pip3 install xlsxwriter

Как только это сделано, вы можете SSH в экземпляре EC2 и запустите сценарий Python из командной строки со следующим утверждением:

python3 stock_market_data.py

Шаг 4: Создайте ведро AWS S3, чтобы удерживать готовый скрипт Python

С работой, которую мы закончили до сих пор, наш скрипт Python может быть выполнен внутри нашего экземпляра EC2.

Проблема с этим в том, что xlsx Файл будет сохранен на виртуальный сервер AWS.

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

Чтобы исправить это, мы собираемся создать общественное ведро на AWS S3, где мы можем сохранить xlsx файл. Любой, кто имеет правильный URL, сможет загрузить этот файл после того, как это изменение сделано.

Для начала навигация на AWS S3 из консоли управления AWS. Нажмите Создать ведро В правом верхнем углу:

На следующем экране вам нужно будет выбрать имя для вашего ведра и региона AWS для размещения ведра. Имя ведра должно быть уникальным и не может содержать пробелы или прописные буквы. Регион не имеет большого значения для целей этого учебника, поэтому я буду использовать регион по умолчанию США Восток (Огайо) США-Восток-2) Отказ

Вам нужно будет изменить настройки общественного доступа в следующем разделе, чтобы соответствовать этой конфигурации:

Нажмите Создать ведро Чтобы создать ваше ведро и заключить этот шаг этого учебника!

Шаг 5: Измените свой скрипт Python, чтобы нажать файл XLSX на AWS S3

Наши AWS S3 Bucket теперь готовы держать наш доработанный xlsx документ. Теперь мы сделаем небольшое изменение нашим stock_market_data.py Файл для толкания доработанного документа на наше ведро S3.

Нам нужно будет использовать Boto3 пакет, чтобы сделать это. Boto3 Это комплект разработки программного обеспечения AWS (SDK) для Python, позволяющий разработчикам Python писать программное обеспечение, которое подключается к услугам AWS. Для начала вам нужно установить Boto3 На вашей виртуальной машине EC2. Запустите следующую оператор командной строки, чтобы сделать это:

pip3 install boto3

Вам также нужно будет импортировать библиотеку в stock_market_data.py Добавляя следующее утверждение в верхнюю часть сценария Python.

import boto3

Нам нужно добавить несколько строк кода до конца stock_market_data.py Чтобы протолкнуть окончательный документ на AWS S3.

s3 = boto3.resource('s3')
s3.meta.client.upload_file('stock_market_data.xlsx', 'my-S3-bucket', 'stock_market_data.xlsx', ExtraArgs={'ACL':'public-read'})

Первая строка этого кода S3.Resource ('S3') , позволяет нашему сценарию Python подключиться к веб-сервисам Amazon.

Вторая строка кода вызывает метод от Boto3 Это на самом деле загружает наш файл на S3. Требуется четыре аргумента:

  • stock_market_data.xlsx – имя файла на нашем локальном компьютере.
  • My-S3-Bucket – имя ведра S3, которое мы загружаем наш файл.
  • stock_market_data.xlsx – желаемое имя файла в ведре S3. В большинстве случаев это будет одинаковое значение, что и первый аргумент, переданный в этот метод.
  • Experargs = {'acl': «Государственный читал»} – Это необязательный аргумент, который сообщает AWS, чтобы сделать загруженный файл публично читабелен.

Шаг 6: Запланируйте свой скрипт Python, чтобы периодически бегать с помощью Cron

До сих пор мы завершили следующее:

  • Построил наш сценарий Python
  • Создал экземпляр EC2 и развернул наш код там
  • Создал ведро S3, где мы можем подтолкнуть финал xlsx документ
  • Изменил оригинальный сценарий Python для загрузки доработанного stock_market_data.xlsx Файл к ведрю AWS S3

Единственный шаг, который оставлен, – это периодически заканчивать сценарий Python.

Мы можем сделать это, используя утилиту командной строки, называемой Cron Отказ Начать, нам нужно будет создать Cron Выражение, которое говорит утилиту, когда запустить код. Crontab Guru Сайт – отличный ресурс для этого.

Вот как вы можете использовать Crontab Guru, чтобы получить Cron выражение, которое означает каждый день в полдень :

Теперь нам нужно попросить нашего экземпляра EC2 Cron демон, чтобы запустить stock_market_data.py в это время каждый день.

Для этого мы сначала создам новый файл в нашем экземпляре EC2 под названием stock_market_data.cron Отказ

Откройте этот файл и введите наше выражение CRON, за которым следует оператор, который должен быть выполнен в командной строке в указанном времени.

Наша командная строка утверждает python3 stock_market_data.py Итак, вот что следует содержаться в stock_market_data.cron :

00 12 * * * python3 stock_market_data.py

Если вы запустите Ls Команда в вашем экземпляре EC2, вы теперь должны увидеть два файла:

stock_market_data.py	stock_market_data.cron

Последний шаг этого учебника – загрузить stock_market_data.cron в Crontab Отказ Вы можете думать о Crontab В качестве файла, содержащего команды и инструкции для Cron демон для выполнения. Другими словами, Crontab Содержит партии Cron рабочие места.

Во-первых, посмотрим, что в нашем Crontab Отказ Это должно быть пусто, так как мы ничего не положили в него ничего! Вы можете просмотреть содержимое вашего Crontab Со следующей командой:

crontab -l

Загрузить stock_market_data.cron в Crontab Запустите следующее утверждение в командной строке:

crontab stock_market_data.cron

Теперь, когда вы запускаете Crontab -l , Тебе следует увидеть:

00 12 * * * python3 stock_market_data.py

Наше stock_market_data.py Сценарий теперь будет работать в полдень каждый день на нашей виртуальной машине AWS EC2!

Последние мысли

В этой статье вы узнали, как создавать автоматически обновление электронных таблиц Excel финансовых данных с использованием Python, Iex Cloud и Amazon Web Services.

Вот конкретные шаги, которые мы находились в этом руководстве:

  • Как создать учетную запись с облаком IEX
  • Как написать сценарий Python, который генерирует красивые документы Excel, используя Pandas и XLSXWriter
  • Как запустить экземпляр AWS EC2 и развернуть код на нем
  • Как создать ведро AWS S3
  • Как нажать файлы в ведро AWS S3 из скрипта Python
  • Как запланировать код для запуска с помощью Cron Утилита программного обеспечения

Эта статья была опубликована Ником МакКалумом, Кто Обучает людям, как кодировать на своем сайте Отказ