Sha256: 4d590dce0d153d401c2e10cb5894420aa4cd7c1410f7c2a31f82ebd21eb94cf3
Contents?: true
Size: 1.32 KB
Versions: 1
Compression:
Stored size: 1.32 KB
Contents
require 'open-uri' require 'simple_xlsx_reader' require 'polars-df' module WorldbankAsDataframe class Commodities attr_reader :tag def initialize(series = nil, options={}) @tag = series end 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 end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
worldbank_as_dataframe-0.2.1 | lib/worldbank_as_dataframe/commodities.rb |