Автор оригинала: 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 – использовать условное форматирование, которое применяется только для стилизации, когда ячейка не равна Нет
Отказ
Это имеет три преимущества:
- Он обеспечивает более гибкость для стилизации, чем обычные параметры форматирования, доступные в XLSXWriter.
- Вам не нужно вручную петлю через каждую точку данных и импортировать их в
писатель
объект один за другим. - Это позволяет легко увидеть, когда
Нет
Значения попадают в ваш доработанный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
Утилита программного обеспечения
Эта статья была опубликована Ником МакКалумом, Кто Обучает людям, как кодировать на своем сайте Отказ