cotcube-bardata 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7db21286fcb1a011326db3d27333b3417ec497db6c5b005250e0dcc11d355839
4
- data.tar.gz: 1eca29b839ae84d43c601f793501237cabc5de25363ea1bd55f6c707393d98ba
3
+ metadata.gz: a701303a258aaaf6050922e35eaacf53ce09fc43fc25778492ebb0b11fb9890c
4
+ data.tar.gz: 389709153f639e14638832e701f19a295181e1b81e26a8aa2ba2baf5c0587ee9
5
5
  SHA512:
6
- metadata.gz: 3b46cbfbd3bf8117a5076691d9eaa8985ea551d822838e69cf4336a97161e77d3c0ab5b9427f957a08a219a19290d76832527cadbf2956d16053762443e8f25b
7
- data.tar.gz: b082544cd2ac1c4a36a5e23a7ce2da9764fd9ce4fa7f09a72b28a579301eb007fda3ea8c8856cb5f9a9fea6756d2c6ee2a4d84224195840793ff49d1c7985855
6
+ metadata.gz: ee32360405d9597e82c6eb9d7678895ecd1c7db9872ed2ecdd8efbd4fc0cd2ec4cea21d2546e867a45af3655ab251a34d39855d7b7d7865458ea60ff8ba65811
7
+ data.tar.gz: 7a4387b1834d811a61e9bd04fbe0a263f7f4a730b2a15cb928fb956929acefa5097a502fa548c26356f5ccac051d7f037344c42e320400a8a5eab55266119b81
@@ -1,3 +1,9 @@
1
+ ## 0.1.8 (January 27, 2021)
2
+ - in helpers, #extended_range_for_date: fixed comparison signs
3
+ - range_matrix: applied cops, noted appearance of Cotcube::Helpers.simple_series_stats
4
+ - cached: Fixing wrong comparison sign
5
+ - daily: slimmed down results for #continuous_overview
6
+
1
7
  ## 0.1.7 (January 14, 2021)
2
8
  - added :range parameter to :provide, hence to :provide_cached, :provide_daily
3
9
  - added forgotten module_functions
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.7
1
+ 0.1.8
@@ -34,7 +34,8 @@ Gem::Specification.new do |spec|
34
34
  spec.add_dependency 'parallel', '~> 1'
35
35
  spec.add_dependency 'yaml', '~> 0.1'
36
36
 
37
- spec.add_development_dependency 'rake', '>= 12'
37
+ # using ~> in favor of >= to overcome warning
38
+ spec.add_development_dependency 'rake', '~> 13'
38
39
  spec.add_development_dependency 'rspec', '~>3.6'
39
- spec.add_development_dependency 'yard', '~>0.9'
40
+ spec.add_development_dependency 'yard', '~>0.9'
40
41
  end
@@ -59,7 +59,9 @@ module Cotcube
59
59
  end
60
60
  end
61
61
  return result
62
- elsif File.mtime(file) < File.mtime(quarters_file)
62
+ elsif File.mtime(file) + 1.day > File.mtime(quarters_file)
63
+ puts "CACHE #{File.mtime(file)}\t#{file}"
64
+ puts "QUART #{File.mtime(quarters_file)}\t#{quarters_file}"
63
65
  result = if range.nil?
64
66
  base
65
67
  else
@@ -71,7 +73,9 @@ module Cotcube
71
73
  # rubocop:enable Metrics/BlockNesting
72
74
  return result
73
75
  else
74
- puts "File #{file} exists, but is neither closed nor current. Running update.".colorize(:light_green)
76
+ # write a (positive warning, that the cache needs to be updated, as cached value is older
77
+ # than one day but not closed
78
+ puts "File #{file} exists, but is neither closed nor current. Running update...".colorize(:light_green)
75
79
  end
76
80
  end
77
81
  begin
@@ -132,6 +132,13 @@ module Cotcube
132
132
  end
133
133
  data.reject! { |x| x[selector].empty? }
134
134
  result = data.group_by { |x| x[selector].first[:contract] }
135
+ result.each_key do |key|
136
+ result[key].map! do |x|
137
+ x[:volume].select! { |z| z[:contract] == key }
138
+ x[:oi].select! { |z| z[:contract] == key }
139
+ x
140
+ end
141
+ end
135
142
  if human
136
143
  result.each do |k, v|
137
144
  next unless filter.nil? || v.first[selector].first[:contract][2..4] =~ (/#{filter}/)
@@ -152,5 +159,91 @@ module Cotcube
152
159
  end
153
160
  result
154
161
  end
162
+
163
+ def continuous_table(symbol: nil, id: nil,
164
+ selector: :volume,
165
+ filter: nil,
166
+ debug: false)
167
+ raise ArgumentError, 'Selector must be either :volume or :oi' unless selector.is_a?(Symbol) &&
168
+ %i[volume oi].include?(selector)
169
+
170
+ sym = get_id_set(symbol: symbol, id: id)
171
+ if %w[R6 BJ GE].include? sym[:symbol]
172
+ puts "Rejecting to process symbol '#{sym[:symbol]}'."
173
+ return
174
+ end
175
+ id = sym[:id]
176
+ dfm = lambda do |x, y = Date.today.year|
177
+ k = Date.strptime("#{y} #{x.negative? ? x + 366 : x}", '%Y %j')
178
+ k -= 1 while [0, 6].include?(k.wday)
179
+ k.strftime('%a, %Y-%m-%d')
180
+ rescue StandardError
181
+ puts "#{sym[:symbol]}\t#{x}\t#{y}"
182
+ end
183
+
184
+ ytoday = Date.today.yday
185
+ data = continuous_overview(id: id, selector: selector, filter: filter, human: false, config: init)
186
+ .reject { |k, _| k[-2..].to_i == Date.today.year % 2000 }
187
+ .group_by { |k, _| k[2] }
188
+ output_sent = 0
189
+ data.keys.sort.each do |month|
190
+ puts "Processing #{sym[:symbol]}#{month}" if debug
191
+ v0 = data[month]
192
+ ydays = v0.map { |_, v1| Date.parse(v1.last[:date]).yday }
193
+ fdays = v0.map { |_, v1| Date.parse(v1.first[:date]).yday }.sort
194
+ # if the last ml day nears the end of the year, we must fix
195
+ ydays.map! { |x| x > 350 ? x - 366 : x } if ydays.min < 50
196
+ fday = fdays[fdays.size / 2]
197
+ yavg = ydays.reduce(:+) / ydays.size
198
+ # a contract is proposed to use after fday - 1, but before ydays.min (green)
199
+ # it is warned to user after fday - 1 but before yavg - 1 (red)
200
+ # it is warned red >= yavg - 1 and <= yavg + 1
201
+ color = if (ytoday >= yavg - 1) && (ytoday <= yavg + 1)
202
+ :light_red
203
+ elsif (ytoday > ydays.min) && (ytoday < yavg - 1)
204
+ :light_yellow
205
+ elsif (ytoday >= (fday > yavg ? 0 : fday - 5)) && (ytoday <= ydays.min)
206
+ :light_green
207
+ else
208
+ :white
209
+ end
210
+ if debug || (color != :white)
211
+ # rubocop:disable Layout/ClosingParenthesisIndentation
212
+ puts "#{sym[:symbol]
213
+ }#{month
214
+ }\t#{format '%12s', sym[:type]
215
+ }\t#{ytoday
216
+ }/#{fday
217
+ }\t#{format '%5d', ydays.min
218
+ }: #{dfm.call(ydays.min)
219
+ }\t#{format '%5d', yavg
220
+ }: #{dfm.call(yavg)
221
+ }\t#{format '%5d', ydays.max
222
+ }: #{dfm.call(ydays.max)}".colorize(color)
223
+ output_sent += 1
224
+ end
225
+ next unless debug
226
+
227
+ v0.each do |contract, v1|
228
+ puts "\t#{contract
229
+ }\t#{v1.first[:date]
230
+ }\t#{Date.parse(v1.last[:date]).strftime('%a')
231
+ }, #{v1.last[:date]
232
+ } (#{Date.parse(v1.last[:date]).yday}"
233
+ # rubocop:enable Layout/ClosingParenthesisIndentation
234
+ end
235
+ end
236
+ case output_sent
237
+ when 0
238
+ puts "WARNING: No output was sent for symbol '#{sym[:symbol]}'.".colorize(:light_yellow)
239
+ when 1
240
+ # all ok
241
+ true
242
+ else
243
+ puts "---- #{output_sent} for #{sym[:symbol]} ---------------"
244
+
245
+ end
246
+ nil
247
+ end
155
248
  end
156
249
  end
@@ -36,11 +36,11 @@ module Cotcube
36
36
  ' is assumed (starting 5 pm CT yesterday, ending 4 pm CT today)'.colorize(:light_yellow)
37
37
  end
38
38
  result = select_specific_date(date: starting, base: base)
39
- result += base.select { |d| d[:datetime] > starting and d[:datetime] < ending.to_date }
39
+ result += base.select { |d| d[:datetime] >= starting and d[:datetime] < ending.to_date }
40
40
  result += select_specific_date(date: ending, base: base)
41
41
  result.uniq!
42
42
  else
43
- result = base.select { |x| x[:datetime] >= starting and x[:datetime] < ending }
43
+ result = base.select { |x| x[:datetime] >= starting and x[:datetime] <= ending }
44
44
  end
45
45
  result
46
46
  end
@@ -12,7 +12,7 @@ module Cotcube
12
12
  # 2. avg:
13
13
  # 3. lower: like median, but not at 1/2 but 1/4
14
14
  # 4. median:
15
- # 5. upper: like median, bot not at 1/2 but 3/4
15
+ # 5. upper: like median, but not at 1/2 but 3/4
16
16
  # 6. max:
17
17
  # and columns:
18
18
  # 1.a) all days os the series
@@ -20,6 +20,8 @@ module Cotcube
20
20
  # 1.c) the last 200 days
21
21
  # 2.a-c) same with days reduced to weeks (c: 52 weeks)
22
22
  # 3.a-c) same with days reduced to months (c: 12 months)
23
+ #
24
+ # NOTE: there is now a new method Cotcube::Helpers.simple_series_stats, that should be used in favor.
23
25
  def range_matrix(symbol: nil, id: nil, print: false, dim: 0.05)
24
26
  # rubocop:disable Style/MultilineBlockChain
25
27
  sym = get_id_set(symbol: symbol, id: id)
@@ -38,36 +40,43 @@ module Cotcube
38
40
  target[period][:all_size] = source[period].size
39
41
  target[period][:all_avg] = (source[period].map { |x| x[:range] }.reduce(:+) / source[period].size).round
40
42
  target[period][:all_lower] = source[period].sort_by do |x|
41
- x[:range]
42
- end.map { |x| x[:range] }[ (source[period].size * 1 / 4).round ]
43
- target[period][:all_median] = source[period].sort_by do |x|
44
- x[:range]
45
- end.map { |x| x[:range] }[ (source[period].size * 2 / 4).round ]
46
- target[period][:all_upper] = source[period].sort_by do |x|
47
- x[:range]
48
- end.map { |x| x[:range] }[ (source[period].size * 3 / 4).round ]
43
+ x[:range]
44
+ end.map { |x| x[:range] }[ (source[period].size * 1 / 4).round ]
45
+
46
+ target[period][:all_median] = source[period].sort_by do |x|
47
+ x[:range]
48
+ end.map { |x| x[:range] }[ (source[period].size * 2 / 4).round ]
49
+
50
+ target[period][:all_upper] = source[period].sort_by do |x|
51
+ x[:range]
52
+ end.map { |x| x[:range] }[ (source[period].size * 3 / 4).round ]
53
+
49
54
  target[period][:all_max] = source[period].map { |x| x[:range] }.max
50
55
  target[period][:all_records] = source[period].sort_by do |x|
51
- -x[:range]
52
- end.map { |x| { contract: x[:contract], range: x[:range] } }.take(5)
56
+ -x[:range]
57
+ end.map { |x| { contract: x[:contract], range: x[:range] } }.take(5)
53
58
 
54
59
  tenth = (source[period].size * dim).round
55
60
  custom = source[period].sort_by { |x| x[:range] }[tenth..source[period].size - tenth]
61
+
56
62
  target[period][:dim_size] = custom.size
57
63
  target[period][:dim_avg] = (custom.map { |x| x[:range] }.reduce(:+) / custom.size).round
58
64
  target[period][:dim_lower] = custom.sort_by do |x|
59
- x[:range]
60
- end.map { |x| x[:range] }[ (custom.size * 1 / 4).round ]
61
- target[period][:dim_median] = custom.sort_by do |x|
62
- x[:range]
63
- end.map { |x| x[:range] }[ (custom.size * 2 / 4).round ]
64
- target[period][:dim_upper] = custom.sort_by do |x|
65
- x[:range]
66
- end.map { |x| x[:range] }[ (custom.size * 3 / 4).round ]
67
- target[period][:dim_max] = custom.map { |x| x[:range] }.max
65
+ x[:range]
66
+ end.map { |x| x[:range] }[ (custom.size * 1 / 4).round ]
67
+
68
+ target[period][:dim_median] = custom.sort_by do |x|
69
+ x[:range]
70
+ end.map { |x| x[:range] }[ (custom.size * 2 / 4).round ]
71
+
72
+ target[period][:dim_upper] = custom.sort_by do |x|
73
+ x[:range]
74
+ end.map { |x| x[:range] }[ (custom.size * 3 / 4).round ]
75
+
76
+ target[period][:dim_max] = custom.map { |x| x[:range] }.max
68
77
  target[period][:dim_records] = custom.sort_by do |x|
69
- -x[:range]
70
- end.map { |x| { contract: x[:contract], range: x[:range] } }.take(5)
78
+ -x[:range]
79
+ end.map { |x| { contract: x[:contract], range: x[:range] } }.take(5)
71
80
 
72
81
  range = case period
73
82
  when :months
@@ -83,18 +92,18 @@ module Cotcube
83
92
  target[period][:rec_size] = custom.size
84
93
  target[period][:rec_avg] = (custom.map { |x| x[:range] }.reduce(:+) / custom.size).round
85
94
  target[period][:rec_lower] = custom.sort_by do |x|
86
- x[:range]
87
- end.map { |x| x[:range] }[ (custom.size * 1 / 4).round ]
88
- target[period][:rec_median] = custom.sort_by do |x|
89
- x[:range]
90
- end.map { |x| x[:range] }[ (custom.size * 2 / 4).round ]
91
- target[period][:rec_upper] = custom.sort_by do |x|
92
- x[:range]
93
- end.map { |x| x[:range] }[ (custom.size * 3 / 4).round ]
94
- target[period][:rec_max] = custom.map { |x| x[:range] }.max
95
+ x[:range]
96
+ end.map { |x| x[:range] }[ (custom.size * 1 / 4).round ]
97
+ target[period][:rec_median] = custom.sort_by do |x|
98
+ x[:range]
99
+ end.map { |x| x[:range] }[ (custom.size * 2 / 4).round ]
100
+ target[period][:rec_upper] = custom.sort_by do |x|
101
+ x[:range]
102
+ end.map { |x| x[:range] }[ (custom.size * 3 / 4).round ]
103
+ target[period][:rec_max] = custom.map { |x| x[:range] }.max
95
104
  target[period][:rec_records] = custom.sort_by do |x|
96
- -x[:range]
97
- end.map { |x| { contract: x[:contract], range: x[:range] } }.take(5)
105
+ -x[:range]
106
+ end.map { |x| { contract: x[:contract], range: x[:range] } }.take(5)
98
107
  end
99
108
 
100
109
  if print
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cotcube-bardata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin L. Tischendorf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-14 00:00:00.000000000 Z
11
+ date: 2021-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -112,16 +112,16 @@ dependencies:
112
112
  name: rake
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '12'
117
+ version: '13'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '12'
124
+ version: '13'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rspec
127
127
  requirement: !ruby/object:Gem::Requirement