Class: WorldbankAsDataframe::Commodities

Inherits:
Object
  • Object
show all
Defined in:
lib/worldbank_as_dataframe/commodities.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(series = nil, options = {}) ⇒ Commodities

Returns a new instance of Commodities.



9
10
11
# File 'lib/worldbank_as_dataframe/commodities.rb', line 9

def initialize(series = nil, options={})
  @tag = series
end

Instance Attribute Details

#tagObject (readonly)

Returns the value of attribute tag.



7
8
9
# File 'lib/worldbank_as_dataframe/commodities.rb', line 7

def tag
  @tag
end

Instance Method Details

#fetch(start: nil, fin: nil) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/worldbank_as_dataframe/commodities.rb', line 13

def fetch(start: nil, fin: nil)
  doc = SimpleXlsxReader.parse(URI.open('https://thedocs.worldbank.org/en/doc/5d903e848db1d1b83e0ec8f744e55570-0350012021/related/CMO-Historical-Data-Monthly.xlsx'))
  ary = doc.sheets.detect{|sht| sht.name == 'Monthly Prices'}.rows.to_a[4..-1]
  ary[0][0] = 'Timestamps'
  ary.map!{|a| a.reverse.drop_while(&:nil?).reverse }
  ary[1].length.times {|i| ary[1][i] = [ary[0][i], ary[1][i]].compact.join(' ') }
  ary = ary[1..-1]

  dat = ary[1..-1]
  cols = ary[0]

  dat.each{|a| dt = a[0].split('M'); a[0] = Date.new(dt[0].to_i, dt[1].to_i, 1).to_date }
  dat.each{|row| row.map!{|c| c.in?(["","..."]) ? nil : c }}

  df = Polars::DataFrame.new(dat.transpose, columns: cols)
  df = df.filter(Polars.col('Timestamps') >= start.to_date) unless start.nil?
  df = df.filter(Polars.col('Timestamps') <= fin.to_date) unless fin.nil?

  unless @tag.nil?
    cols = cols.map{|c| (/#{tag.downcase}/ =~ c.downcase).nil? ? nil : c }.compact
    df = df.select(['Timestamps', cols].flatten) if (cols.length>0)
  end

  df
end