Commit cbce5327 authored by Dr.李's avatar Dr.李

FEATURE: added more engine stuff

parent e2228533
......@@ -5,4 +5,4 @@ Created on 2017-4-25
@author: cheng.li
"""
__version__ = "0.2.1"
__version__ = "0.2.3"
......@@ -5,14 +5,14 @@ Created on 2017-8-16
@author: cheng.li
"""
from alphamind.data.engines.sqlengine import SqlEngine
from alphamind.data.engines.sqlengine import risk_styles
from alphamind.data.engines.sqlengine import industry_styles
from alphamind.data.engines.sqlengine import macro_styles
from alphamind.analysis.factoranalysis import er_portfolio_analysis
from alphamind.analysis.factoranalysis import factor_analysis
from alphamind.analysis.quantileanalysis import er_quantile_analysis
from alphamind.analysis.quantileanalysis import quantile_analysis
from alphamind.data.engines.sqlengine import SqlEngine
from alphamind.data.engines.sqlengine import industry_styles
from alphamind.data.engines.sqlengine import macro_styles
from alphamind.data.engines.sqlengine import risk_styles
from alphamind.data.engines.universe import Universe
from alphamind.data.engines.utilities import industry_list
from alphamind.data.neutralize import neutralize
......
# -*- coding: utf-8 -*-
"""
Created on 2020-11-14
@author: cheng.li
"""
import os
if "DB_VENDOR" in os.environ and os.environ["DB_VENDOR"].lower() == "rl":
from alphamind.data.dbmodel.models.models_rl import Market
from alphamind.data.dbmodel.models.models_rl import Universe
from alphamind.data.dbmodel.models.models_rl import Industry
from alphamind.data.dbmodel.models.models_rl import RiskExposure
from alphamind.data.dbmodel.models.models_rl import RiskCovDay
from alphamind.data.dbmodel.models.models_rl import RiskCovShort
from alphamind.data.dbmodel.models.models_rl import RiskCovLong
from alphamind.data.dbmodel.models.models_rl import SpecificRiskDay
from alphamind.data.dbmodel.models.models_rl import SpecificRiskShort
from alphamind.data.dbmodel.models.models_rl import SpecificRiskLong
else:
from alphamind.data.dbmodel.models.models import Market
from alphamind.data.dbmodel.models.models import Universe
from alphamind.data.dbmodel.models.models import Industry
from alphamind.data.dbmodel.models.models import RiskExposure
from alphamind.data.dbmodel.models.models import RiskCovDay
from alphamind.data.dbmodel.models.models import RiskCovShort
from alphamind.data.dbmodel.models.models import RiskCovLong
from alphamind.data.dbmodel.models.models import SpecificRiskDay
from alphamind.data.dbmodel.models.models import SpecificRiskShort
from alphamind.data.dbmodel.models.models import SpecificRiskLong
from alphamind.data.dbmodel.models.models import FactorMaster
from alphamind.data.dbmodel.models.models import IndexComponent
from alphamind.data.dbmodel.models.models import IndexMarket
from alphamind.data.dbmodel.models.models import RiskMaster
......@@ -29,6 +29,7 @@ class _StkDailyPricePro(Base):
trade_date = Column(Date)
code = Column("security_code", Text)
chgPct = Column("change_pct", FLOAT)
secShortName = Column("name", Text)
is_valid = Column(INT, nullable=False)
flag = Column(INT, index=True, server_default=text("'1'"))
is_verify = Column(INT, index=True, server_default=text("'0'"))
......
# -*- coding: utf-8 -*-
"""
Created on 2020-11-14
@author: cheng.li
"""
import os
if "DB_VENDOR" in os.environ and os.environ["DB_VENDOR"].lower() == "rl":
from alphamind.data.engines.sqlengine.sqlengine_rl import SqlEngine
from alphamind.data.engines.sqlengine.sqlengine_rl import total_risk_factors
from alphamind.data.engines.sqlengine.sqlengine_rl import industry_styles
from alphamind.data.engines.sqlengine.sqlengine_rl import risk_styles
from alphamind.data.engines.sqlengine.sqlengine_rl import macro_styles
else:
from alphamind.data.engines.sqlengine import SqlEngine
from alphamind.data.engines.sqlengine.sqlengine import total_risk_factors
from alphamind.data.engines.sqlengine.sqlengine import industry_styles
from alphamind.data.engines.sqlengine.sqlengine import risk_styles
from alphamind.data.engines.sqlengine.sqlengine import macro_styles
......@@ -20,14 +20,14 @@ from sqlalchemy.sql import func
from PyFin.api import advanceDateByCalendar
from alphamind.data.dbmodel.models import FactorMaster
from alphamind.data.dbmodel.models import IndexComponent
from alphamind.data.dbmodel.models import IndexMarket
from alphamind.data.dbmodel.models import Industry
from alphamind.data.dbmodel.models import Market
from alphamind.data.dbmodel.models import RiskExposure
from alphamind.data.dbmodel.models import RiskMaster
from alphamind.data.dbmodel.models import Universe as UniverseTable
from alphamind.data.dbmodel.models.models import FactorMaster
from alphamind.data.dbmodel.models.models import IndexComponent
from alphamind.data.dbmodel.models.models import IndexMarket
from alphamind.data.dbmodel.models.models import Industry
from alphamind.data.dbmodel.models.models import Market
from alphamind.data.dbmodel.models.models import RiskExposure
from alphamind.data.dbmodel.models.models import RiskMaster
from alphamind.data.dbmodel.models.models import Universe as UniverseTable
from alphamind.data.engines.universe import Universe
from alphamind.data.engines.utilities import factor_tables
from alphamind.data.engines.utilities import _map_factors
......@@ -37,6 +37,7 @@ from alphamind.data.processing import factor_processing
from alphamind.data.transformer import Transformer
from alphamind.portfolio.riskmodel import FactorRiskModel
risk_styles = ['BETA',
'MOMENTUM',
'SIZE',
......
......@@ -5,14 +5,11 @@ Created on 2020-10-11
@author: cheng.li
"""
import os
from typing import Dict
from typing import Iterable
from typing import List
from typing import Tuple
from typing import Union
import numpy as np
import pandas as pd
import sqlalchemy as sa
......@@ -21,26 +18,25 @@ from sqlalchemy import (
and_,
join,
select,
outerjoin
)
from PyFin.api import advanceDateByCalendar
from alphamind.data.dbmodel.models_rl import (
from alphamind.data.dbmodel.models.models_rl import (
Market,
Industry,
RiskExposure
RiskExposure,
Universe as UniverseTable
)
if "DB_VENDOR" in os.environ and os.environ["DB_VENDOR"].lower() == "rl":
from alphamind.data.dbmodel.models_rl import Universe as UniverseTable
else:
from alphamind.data.dbmodel.models import Universe as UniverseTable
from alphamind.data.engines.utilities import factor_tables
from alphamind.data.engines.utilities import _map_factors
from alphamind.data.engines.universe import Universe
from alphamind.data.processing import factor_processing
from alphamind.data.engines.utilities import _map_risk_model_table
from alphamind.portfolio.riskmodel import FactorRiskModel
from alphamind.data.transformer import Transformer
risk_styles = ['BETA',
......@@ -214,6 +210,58 @@ class SqlEngine:
dates: Iterable[str] = None) -> pd.DataFrame:
return universe.query(self, start_date, end_date, dates)
def fetch_factor(self,
ref_date: str,
factors: Iterable[object],
codes: Iterable[int],
warm_start: int = 0,
used_factor_tables=None) -> pd.DataFrame:
if isinstance(factors, Transformer):
transformer = factors
else:
transformer = Transformer(factors)
dependency = transformer.dependency
if used_factor_tables:
factor_cols = _map_factors(dependency, used_factor_tables)
else:
factor_cols = _map_factors(dependency, factor_tables)
start_date = advanceDateByCalendar('china.sse', ref_date, str(-warm_start) + 'b').strftime(
'%Y-%m-%d')
end_date = ref_date
big_table = Market
joined_tables = set()
joined_tables.add(Market.__table__.name)
for t in set(factor_cols.values()):
if t.__table__.name not in joined_tables:
big_table = outerjoin(big_table, t, and_(Market.trade_date == t.trade_date,
Market.code == t.code))
joined_tables.add(t.__table__.name)
query = select(
[Market.trade_date, Market.code.label("code"),
Market.chgPct.label("chgPct"),
Market.secShortName.label("secShortName")] + list(
factor_cols.keys())) \
.select_from(big_table).where(and_(Market.trade_date.between(start_date, end_date),
Market.code.in_(codes)))
df = pd.read_sql(query, self.engine) \
.replace([-np.inf, np.inf], np.nan) \
.sort_values(['trade_date', 'code']) \
.set_index('trade_date')
res = transformer.transform('code', df).replace([-np.inf, np.inf], np.nan)
res['chgPct'] = df.chgPct
res['secShortName'] = df['secShortName']
res = res.loc[ref_date:ref_date, :]
res.index = list(range(len(res)))
return res
def fetch_industry(self,
ref_date: str,
codes: Iterable[int] = None,
......@@ -405,6 +453,8 @@ if __name__ == "__main__":
universe = Universe("hs300")
start_date = '2020-09-29'
end_date = '2020-10-10'
df = sql_engine.fetch_factor("2020-02-21", factors=["BETA"], codes=["2010031963"])
print(df)
df = sql_engine.fetch_codes_range(start_date=start_date, end_date=end_date, universe=Universe("hs300"))
print(df)
df = sql_engine.fetch_dx_return("2020-10-09", codes=["2010031963"])
......
......@@ -7,7 +7,6 @@ Created on 2017-7-7
import abc
import sys
import os
import pandas as pd
from sqlalchemy import and_
......@@ -15,11 +14,7 @@ from sqlalchemy import not_
from sqlalchemy import or_
from sqlalchemy import select
if "DB_VENDOR" in os.environ and os.environ["DB_VENDOR"].lower() == "rl":
from alphamind.data.dbmodel.models_rl import Universe as UniverseTable
else:
from alphamind.data.dbmodel.models import Universe as UniverseTable
from alphamind.data.dbmodel.models import Universe as UniverseTable
class BaseUniverse(metaclass=abc.ABCMeta):
......
......@@ -9,34 +9,16 @@ import os
from typing import Dict
from typing import Iterable
if "DB_VENDOR" in os.environ and os.environ["DB_VENDOR"].lower() == "rl":
from alphamind.data.dbmodel.models import Categories
from alphamind.data.dbmodel.models import Market
from alphamind.data.dbmodel.models_rl import RiskCovDay
from alphamind.data.dbmodel.models_rl import RiskCovLong
from alphamind.data.dbmodel.models_rl import RiskCovShort
from alphamind.data.dbmodel.models_rl import RiskExposure
from alphamind.data.dbmodel.models_rl import SpecificRiskDay
from alphamind.data.dbmodel.models_rl import SpecificRiskLong
from alphamind.data.dbmodel.models_rl import SpecificRiskShort
from alphamind.data.dbmodel.models import Uqer
from alphamind.data.engines.industries import INDUSTRY_MAPPING
factor_tables = [Market, RiskExposure, Uqer, Categories]
else:
from alphamind.data.dbmodel.models import Categories
from alphamind.data.dbmodel.models import Market
from alphamind.data.dbmodel.models import RiskCovDay
from alphamind.data.dbmodel.models import RiskCovLong
from alphamind.data.dbmodel.models import RiskCovShort
from alphamind.data.dbmodel.models import RiskExposure
from alphamind.data.dbmodel.models import SpecificRiskDay
from alphamind.data.dbmodel.models import SpecificRiskLong
from alphamind.data.dbmodel.models import SpecificRiskShort
from alphamind.data.dbmodel.models import Uqer
from alphamind.data.engines.industries import INDUSTRY_MAPPING
factor_tables = [Market, RiskExposure, Uqer, Categories]
from alphamind.data.dbmodel.models import Market
from alphamind.data.dbmodel.models import RiskCovDay
from alphamind.data.dbmodel.models import RiskCovLong
from alphamind.data.dbmodel.models import RiskCovShort
from alphamind.data.dbmodel.models import RiskExposure
from alphamind.data.dbmodel.models import SpecificRiskDay
from alphamind.data.dbmodel.models import SpecificRiskLong
from alphamind.data.dbmodel.models import SpecificRiskShort
from alphamind.data.engines.industries import INDUSTRY_MAPPING
factor_tables = [Market, RiskExposure]
def _map_risk_model_table(risk_model: str) -> tuple:
......
......@@ -9,7 +9,7 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
......@@ -32,9 +32,21 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 2,
"metadata": {},
"outputs": [],
"outputs": [
{
"ename": "AttributeError",
"evalue": "'SqlEngine' object has no attribute 'fetch_factor'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-2-f6a26cae2a7b>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[0mrisk_cov\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrisk_exposure\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mengine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfetch_risk_model\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcodes\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 9\u001b[1;33m \u001b[0mfactor\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mengine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfetch_factor\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'EPS'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcodes\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 10\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[0mtotal_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmerge\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfactor\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrisk_exposure\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mon\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'code'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdropna\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mAttributeError\u001b[0m: 'SqlEngine' object has no attribute 'fetch_factor'"
]
}
],
"source": [
"risk_penlty = 0.5\n",
"ref_date = '2018-02-08'\n",
......@@ -59,7 +71,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
......@@ -79,17 +91,9 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 2.99 ms\n"
]
}
],
"outputs": [],
"source": [
"%%time\n",
"w = Variable(n)\n",
......@@ -109,53 +113,19 @@
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-----------------------------------------------------------------\n",
" OSQP v0.4.1 - Operator Splitting QP Solver\n",
" (c) Bartolomeo Stellato, Goran Banjac\n",
" University of Oxford - Stanford University 2018\n",
"-----------------------------------------------------------------\n",
"problem: variables n = 439, constraints m = 640\n",
" nnz(P) + nnz(A) = 4419\n",
"settings: linear system solver = qdldl,\n",
" eps_abs = 1.0e-03, eps_rel = 1.0e-03,\n",
" eps_prim_inf = 1.0e-04, eps_dual_inf = 1.0e-04,\n",
" rho = 1.00e-01 (adaptive),\n",
" sigma = 1.00e-06, alpha = 1.60, max_iter = 4000\n",
" check_termination: on (interval 25),\n",
" scaling: on, scaled_termination: off\n",
" warm start: on, polish: on\n",
"\n",
"iter objective pri res dua res rho time\n",
" 1 -6.4413e+01 5.65e+00 6.37e+02 1.00e-01 1.36e-03s\n",
" 200 -2.4008e+00 4.49e-06 1.89e-03 1.55e+00 5.62e-03s\n",
"plsh -2.4003e+00 5.55e-16 1.37e-14 --------- 6.38e-03s\n",
"\n",
"status: solved\n",
"solution polish: successful\n",
"number of iterations: 200\n",
"optimal objective: -2.4003\n",
"run time: 6.38e-03s\n",
"optimal rho estimate: 2.29e-01\n",
"\n",
"Wall time: 29.9 ms\n"
"ename": "NameError",
"evalue": "name 'prob' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<timed eval>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n",
"\u001b[1;31mNameError\u001b[0m: name 'prob' is not defined"
]
},
{
"data": {
"text/plain": [
"-2.4003282365506444"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
......@@ -165,18 +135,19 @@
},
{
"cell_type": "code",
"execution_count": 13,
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('optimal', -2.4003282365506444)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
"ename": "NameError",
"evalue": "name 'prob' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-4-10ee360ecec6>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstatus\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'prob' is not defined"
]
}
],
"source": [
......@@ -185,45 +156,19 @@
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"ECOS 2.0.7 - (C) embotech GmbH, Zurich Switzerland, 2012-15. Web: www.embotech.com/ECOS\n",
"\n",
"It pcost dcost gap pres dres k/t mu step sigma IR | BT\n",
" 0 -3.332e-01 -1.048e+02 +2e+03 9e-01 1e-02 1e+00 5e+00 --- --- 1 1 - | - - \n",
" 1 -3.461e-01 -1.811e+01 +1e+03 2e-01 2e-03 8e-01 3e+00 0.5430 3e-01 1 1 1 | 0 0\n",
" 2 -2.875e+00 -4.039e+00 +2e+02 1e-02 9e-05 9e-02 4e-01 0.9297 6e-02 1 1 1 | 0 0\n",
" 3 -2.573e+00 -2.939e+00 +5e+01 5e-03 3e-05 3e-02 1e-01 0.7733 9e-02 1 1 2 | 0 0\n",
" 4 -2.449e+00 -2.553e+00 +1e+01 1e-03 8e-06 6e-03 3e-02 0.7708 6e-02 1 1 1 | 0 0\n",
" 5 -2.407e+00 -2.418e+00 +2e+00 1e-04 9e-07 6e-04 4e-03 0.9066 2e-02 1 1 1 | 0 0\n",
" 6 -2.402e+00 -2.404e+00 +3e-01 3e-05 2e-07 1e-04 7e-04 0.8248 1e-02 1 1 2 | 0 0\n",
" 7 -2.401e+00 -2.401e+00 +6e-02 6e-06 4e-08 9e-06 2e-04 0.9466 2e-01 2 2 2 | 0 0\n",
" 8 -2.400e+00 -2.400e+00 +5e-03 4e-07 3e-09 7e-07 1e-05 0.9237 1e-03 1 1 1 | 0 0\n",
" 9 -2.400e+00 -2.400e+00 +2e-04 2e-08 1e-10 2e-08 5e-07 0.9890 3e-02 1 1 1 | 0 0\n",
"10 -2.400e+00 -2.400e+00 +2e-06 2e-10 1e-12 2e-10 5e-09 0.9890 1e-04 1 1 1 | 0 0\n",
"11 -2.400e+00 -2.400e+00 +2e-08 2e-12 1e-14 2e-12 6e-11 0.9890 1e-04 2 1 1 | 0 0\n",
"\n",
"OPTIMAL (within feastol=2.2e-12, reltol=9.8e-09, abstol=2.4e-08).\n",
"Runtime: 0.011237 seconds.\n",
"\n",
"Wall time: 32.9 ms\n"
"ename": "NameError",
"evalue": "name 'prob' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<timed eval>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n",
"\u001b[1;31mNameError\u001b[0m: name 'prob' is not defined"
]
},
{
"data": {
"text/plain": [
"-2.400328236659518"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
......@@ -531,9 +476,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -545,7 +490,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
"version": "3.7.9"
},
"varInspector": {
"cols": {
......@@ -578,5 +523,5 @@
}
},
"nbformat": 4,
"nbformat_minor": 2
"nbformat_minor": 4
}
arrow == 0.16.0
cython == 0.29.21
cvxpy == 1.1.5
cvxopt == 1.2.5
deprecated == 1.2.10
ecos == 2.0.7.post1
jupyter == 1.0.0
jupyterlab == 2.2.6
matplotlib == 3.3.1
numba == 0.51.1
numpy == 1.19.1
pandas == 1.1.1
psycopg2-binary == 2.8.5
scikit-learn ==0.23.2
scipy == 1.5.2
simpleutils == 0.2.6
sqlalchemy == 1.3.19
xgboost == 1.2.0
\ No newline at end of file
arrow
cython
cvxpy
cvxopt
deprecated
ecos
jupyter
jupyterlab
matplotlib
numba
numpy
pandas
psycopg2-binary
scikit-learn
scipy
simpleutils
sqlalchemy
xgboost
\ No newline at end of file
......@@ -14,7 +14,7 @@ from Cython.Build import cythonize
from distutils.extension import Extension
import numpy as np
VERSION = "0.2.1"
VERSION = "0.2.3"
if platform.system() != "Windows":
import multiprocessing
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment