CLI UI improvements

* Customzed progressbar format and display information
 * Added new bar to BaseBundle and DailyBarWriter
This commit is contained in:
Conner Fromknecht
2017-07-13 03:15:25 -07:00
parent 64cd22b1c4
commit f0050f2e2f
6 changed files with 77 additions and 34 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
# These imports are necessary to force module-scope register calls to happen.
from . import quandl # noqa
from . import poloniex_bundle
from . import poloniex
from .core import (
UnknownBundle,
bundles,
+38 -23
View File
@@ -24,7 +24,10 @@ import pandas as pd
from . import core as bundles
from catalyst.utils.cli import maybe_show_progress
from catalyst.utils.cli import (
item_show_count,
maybe_show_progress
)
from catalyst.utils.memoize import lazyval
logbook.StderrHandler().push_application()
@@ -130,7 +133,11 @@ class BaseBundle(object):
show_progress=show_progress,
)
metadata = self._post_process_metadata(raw_metadata, cache)
metadata = self._post_process_metadata(
raw_metadata,
cache,
show_progress=show_progress,
)
asset_db_writer.write(metadata)
if '5-minute' in self.frequencies:
@@ -176,42 +183,49 @@ class BaseBundle(object):
show_progress=False):
raw_iter = self._fetch_metadata_iter(api_key, cache, retries, environ)
def item_show_func(_, _it=iter(count())):
return 'Downloading metadata: {0}'.format('.' * next(_it))
with maybe_show_progress(
raw_iter,
show_progress,
item_show_func=item_show_func,
label='Fetching {bundle} metadata:'.format(bundle=self.name),
label='Fetching symbol metadata',
item_show_func=item_show_count(),
length=3,
show_percent=False,
) as blocks:
metadata = pd.concat(blocks, ignore_index=True)
return metadata
def _post_process_metadata(self, metadata, cache):
def _post_process_metadata(self, metadata, cache, show_progress=False):
final_metadata = pd.DataFrame(
columns=self.md_column_names,
index=metadata.index,
)
with maybe_show_progress(
metadata.symbol.iteritems(),
show_progress,
label='Post-processing symbol metadata',
item_show_func=item_show_count(len(metadata)),
length=len(metadata),
show_percent=False,
) as symbols_map:
for asset_id, symbol in symbols_map:
try:
raw_data = cache[symbol]
except KeyError:
raise ValueError(
'Unable to find cached data for symbol: {0}'.format(symbol)
)
for asset_id, symbol in metadata.symbol.iteritems():
try:
raw_data = cache[symbol]
except KeyError:
raise ValueError(
'Unable to find cached data for symbol: {0}'.format(symbol)
final_symbol_metadata = self.post_process_symbol_metadata(
metadata.iloc[asset_id],
raw_data,
)
final_symbol_metadata = self.post_process_symbol_metadata(
metadata.iloc[asset_id],
raw_data,
)
final_metadata.iloc[asset_id] = final_symbol_metadata
final_metadata.iloc[asset_id] = final_symbol_metadata
final_metadata['exchange'] = self.exchange
final_metadata['exchange'] = self.exchange
return final_metadata
@@ -237,13 +251,14 @@ class BaseBundle(object):
'attempts.'.format(page_number, retries),
)
# update cached value for key
cache[key] = raw
if raw.empty:
# empty DataFrame signals completion
break
# update cached value for key
cache[key] = raw
yield raw
def _fetch_symbol_iter(self,
+1 -1
View File
@@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from catalyst.data.bundles.bundle import BaseBundle
from catalyst.data.bundles.base import BaseBundle
from catalyst.utils.memoize import lazyval
class BasePricingBundle(BaseBundle):
+1 -1
View File
@@ -20,7 +20,7 @@ import pandas as pd
from six.moves.urllib.parse import urlencode
from catalyst.data.bundles.core import register_bundle
from catalyst.data.bundles.pricing_bundle import BaseCryptoPricingBundle
from catalyst.data.bundles.base_pricing import BaseCryptoPricingBundle
from catalyst.utils.memoize import lazyval
class PoloniexBundle(BaseCryptoPricingBundle):
+9 -7
View File
@@ -73,7 +73,10 @@ from catalyst.utils.sqlite_utils import (
coerce_string_to_conn,
)
from catalyst.utils.memoize import lazyval
from catalyst.utils.cli import maybe_show_progress
from catalyst.utils.cli import (
item_show_count,
maybe_show_progress,
)
from ._equities import _compute_row_slices, _read_bcolz_data
from ._adjustments import load_adjustments_from_sqlite
@@ -226,10 +229,7 @@ class BcolzDailyBarWriter(object):
@property
def progress_bar_message(self):
return "Merging daily equity files:"
def progress_bar_item_show_func(self, value):
return value if value is None else str(value[0])
return 'Compiling daily pricing data'
def write(self,
data,
@@ -257,15 +257,17 @@ class BcolzDailyBarWriter(object):
table : bcolz.ctable
The newly-written table.
"""
total = None if assets is None else len(assets)
ctx = maybe_show_progress(
(
(sid, self.to_ctable(df, invalid_data_behavior))
for sid, df in data
),
show_progress=show_progress,
item_show_func=self.progress_bar_item_show_func,
label=self.progress_bar_message,
length=len(assets) if assets is not None else None,
item_show_func=item_show_count(total),
length=total,
show_percent=False,
)
with ctx as it:
return self._write_internal(it, assets)
+27 -1
View File
@@ -1,10 +1,33 @@
from itertools import count
import click
import pandas as pd
from .context_tricks import CallbackManager
DEFAULT_BAR_TEMPLATE = ' [%(bar)s] %(label)s: %(info)s'
DEFAULT_EMPTY_CHAR = ' '
DEFAULT_FILL_CHAR = '='
def maybe_show_progress(it, show_progress, **kwargs):
def item_show_count(total=None):
def maybe_show_total(index):
if total is not None:
return '{0}/{1}'.format(index, total)
return str(index)
def item_show_func(item, _it=iter(count())):
if item is not None:
return maybe_show_total(next(_it))
return 'DONE'
return item_show_func
def maybe_show_progress(it,
show_progress,
empty_char=DEFAULT_EMPTY_CHAR,
fill_char=DEFAULT_FILL_CHAR,
bar_template=DEFAULT_BAR_TEMPLATE,
**kwargs):
"""Optionally show a progress bar for the given iterator.
Parameters
@@ -30,6 +53,9 @@ def maybe_show_progress(it, show_progress, **kwargs):
...
"""
if show_progress:
kwargs['bar_template'] = bar_template
kwargs['empty_char'] = empty_char
kwargs['fill_char'] = fill_char
return click.progressbar(it, **kwargs)
# context manager that just return `it` when we enter it