Import stock prices

stocks <- tq_get(c("XOM", "CVX", "SHEL", "COP"),
                 get = "stock.prices",
                 from = "2016-01-01",
                 to = "2025-01-01")
stocks
## # A tibble: 9,056 × 8
##    symbol date        open  high   low close   volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
##  1 XOM    2016-01-04  77.5  77.9  76.5  77.5 20400100     50.4
##  2 XOM    2016-01-05  77.2  78.1  76.9  78.1 11993500     50.9
##  3 XOM    2016-01-06  76.6  77.6  76.6  77.5 18826900     50.4
##  4 XOM    2016-01-07  76.1  78.0  75.9  76.2 21263800     49.6
##  5 XOM    2016-01-08  76.3  76.7  74.5  74.7 19033600     48.6
##  6 XOM    2016-01-11  75.0  75.1  72.6  73.7 21353000     48.0
##  7 XOM    2016-01-12  74.1  75.4  73.2  75.2 21864100     49.0
##  8 XOM    2016-01-13  75.8  77.1  74.9  75.7 26052700     49.2
##  9 XOM    2016-01-14  76.2  79.9  75.8  79.1 33806700     51.5
## 10 XOM    2016-01-15  76.3  78.2  76.3  77.6 28342100     50.5
## # ℹ 9,046 more rows

Plot stock prices

stocks %>%
    
    ggplot(aes(x = date, y = adjusted, color = symbol)) +
    geom_line()

Apply dyplr verbs learned in chapter 5

Filter rows

stocks %>%
    filter(close > 80)
## # A tibble: 4,280 × 8
##    symbol date        open  high   low close   volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
##  1 XOM    2016-02-05  79.4  80.1  78.6  80.1 26719900     52.1
##  2 XOM    2016-02-08  79.3  81.8  78.9  81.2 26601200     52.8
##  3 XOM    2016-02-09  80.0  80.7  78.7  80.1 18418100     52.6
##  4 XOM    2016-02-12  80.1  81.1  79.8  81.0 16767200     53.2
##  5 XOM    2016-02-16  81.7  81.8  80.3  81.2 15912200     53.3
##  6 XOM    2016-02-17  81.7  82.8  81.2  82   17006700     53.9
##  7 XOM    2016-02-18  82.9  83.1  81.9  82.4 14873700     54.2
##  8 XOM    2016-02-19  82.2  82.6  80.9  82.5 13615900     54.2
##  9 XOM    2016-02-22  82.5  83.4  82.2  82.4 14595200     54.1
## 10 XOM    2016-02-23  82.0  82.4  80.9  81.2 11041600     53.4
## # ℹ 4,270 more rows

Arrange rows

stocks %>%
    arrange(desc(volume))
## # A tibble: 9,056 × 8
##    symbol date        open  high   low close   volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
##  1 XOM    2021-03-19  56.7  57.5  55.8  56.5 84439400     47.4
##  2 XOM    2020-03-13  40.0  40.1  35    38.1 79891500     29.5
##  3 XOM    2020-11-09  36.4  38.0  36.1  36.9 76879400     29.7
##  4 XOM    2020-03-20  34.8  35.2  31.6  32.7 76534600     25.4
##  5 XOM    2020-03-09  41.7  44.6  40.8  41.9 72896300     32.4
##  6 XOM    2022-03-08  89.1  91.5  85.4  87.8 72082300     77.7
##  7 XOM    2020-03-12  39.9  40.7  37    37.2 65725300     28.8
##  8 XOM    2022-03-09  84.0  86.6  81.6  82.8 65466700     73.3
##  9 XOM    2022-06-17  91.0  91.3  85.7  86.1 64610200     77.0
## 10 XOM    2020-02-28  48.8  51.4  48.0  51.4 62446700     39.8
## # ℹ 9,046 more rows

Select columns

stocks %>%
    select(open:close)
## # A tibble: 9,056 × 4
##     open  high   low close
##    <dbl> <dbl> <dbl> <dbl>
##  1  77.5  77.9  76.5  77.5
##  2  77.2  78.1  76.9  78.1
##  3  76.6  77.6  76.6  77.5
##  4  76.1  78.0  75.9  76.2
##  5  76.3  76.7  74.5  74.7
##  6  75.0  75.1  72.6  73.7
##  7  74.1  75.4  73.2  75.2
##  8  75.8  77.1  74.9  75.7
##  9  76.2  79.9  75.8  79.1
## 10  76.3  78.2  76.3  77.6
## # ℹ 9,046 more rows

Add columns

stocks %>%
    mutate(movement = volume * adjusted)
## # A tibble: 9,056 × 9
##    symbol date        open  high   low close   volume adjusted    movement
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>       <dbl>
##  1 XOM    2016-01-04  77.5  77.9  76.5  77.5 20400100     50.4 1028624755.
##  2 XOM    2016-01-05  77.2  78.1  76.9  78.1 11993500     50.9  609895444.
##  3 XOM    2016-01-06  76.6  77.6  76.6  77.5 18826900     50.4  949422690.
##  4 XOM    2016-01-07  76.1  78.0  75.9  76.2 21263800     49.6 1055149642.
##  5 XOM    2016-01-08  76.3  76.7  74.5  74.7 19033600     48.6  925402285.
##  6 XOM    2016-01-11  75.0  75.1  72.6  73.7 21353000     48.0 1024270447.
##  7 XOM    2016-01-12  74.1  75.4  73.2  75.2 21864100     49.0 1070278154.
##  8 XOM    2016-01-13  75.8  77.1  74.9  75.7 26052700     49.2 1282947493.
##  9 XOM    2016-01-14  76.2  79.9  75.8  79.1 33806700     51.5 1741150283.
## 10 XOM    2016-01-15  76.3  78.2  76.3  77.6 28342100     50.5 1431294646.
## # ℹ 9,046 more rows
stocks %>%
    transmute(movement = volume * adjusted)
## # A tibble: 9,056 × 1
##       movement
##          <dbl>
##  1 1028624755.
##  2  609895444.
##  3  949422690.
##  4 1055149642.
##  5  925402285.
##  6 1024270447.
##  7 1070278154.
##  8 1282947493.
##  9 1741150283.
## 10 1431294646.
## # ℹ 9,046 more rows
stocks %>%
    mutate(prev_volume = lag(volume))
## # A tibble: 9,056 × 9
##    symbol date        open  high   low close   volume adjusted prev_volume
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>       <dbl>
##  1 XOM    2016-01-04  77.5  77.9  76.5  77.5 20400100     50.4          NA
##  2 XOM    2016-01-05  77.2  78.1  76.9  78.1 11993500     50.9    20400100
##  3 XOM    2016-01-06  76.6  77.6  76.6  77.5 18826900     50.4    11993500
##  4 XOM    2016-01-07  76.1  78.0  75.9  76.2 21263800     49.6    18826900
##  5 XOM    2016-01-08  76.3  76.7  74.5  74.7 19033600     48.6    21263800
##  6 XOM    2016-01-11  75.0  75.1  72.6  73.7 21353000     48.0    19033600
##  7 XOM    2016-01-12  74.1  75.4  73.2  75.2 21864100     49.0    21353000
##  8 XOM    2016-01-13  75.8  77.1  74.9  75.7 26052700     49.2    21864100
##  9 XOM    2016-01-14  76.2  79.9  75.8  79.1 33806700     51.5    26052700
## 10 XOM    2016-01-15  76.3  78.2  76.3  77.6 28342100     50.5    33806700
## # ℹ 9,046 more rows
stocks %>%
    mutate(cumsum_volume = cumsum(volume))
## # A tibble: 9,056 × 9
##    symbol date        open  high   low close   volume adjusted cumsum_volume
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>         <dbl>
##  1 XOM    2016-01-04  77.5  77.9  76.5  77.5 20400100     50.4      20400100
##  2 XOM    2016-01-05  77.2  78.1  76.9  78.1 11993500     50.9      32393600
##  3 XOM    2016-01-06  76.6  77.6  76.6  77.5 18826900     50.4      51220500
##  4 XOM    2016-01-07  76.1  78.0  75.9  76.2 21263800     49.6      72484300
##  5 XOM    2016-01-08  76.3  76.7  74.5  74.7 19033600     48.6      91517900
##  6 XOM    2016-01-11  75.0  75.1  72.6  73.7 21353000     48.0     112870900
##  7 XOM    2016-01-12  74.1  75.4  73.2  75.2 21864100     49.0     134735000
##  8 XOM    2016-01-13  75.8  77.1  74.9  75.7 26052700     49.2     160787700
##  9 XOM    2016-01-14  76.2  79.9  75.8  79.1 33806700     51.5     194594400
## 10 XOM    2016-01-15  76.3  78.2  76.3  77.6 28342100     50.5     222936500
## # ℹ 9,046 more rows

Summarize with groups

stocks %>%
    summarise(Avg_Open = mean(open, na.rm = TRUE))
## # A tibble: 1 × 1
##   Avg_Open
##      <dbl>
## 1     83.1
stocks %>%
    group_by(symbol) %>%
    summarise(Avg_Open = mean(open, na.rm = TRUE), Avg_High = mean(high, na.rm = TRUE), Avg_Low = mean(low, na.rm = TRUE), Avg_Close = mean(close, na.rm = TRUE)) %>%
    arrange(Avg_Open)
## # A tibble: 4 × 5
##   symbol Avg_Open Avg_High Avg_Low Avg_Close
##   <chr>     <dbl>    <dbl>   <dbl>     <dbl>
## 1 SHEL       54.8     55.2    54.4      54.8
## 2 COP        71.8     72.7    70.8      71.8
## 3 XOM        82.0     82.7    81.2      82.0
## 4 CVX       124.     125.    123.      124.
stocks %>%
    group_by(symbol) %>%
    summarise(count = n(), Avg_Open = mean(open, na.rm = TRUE), Avg_High = mean(high, na.rm = TRUE), Avg_Low = mean(low, na.rm = TRUE), Avg_Close = mean(close, na.rm = TRUE)) %>%
    ggplot(mapping = aes(x = symbol, y = Avg_Open)) + 
    geom_bar(stat = 'identity') + ggtitle("Average Open Price", subtitle = "By Corporation")

stocks %>%
    filter(!is.na(open))
## # A tibble: 9,056 × 8
##    symbol date        open  high   low close   volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
##  1 XOM    2016-01-04  77.5  77.9  76.5  77.5 20400100     50.4
##  2 XOM    2016-01-05  77.2  78.1  76.9  78.1 11993500     50.9
##  3 XOM    2016-01-06  76.6  77.6  76.6  77.5 18826900     50.4
##  4 XOM    2016-01-07  76.1  78.0  75.9  76.2 21263800     49.6
##  5 XOM    2016-01-08  76.3  76.7  74.5  74.7 19033600     48.6
##  6 XOM    2016-01-11  75.0  75.1  72.6  73.7 21353000     48.0
##  7 XOM    2016-01-12  74.1  75.4  73.2  75.2 21864100     49.0
##  8 XOM    2016-01-13  75.8  77.1  74.9  75.7 26052700     49.2
##  9 XOM    2016-01-14  76.2  79.9  75.8  79.1 33806700     51.5
## 10 XOM    2016-01-15  76.3  78.2  76.3  77.6 28342100     50.5
## # ℹ 9,046 more rows
stocks %>%
    group_by(symbol, open) %>%
    summarise(count = n()) %>%
    ungroup()
## `summarise()` has grouped output by 'symbol'. You can override using the
## `.groups` argument.
## # A tibble: 7,400 × 3
##    symbol  open count
##    <chr>  <dbl> <int>
##  1 COP     23.1     1
##  2 COP     24.2     1
##  3 COP     26.4     1
##  4 COP     26.5     1
##  5 COP     26.8     1
##  6 COP     27.1     1
##  7 COP     27.5     1
##  8 COP     28.1     1
##  9 COP     28.5     1
## 10 COP     28.9     1
## # ℹ 7,390 more rows