semvec/pypi-packages huggingface dataset:
pretty-talib 0.0.10
prettified interface for TA-Lib
Requires Python: >=3.5

# pretty_talib
![python_version](https://img.shields.io/static/v1?label=Python&message=3.5%20|%203.6%20|%203.7&color=blue) [![PyPI downloads/month](https://img.shields.io/pypi/dm/pretty_talib?logo=pypi&logoColor=white)](https://pypi.python.org/pypi/pretty_talib)

## Description
Prettified interface for [TA-Lib](https://github.com/mrjbq7/ta-lib)

## Install
1. Install TA-Lib dependency
    - For Mac it's easy as that
      ~~~~shell
      brew install ta-lib
      ~~~~
    - For other platforms, or troubleshooting please check the installation guide for [TA-Lib](https://github.com/mrjbq7/ta-lib)

2. Install pretty_talib
~~~~bash
pip install pretty_talib
# or
pip3 install pretty_talib
~~~~

## Important Note
THE TYPE OF 'data' AND THE VALUES OF 'use_builtin_types' AND 'use_objects' HIGHLY AFFECTS EFFICIENCY.

SEE BENCHMARK BELOW (Ran 250 times)

~~~~
--------------------------------------------------------------------------------------------------
| rank |                                setup                               |  duration  |  perc |
--------------------------------------------------------------------------------------------------
|    1 | data: Dict,             use_builtin_types=False, use_objects=False | 0.00626893 |       |
|    2 | data: Dict,             use_builtin_types=True,  use_objects=False | 0.02440002 | 3.89x | -> ~5.4x slower
|    3 | data: Dict,             use_builtin_types=True,  use_objects=True  | 0.03171391 | 5.05x | -> ~5.9x slower
|    4 | data: pandas.DataFrame, use_builtin_types=False, use_objects=False | 0.03171391 | 5.05x | -> ~6.1x slower
--------------------------------------------------------------------------------------------------
~~~~

## Usage
~~~~python
# System
import json

# Pip
import numpy

# Local
from pretty_talib import get_stats, ALL, FunctionName



l=50
timeperiod = 5
data = {
    'open': numpy.random.random(l),
    'high': numpy.random.random(l),
    'low': numpy.random.random(l),
    'close': numpy.random.random(l),
    'volume': numpy.random.random(l)
}

stats = get_stats(data, timeperiod=timeperiod, use_builtin_types=False)

with open('stats.json', 'w') as file:
    json.dump(stats, file, indent=4)

# BENCHMARKS

# from funcmeasure import measure

# def use_objects_false_use_builtin_types_false():
#     get_stats(data, types=ALL, timeperiod=timeperiod)

# def use_objects_false_builtin_types_true():
#     get_stats(data, types=ALL, timeperiod=timeperiod, use_builtin_types=True)

# def use_objects_true_use_builtin_types_true():
#     get_stats(data, types=ALL, timeperiod=timeperiod, use_objects=True)

# measure(
#     [
#         use_objects_false_use_builtin_types_false,
#         use_objects_false_builtin_types_true,
#         use_objects_true_use_builtin_types_true
#     ],
#     times=100
# )
~~~~

## Credits
[TA-Lib](https://github.com/mrjbq7/ta-lib) by [mrjbq7](https://github.com/mrjbq7)
h5db 0.1.2
利用h5来做一个分布式的kv磁盘存储工具


安装
----

pip install -U h5db

目前测试版本为python3，python2不支持

入门
----

读写数据
^^^^^^^^

例如需要储存和读取下面一个词典

.. code-block:: python

   import h5db
   import numpy as np


   # make sure save_dir exist 
   save_dir = './data'
   save_dat = [['1', np.random.random([10, 1024])], ['2', np.random.random([4, 1024])]]
   h5db.simple_add(save_dir, save_dat)
   print(h5db.simple_search(save_dir, ['1', '2']))

说明
^^^^


#. 
   h5db默认使用简单hash函数将key分成100个部分，存储到100个对应的h5文件，搜索的时候会同时开启100个进程进行搜索，最后返回一个dict类型: {key: value}, 如果没有搜索到，则value是None；

#. 
   对于可以转换成int的类型的key, 默认的hash函数为 int(key) % 100, 对于str类型的key，默认用其sha1值的10位数 % 100；

#. 
   目前主要支持{str: np.ndarray} 和 {str: str}这两种数据类型，其他复杂类型未测试

详细用法
--------

主要的类是H5

.. code-block:: python

   class H5:
       '''
       H5DB的类
       save_dir: h5文件储存目录
       logger_path: logger储存目录
       l1_size: 一级分类个数
       l2_size: 二级分类个数（h5文件中的groups)
       hash_l1: 可以自定义一级hash函数
       hash_l2：可以自定义二级hash函数
       '''

       def __init__(self,
                    save_dir: str = None,
                    logger_path: str = None,
                    l1_size: int = 100,
                    l2_size: int = 2000,
                    hash_l1: callable = None,
                    hash_l2: callable = None):

可以自定义key的hash函数，也可以使用默认的hash函数，默认的hash函数可以见gen_mod_hash和gen_mod_hash_shift

主要作用的两个函数

插入数据
^^^^^^^^

.. code-block:: python


       def multiple_file_add(self,
                             data_pairs: list,
                             save_prefix: str = 'part.',
                             replacement: bool = False):

data_pairs：[k, v]对的list
replacement：遇到重复的key，value对，是否进行覆盖

搜索数据
^^^^^^^^

.. code-block:: python

       def search(self,
                  vids: list,
                  save_prefix: str = 'part.',
                  max_parallel: int = None):

save_prefix必须与插入数据时候设定的prefix一致

max_parallel最高的并发数量，注意到本身是多文件存储的，因此最低并发数是初始化类时的l1_size，注意当io是瓶颈时，继续增大max_parallel并不会加快搜索速度

默认使用multiprocessing.Manager.dict进行多进程沟通，也可以自己修改代码使用其他框架。

一个基础例子
^^^^^^^^^^^^

.. code-block:: python

   from h5db import H5
   import json

   h5 = H5(save_dir='./data',
           l1_size=10)

   file_to_save = {'1': {'name': 'lr', 'age': 27},
                   '2': {'attr': 'cd', 'attr-2': 26.5},}

   # 注意到这里必须转换成str类型，dict类型不支持
   file_to_save = [[k, json.dumps(v)] for k, v in file_to_save.items()]
   h5.multiple_file_add(file_to_save)
   print(h5.search(['1', '2', '3']))

输出

.. code-block::

   11/26/2020 19:40:01-INFO-Filename ./data/part.1.h5 will write 1 lines
   11/26/2020 19:40:01-INFO-Filename ./data/part.2.h5 will write 1 lines
   11/26/2020 19:40:01-INFO-dumping vids to idx.bin
   11/26/2020 19:40:01-INFO-all Processes finished!
   [('1', b'{"name": "lr", "age": 27}'), ('2', b'{"attr": "cd", "attr-2": 26.5}')]