Module pinkfish.utility
Utility functions.
Expand source code
"""
Utility functions.
"""
from configparser import ConfigParser
from functools import wraps
import importlib.util
import inspect
import os
from pathlib import Path
import pandas as pd
ROOT = str(Path(os.getcwd().split('pinkfish')[0] + '/pinkfish'))
"""
str: pinkfish project root dir.
"""
def import_strategy(strategy_name, top_level_dir='examples', module_name='strategy'):
"""
Import a strategy from a python `.py` file.
Parameters
----------
strategy_name : str
The leaf dir name that contains the strategy to import.
top_level_dir : str, optional
The top level dir name for the strategies
(default is 'examples').
module_name: str, optional
The name of the python module (default is 'strategy').
Returns
-------
module
The imported module.
Examples
--------
>>> strategy = import_strategy(strategy_name='190.momentum-dmsr-portfolio')
"""
strategy_location = (Path(ROOT) / Path(top_level_dir)
/ Path(strategy_name)
/ Path(module_name + '.py'))
print(strategy_location)
spec = importlib.util.spec_from_file_location(module_name, strategy_location)
strategy = importlib.util.module_from_spec(spec)
spec.loader.exec_module(strategy)
return strategy
def print_full(x):
"""
Print every row of list-like object.
"""
pd.set_option('display.max_rows', len(x))
print(x)
pd.reset_option('display.max_rows')
def read_config():
"""
Read pinkfish configuration.
"""
conf = {}
parser = ConfigParser()
parser.read(os.path.expanduser('~/.pinkfish'))
conf['base_dir'] = parser.get('global', 'base_dir')
return conf
def is_last_row(ts, index):
"""
Return True for last row, False otherwise.
"""
return True if (index == len(ts) - 1) else False
def sort_dict(d, reverse=False):
"""
Return sorted dict; optionally reverse sort.
"""
return dict(sorted(d.items(), key=lambda x: x[1], reverse=reverse))
def set_dict_values(d, value):
"""
Return dict with same keys as `d` and all values equal to `value'.
"""
return dict.fromkeys(d, value)
def find_nan_rows(ts):
"""
Return a dataframe with the rows that contain NaN values.
This function can help you track down problems with a timeseries.
You may need to call `pd.set_option("display.max_columns", None)`
at the top of your notebook to display all columns.
Examples
--------
>>> pd.set_option("display.max_columns", None)
>>> df = pf.find_nan_rows(ts)
>>> df
"""
is_NaN = ts.isnull()
row_has_NaN = is_NaN.any(axis=1)
rows_with_NaN = ts[row_has_NaN]
return rows_with_NaN
def no_empty_container(container_name, default_ret_value):
"""
Check if container is empty. If so, return `default_ret_value`.
Parameters
----------
container_name : str
The name of the container parameter to check.
default_ret_value : int
The return value the wrapped function if the container is empty.
(default is 'examples').
module_name: str, optional
The name of the python module (default is 'strategy').
Returns
-------
`default_ret_value` or `func` return value : type of return value
If the container is empty, `default_ret_value` is returned,
otherwise the return value of `func`.
Examples
--------
>>> @no_empty_container('my_list', 0)
>>> def my_func(my_list):
>>> return 5
>>> my_func([])
0
"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
container_obj = kwargs[container_name]
except KeyError:
container_arg_index = inspect.getfullargspec(func).args.index(container_name)
container_obj = args[container_arg_index]
if len(container_obj) == 0:
return default_ret_value
return func(*args, **kwargs)
return wrapper
return decorator
Global variables
var ROOT
-
str: pinkfish project root dir.
Functions
def find_nan_rows(ts)
-
Return a dataframe with the rows that contain NaN values.
This function can help you track down problems with a timeseries. You may need to call
pd.set_option("display.max_columns", None)
at the top of your notebook to display all columns.Examples
>>> pd.set_option("display.max_columns", None) >>> df = pf.find_nan_rows(ts) >>> df
Expand source code
def find_nan_rows(ts): """ Return a dataframe with the rows that contain NaN values. This function can help you track down problems with a timeseries. You may need to call `pd.set_option("display.max_columns", None)` at the top of your notebook to display all columns. Examples -------- >>> pd.set_option("display.max_columns", None) >>> df = pf.find_nan_rows(ts) >>> df """ is_NaN = ts.isnull() row_has_NaN = is_NaN.any(axis=1) rows_with_NaN = ts[row_has_NaN] return rows_with_NaN
def import_strategy(strategy_name, top_level_dir='examples', module_name='strategy')
-
Import a strategy from a python
.py
file.Parameters
strategy_name
:str
- The leaf dir name that contains the strategy to import.
top_level_dir
:str
, optional- The top level dir name for the strategies (default is 'examples').
module_name
:str
, optional- The name of the python module (default is 'strategy').
Returns
module
- The imported module.
Examples
>>> strategy = import_strategy(strategy_name='190.momentum-dmsr-portfolio')
Expand source code
def import_strategy(strategy_name, top_level_dir='examples', module_name='strategy'): """ Import a strategy from a python `.py` file. Parameters ---------- strategy_name : str The leaf dir name that contains the strategy to import. top_level_dir : str, optional The top level dir name for the strategies (default is 'examples'). module_name: str, optional The name of the python module (default is 'strategy'). Returns ------- module The imported module. Examples -------- >>> strategy = import_strategy(strategy_name='190.momentum-dmsr-portfolio') """ strategy_location = (Path(ROOT) / Path(top_level_dir) / Path(strategy_name) / Path(module_name + '.py')) print(strategy_location) spec = importlib.util.spec_from_file_location(module_name, strategy_location) strategy = importlib.util.module_from_spec(spec) spec.loader.exec_module(strategy) return strategy
def is_last_row(ts, index)
-
Return True for last row, False otherwise.
Expand source code
def is_last_row(ts, index): """ Return True for last row, False otherwise. """ return True if (index == len(ts) - 1) else False
def no_empty_container(container_name, default_ret_value)
-
Check if container is empty. If so, return
default_ret_value
.Parameters
container_name
:str
- The name of the container parameter to check.
default_ret_value
:int
- The return value the wrapped function if the container is empty. (default is 'examples').
module_name
:str
, optional- The name of the python module (default is 'strategy').
Returns
default_ret_value
orfunc
return value : type of return value If the container is empty,default_ret_value
is returned, otherwise the return value offunc
.Examples
>>> @no_empty_container('my_list', 0) >>> def my_func(my_list): >>> return 5 >>> my_func([]) 0
Expand source code
def no_empty_container(container_name, default_ret_value): """ Check if container is empty. If so, return `default_ret_value`. Parameters ---------- container_name : str The name of the container parameter to check. default_ret_value : int The return value the wrapped function if the container is empty. (default is 'examples'). module_name: str, optional The name of the python module (default is 'strategy'). Returns ------- `default_ret_value` or `func` return value : type of return value If the container is empty, `default_ret_value` is returned, otherwise the return value of `func`. Examples -------- >>> @no_empty_container('my_list', 0) >>> def my_func(my_list): >>> return 5 >>> my_func([]) 0 """ def decorator(func): @wraps(func) def wrapper(*args, **kwargs): try: container_obj = kwargs[container_name] except KeyError: container_arg_index = inspect.getfullargspec(func).args.index(container_name) container_obj = args[container_arg_index] if len(container_obj) == 0: return default_ret_value return func(*args, **kwargs) return wrapper return decorator
def print_full(x)
-
Print every row of list-like object.
Expand source code
def print_full(x): """ Print every row of list-like object. """ pd.set_option('display.max_rows', len(x)) print(x) pd.reset_option('display.max_rows')
def read_config()
-
Read pinkfish configuration.
Expand source code
def read_config(): """ Read pinkfish configuration. """ conf = {} parser = ConfigParser() parser.read(os.path.expanduser('~/.pinkfish')) conf['base_dir'] = parser.get('global', 'base_dir') return conf
def set_dict_values(d, value)
-
Return dict with same keys as
d
and all values equal to `value'.Expand source code
def set_dict_values(d, value): """ Return dict with same keys as `d` and all values equal to `value'. """ return dict.fromkeys(d, value)
def sort_dict(d, reverse=False)
-
Return sorted dict; optionally reverse sort.
Expand source code
def sort_dict(d, reverse=False): """ Return sorted dict; optionally reverse sort. """ return dict(sorted(d.items(), key=lambda x: x[1], reverse=reverse))