<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivos Matheus Duzzi Ribeiro - Estatidados</title>
	<atom:link href="http://estatidados.com.br/category/professores-colaboradores/matheus-duzzi-ribeiro/feed/" rel="self" type="application/rss+xml" />
	<link>http://estatidados.com.br</link>
	<description>Comunidade de Estatística</description>
	<lastBuildDate>Thu, 09 Jun 2022 21:17:29 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.5</generator>
	<item>
		<title>Do scrap ao deploy com Shiny</title>
		<link>http://estatidados.com.br/do-scrap-ao-deploy-com-shiny/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=do-scrap-ao-deploy-com-shiny</link>
					<comments>http://estatidados.com.br/do-scrap-ao-deploy-com-shiny/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Fri, 24 Sep 2021 10:51:52 +0000</pubDate>
				<category><![CDATA[ciencia de dados]]></category>
		<category><![CDATA[Matheus Duzzi Ribeiro]]></category>
		<category><![CDATA[Professores colaboradores]]></category>
		<guid isPermaLink="false">http://estatidados.com.br/?p=650</guid>

					<description><![CDATA[<p>Mostrando as empresas por trás dos tickers da bolsa e prevendo seu fechamento de maneira direta A partir do momento que você precisa deixar uma análise, modelo ou mesmo um resultado disponível para as pessoas da sua equipe em qualquer<a class="leiamais" href="http://estatidados.com.br/do-scrap-ao-deploy-com-shiny/" title="Do scrap ao deploy com Shiny">...[Continuar lendo]</a></p>
<p>O post <a rel="nofollow" href="http://estatidados.com.br/do-scrap-ao-deploy-com-shiny/">Do scrap ao deploy com Shiny</a> apareceu primeiro em <a rel="nofollow" href="http://estatidados.com.br">Estatidados</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p id="a0c1">Mostrando as empresas por trás dos tickers da bolsa e prevendo seu fechamento de maneira direta</p>



<p id="e4b1">A partir do momento que você precisa deixar uma análise, modelo ou mesmo um resultado disponível para as pessoas da sua equipe em qualquer momento, é hora de lidar com o que chamamos de&nbsp;<em>deploy&nbsp;</em>de produtos de dados.</p>



<p id="4f44">O termo&nbsp;<em>deploy&nbsp;</em>remete a ação de automatizar aquilo que você fez na sua própria máquina, deixando o algoritmo executar periodicamente a rotina programada. Esse código pode ser de uma coleta, limpeza, modelagem, análise ou mesmo todas essas etapas juntas para compor um dashboard, como iremos fazer aqui hoje.</p>



<p id="b61d">Assim, o problema que iremos resolver aqui é:&nbsp;<em>mostrar de maneira dinâmica as principais características das empresa listadas na bolsa brasileira, a ibovespa, além de aplicar um modelo preditivo para tentar prever o fechamento de cada ticker nos dias seguintes ao acesso da dashboard, de modo que o usuário possa ter uma visão geral daquela empresa e tomar suas decisões de negócio baseada em dados.</em></p>



<figure class="wp-block-image"><img src="https://miro.medium.com/max/1400/0*3hH9uro8TpZj_7Hr.png" alt=""/><figcaption>Ciclo de vida de desenvolvimento de software — Fonte: Trybe</figcaption></figure>



<p id="851c">Assim, pensando no ciclo acima e no problema exposto, seguiremos com os seguintes passos:</p>



<p id="8eb6"><strong>Coleta de dados</strong></p>



<ul><li>Vamos entender&nbsp;<em>como</em>,&nbsp;<em>quando</em>&nbsp;e de&nbsp;<em>onde</em>&nbsp;coletaremos os dados. Dessa forma, a partir disso poderemos ver onde existe necessidade de adaptar a forma como usamos a fonte de dados para “plugar” da melhor maneira no nosso dashboard.</li></ul>



<p id="8d6e"><strong>Desenvolvimento da aplicação</strong></p>



<ul><li>Construir o painel em Shiny, pensando já que esse painel deverá&nbsp;<em>“se manter sozinho”</em>. Digo isso, pois se estamos acostumados a sempre construir uma análise para ser mantida localmente, criamos alguns hábitos como o uso de variáveis que armazenam os dados para uso linear durante o código, sofrendo mudanças que muitas vezes não podem ser desfeitas durante a compilação, como por exemplo, a limpeza de dados faltantes.</li></ul>



<p id="d7b7"><strong>Deploy</strong></p>



<ul><li>Por fim, chegamos ao ponto de publicar no Shiny Apps. Sempre tenha em mente algumas boas práticas nessa etapa, como: verificar se o arquivo do shiny está como&nbsp;<em>app.R</em>, se esse arquivo está em uma pasta própria para o projeto e se os possíveis arquivos utilizados estão dentro dessa pasta.</li></ul>



<h1 id="3a9b">Coleta de dados</h1>



<p id="2cc3">Pensando nos dados que alimentaram nosso painel, teremos duas fontes, sendo elas a API do Yahoo!, a&nbsp;<em>Yahoo Finance</em>, e um scrap da&nbsp;<em>Wikipedia</em>. A escolha dessas fontes têm motivos bem simples:</p>



<ul><li>A API do Yahoo é gratuita, tendo um limite de requests razoável para o nosso objetivo e a latência de atualização é viável, pensando que iremos querer somente fechamento dos tickers e não sua cotação em tempo real.</li><li>A Wikipedia em sua natureza possui um bom padrão de publicação, de modo que uma rotina de webscraping consegue facilmente consumir seus dados.</li></ul>



<figure class="wp-block-image"><img src="https://miro.medium.com/max/810/1*qgAL2MJ40vsWIKYvypOAhA.png" alt=""/></figure>



<p id="f530">Veja que o primeiro parágrafo de uma página de empresa conta com uma introdução simples e direta da mesma.</p>



<figure class="wp-block-image"><img src="https://miro.medium.com/max/403/1*cYdSvl57eiAMA0YrebzBBw.png" alt=""/></figure>



<p id="bf70">Além disso, o site disponibiliza um card que pode ser transformado em um “cartão de apresentação” da empresa em forma de tabela.</p>



<figure class="wp-block-image"><img src="https://miro.medium.com/max/875/1*yGfSojmhp2UGV80FjEP3CA.png" alt=""/></figure>



<p id="e279">Por fim, a própria Wikipedia disponibiliza também uma tabela com as principais empresas listadas na bolsa de valores, implantando em cada um dos nomes o link que guia para sua página na enciclopédia digital, de modo que possamos usar essa lista para construir a escolha do usuário de qual empresa ele gostaria de ver em sua tela, guiando qual “vertente” da Wikipedia devemos puxar os dados.</p>



<h1 id="fc35"><strong>Desenvolvimento e deploy da aplicação</strong></h1>



<p id="e43e">Dado que o Shiny possui um server gratuito disponível para deploy, isto é, podemos deixar nosso painel disponível para quem queira acessar (podendo até implementar uma página de autenticação, se necessário), iremos programar o dashboard em R e publicar no shinyapps.io.</p>



<p id="ef93">É legal ressaltar que além do shinyapps, outra alternativa muito interessante para quem programa em python e deseja colocar seus dashboards em produção é o&nbsp;<em>Streamlit</em>&nbsp;, pelo qual podemos vincular um código no github para virar um painel.</p>



<p id="f56e">Agora que já sabemos de todos os passos a serem seguidos, é hora de por a mão na massa!</p>



<pre class="wp-block-preformatted">library(tidyr)<br>library(dplyr)<br>library(rvest)<br>library(dygraphs)<br>library(BatchGetSymbols)<br>library(shiny)<br>library(forecast)# tabela de acoes<br>wiki1 &lt;- "<a href="https://pt.wikipedia.org/wiki/Lista_de_companhias_citadas_no_Ibovespa">https://pt.wikipedia.org/wiki/Lista_de_companhias_citadas_no_Ibovespa</a>"<br>doc1 &lt;- read_html(wiki1) <br>doc1 %&gt;% <br>    html_nodes(xpath = '//*[<a href="http://twitter.com/id">@id</a>="mw-content-text"]/div/table[1]') %&gt;%<br>    html_table() -&gt; tabela_b3 <br>tabela_acoes &lt;- as.data.frame(tabela_b3) </pre>



<p id="4ec5">Importando as bibliotecas que serão utilizadas, podemos ver alguns nomes comuns para os mais familiarizados com R, como&nbsp;<em>tidyr</em>,&nbsp;<em>dplyr</em>,&nbsp;<em>rvest</em>&nbsp;e&nbsp;<em>shiny.&nbsp;</em>Quanto as<em>&nbsp;</em>outras bibliotecas, temos a seguinte composição:</p>



<ul><li><strong>Dygraphs:</strong>&nbsp;biblioteca que entrega gráficos interativos de&nbsp;<em>“candle”</em>, famosos no mundo da renda variável.</li><li><strong>BatchGetSymbols:</strong>&nbsp;API do Yahoo! Finance</li><li><strong>Forecast:</strong>&nbsp;algoritmos de manipulação e modelagem de séries temporais</li></ul>



<p id="ff6f">Dito isso, começamos com o scrap de dados da Wikipedia, e para esse tarefa iremos iniciar com a coleta dos dados da tabela de tickers. Nesse momento, a ideia é que apontemos a página, por meio de uma URL, a qual iremos escolher o componente HTML que queremos coletar, e por fim, passamos o dado coletado para um dataframe.</p>



<pre class="wp-block-preformatted">links = doc1 %&gt;% html_nodes(xpath = "//td/a") %&gt;% <br>    html_attr("href")<br>links = data.frame(links)<br>links = links %&gt;% filter(!grepl("/wiki/Ficheiro",links) &amp;  !grepl("<a href="http://www.taesa.com.br/">http://www.taesa.com.br/</a>",links))</pre>



<p id="0b3b">Visto que sabemos que os links para cada empresa estão como hiperlinks, passamos novamente um “filtro” no HTML, pegando esses dados e retirando alguns erros de processamento, como duplicação ou termos que não gostaríamos que aparecesse no dataframe de links.</p>



<pre class="wp-block-preformatted">tabela_acoes = tabela_acoes %&gt;% filter(`Código` != "BBDC3" &amp; `Código` !="PETR3" &amp; `Código` !="BRML3" &amp; `Código` != "CCRO3" &amp; `Código` != "ELET3")<br>acesso = cbind(tabela_acoes,links)<br>acesso = acesso %&gt;% select(`Código`,links)</pre>



<p id="3c21">Por fim, retiramos alguns casos onde a tabela está mesclada, de modo que o join entre os links de cada empresa no Wikipedia e o ticker permaneçam na mesma ordem. Unimos os dados em um único dataframe e fechamos a etapa de coleta.</p>



<pre class="wp-block-preformatted">ui &lt;- fluidPage(<br>    theme = shinythemes::shinytheme("united"),titlePanel("Conhecendo a B3"),sidebarLayout(<br>        sidebarPanel(<br>            h3("Escolha uma ação"),<br>            selectInput("escolha_acao", "Ação:", <br>                        choices = acesso$Código)<br>        ),<br>        mainPanel(<br>            textOutput("nome_empresa"),<br>            tags$hr(style="border-color: white;"),tags$hr(style="border-color: white;"),<br>            textOutput("primeiro_paragrafo"),<br>            tags$hr(style="border-color: white;"),tags$hr(style="border-color: white;"),<br>            DT::dataTableOutput("card_wiki"),<br>            tags$hr(style="border-color: white;"),tags$hr(style="border-color: white;"),<br>            h3("Cotação Histórica da empresa"),<br>            dygraphOutput("candle"),<br>            tags$hr(style="border-color: white;"),tags$hr(style="border-color: white;"),<br>            h3("Previsão para os próximos dias (fechamento)"),<br>            tags$hr(style="border-color: white;"),<br>            DT::dataTableOutput("prev"),<br>        )<br>    )<br>)</pre>



<p id="c7bb">Partindo para a construção da interface, codificamos um painel simples de seleção do ticker com&nbsp;<em>SidebarPanel</em>, alinhado<em>&nbsp;</em>a dois componentes de texto dinâmicos (título e primeiro parágrafo), uma tabela dinâmica, um gráfico candle e uma outra tabela para soltar a previsão do ticker.</p>



<pre class="wp-block-preformatted">server &lt;- function(input, output) {<br>    <br>    output$card_wiki = DT::renderDataTable({<br>        <br>        acesso = acesso %&gt;% filter(`Código`== input$escolha_acao)<br>        <br>        wiki1 &lt;- paste0("<a href="https://pt.wikipedia.org/">https://pt.wikipedia.org/</a>",acesso$links[1])<br>        doc1 &lt;- read_html(wiki1) <br>        doc1 %&gt;% <br>            html_nodes(xpath = '//*[<a href="http://twitter.com/id">@id</a>="mw-content-text"]/div/table[1]') %&gt;%<br>            html_table() -&gt; tabela_carac_acao <br>        tabela_carac_acao  &lt;- as.data.frame(tabela_carac_acao)<br>        tabela_carac_acao &lt;- tabela_carac_acao[-1,]<br>        <br>        DT::datatable(<br>            tabela_carac_acao , options = list(paging = FALSE,searching = FALSE))<br>    })<br>    <br>    output$primeiro_paragrafo &lt;- renderText({acesso = acesso %&gt;% filter(`Código`== input$escolha_acao)<br>        <br>        wiki2 &lt;- paste0("<a href="https://pt.wikipedia.org/">https://pt.wikipedia.org/</a>",acesso$links[1])<br>        doc2 &lt;- read_html(wiki2) <br>        doc2 %&gt;% <br>            html_nodes(xpath = '//*[<a href="http://twitter.com/id">@id</a>="mw-content-text"]/div/p[1]') %&gt;%<br>            html_text() -&gt; primeiro_par<br>        primeiro_par<br>    })<br>    <br>    output$nome_empresa &lt;- renderText({<br>        <br>        acesso = acesso %&gt;% filter(`Código`== input$escolha_acao)<br>        <br>        wiki2 &lt;- paste0("<a href="https://pt.wikipedia.org/">https://pt.wikipedia.org/</a>",acesso$links[1])<br>        doc2 &lt;- read_html(wiki2) <br>        doc2 %&gt;% <br>            html_nodes(xpath = '//*[<a href="http://twitter.com/id">@id</a>="firstHeading"]') %&gt;%<br>            html_text() -&gt; nome_empresa<br>        nome_empresa<br>    })<br>    <br>    output$candle &lt;- renderDygraph({<br>        <br>        acesso = acesso %&gt;% filter(`Código`== input$escolha_acao)<br>        <br>        inicio &lt;- "2018-01-01" <br>        final &lt;- Sys.Date()<br>        bench.ticker &lt;- "^BVSP"<br>        saida &lt;- BatchGetSymbols(tickers = paste0(acesso$Código,".SA"), first.date = inicio, last.date = final, <br>                                 bench.ticker = bench.ticker)<br>        saida &lt;- as.data.frame(saida$df.tickers)<br>        <br>        row.names(saida) &lt;- saida$ref.date<br>        m &lt;- saida %&gt;% dplyr::select(-ref.date,-price.adjusted,-volume,-ticker,-ret.adjusted.prices,-ret.closing.prices)<br>        colnames(m) &lt;- c("Open","High","Low","Close")<br>        <br>        dygraph(m) %&gt;%<br>            dyCandlestick()<br>        <br>    })<br>    <br>    output$prev = DT::renderDataTable({<br>        <br>        acesso = acesso %&gt;% filter(`Código`== input$escolha_acao)<br>        <br>        inicio &lt;- "2018-01-01" <br>        final &lt;- Sys.Date()<br>        bench.ticker &lt;- "^BVSP"<br>        saida &lt;- BatchGetSymbols(tickers = paste0(acesso$Código,".SA"), first.date = inicio, last.date = final, <br>                                 bench.ticker = bench.ticker)<br>        saida &lt;- as.data.frame(saida$df.tickers)<br>        <br>        row.names(saida) &lt;- saida$ref.date<br>        d &lt;- saida %&gt;% dplyr::select(-ref.date,-price.adjusted,-volume,-ticker,-ret.adjusted.prices,-ret.closing.prices)<br>        colnames(d) &lt;- c("Open","High","Low","Close")<br>        <br>        tabela = as.data.frame(forecast(nnetar(ts(d$Close,start = c(2018), frequency = 365)),h=4))<br>        tabela = format(round(tabela, 2))<br>        rownames(tabela) &lt;- c(Sys.Date()+1,Sys.Date()+2,Sys.Date()+3,Sys.Date()+4)<br>        <br>        DT::datatable(tabela, options = list(paging = FALSE,searching = FALSE))<br>    })}</pre>



<p id="4312">Passando para a codificação do “backend”, iniciamos a construção do server. O nome da empresa, primeiro parágrafo e tabela da Wikipedia são configurados para terem a dinâmica de usar o que o usuário escolheu, juntando com o link da Wikipedia e fazendo uma varredura na página da empresa.</p>



<p id="21b9">Para o gráfico candle e a previsão, usamos a escolha do usuário para fazer um request na API do Yahoo! em dados de 2018 em diante, de modo que seja possível plotar e realizar uma previsão através de uma Rede Neural Feed-forward para os próximos 4 dias.</p>



<p id="8c90">Concluindo nosso trabalho, é só publicar no Shinyapps!</p>



<p id="901e">O resultado pode ser visto em&nbsp;<a href="https://matheusduzzi.shinyapps.io/wiki/">https://matheusduzzi.shinyapps.io/wiki/</a></p>
<p>O post <a rel="nofollow" href="http://estatidados.com.br/do-scrap-ao-deploy-com-shiny/">Do scrap ao deploy com Shiny</a> apareceu primeiro em <a rel="nofollow" href="http://estatidados.com.br">Estatidados</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://estatidados.com.br/do-scrap-ao-deploy-com-shiny/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
