Multi dezvoltatori Python din lumea financiara au sarcina de a crea documente Excel pentru analiza de catre utilizatori non-tehnici.

Acest lucru este de fapt mult mai greu decat pare. De la furnizarea datelor pana la formatarea foii de calcul pana la implementarea documentului final intr-o locatie centrala, exista o multime de pasi implicati in acest proces.

In acest tutorial, va voi arata cum puteti crea foi de calcul Excel folosind Python care:

  • Folositi datele pietei bursiere din IEX Cloud
  • Sunt implementate intr-o galeata S3 centralizata, astfel incat oricine are adresa URL potrivita sa le poata accesa
  • Actualizati automat zilnic folosind utilitatea cron linia de comanda

Pasul 1: Creati un cont cu IEX Cloud

IEX Cloud este filiala furnizorului de date a bursei IEX.

In cazul in care nu sunteti familiarizat cu IEX, acesta este un acronim pentru „Bursa Investitorului”. IEX a fost fondata de Brad Katsuyama pentru a construi o bursa mai buna, care sa evite comportamentul neprietenos al investitorilor, precum tranzactionarea frontala si de inalta frecventa. Lucrarile lui Katsuyama au fost cronicizate in cele mai vandute carti ale lui Michael Lewis, Flash Boys.

Am investigat multi furnizori de date financiare si IEX Cloud are cea mai buna combinatie de:

  • Date de inalta calitate
  • Pret accesibil

Preturile lor sunt sub:

Planul de lansare de 9 dolari / luna este suficient pentru multe cazuri de utilizare.

Un avertisment privind utilizarea IEX Cloud (si orice alt furnizor de date cu plata): este foarte important sa setati bugetele de utilizare de la inceput. Aceste bugete te blocheaza din cont odata ce ai atins un anumit cost in dolari pentru luna.

Cand am inceput sa folosesc IEX Cloud, am creat din greseala o bucla infinita intr-o vineri dupa-amiaza care continea un apel API catre IEX Cloud. Aceste apeluri API au preturi pe baza de apel … ceea ce a dus la un e-mail terifiant de la IEX:

Este o dovada a centrarii clientului IEX, ca au acceptat sa-mi reseteze modul in care stabilesc bugetele de utilizare in avans. Du-te IEX!

Ca si in cazul majoritatii abonamentelor API, principalul beneficiu al crearii unui cont IEX Cloud este de a avea o cheie API.

Din motive evidente, nu voi partaja o cheie API in acest articol.

Cu toate acestea, puteti sa lucrati in continuare prin acest tutorial cu propria cheie API atat timp cat il atribuiti urmatorului nume variabil:

IEX_API_Key

Veti vedea variabila goala IEX_API_Key in blocurile mele de cod in tot restul acestui tutorial.

Pasul 2: Scrieti-va scriptul Python

Acum, cand aveti acces la cheia API de care va trebui sa adunati date financiare, este timpul sa va scrieti scriptul Python.

Aceasta va fi cea mai lunga sectiune a acestui tutorial. Este, de asemenea, cel mai flexibil – vom crea un script Python care indeplineste anumite criterii pre-specificate, dar puteti modifica aceasta sectiune pentru a crea cu adevarat orice foaie de calcul dorita!

Pentru a incepe, sa stabilim postarile noastre. Vom scrie un script Python care genereaza un fisier Excel de date ale pietei bursiere cu urmatoarele caracteristici:

  • Acesta va include cele mai mari 10 stocuri din Statele Unite
  • Acesta va contine patru coloane: bursier, numele companiei, pretul actiunilor si randamentul dividendelor.
  • Acesta va fi formatat astfel incat culoarea de fundal a antetului este # 135485, iar textul este alb, in ​​timp ce fundalul corpului foii de calcul este #DADADA, iar culoarea fontului este neagra (implicit).

Sa incepem importand primul nostru pachet.

Intrucat foile de calcul sunt in esenta doar structuri de date cu randuri si coloane, biblioteca panda – inclusiv obiectul sau incorporat DataFrame – este un candidat perfect pentru manipularea datelor din acest tutorial.

Vom incepe prin a importa panda sub pias-ul alias astfel:

import panda ca pd

In continuare, vom specifica cheia noastra API IEX Cloud. Asa cum am mentionat anterior, nu voi include cu adevarat cheia mea API, asa ca va trebui sa apucati propria cheie API din contul dvs. IEX si sa o includeti aici:

IEX_API_Key = ”

Urmatorul nostru pas este sa determinam cele mai mari zece companii din Statele Unite.

Puteti raspunde la aceasta intrebare cu o cautare rapida pe Google.

Din punct de vedere scurt, am inclus companiile (sau mai bine zis, marcatele de actiuni) in urmatoarea lista Python:

tickers = [‘MSFT’, ‘AAPL’, ‘AMZN’, ‘GOOG’, ‘FB’, ‘BRK.B’, ‘JNJ’, ‘WMT’, ‘V’, ‘PG’] Acestea sunt cele mai mari 10 companii din Statele Unite bazate pe capitalizarea de piata. Retineti ca lista reala a celor mai mari 10 companii se va schimba in timp. Aceasta lista este actuala la mijlocul lunii aprilie 2020.

In continuare, este timpul sa ne dam seama cum sa pingem API-ul IEX Cloud pentru a obtine valorile de care avem nevoie pentru fiecare companie.

API-ul IEX Cloud returneaza obiectele JSON ca raspuns la solicitarile HTTP. Intrucat lucram cu mai mult de 1 ticker in acest tutorial, vom folosi functionalitatea de apel API API de la IEX Cloud, care va permite sa solicitati date pe mai mult de un ticker simultan. Utilizarea apelurilor API prin loturi are doua avantaje:

  • Acesta reduce numarul de solicitari HTTP pe care trebuie sa le faceti, ceea ce va face codul dvs. mai performant.
  • Preturile pentru apelurile API pe loturi sunt usor mai bune la majoritatea furnizorilor de date.

Iata un exemplu despre cum ar putea arata cererea HTTP, cu cateva cuvinte de rezerva pentru care trebuie sa personalizam solicitarea:

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

In aceasta adresa URL, vom inlocui aceste variabile cu urmatoarele valori:

  • TICKERS va fi inlocuit cu un sir care contine fiecare dintre tickerele noastre separate printr-o virgula.
  • ENDPOINTS va fi inlocuit cu un sir care contine fiecare dintre punctele finale IEX Cloud pe care dorim sa le lovim, separate printr-o virgula.
  • RANGE va fi inlocuit cu 1y. Aceste puncte finale contin fiecare date punctuale in timp si nu date din seria timpului, astfel incat acest interval poate fi cu adevarat orice doriti.

Sa introducem aceasta adresa URL intr-o variabila numita HTTP_request pentru ca noi sa le modificam ulterior:

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

Sa lucram fiecare dintre aceste variabile una cate una pentru a determina adresa URL exacta pe care trebuie sa o atingem.

Pentru variabila TICKERS, putem genera o adevarata variabila Python (si nu doar un cuvant de rezerva) cu o simpla bucla pentru:

# Creati un sir gol numit `ticker_string` pe care il vom adauga tickers si virgule la ticker_string = ” # Inchideti fiecare element din` tickers` si adaugati-le si o virgula la ticker_string pentru ticker in tickers: ticker_string + = ticker ticker_string + = ‘,’ #Dupa ultima virgula din `ticker_string` ticker_string = ticker_string [: – 1]

Acum putem interpola variabila ticker_string in variabila HTTP_request pe care am creat-o anterior folosind o f-string:

HTTP_request = inhttps: //cloud.iexapis.com/stable/stock/market/batch? Symbols = {ticker_string} & types = ENDPOINTS & range = RANGE & token = IEX_API_Key ‘

In continuare, trebuie sa determinam care sunt punctele finale ale IEX Cloud pe care trebuie sa le facem ping.

Unele investigatii rapide privind documentatia IEX Cloud dezvaluie ca avem nevoie doar de pret si de punctele statistice pentru a crea foaia de calcul.

Astfel, putem inlocui cuvantul ENDPOINTS de la locatar din cererea noastra HTTP initiala cu urmatoarea variabila:

puncte finale = ‘pret, statistici’

Asa cum am facut-o cu variabila noastra ticker_string, haideti sa inlocuim variabila punctelor finale in variabila ticker_string:

HTTP_request = inhttps: //cloud.iexapis.com/stable/stock/market/batch? Symbols = {ticker_string} & types = {endpoints} & range = RANGE & token = IEX_API_Key ‘

Ultimul placeholder pe care trebuie sa il inlocuim este RANGE. Nu vom inlocui cu aceasta o variabila. In schimb, putem coda 1y direct pe calea URL astfel:

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

Am facut multe pana acum, asa ca haideti sa ne recapitulam baza de coduri:

import panda ca pd IEX_API_Key = ” # Specificati marcatele de stocuri care vor fi incluse in foile de calcul tickers = [‘MSFT’, ‘AAPL’, ‘AMZN’, ‘GOOG’, ‘FB’, ‘BRK.B’, ‘ JNJ ‘,’ WMT ‘,’ V ‘,’ PG ‘] # Creati un sir gol numit `ticker_string`, pe care il vom adauga tickers si virgule la ticker_string =’ ‘#Loop prin fiecare element din` tickers` si le adaugam si o virgula spre ticker_string pentru ticker in tickers: ticker_string + = ticker ticker_string + = ‘,’ #Drop ultima virgula din `ticker_string` ticker_string = ticker_string [: – 1] #Create the endpoint string endpoints = ‘price, stats’ #Interpolate sirurile de final in sirul HTTP_request HTTP_request = in http: //cloud.iexapis.com/stable/stock/market/batch? Symbols = {ticker_string} &tipuri = {endpoint} & gama = 1y & jeton = {IEX_API_Key}“

Acum este timpul sa faceti un ping la API si sa-i salvati datele intr-o structura de date din aplicatia noastra Python.

Putem citi obiecte JSON cu metoda read_json de panda. In cazul nostru, vom salva datele JSON intr-un DataFrame pandas numit raw_data, astfel:

raw_data = pd.read_json (HTTP_request)

Sa luam un moment acum pentru a ne asigura ca datele au fost importate intr-un format frumos pentru aplicatia noastra.

Daca lucrati prin acest tutorial intr-un Jupyter Notebook, puteti sa introduceti pur si simplu numele variabilei DataFrame pandas pe ultima linie a unei celule de cod, iar Jupyter va reda frumos o imagine a datelor, astfel:

Dupa cum puteti vedea, panda DataFrame contine o coloana pentru fiecare bursier si doua randuri: unul pentru punctele statistice si altul pentru punctul final al pretului. Va trebui sa analizam acest DataFrame pentru a obtine cele patru valori pe care le dorim. Haideti sa lucram prin parametrii, unul cate unul, in pasii de mai jos.

Metrica 1: Bilet de actiuni

Aceasta etapa este foarte simpla, deoarece capusele de stoc sunt continute in coloanele din Panda DataFrame. Le putem accesa prin intermediul atributului de coloane din panda DataFrame astfel:

raw_data.columns

Pentru a accesa celelalte valori din raw_data, vom crea o bucla pentru care se bucle prin fiecare bifator in raw_data.columns. In fiecare iteratie a buclei, vom adauga datele unui nou obiect DataFrame pandas numit output_data.

Mai intai va trebui sa cream output_data, care ar trebui sa fie un DataFrame panda gol cu ​​patru coloane. Iata cum se face acest lucru:

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

Se creeaza un DataFrame panda gol cu ​​0 randuri si 4 coloane.

Acum ca acest obiect a fost creat, iata cum putem structura acest lucru pentru bucla:

pentru ticker in raw_data.columns: #Pars numele companiei – nu a fost completat inca company_name = ” #Pretul pretului actiunii companiei – nu a fost finalizat inca stock_price = 0 #Prinderea dividendului companiei – nu a fost finalizata inca dividend_yield = 0 new_column = pd. Serie ([ticker, nume companie, stoc_price, dividend_yield]) output_data = output_data.append (new_column, ignore_index = True)

In continuare, sa stabilim cum sa analizam variabila nume_ companie din obiectul raw_data.

Metrica 2: Denumirea companiei

Variabila company_name este prima variabila care va trebui analizata din obiectul raw_data. Ca o recapitulare rapida, iata cum arata raw_data:

Variabila company_name se pastreaza in punctul final al statisticilor sub cheia dictionarului CompanyName. Pentru a analiza aceste date evidentiaza raw_data, putem utiliza acesti indici:

raw_data [Ticker] [ ‘Statistici’] [ ‘CompanyName’]

Includerea acestui lucru in bucla noastra de dinainte da acest lucru:

output_data = pd.DataFrame (pd.np.empty ((0,4))) pentru ticker in raw_data.columns: #Parce numele companiei – nu este completat inca company_name = raw_data [ticker] [‘statistici’] [‘companyName’ ] #Pretul pretului pe actiuni al companiei – nu a fost finalizat inca stoc_price = 0 #Rezultatul dividendului companiei – nu a fost finalizat inca dividend_yield = 0 new_column = pd.Series ([ticker, nume_ companie, stock_price, dividend_yield]) output_data = output_data.append (new_column , ignore_index = True)

Sa trecem la analizarea stocului_price.

Metrica 3: Pretul stocului

Variabila stock_price este cuprinsa in punctul final al pretului, care returneaza o singura valoare. Acest lucru inseamna ca nu este necesar sa incadram impreuna indici, cum am facut cu compania_nume.

Iata cum am putea analiza stocul_price din raw_data:

raw_data [ticker] [ ‘pret’]

Includerea acestui lucru in bucla noastra ne ofera:

output_data = pd.DataFrame (pd.np.empty ((0,4))) pentru ticker in raw_data.columns: #Prude numele companiei – nu este completat inca company_name = raw_data [ticker] [‘statistici’] [‘companyName’ ] #Pretul pretului pe actiuni al companiei – nu a fost finalizat inca stock_price = raw_data [ticker] [‘price’] #Prend randamentul dividendelor companiei – nu a fost completat inca dividend_yield = 0 new_column = pd.Series ([ticker, nume_ companie, stoc_price, dividend_yield] ) output_data = output_data.append (new_column, ignore_index = True)

Ultima masura pe care trebuie sa o analizam este dividend_yield.

Metrica 4: Randamentul dividendelor

Ca si numele companiei, dividend_yield este continut in punctul final al statisticilor. Se pastreaza sub cheia de dictionar dividendYield.

Iata cum am putea sa-l analizam din raw_data:

raw_data [Ticker] [ ‘Statistici’] [ ‘dividendYield’]

Adaugarea acestui lucru la bucla noastra pentru a ne ofera:

output_data = pd.DataFrame (pd.np.empty ((0,4))) pentru ticker in raw_data.columns: #Parce numele companiei – nu este completat inca company_name = raw_data [ticker] [‘statistici’] [‘companyName’ ] #Pretul pretului pe actiuni al companiei – nu a fost finalizat inca stock_price = raw_data [ticker] [‘price’] #Retitul dividendului companiei – nu a fost finalizat inca dividend_yield = raw_data [ticker] [‘statistici’] [‘dividendYield’] new_column = pd.Series ([ticker, nume companie, stoc_price, dividend_yield]) output_data = output_data.append (new_column, ignore_index = True)

Sa tiparim obiectul nostru output_data pentru a vedea cum arata datele:

Pana acum, bine! Urmatorii doi pasi sunt numiti coloanele DataFrame pandas si schimbarea indexului.

Cum sa denumiti Coloanele unui Fisier Data Pandas

Putem actualiza numele coloanelor obiectului nostru output_data prin crearea unei liste de nume de coloana si atribuirea atributului output_data.columns, astfel:

output_data.columns = [‘Ticker’, ‘Denumirea companiei’, ‘Pretul stocului’, ‘Dividend rendiment’]

Sa tiparim obiectul nostru output_data pentru a vedea cum arata datele:

Mult mai bine! Sa schimbam indicele de iesire_data.

Cum puteti schimba indexul unei fisiere de date Pandas

Indexul unui DataFrame pandas este o coloana speciala, care este oarecum similara cu cheia primara a unei tabele de baze de date SQL. In obiectul nostru output_data, dorim sa setam coloana Ticker ca index al DataFrame.

Iata cum putem face acest lucru folosind metoda set_index:

output_data.set_index (“Ticker”, inplace = True)

Sa tiparim obiectul nostru output_data pentru a vedea cum arata datele:

O alta imbunatatire incrementala!

In continuare, sa ne ocupam de datele lipsa din output_data.

Cum sa gestionati date care lipsesc in Pandas DataFrames

Daca aruncati o privire atenta la output_data, veti observa ca exista mai multe valori None in coloana Dividend Rendem:

Aceste valori None indica pur si simplu ca compania din acel rand nu plateste in prezent un dividend. Cu toate ca Niciuna nu este o modalitate de a reprezenta un stoc fara dividende, este mai comuna afisarea unui randament de dividende de 0.

Din fericire, solutia pentru acest lucru este destul de simpla. Biblioteca pandas include o excelenta metoda fillna care ne permite sa inlocuim valorile lipsa intr-un pandas DataFrame.

Iata cum putem folosi metoda fillna pentru a inlocui valorile Niciunii coloanei cu Dividend Rendiment cu 0:

output_data [‘Dividend Eield’]. fillna (0, inplace = True)

Obiectul output_data pare mult mai curat acum:

Acum suntem gata sa exportam DataFrame intr-un document Excel! Ca o recapitulare rapida, iata scriptul nostru Python pana in prezent:

import panda ca pd IEX_API_Key = ” # Specificati marcatele de stocuri care vor fi incluse in foile de calcul tickers = [‘MSFT’, ‘AAPL’, ‘AMZN’, ‘GOOG’, ‘FB’, ‘BRK.B’, ‘ JNJ ‘,’ WMT ‘,’ V ‘,’ PG ‘] # Creati un sir gol, numit `ticker_string`, pe care il vom adauga tickers si virgule la ticker_string =’ ‘#Loop prin fiecare element din` tickers` si le vom adauga o virgula catre ticker_string pentru ticker in tickers: ticker_string + = ticker ticker_string + = ‘,’ #Drop ultima virgula din `ticker_string` ticker_string = ticker_string [: – 1] #Create the endpoint string endpoints = ‘price, stats’ #Interpolate sirurile de final in sirul HTTP_request HTTP_request = in http: //cloud.iexapis.com/stable/stock/market/batch? Symbols = {ticker_string} &types = {endpoints} & range = 1y & token = {IEX_API_Key} ‘#Creati un DataFrame pand gol pentru a adauga valorile noastre parsate in timpul nostru pentru bucla output_data = pd.DataFrame (pd.np.empty ((0,4))) pentru ticker in raw_data.columns: #Pars numele companiei company_name = raw_data [ticker] [‘statistici’] [‘nameNume companie’] #Parse pretul pe actiune al companiei stock_price = raw_data [ticker] [‘pret’] #Parsul companiei randamentul dividendului_yield = raw_data [ticker] [‘stats’] [‘dividendYield’] new_column = pd.Series ([ticker, nume_ companie, stock_price, dividend_yield]) output_data = output_data.append (new_column, ignore_index = True) # Schimba numele coloanelor output_data output_data.columns = [‘Ticker’, ‘Denumirea companiei’, ‘Pretul stocului’, ‘Dividend rendiment’] # Schimba indexul output_data output_data.set_index (‘Ticker’, inplace = True) #Reinlocuieste valorile lipsa ale coloanei ‘Dividend Rendent’ cu 0 output_data [‘Dividend Rendement’]. Imprimati dataFrame output_data

Cum sa exporti un document Excel Styled dintr-un Pandora DataFrame folosind XlsxWriter

Exista mai multe modalitati de a exporta un fisier xlsx dintr-un pandas DataFrame.

Cel mai simplu mod este de a utiliza functia incorporata to_excel. Ca exemplu, iata cum am putea exporta output_data intr-un fisier Excel:

output_data.to_excel ( “my_excel_document.xlsx)

Problema cu aceasta abordare este ca fisierul Excel nu are format. Rezultatul arata astfel:

Lipsa de formatare din acest document face dificila interpretarea.

Care este solutia?

Putem folosi pachetul Python XlsxWriter pentru a genera fisiere Excel bine formatate. Pentru inceput, vom dori sa adaugam importul urmator la inceputul scriptului nostru Python:

import xlsxwriter

In continuare, trebuie sa ne cream fisierul Excel real. Pachetul XlsxWriter are de fapt o pagina de documentare dedicata pentru a lucra cu DataFrames pandas, care este disponibila aici.

Primul nostru pas este sa apelam la functia pd.ExcelWriter si sa trecem in numele dorit al fisierului nostru xlsx ca prim argument si motor = ‘xlsxwriter ca al doilea argument. Vom atribui acest lucru unei variabile numite scriitor:

writer = pd.ExcelWriter (‘stock_market_data.xlsx’, motor = ‘xlsxwriter’)

De acolo, trebuie sa apelam la metoda to_excel pe panda DataFrame. De data aceasta, in loc sa transmitem numele fisierului pe care incercam sa-l exportam, vom trece la obiectul scriitor pe care tocmai l-am creat:

output_data.to_excel (scriitor, foaie nume = ‘Foaie1’)

In sfarsit, vom apela la metoda de salvare pe obiectul nostru scriitor, care salveaza fisierul xlsx in directorul nostru de lucru curent. Cand toate acestea sunt facute, aici este sectiunea scriptului nostru Python care salveaza output_data intr-un fisier Excel.

writer = pd.ExcelWriter (‘stock_market_data.xlsx’, engine = ‘xlsxwriter’) output_data.to_excel (writer, sheet_name = ‘Sheet1’) writer.save ()

Toate codurile de formatare pe care le vom include in fisierul nostru xlsx trebuie sa fie cuprinse intre crearea obiectului ExcelWriter si instructiunea writer.save ().

Cum sa stil un fisier xlsx creat cu Python

Este de fapt mai greu decat te-ai putea gandi sa creezi un fisier Excel folosind Python.

Acest lucru este partial din cauza unora dintre limitarile pachetului XlsxWriter. Documentatia sa prevede:

„XlsxWriter si Pandas ofera foarte putin suport pentru formatarea datelor de iesire dintr-un cadru de date, in afara de formatarea implicita, cum ar fi antetul si celulele index si orice celule care contin date sau date. In plus, nu este posibil sa formatati celule care au deja un format implicit aplicat. Daca aveti nevoie de formatarea foarte controlata a iesirii cadrului de date, atunci probabil ca ar fi mai bine sa folositi Xlsxwriter direct cu datele brute preluate de la Pandas. Cu toate acestea, unele optiuni de formatare sunt disponibile. “

In experienta mea, cea mai flexibila modalitate de a stilul celulelor dintr-un fisier xlsx creat de XlsxWriter este sa folosesti formatarea conditionata care se aplica styling-ului doar atunci cand o celula nu este egala cu None.

Aceasta are trei avantaje:

  1. Ofera mai multa flexibilitate de stil decat optiunile normale de formatare disponibile in XlsxWriter.
  2. Nu este necesar sa faceti bucla manuala prin fiecare punct de date si sa le importati in obiectul scriitorului, unul cate unul.
  3. Va permite sa vedeti cu usurinta cand valorile Niciuna nu si-au croit drum in fisierele dvs. xlsx finalizate, deoarece acestea vor lipsi formatarea necesara.

Pentru a aplica stilul folosind formatarea conditionata, mai intai trebuie sa cream cateva sabloane de stil. Mai exact, vom avea nevoie de patru sabloane:

  • Un antet_templat care va fi aplicat numelor de coloane din partea de sus a foii de calcul
  • Un sir_templat care va fi aplicat coloanelor Ticker and Company Name
  • Un tip de dolar care va fi aplicat coloanei Pretul actiunilor
  • Un procent_templat care va fi aplicat coloanei cu dividendul

Fiecare dintre aceste sabloane de format trebuie adaugate obiectului scriitor in dictionare care seamana cu sintaxa CSS. Iata ce vreau sa spun:

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})

Pentru a aplica aceste formate pe anumite celule din fisierul nostru xlsx, trebuie sa apelam la metoda conditional_format a pachetului pe writer.sheets [‘Date de piata bursiera’]. Iata un exemplu:

writer.sheets [‘Datele pietei bursiere’]. conditional_format (‘A2: B11’, {‘type’: ‘celula’, ‘criterii’: ‘<>’, ‘valoare’: ” Niciuna ”, ‘format’ : string_template})

Daca generalizam aceasta formatare la celelalte trei formate pe care le aplicam, iata care devine sectiunea de formatare a scriptului nostru Python:

writer = pd.ExcelWriter (‘stock_market_data.xlsx’, engine = ‘xlsxwriter’) output_data.to_excel (writer, sheet_name = ‘Data pietei bursiere’) 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 antetul foii de calcul writer.sheets [‘Date privind piata de valori’]. conditional_format (‘A1: D1’, {‘type’: ‘celula’, ‘criterii ‘:’ <> ‘,’ valoare ‘:’ ‘Niciuna’ ‘,’ format ‘: header_template}) #Format coloanele’ Ticker ‘si’ Nume companie ‘writer.sheets [‘ Datele pietei bursiere ‘]. conditional_format ( ‘A2: B11’, {‘type’: ‘celula’, ‘criterii’: ‘<>’, ‘valoare’: ” Niciunul ”, ‘format’: string_template}) #Format scriitorul de rubrici ‘Pretul stocului’ .sheets [‘Date ale pietei bursiere’]. conditional_format (‘C2: C11’, {‘type’: ‘celula’, ‘criterii’: ‘<>’, ‘valoare’: ” Niciuna ”, ‘format’: dollar_template}) #Formatati „coloana cu randamentul dividendului” column.sheets [„Date privind piata bursiera]]. conditional_format (‘D2: D11’, {‘tip’: ‘celula’, ‘criterii ‘:’ <> ‘,’ valoare ‘:’ ‘Niciuna’ ‘,’ format ‘: procent_template}) writer.save ()

Haideti sa aruncam o privire la documentul nostru Excel pentru a vedea cum arata:

Pana acum, bine! Ultima imbunatatire incrementala pe care o putem face acestui document este de a face coloanele sale un pic mai largi.

Putem specifica latimile coloanei apeland la metoda set_column pe writer.sheets [‘Date bursiera’].

Iata ce vom adauga la scriptul nostru Python pentru a face acest lucru:

#Specificati toate latimile coloanelor writer.sheets [‘Date despre piata de valori’]. Set_column (‘B: B’, 32) writer.sheets [‘Date de piata stoc’]. Set_column (‘C: C’, 18) writer.sheets [„Datele pietei bursiere”]. Set_column („D: D”, 20)

Iata versiunea finala a foii de calcul:

Voila! Suntem bine sa mergem! Puteti accesa versiunea finala a acestui script Python pe GitHub aici. Fisierul este numit stock_market_data.py.

Pasul 3: Configurati o masina virtuala AWS EC2 pentru a rula scriptul dvs. Python

Scriptul dvs. Python este finalizat si gata de a rula.

Cu toate acestea, nu vrem sa rulam pur si simplu acest lucru pe masina noastra locala, in mod ad-hoc.

In schimb, vom configura o masina virtuala utilizand serviciul Cloud Eludele Compute Cloud (EC2) al Amazon Web Services.

Mai intai va trebui sa creati un cont AWS daca nu aveti deja unul. Pentru aceasta, navigati la aceasta adresa URL si faceti clic pe „Creati un cont AWS” in coltul din dreapta sus:

Aplicatia web AWS va va ghida prin etapele de creare a unui cont.

Dupa crearea contului dvs., va trebui sa creati o instanta EC2. Acesta este pur si simplu un server virtual pentru rularea codului pe infrastructura AWS.

Instantele EC2 vin in diferite sisteme de operare si dimensiuni, de la servere foarte mici care se califica pentru nivelul gratuit AWS pana la servere foarte mari, capabile sa ruleze aplicatii complexe.

video porno anal http://alimpex.net/__media__/js/netsoltrademark.php?d=adult66.net/
porno gangbang anal http://wizardofweed.com/__media__/js/netsoltrademark.php?d=adult66.net/
porno mature hamster http://incredibleserver.com/__media__/js/netsoltrademark.php?d=adult66.net/
film porno in romana http://prenupexperts.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/amatori
filme porno taxi http://online-tvpc.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/anal
filme porno cu sot si sotie http://thecalogallery.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/asiatice
filme porno romania http://wdcep.net/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/beeg
big brother porno http://crowdcentrex.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/blonde
filme porno cu femei romance http://ioarc.net/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/brazzers
porno r http://resolveitresources.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/brunete
porno cu soacre http://k-kauppa.mobi/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/chaturbate
fime porno cu mature http://taxsalebuyer.com/__media__/js/netsoltrademark.php?d=adult66.net/blonda-in-lenjerie-intima-sexy-e-fututa-anal-de-prietenul-ei
free mature porno http://mytixs.com/__media__/js/netsoltrademark.php?d=adult66.net/pustoaica-de-17-ani-e-violata-in-patul-ei-de-doi-prieteni-veniti-in-vizita
filme porno cu maimute http://radiovision.tv/__media__/js/netsoltrademark.php?d=adult66.net/partida-de-sex-cu-doi-adolescenti-virgini-care-se-filmeaza
mia khalifa filme porno http://hipstirbarware.com/__media__/js/netsoltrademark.php?d=adult66.net/cuplu-de-amatori-isi-filmeaza-partida-de-sex-porno-apoi-au-orgasm
you porno http://azcentralmls.info/__media__/js/netsoltrademark.php?d=adult66.net/doi-minori-amatori-fac-sex-salbatic-si-se-filmeaza
siteuri porno http://goodhousekeepingmagazine.info/__media__/js/netsoltrademark.php?d=adult66.net/cuplu-de-amatori-excitati-face-sex-fierbinte-in-jacuzzi-si-se-filmeaza-cum-se-fut
porno alexis texas http://rapc.biz/__media__/js/netsoltrademark.php?d=adult66.net/sex-anal-sex-oral-cu-un-cuplu-de-amatori-pe-canapeaua-din-sufragerie
porno star hd http://magikanrefills.net/__media__/js/netsoltrademark.php?d=adult66.net/doi-indragostiti-fac-sex-romantic-si-se-filmeaza-unu-pe-altu
porno masturbari http://thewarwicks.com/__media__/js/netsoltrademark.php?d=adult66.net/bruneta-draguta-e-dezvirginata-pe-bune-de-prietenul-mai-mare-care-o-filmeaza

Vom folosi cel mai mic server AWS pentru a rula scriptul Python pe care l-am scris in acest articol. Pentru a incepe, navigati la EC2 in consola de administrare AWS. Dupa ce ati ajuns in EC2, faceti clic pe Lansare instanta:

Acest lucru va va duce la un ecran care contine toate tipurile de instanta disponibile in AWS EC2. Orice masina care se califica pentru nivelul liber AWS va fi suficienta.

Am ales Amazon Linux 2 AMI (HVM):

Faceti clic pe Selectare pentru a continua.

In pagina urmatoare, AWS va va solicita sa selectati specificatiile pentru aparatul dvs. Campurile pe care le puteti selecta includ:

  • Familie
  • Tip
  • vCPUs
  • Memorie
  • Stocare de instanta (GB)
  • EBS optimizat
  • Performanta retelei
  • Asistenta IPv6

In scopul acestui tutorial, dorim pur si simplu sa selectam masina unica care este eligibila pentru nivel liber. Se caracterizeaza printr-o mica eticheta verde care arata astfel:

Dupa ce ati selectat o masina eligibila cu nivel gratuit, faceti clic pe Revizuire si Lansare in partea de jos a ecranului pentru a continua. Urmatorul ecran va prezenta detaliile noii tale instante pentru a le putea examina. Examinati rapid specificatiile aparatului, apoi faceti clic pe Lansare in coltul din dreapta jos.

Facand clic pe butonul Lansare va declansa o fereastra care va va solicita sa selectati o pereche de chei existente sau sa creati o noua pereche de chei. O pereche de chei este alcatuita dintr-o cheie publica detinuta de AWS si o cheie privata pe care trebuie sa o descarcati si sa o stocati intr-un fisier .pem. Trebuie sa aveti acces la acel fisier .pem pentru a accesa instanta dvs. EC2 (de obicei prin SSH). De asemenea, aveti optiunea de a continua fara o pereche de chei, dar acest lucru nu este recomandat din motive de securitate.

Dupa ce ati selectat sau creat o pereche de chei pentru aceasta instanta EC2 si faceti clic pe butonul radio pentru ca recunosc ca am acces la fisierul de chei private selectat (data-feeds.pem) si ca fara acest fisier, nu voi fi pentru a va conecta la instanta mea, puteti da clic pe Lansare instante pentru a continua.

Instanta dvs. va incepe acum sa se lanseze. Poate dura ceva timp pentru ca aceste instante sa se porneasca, dar odata gata, starea sa de instanta va aparea ca fiind rulata in tabloul de bord EC2.

In continuare, va trebui sa impingeti scriptul Python in instanta EC2. Iata o declaratie de stare de comanda generica care va permite sa mutati un fisier intr-o instanta EC2:

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

Executati aceasta declaratie cu inlocuirile necesare pentru a muta stock_market_data.py in instanta EC2.

Incercarea de a rula stock_market_data.py in acest moment va duce de fapt la o eroare, deoarece instanta EC2 nu vine cu pachetele Python necesare.

Pentru a remedia acest lucru, puteti exporta fisierul require.txt si importa pachetele corespunzatoare folosind pip, sau puteti rula pur si simplu urmatoarele:

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

Odata facut acest lucru, puteti SSH in instanta EC2 si rulati scriptul Python din linia de comanda cu urmatoarea afirmatie:

python3 stock_market_data.py

Pasul 4: Creati o cupa AWS S3 pentru a tine scriptul Python finalizat

Cu munca pe care am finalizat-o pana acum, scriptul nostru Python poate fi executat in cadrul instantei noastre EC2.

Problema cu aceasta este ca fisierul xlsx va fi salvat pe serverul virtual AWS.

Nu este accesibila nimanui, dar noi, in acel server, ceea ce ii limiteaza utilitatea.

Pentru a remedia acest lucru, vom crea o bucketa publica pe AWS S3, unde putem salva fisierul xlsx. Oricine are adresa URL corecta va putea descarca acest fisier odata ce aceasta modificare va fi facuta.

Pentru a incepe, navigati la AWS S3 din AWS Management Console. Faceti clic pe Creati galeata in partea dreapta sus:

Pe ecranul urmator, va trebui sa alegeti un nume pentru galeata si o regiune AWS in care sa fie gazduita galeata. Numele galetii trebuie sa fie unic si nu poate contine spatii sau litere mari. Regiunea nu conteaza prea mult in scopul acestui tutorial, asa ca voi folosi regiunea implicita din US East (Ohio) us-east-2).

Va trebui sa schimbati setarile de acces public in sectiunea urmatoare pentru a se potrivi cu aceasta configuratie:

Faceti clic pe Creare galeata pentru a crea galeata si incheiati acest pas al acestui tutorial!

Pasul 5: Modificati scriptul dvs. Python pentru a impinge fisierul xlsx in AWS S3

Cupa noastra AWS S3 este acum gata sa retina documentul nostru xlsx finalizat. Vom face acum o mica modificare a fisierului nostru stock_market_data.py pentru a impinge documentul finalizat in galeata noastra S3.

Va trebui sa folosim pachetul boto3 pentru a face acest lucru. boto3 este AWS Software Development Kit (SDK) pentru Python, care permite dezvoltatorilor Python sa scrie software care se conecteaza la serviciile AWS. Pentru a incepe, va trebui sa instalati boto3 pe masina dvs. virtuala EC2. Executati urmatoarea instructiune de linie de comanda pentru a face acest lucru:

pip3 instala boto3

De asemenea, va trebui sa importati biblioteca in stock_market_data.py adaugand urmatoarea declaratie in partea de sus a scriptului Python.

import boto3

Va trebui sa adaugam cateva linii de cod la sfarsitul stock_market_data.py pentru a impinge documentul final in 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’ ‘ })

Prima linie a acestui cod, s3 = boto3.resource (‘s3’), permite scriptului nostru Python sa se conecteze la Amazon Web Services.

A doua linie de cod apeleaza la o metoda de la boto3 care incarca de fapt fisierul nostru in S3. Este nevoie de patru argumente:

  • stock_market_data.xlsx – numele fisierului pe masina noastra locala.
  • my-S3-bucket – numele bucketului S3 la care ne incarcam fisierul.
  • stock_market_data.xlsx – numele dorit al fisierului din galeata S3. In cele mai multe cazuri, aceasta va avea aceeasi valoare ca primul argument transmis in aceasta metoda.
  • ExtraArgs = {‘ACL’: ‘public-read’} – acesta este un argument optional care spune AWS pentru ca fisierul incarcat sa poata fi citit public.

Pasul 6: Programeaza-ti scriptul Python pentru a rula periodic utilizand Cron

Pana in prezent, am finalizat urmatoarele:

  • Construit scriptul nostru Python
  • A creat o instanta EC2 si a implementat codul nostru acolo
  • A creat o galeata S3 unde putem impinge documentul final xlsx
  • A modificat scriptul Python original pentru a incarca fisierul stock_market_data.xlsx finalizat intr-o galeata AWS S3

Singurul pas care ramane este sa planifici scriptul Python sa ruleze periodic.

Putem face acest lucru folosind o utilitate pentru linia de comanda numita cron. Pentru a incepe, va trebui sa cream o expresie cron care sa anunte utilitatea cand sa execute codul. Site-ul crontab guru este o resursa excelenta pentru acest lucru.

Iata cum puteti utiliza guru crontab pentru a obtine expresia cron care inseamna in fiecare zi la pranz:

Acum trebuie sa instruim demonul cron al instantei noastre EC2 pentru a rula stoc_market_data.py in acest moment in fiecare zi.

Pentru a face acest lucru, vom crea mai intai un nou fisier in instanta noastra EC2 numita stock_market_data.cron.

Deschideti acest fisier si tastati in expresia noastra cron, urmata de instructiunea care ar trebui sa fie executata la linia de comanda la acel moment specificat.

Instructiunea noastra de linie de comanda este python3 stock_market_data.py, deci iata ce ar trebui sa fie continut in stock_market_data.cron:

00 12 * * * python3 stock_market_data.py

Daca executati o comanda ls in instanta dvs. EC2, acum ar trebui sa vedeti doua fisiere:

stock_market_data.py stock_market_data.cron

Ultimul pas al acestui tutorial este incarcarea stock_market_data.cron in crontab. Va puteti gandi la crontab ca un fisier care contine comenzi si instructiuni pentru demonul cron sa fie executat. Cu alte cuvinte, crontab contine loturi de joburi cron.

In primul rand, sa vedem ce este in crontab-ul nostru. Ar trebui sa fie gol, din moment ce nu am pus nimic in el! Puteti vizualiza continutul crontab-ului dvs. cu urmatoarea comanda:

crontab -l

Pentru a incarca stock_market_data.cron in crontab, executati urmatoarea instructiune pe linia de comanda:

crontab stock_market_data.cron

Acum, atunci cand rulati crontab -l, ar trebui sa vedeti:

00 12 * * * python3 stock_market_data.py

Scriptul nostru stock_market_data.py va rula acum la pranz in fiecare zi pe masina noastra virtuala AWS EC2!

Ganduri finale

In acest articol, ati invatat cum sa creati actualizarea automata a foilor de calcul Excel cu date financiare utilizand Python, IEX Cloud si Amazon Web Services.

Iata pasii specifici pe care i-am parcurs in acest tutorial:

  • Cum se creeaza un cont cu IEX Cloud
  • Cum se scrie un script Python care genereaza documente Excelente folosind pandas si XlsxWriter
  • Cum se lanseaza o instanta AWS EC2 si se implementeaza codul pe ea
  • Cum se creeaza o galeata AWS S3
  • Cum sa impingeti fisierele intr-un compartiment AWS S3 dintr-un script Python
  • Cum sa programati codul pentru a rula folosind utilitarul software cron

Acest articol a fost publicat de Nick McCullum, care ii invata pe oameni cum sa codeze pe site-ul sau.

Invata sa codam gratuit. Programul de invatamant open source freeCodeCamp a ajutat mai mult de 40.000 de oameni sa obtina locuri de munca ca dezvoltatori. Incepe