sboysel/fredr

way to traverse category trees?

Closed this issue · 4 comments

similar to traverseCategories found here?

https://github.com/jcizel/FredR/blob/master/R/FredR.R

I'm having a hard time exploring all the categories. I have to sift through them manually and what I'd like to do is start at a base node up top and sort all the way down by popularity but I need to be able to traverse the tree first.

That function isn't exported, so im not really sure what it actually does.

fredr is really designed for you to use it in conjunction with the FRED site. For example, they have a category section
https://fred.stlouisfed.org/categories/

Clicking on Money and Banking -> Exchange Rates -> Daily Rates, I can see all the daily rate series and can use their drop down to sort by popularity.

At the top in the URL, I can see the category id for Daily Rates is 94, which I can use in more fredr functions if I want.

You can incrementally get your way there with fredr_category_children(), but I still needed to reference the website to figure out the path to get to the Daily Series category.

library(fredr)
#> Warning: package 'fredr' was built under R version 4.0.2

fredr_category_children(0)
#> # A tibble: 8 x 3
#>      id name                                    parent_id
#>   <int> <chr>                                       <int>
#> 1 32991 Money, Banking, & Finance                       0
#> 2    10 Population, Employment, & Labor Markets         0
#> 3 32992 National Accounts                               0
#> 4     1 Production & Business Activity                  0
#> 5 32455 Prices                                          0
#> 6 32263 International Data                              0
#> 7  3008 U.S. Regional Data                              0
#> 8 33060 Academic Data                                   0

fredr_category_children(32991)
#> # A tibble: 7 x 4
#>      id name               parent_id notes                                      
#>   <int> <chr>                  <int> <chr>                                      
#> 1    22 Interest Rates         32991  <NA>                                      
#> 2    15 Exchange Rates         32991  <NA>                                      
#> 3    24 Monetary Data          32991  <NA>                                      
#> 4    46 Financial Indicat…     32991  <NA>                                      
#> 5    23 Banking                32991  <NA>                                      
#> 6 32360 Business Lending       32991  <NA>                                      
#> 7 32145 Foreign Exchange …     32991 "In addition to the listed daily intervent…

fredr_category_children(15)
#> # A tibble: 5 x 4
#>      id name            parent_id notes                                         
#>   <int> <chr>               <int> <chr>                                         
#> 1    94 Daily Rates            15 "Effective January 1, 2009, the Federal Reser…
#> 2    95 Monthly Rates          15  <NA>                                         
#> 3 32219 Annual Rates           15  <NA>                                         
#> 4   105 Trade-Weighted…        15  <NA>                                         
#> 5   158 By Country             15  <NA>

fredr_category_series(94, order_by = "popularity")[c(1, 4, 5, 6)]
#> # A tibble: 35 x 4
#>    id       title                               observation_sta… observation_end
#>    <chr>    <chr>                               <chr>            <chr>          
#>  1 TWEXEME… Trade Weighted U.S. Dollar Index: … 2006-01-01       2019-01-01     
#>  2 TWEXAFE… Trade Weighted U.S. Dollar Index: … 2006-01-01       2019-01-01     
#>  3 TWEXBGS… Trade Weighted U.S. Dollar Index: … 2006-01-01       2019-01-01     
#>  4 DEXSLUS  Sri Lanka / U.S. Foreign Exchange … 1973-01-02       2020-11-25     
#>  5 TWEXEME… Trade Weighted U.S. Dollar Index: … 2006-01-01       2020-10-01     
#>  6 DTWEXO   Trade Weighted U.S. Dollar Index: … 1995-01-04       2019-12-31     
#>  7 DEXDNUS  Denmark / U.S. Foreign Exchange Ra… 1971-01-04       2020-11-25     
#>  8 TWEXAFE… Trade Weighted U.S. Dollar Index: … 2006-01-01       2020-10-01     
#>  9 DEXUSNZ  U.S. / New Zealand Foreign Exchang… 1971-01-04       2020-11-25     
#> 10 DEXVZUS  Venezuela / U.S. Foreign Exchange … 1995-01-02       2020-11-25     
#> # … with 25 more rows

I think it would be rather hard to show all recursive children of a node at once if that is what you are asking for

updated script

library(fredr)
fredr_set_key("getyourown")

recursive.categories <- function(x) {
  
  #parent <- fredr_category(32266)
  Sys.sleep(.5)
  parent <- fredr_category(x)
  
  Sys.sleep(.5)
  series <- fredr_category_series(x)

  Sys.sleep(.5)
  children <- fredr_category_children(category_id = parent$id)
  
  print(parent)
  print(series)
  
  if (length(children) == 0)  {
    p <- cbind(parent$id,parent$name)
    
    names(p) <- iconv(paste(parent$id,parent$name), from="UTF-8", to="UTF-8", sub="")
    #names(p) <- paste(parent$id,parent$name)
    #return (p)
    if(nrow(series)!=0)
      {
        #set <- list(parent,series)
        #names(set) <- c(iconv(paste(parent$id,parent$name,"info"), from="UTF-8", to="UTF-8", sub=""),iconv(paste(parent$id,parent$name,"series"), from="UTF-8", to="UTF-8", sub=""))
        set <- list(series)
        names(set) <- c(iconv(paste(parent$id,parent$name,"series"), from="UTF-8", to="UTF-8", sub=""))
      } else 
      {
        #set <- parent
      }
    
    return(set)
  }
  
  else  {
    c <- (lapply(children[["id"]], function(y)
    {
      Sys.sleep(.5)
      print(y)
      recursive.categories(y)
    }))
  names(c) <- iconv(paste(children$id,children$name), from="UTF-8", to="UTF-8", sub="")
  #names(c) <- paste(children$id,children$name)
  
  #set <- list(parent,c,series)
  #set <- list(c,series)
  
  if(nrow(series)!=0)
  {
    #set <- list(parent,c,series)
    #names(set) <- c(iconv(paste(parent$id,parent$name,"info"), from="UTF-8", to="UTF-8", sub=""),iconv(paste(parent$id,parent$name,"children"), from="UTF-8", to="UTF-8", sub=""),iconv(paste(parent$id,parent$name,"series"), from="UTF-8", to="UTF-8", sub=""))
    set <- list(c,series)
    names(set) <- c(iconv(paste(parent$id,parent$name,"children"), from="UTF-8", to="UTF-8", sub=""),iconv(paste(parent$id,parent$name,"series"), from="UTF-8", to="UTF-8", sub=""))
  } else 
  {
    #set <- list(parent,c)
    #names(set) <- c(iconv(paste(parent$id,parent$name,"info"), from="UTF-8", to="UTF-8", sub=""),iconv(paste(parent$id,parent$name,"children"), from="UTF-8", to="UTF-8", sub=""))
    set <- list(c)
    names(set) <- c(iconv(paste(parent$id,parent$name,"children"), from="UTF-8", to="UTF-8", sub=""))
  }
  
  return(set)
  #return(c)
  }
  
}

sets <- recursive.categories(0)
#sets <- recursive.categories(32266)
#sets <- recursive.categories(32998)
View(sets)

store <- as.Node(sets)
ToDataFrameTree(store)


@thistleknot I'm happy to hear that you found a solution that works for you, however, I think that fredr should probably stick to just the API endpoints without too much additional work on top of it, so we probably won't add this. Thanks for detailing your solution though, in case anyone else needs this!