Análise de Dados Financeiros e Econômicos com o R
EA-UFRGS
27/08/2026
Dados são serializados ou salvos em texto em diferentes tipos de arquivos.
Em ordem de popularidade:
/) para designar o diretório do arquivo. Referências relativas também funcionam, tal como em:dataframe.afedR3Pacote
afedR3(Perlin 2023) é o pacote oficial do livro, contendo diversos arquivos de dados de exemplo.
Passos:
remotes (caso ainda não o tenha feito) e depois instale afedR3 com comando remotes::install_github("msperlin/afedR3")afedR3::data_path tendo o nome do arquivo como entrada:dataframesreadr::read_csv# A tibble: 3,215 × 2
ref_date price_close
<date> <dbl>
1 2010-01-04 70045
2 2010-01-05 70240
3 2010-01-06 70729
4 2010-01-07 70451
5 2010-01-08 70263
6 2010-01-11 70433
7 2010-01-12 70076
8 2010-01-13 70385
9 2010-01-14 69801
10 2010-01-15 68978
# ℹ 3,205 more rows
Verifique a existência de texto antes dos dados e a necessidade de ignorar algumas linhas iniciais.
Verifique a existência ou não dos nomes das colunas na primeira linha com os dados.
Verifique qual o símbolo de separador de colunas. Comumente, seguindo notação internacional, será a vírgula, porém nunca se tem certeza sem checar;
Para dados numéricos, verifique o símbolo de decimal, o qual deve ser o ponto (.) tal como em 2.5. Caso necessário, podes ajustar o símbolo na própria função de leitura;
Verifique a codificação do arquivo de texto (UTF-8, Latin1 (ISO-8859) ou windows1252) e ajuste o código de importação para sincronizar a codificação.
Nunca modifique dados brutos manualmente. Sempre que você encontrar uma estrutura de texto inesperada em um arquivo .csv, use os argumentos da função de leitura csv para importar as informações corretamente.
Agora, vamos estudar um caso mais anormal de arquivo .csv. No pacote do livro temos um arquivo chamado CH04_funky-csv-file.csv onde:
As primeiras 10 linhas dos arquivos contém o seguinte conteúdo:
[1] "Example of funky file:"
[2] "- columns separated by \";\""
[3] "- decimal points as \",\""
[4] ""
[5] "Data build in 2022-12-28"
[6] "Origin: www.funkysite.com.br"
[7] ""
[8] "ID;Race;Age;Sex;Hour;IQ;Height;Died"
[9] "001;White;80;Male;00:00:00;92;68;FALSE"
[10] "002;Hispanic;25;Female;00:00:00;99;68;TRUE"
Rows: 100
Columns: 8
$ ID <chr> "001", "002", "003", "004", "005", "006", "007", "008", "009", …
$ Race <chr> "White", "Hispanic", "Asian", "White", "White", "White", "White…
$ Age <dbl> 80, 25, 25, 64, 76, 89, 33, 61, 23, 59, 80, 31, 83, 68, 67, 60,…
$ Sex <chr> "Male", "Female", "Male", "Male", "Female", "Female", "Female",…
$ Hour <time> 00:00:00, 00:00:00, 00:00:00, 00:00:00, 00:30:00, 00:30:00, 00…
$ IQ <dbl> 92, 99, 98, 105, 109, 84, 109, 109, 99, 126, 97, 88, 86, 99, 11…
$ Height <dbl> 68, 68, 69, 69, 67, 73, 65, 72, 70, 66, 63, 68, 72, 76, 68, 65,…
$ Died <lgl> FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE…
dataframesRows: 3,215
Columns: 2
$ ref_date <dttm> 2010-01-04, 2010-01-05, 2010-01-06, 2010-01-07, 2010-01-0…
$ price_close <dbl> 70045, 70240, 70729, 70451, 70263, 70433, 70076, 70385, 69…
listas são ótimas para salvar em .rds!)Rows: 3,215
Columns: 2
$ ref_date <dttm> 2010-01-04, 2010-01-05, 2010-01-06, 2010-01-07, 2010-01-0…
$ price_close <dbl> 70045, 70240, 70729, 70451, 70263, 70433, 70076, 70385, 69…
fst)dataframesO uso do formato fst é bastante simples. Utilizamos a função read_fst para ler arquivos:
Rows: 100
Columns: 8
$ ID <chr> "001", "002", "003", "004", "005", "006", "007", "008", "009", …
$ Race <fct> Black, White, Hispanic, Black, White, White, White, White, Hisp…
$ Age <int> 33, 35, 23, 87, 65, 51, 58, 67, 22, 52, 52, 71, 38, 23, 81, 31,…
$ Sex <fct> Male, Female, Male, Female, Male, Male, Female, Female, Male, F…
$ Hour <dbl> 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.02083333, 0.0…
$ IQ <dbl> 108, 108, 85, 106, 92, 92, 88, 100, 86, 80, 78, 101, 109, 92, 9…
$ Height <dbl> 72, 63, 77, 72, 71, 74, 64, 69, 63, 72, 70, 67, 70, 74, 71, 70,…
$ Died <lgl> FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE,…
Assumindo a existência de um arquivo com formato SQLite, podemos importar suas tabelas com o pacote RSQLite:
[1] "MyTable1" "MyTable2"
Rows: 1,000
Columns: 2
$ x <dbl> 0.24645265, 0.47972926, 0.36782192, 0.09451063, 0.15353447, 0.014591…
$ G <chr> "B", "B", "A", "A", "A", "A", "A", "B", "B", "A", "A", "A", "A", "A"…
# open connection
my_con <- RSQLite::dbConnect(drv = RSQLite::SQLite(),
f_sqlite)
# set sql statement
my_SQL_statement <- "select * from myTable2 where G='A'"
# get query
my_df_A <- RSQLite::dbGetQuery(conn = my_con,
statement = my_SQL_statement)
# disconnect from db
RSQLite::dbDisconnect(my_con)
# print with str
print(my_df_A) x G
1 0.926352099 A
2 0.130461409 A
3 0.175863242 A
4 0.232315670 A
5 0.847271047 A
6 0.300454626 A
7 0.505549132 A
8 0.612706532 A
9 0.973640711 A
10 0.427328012 A
11 0.643232163 A
12 0.404313738 A
13 0.863017808 A
14 0.582067640 A
15 0.081243903 A
16 0.511236865 A
17 0.415739435 A
18 0.289032060 A
19 0.141296847 A
20 0.282350294 A
21 0.458751757 A
22 0.526832054 A
23 0.753867575 A
24 0.889684120 A
25 0.772471444 A
26 0.185977806 A
27 0.629218919 A
28 0.365952431 A
29 0.696302751 A
30 0.149488677 A
31 0.889382872 A
32 0.227752264 A
33 0.460097400 A
34 0.884215479 A
35 0.593849448 A
36 0.950207171 A
37 0.491693109 A
38 0.340887717 A
39 0.714875318 A
40 0.701968306 A
41 0.683094237 A
42 0.717466356 A
43 0.096669153 A
44 0.882994940 A
45 0.898418804 A
46 0.751427123 A
47 0.494277414 A
48 0.193050413 A
49 0.945227575 A
50 0.282941852 A
51 0.236774936 A
52 0.051087632 A
53 0.665136149 A
54 0.907210830 A
55 0.039371408 A
56 0.996058959 A
57 0.396210951 A
58 0.503992447 A
59 0.229309389 A
60 0.153367392 A
61 0.972175756 A
62 0.996803596 A
63 0.703029326 A
64 0.505097419 A
65 0.624992198 A
66 0.005983939 A
67 0.778237550 A
68 0.879486091 A
69 0.677142647 A
70 0.680076466 A
71 0.309149390 A
72 0.724364248 A
73 0.081005128 A
74 0.195773744 A
75 0.271248960 A
76 0.198184770 A
77 0.535323065 A
78 0.246461361 A
79 0.949368217 A
80 0.368869499 A
81 0.636857475 A
82 0.178245325 A
83 0.330224338 A
84 0.394005301 A
85 0.570282862 A
86 0.783627173 A
87 0.230118092 A
88 0.514861194 A
89 0.372955043 A
90 0.661570268 A
91 0.938298085 A
92 0.716896655 A
93 0.445549869 A
94 0.063092344 A
95 0.715321713 A
96 0.846515060 A
97 0.170744318 A
98 0.297788653 A
99 0.281884598 A
100 0.114622168 A
101 0.199975115 A
102 0.148213929 A
103 0.631335290 A
104 0.341375148 A
105 0.003381719 A
106 0.119352195 A
107 0.686116250 A
108 0.688206532 A
109 0.986772353 A
110 0.406233246 A
111 0.514205438 A
112 0.766021595 A
113 0.988969374 A
114 0.612179970 A
115 0.009857139 A
116 0.164873729 A
117 0.606945420 A
118 0.816810937 A
119 0.420719406 A
120 0.343190229 A
121 0.954517847 A
122 0.376597324 A
123 0.762052210 A
124 0.429517014 A
125 0.383972993 A
126 0.455820148 A
127 0.780624438 A
128 0.453777955 A
129 0.235479327 A
130 0.215236539 A
131 0.733390799 A
132 0.556616992 A
133 0.339270782 A
134 0.096677931 A
135 0.647610575 A
136 0.204342841 A
137 0.892393797 A
138 0.991015281 A
139 0.975770442 A
140 0.090724978 A
141 0.268624977 A
142 0.278527739 A
143 0.024160279 A
144 0.071693659 A
145 0.508144154 A
146 0.542731101 A
147 0.301177149 A
148 0.378465635 A
149 0.582885280 A
150 0.910761612 A
151 0.695478889 A
152 0.876760570 A
153 0.546714167 A
154 0.505731161 A
155 0.389416202 A
156 0.911309490 A
157 0.121257364 A
158 0.265228343 A
159 0.842668906 A
160 0.596051143 A
161 0.290346726 A
162 0.891403693 A
163 0.135668735 A
164 0.513112954 A
165 0.760240173 A
166 0.204069268 A
167 0.458708899 A
168 0.304207415 A
169 0.150496249 A
170 0.455392335 A
171 0.689250448 A
172 0.731839732 A
173 0.513194087 A
174 0.045911065 A
175 0.077938913 A
176 0.422501823 A
177 0.888946917 A
178 0.594177959 A
179 0.000772401 A
180 0.267807344 A
181 0.518853521 A
182 0.458982665 A
183 0.614808618 A
184 0.651095708 A
185 0.310617130 A
186 0.918155938 A
187 0.607143139 A
188 0.871379235 A
189 0.091685703 A
190 0.052513524 A
191 0.795584715 A
192 0.275062672 A
193 0.244508559 A
194 0.942304037 A
195 0.768861659 A
196 0.732745936 A
197 0.161510243 A
198 0.867782422 A
199 0.333334500 A
200 0.123499410 A
201 0.294597098 A
202 0.924806250 A
203 0.013211581 A
204 0.502136462 A
205 0.293409960 A
206 0.541851201 A
207 0.565297378 A
208 0.537220878 A
209 0.097392976 A
210 0.171076477 A
211 0.003422277 A
212 0.784343392 A
213 0.451197762 A
214 0.915918597 A
215 0.103173527 A
216 0.437913735 A
217 0.921286851 A
218 0.478079480 A
219 0.994991626 A
220 0.022179785 A
221 0.072984148 A
222 0.238176641 A
223 0.643777663 A
224 0.793520630 A
225 0.297012517 A
226 0.068111578 A
227 0.757107673 A
228 0.498820626 A
229 0.321404548 A
230 0.217731198 A
231 0.899944647 A
232 0.910686190 A
233 0.183130585 A
234 0.686452494 A
235 0.493071432 A
236 0.508465396 A
237 0.013959167 A
238 0.857537999 A
239 0.590978719 A
240 0.285297255 A
241 0.868929829 A
242 0.212028743 A
243 0.674032006 A
244 0.114149193 A
245 0.714924927 A
246 0.435292426 A
247 0.115961868 A
248 0.300902478 A
249 0.610522194 A
250 0.379911253 A
251 0.998968589 A
252 0.995009037 A
253 0.124609603 A
254 0.146437667 A
255 0.759302137 A
256 0.829778230 A
257 0.987579606 A
258 0.023597134 A
259 0.402881970 A
260 0.452345368 A
261 0.846119321 A
262 0.125659662 A
263 0.257458181 A
264 0.060500893 A
265 0.812751193 A
266 0.702773832 A
267 0.374078532 A
268 0.670494115 A
269 0.716266152 A
270 0.739564987 A
271 0.123911744 A
272 0.363764265 A
273 0.699805295 A
274 0.776751306 A
275 0.683634022 A
276 0.437193016 A
277 0.261643100 A
278 0.486001818 A
279 0.931977411 A
280 0.542853621 A
281 0.848786636 A
282 0.256823368 A
283 0.050028037 A
284 0.364046337 A
285 0.199188419 A
286 0.314096630 A
287 0.520067555 A
288 0.811334877 A
289 0.491309770 A
290 0.808258105 A
291 0.955896893 A
292 0.360627553 A
293 0.019372167 A
294 0.130024280 A
295 0.550582552 A
296 0.960764341 A
297 0.500303162 A
298 0.589746997 A
299 0.585891636 A
300 0.364504737 A
301 0.787379959 A
302 0.754983542 A
303 0.880616508 A
304 0.788129114 A
305 0.353919947 A
306 0.025249580 A
307 0.856631615 A
308 0.670515551 A
309 0.275420740 A
310 0.835649210 A
311 0.764128607 A
312 0.394159542 A
313 0.265838468 A
314 0.793149635 A
315 0.512376317 A
316 0.730728222 A
317 0.948573287 A
318 0.752168447 A
319 0.604246978 A
320 0.362324426 A
321 0.046254941 A
322 0.324566046 A
323 0.863682645 A
324 0.061700232 A
325 0.158599072 A
326 0.237168070 A
327 0.033082395 A
328 0.359889390 A
329 0.162434213 A
330 0.335028057 A
331 0.830749761 A
332 0.935520234 A
333 0.353283584 A
334 0.379289244 A
335 0.373508221 A
336 0.935379629 A
337 0.243931570 A
338 0.390640845 A
339 0.896177036 A
340 0.569293526 A
341 0.386545747 A
342 0.888235533 A
343 0.341790554 A
344 0.126174194 A
345 0.988002169 A
346 0.613237949 A
347 0.748337467 A
348 0.805499309 A
349 0.186720149 A
350 0.372824350 A
351 0.080910842 A
352 0.980277673 A
353 0.341411270 A
354 0.360159365 A
355 0.249056510 A
356 0.951397615 A
357 0.219536307 A
358 0.201122360 A
359 0.244877031 A
360 0.689126274 A
361 0.452157147 A
362 0.649661256 A
363 0.162128859 A
364 0.157761326 A
365 0.972208260 A
366 0.951731103 A
367 0.968805769 A
368 0.885208836 A
369 0.686521530 A
370 0.182236390 A
371 0.957047813 A
372 0.400664274 A
373 0.007870568 A
374 0.838253056 A
375 0.885658464 A
376 0.057809380 A
377 0.583736575 A
378 0.970555000 A
379 0.271083940 A
380 0.594813703 A
381 0.675679840 A
382 0.334528218 A
383 0.283187175 A
384 0.294386018 A
385 0.299641175 A
386 0.865903622 A
387 0.003557601 A
388 0.421218722 A
389 0.082443685 A
390 0.194039945 A
391 0.650057096 A
392 0.829947350 A
393 0.111700469 A
394 0.439731076 A
395 0.777259412 A
396 0.114233164 A
397 0.315941603 A
398 0.220898272 A
399 0.952759225 A
400 0.696684974 A
401 0.239801236 A
402 0.767668467 A
403 0.653098166 A
404 0.221842879 A
405 0.619781852 A
406 0.455488328 A
407 0.204023875 A
408 0.562280837 A
409 0.148360330 A
410 0.989934157 A
411 0.515112721 A
412 0.365594626 A
413 0.251176851 A
414 0.517157963 A
415 0.312127987 A
416 0.188034128 A
417 0.083921957 A
418 0.700435605 A
419 0.007902050 A
420 0.753074585 A
421 0.779323563 A
422 0.235109532 A
423 0.446120111 A
424 0.377682882 A
425 0.342837397 A
426 0.962887671 A
427 0.506225426 A
428 0.361483478 A
429 0.981168809 A
430 0.040619817 A
431 0.999095949 A
432 0.496864149 A
433 0.158177980 A
434 0.902492269 A
435 0.875579790 A
436 0.065833627 A
437 0.829310148 A
438 0.308068602 A
439 0.515544774 A
440 0.530788197 A
441 0.841939675 A
442 0.750884325 A
443 0.905175631 A
444 0.018139372 A
445 0.268582684 A
446 0.810028348 A
447 0.354121235 A
448 0.570098296 A
449 0.908538296 A
450 0.271654702 A
451 0.122734787 A
452 0.096725448 A
453 0.069410657 A
454 0.692685120 A
455 0.704534487 A
456 0.290337166 A
457 0.161966122 A
458 0.088563831 A
459 0.774989676 A
460 0.311390322 A
461 0.422373056 A
462 0.612086240 A
463 0.097239274 A
464 0.812635156 A
465 0.410890778 A
466 0.713143210 A
467 0.237075577 A
468 0.226607314 A
469 0.606837649 A
470 0.984940052 A
471 0.576962335 A
472 0.487879737 A
473 0.009763696 A
474 0.740546395 A
475 0.211289196 A
476 0.720650643 A
477 0.139626243 A
478 0.738707291 A
479 0.421392746 A
480 0.498499945 A
481 0.287402591 A
482 0.207844636 A
483 0.014548046 A
484 0.474968247 A
485 0.939085501 A
486 0.996730078 A
487 0.408733483 A
488 0.772061862 A
489 0.568508964 A
490 0.632695357 A
491 0.472385769 A
492 0.343674735 A
493 0.239805944 A
494 0.524081108 A
495 0.060565255 A
496 0.368740106 A
497 0.439059072 A
498 0.862419368 A
499 0.240683663 A
500 0.394640430 A
501 0.552960492 A
502 0.709385331 A
503 0.377465217 A
504 0.717533311 A
505 0.798312210 A
506 0.799072065 A
507 0.126657001 A
508 0.549237624 A
509 0.272488611 A
510 0.315914629 A
511 0.309198891 A
512 0.019729845 A
513 0.111063816 A
514 0.957443466 A
515 0.321918672 A
516 0.711595626 A
517 0.218747594 A
518 0.166772036 A
519 0.143792155 A
520 0.741075729 A
521 0.853388443 A
522 0.401594725 A
library(RSQLite)
# set number of rows in df
N = 10^6
# create simulated dataframe
my_large_df_1 <- data.frame(x=runif(N),
G= sample(c('A','B'),
size = N,
replace = TRUE))
my_large_df_2 <- data.frame(x=runif(N),
G = sample(c('A','B'),
size = N,
replace = TRUE))
# set name of SQLITE file
f_sqlite <- tempfile(fileext = '.SQLITE')
# open connection
my_con <- dbConnect(drv = SQLite(), f_sqlite)
# write df to sqlite
dbWriteTable(conn = my_con, name = 'MyTable1',
value = my_large_df_1)
dbWriteTable(conn = my_con, name = 'MyTable2',
value = my_large_df_2)
# disconnect
dbDisconnect(my_con) [1] " [Illustration:"
[2] ""
[3] " GEORGE ALLEN"
[4] " PUBLISHER"
[5] ""
[6] " 156 CHARING CROSS ROAD"
[7] " LONDON"
[8] ""
[9] " RUSKIN HOUSE"
[10] " ]"
[11] ""
[12] " [Illustration:"
[13] ""
[14] " _Reading Jane’s Letters._ _Cha"
[15] " ]"
O usuário deve levar em conta três pontos na decisão de formato de arquivos de dados:
Na grande maioria das situações, o uso de arquivos csv satisfaz esses quesitos!
Caso abrir mão de portabilidade não faça diferença ao projeto, o formato rds é ótimo e prático. Se este não foi suficiente para dados maiores, as melhores alternativas são fst e parquet (via pacote arrow), os quais usam o máximo do hardware do computador e oferecem compressão e velocidade excepcionais. Como sugestão, caso puder, apenas evite o formato do Excel, o qual é o menos eficiente de todos.
library(fst)
library(readr)
library(arrow)
library(RSQLite)
library(wakefield)
library(dplyr)
library(purrr)
options(scipen = 999)
# create simulated dataset
set.seed(123)
n_row <- 500000
my_df <- as.data.frame(wakefield::r_data_frame(
n = n_row,
id,
age,
sex,
income,
date_stamp,
valid
))
# benchmark helper function
benchmark_format <- function(name, write_fn, read_fn, ext, df) {
f_temp <- fs::file_temp(ext = ext)
on.exit(unlink(f_temp), add = TRUE)
t_write <- system.time(write_fn(df, f_temp))[3]
t_read <- system.time(read_fn(f_temp))[3]
size_mb <- file.size(f_temp) / 1e6
tibble(
Formato = name,
`Tempo de Escrita (s)` = t_write,
`Tempo de Leitura (s)` = t_read,
`Tamanho em Disco (MB)` = size_mb
)
}
# list of format specifications
benchmarks <- list(
list(name = "csv", ext = ".csv",
write_fn = \(df, f) write_csv(df, f),
read_fn = \(f) read_csv(f, show_col_types = FALSE)),
list(name = "rds", ext = ".rds",
write_fn = \(df, f) write_rds(df, f),
read_fn = \(f) read_rds(f)),
list(name = "fst", ext = ".fst",
write_fn = \(df, f) write_fst(df, f),
read_fn = \(f) read_fst(f)),
list(name = "parquet", ext = ".parquet",
write_fn = \(df, f) write_parquet(df, f),
read_fn = \(f) read_parquet(f)),
list(name = "sqlite", ext = ".sqlite",
write_fn = \(df, f) {
con <- dbConnect(SQLite(), f); on.exit(dbDisconnect(con))
dbWriteTable(con, "my_table", df)
},
read_fn = \(f) {
con <- dbConnect(SQLite(), f); on.exit(dbDisconnect(con))
dbReadTable(con, "my_table")
})
)
# run all benchmarks
df_res <- purrr::map_dfr(benchmarks, \(b) {
benchmark_format(b$name, b$write_fn, b$read_fn, b$ext, my_df)
})O R carrega todos os dados diretamente na memória RAM (in-memory).
Quando o tamanho dos dados excede a RAM disponível, o computador trava (ou desliga sozinho).
Na prática, raramente precisamos de todos os dados brutos de uma vez: apenas colunas, filtros ou agregações específicas, o que permite processamento mais eficiente.
Pacotes Recomendados:
arrow (Apache Arrow): manipulação de arquivos colunares (.parquet) e datasets particionados em discoduckdb: motor SQL analítico e de altíssimo desempenhosparklyr / dbplyr: delegação de processamento pesado para bancos de dados SQL remotos ou clusters Apache Spark.wakefield, permitindo definir a quantidade de linhas, o número de colunas e diferentes tipos de variáveis (ex.: texto, numérico, fator, data, booleano):Exporte o dataframe resultante para cada um dos formatos destacados a seguir:
Qual dos formatos ocupou maior espaço em disco? Podes verificar o tamanho dos arquivos no Windows Explorer ou com a função file.size() no R.
Experimente modificar o código anterior alterando:
n = 1000000);Como o tamanho do arquivo e o tempo de gravação/leitura de cada formato respondem a diferentes tipos e volumes de dados?
No material do livro (pacote afedR3) existe um arquivo de dados chamado CH08_some-stocks-SP500.csv. Usando a função afedR3::data_path, utilize a função readr::read_csv para carregar o seu conteúdo. Utilize a função glimpse para verificar o conteúdo dos dados importados. Quantas colunas e qual o nome de cada coluna da tabela?
Na página da CVM é possível obter informações de todas as empresas atualmente listadas na bolsa em um arquivo disponível no link https://dados.cvm.gov.br/dados/CIA_ABERTA/CAD/DADOS/cad_cia_aberta.csv. Utilizando o R, baixe o arquivo em seu computador, importe os dados diretamente usando readr::read_csv (a função importa diretamente de arquivos compactados, sem necessidade de descompactação explícita). Quantas empresas fazem parte da bolsa atualmente (verifique o número de linhas do dataframe com a função nrow)?
ADFER - UFRGS