/**
* jQuery Plugin: Sticky Tabs
*
* @author Aidan Lister
// Set the correct tab when the page loads showStuffFromHash(context);
// Set the correct tab when a user uses their back/forward button $(window).on('hashchange', function() { showStuffFromHash(context); });
// Change the URL when tabs are clicked $('a', context).on('click', function(e) { history.pushState(null, null, this.href); showStuffFromHash(context); });
return this; }; }(jQuery));
window.buildTabsets = function(tocID) {
// build a tabset from a section div with the .tabset class function buildTabset(tabset) {
// check for fade and pills options var fade = tabset.hasClass("tabset-fade"); var pills = tabset.hasClass("tabset-pills"); var navClass = pills ? "nav-pills" : "nav-tabs";
// determine the heading level of the tabset and tabs var match = tabset.attr('class').match(/level(\d) /); if (match === null) return; var tabsetLevel = Number(match[1]); var tabLevel = tabsetLevel + 1;
// find all subheadings immediately below var tabs = tabset.find("div.section.level" + tabLevel); if (!tabs.length) return;
// create tablist and tab-content elements var tabList = $('
'); $(tabs[0]).before(tabList); var tabContent = $('
'); $(tabs[0]).before(tabContent);
// build the tabset var activeTab = 0; tabs.each(function(i) {
// get the tab div var tab = $(tabs[i]);
// get the id then sanitize it for use with bootstrap tabs var id = tab.attr('id');
// see if this is marked as the active tab if (tab.hasClass('active')) activeTab = i;
// remove any table of contents entries associated with // this ID (since we'll be removing the heading element) $("div#" + tocID + " li a[href='#" + id + "']").parent().remove();
// sanitize the id for use with bootstrap tabs id = id.replace(/[.\/?&!#<>]/g, '').replace(/\s/g, '_'); tab.attr('id', id);
// get the heading element within it, grab it's text, then remove it var heading = tab.find('h' + tabLevel + ':first'); var headingText = heading.html(); heading.remove();
// build and append the tab list item var a = $('' + headingText + ''); a.attr('href', '#' + id); a.attr('aria-controls', id); var li = $('
'); li.append(a); tabList.append(li);
// set it's attributes tab.attr('role', 'tabpanel'); tab.addClass('tab-pane'); tab.addClass('tabbed-pane'); if (fade) tab.addClass('fade');
// move it into the tab content div tab.detach().appendTo(tabContent); });
// set active tab $(tabList.children('li')[activeTab]).addClass('active'); var active = $(tabContent.children('div.section')[activeTab]); active.addClass('active'); if (fade) active.addClass('in');
if (tabset.hasClass("tabset-sticky")) tabset.rmarkdownStickyTabs(); }
// convert section divs with the .tabset class to tabsets var tabsets = $("div.section.tabset"); tabsets.each(function(i) { buildTabset($(tabsets[i])); }); };
O R é uma linguagem de programação gratuita projetada especificamente para computação estatística e gráficos. É amplamente utilizada por estatísticos, cientistas de dados, pesquisadores e estudiosos para análise de informações estatísticas, para visualização e para modelagens de séries temporais, análise preditiva, machine learning e redes neurais.
Além disso, existe uma estrutura, chamada de RMarkdown, que permite combinar o poder do R com a simplicidade da formatação de texto e gráficos. Isso possibilita a execução de uma sequência de comandos R diretamente em documentos de texto para criar relatórios dinâmicos, trabalhos acadêmicos e mesmo páginas em HTML.
O ChatGPT também desempenha um papel valioso no aprimoramento de códigos em R, possibilitando a identificação e correção de erros, bem como a elevação do nível e a sofisticação de scripts. Contudo, é importante ressaltar que o conhecimento prévio da linguagem é fundamental, uma vez que o ChatGPT, ocasionalmente, oferece soluções que podem ser inconsistentes com um problema proposto. Nesse sentido, a crítica proveniente do analista de dados mantém sua relevância. Vale destacar que o presente script não foi gerado diretamente por meio da linguagem da OpenAI, sendo apenas utilizado para melhor expressar a lógica de organização do código.
Essas ferramentas conferem ao trabalho do analista uma nova dimensão e eficiência, reduzindo consideravelmente a necessidade dos pacotes do Microsoft Office. A coleta de informações agora ocorre diretamente em fontes primárias através de rotinas pré-estabelecidas. Os dados são consolidados em um ambiente integrado, facilitando a análise econômica, a modelagem e a visualização gráfica. Essa abordagem não apenas moderniza o processo, mas também otimiza a produtividade do trabalho.
Para dar um exemplo disso, demonstro abaixo um código para o acompanhamento da arrecadação de ICMS nominal (ICMS_N) e a valores constantes (ICMS_R), ou qualquer outra fonte de receita, destacando as variações de seu crescimento no período: mês anterior, mesmo mês no ano anterior e 12 meses.
Para começar, é necessário obter uma tabela com três colunas essenciais: MESES, IPCA (ou CONVERSOR) e ICMS-N. Os dados históricos de arrecadação nominal do Imposto sobre Circulação de Mercadorias e Serviços (ICMS) no Rio Grande do Sul podem ser extraídos em https://receita.dados.gov.br. A série temporal proposta inicia em “2000-01-01” e se utiliza um comando filter do pacote dplyr para selecionar a saída da tabela final (kable extra).
Ao se analisar as instruções abaixo, observe que utilizei um conversor para ajustar os valores nominais ao Índice Nacional de Preços ao Consumidor Amplo (IPCA) do Instituto Brasileiro de Geografia e Estatística (IBGE). Recomendo realizar correção direta no código, caso o leitor escolha a utilização do índice oficial do IPCA. Essa correção fica a cargo do usuário interessado. Certifique-se de selecionar a área correta para leitura no seu computador. Isso garantirá que os dados sejam importados de forma precisa.
Os dados são lidos no computador por meio do pacote “readxl::read_excel”, como exemplificado abaixo:
#dados_icmsn <- readxl::read_excel("/Users/escolha_área_dados/icmsn.xlsx")
Veja toda a estrutura do código abaixo.
library(tidyverse)
library(kableExtra)
library(RcppRoll)
library(readxl)
library(writexl)
# Função para calcular valores acumulados
acum_valor <- function(Valor, n) {
data_n <- roll_sum(Valor, n, na.rm = FALSE)
data_lag_n <- lag(data_n, n)
data_acum_n <- (((data_n / data_lag_n) - 1) * 100)
return(data_acum_n)
}
# Ler dados do Excel
dados <- read_excel("/Users/robertocalazans/icmsn_ipca.xlsx")
dados$MESES <- as.Date(dados$MESES)
# Converter IPCA e ICMS para numérico e calcular ICMSR e variações
tbl1 <- dados %>%
mutate(across(c(IPCA, ICMS), as.numeric)) %>%
mutate(ICMSR = ICMS / IPCA * last(IPCA),
Mês_anterior = (ICMSR / lag(ICMSR, 1) - 1) * 100,
Mesmo_mês_ano_anterior = (ICMSR / lag(ICMSR, 12) - 1) * 100) %>%
group_by(year = year(MESES), month = month(MESES)) %>%
rename(
`ICMS Nominal` = ICMS,
`ICMS Real` = ICMSR,
`Var. mensal (%)` = Mês_anterior,
`Var. mesmo mês ano ant. (%)` = Mesmo_mês_ano_anterior,
`Ano` = year,
`Mês do ano` = month
)
# Calcular a variação acumulada de 12 meses e criar sequência de datas
tbl2_df <- acum_valor(tbl1$`ICMS Real`, 12) %>%
na.omit() %>%
data.frame(MESES = seq(min(tbl1$MESES) + months(23), max(tbl1$MESES), by = "month"),
`Em 12 Meses (%)` = .)
# Juntar as tabelas
Tab_ICMS <- inner_join(tbl1, tbl2_df, by = "MESES") %>%
mutate(
`ICMS Nominal` = round(`ICMS Nominal`, 1),
`ICMS Real` = round(`ICMS Real`, 1),
across(c(`ICMS Nominal`, `ICMS Real`), ~format(., big.mark = ".", decimal.mark = ","))
)
# Filtrar e renderizar a tabela kable
Tab_kable <- Tab_ICMS[, -c(2, 7, 8)] %>%
filter(MESES > as.Date("2022-12-01"))
kable(Tab_kable,
caption = "<center><font color='black'>ICMS do RS, nominal e constante total, em (R$ milhões)</font>",
format = "html",
digits = 1,
align = "c",
escape = FALSE) %>%
kable_classic_2(html_font = "arial", font_size = 12) %>%
kable_styling(bootstrap_options = c("striped", "bordered", "condensed"), full_width = FALSE) %>%
column_spec(1, bold = FALSE, color = "black") %>%
column_spec(2:5, color = "black")
MESES | ICMS Nominal | ICMS Real | Var. mensal (%) | Var. mesmo mês ano ant. (%) | Em.12.Meses…. |
---|---|---|---|---|---|
2023-01-01 | 3.604,5 | 3.818,7 | -2.1 | -16.3 | -14.8 |
2023-02-01 | 2.958,8 | 3.108,5 | -18.6 | -16.1 | -15.6 |
2023-03-01 | 3.185,2 | 3.322,8 | 6.9 | -20.3 | -17.0 |
2023-04-01 | 4.026,9 | 4.175,4 | 25.7 | -3.1 | -16.7 |
2023-05-01 | 3.738,8 | 3.867,8 | -7.4 | -2.3 | -16.4 |
2023-06-01 | 3.681,6 | 3.811,7 | -1.5 | -2.8 | -16.4 |
2023-07-01 | 3.720,7 | 3.847,5 | 0.9 | -0.6 | -14.1 |
2023-08-01 | 3.734,9 | 3.853,4 | 0.2 | 6.1 | -12.2 |
2023-09-01 | 4.128,1 | 4.248 | 10.2 | 8.2 | -10.3 |
2023-10-01 | 3.814 | 3.915,3 | -7.8 | 8.1 | -8.1 |
2023-11-01 | 4.060,7 | 4.157 | 6.2 | 26.6 | -3.5 |
2023-12-01 | 4.085,8 | 4.159,3 | 0.1 | 6.7 | -1.2 |
2024-01-01 | 4.418,9 | 4.479,7 | 7.7 | 17.3 | 1.8 |
2024-02-01 | 3.745,6 | 3.765,9 | -15.9 | 21.1 | 4.6 |
2024-03-01 | 3.910,4 | 3.925,3 | 4.2 | 18.1 | 7.9 |
2024-04-01 | 4.300,7 | 4.300,7 | 9.6 | 3.0 | 8.5 |
#Direcione sua atenção para a saída de dados exibida acima.
// add bootstrap table styles to pandoc tables function bootstrapStylePandocTables() { $('tr.odd').parent('tbody').parent('table').addClass('table table-condensed'); } $(document).ready(function () { bootstrapStylePandocTables(); });