Example #1
0
File: orm.py Project: merz9b/coinai
    async def findAll(cls, where=None, args=None, **kw):
        ' find objects by where clause. '
        try:
            sql = [cls.__select__]
            if where:
                sql.append('where')
                sql.append(where)
            if args is None:
                args = []
            orderBy = kw.get('orderBy', None)
            if orderBy:
                sql.append('order by')
                sql.append(orderBy)
            limit = kw.get('limit', None)
            if limit is not None:
                sql.append('limit')
                if isinstance(limit, int):
                    sql.append('?')
                    args.append(limit)
                elif isinstance(limit, tuple) and len(limit) == 2:
                    sql.append('?, ?')
                    args.extend(limit)
                else:
                    raise ValueError('Invalid limit value: %s' % str(limit))

            rs = await select(' '.join(sql), args)
            return [cls(**r) for r in rs]
        except Exception as e:
            errMsg = getErrorMsg()
            error(
                "orm findAll error is: %s, kw is %s, where is %s, args is %s" %
                (str(errMsg), str(kw), str(where), str(args)))
            return []
Example #2
0
		def wrapper(*args, **kw):
			try:
				return func(*args, **kw)
			except Exception as e:
				errMsg = getErrorMsg()
				error("options api error is: %s"%str(errMsg))
				result = {"error": 500, "data": "", "message": _("500_SERVER_ERROR", kw.get("language","en"))}
				return result
Example #3
0
	async def remove(self):
		try:
			args = [self.getValue(self.__primary_key__)]
			rows = await execute(self.__delete__, args)
			if rows != 1:
				error('failed to remove by primary key: affected rows: %s, args : %s' % (rows, str(args)))
			return rows
		except Exception as e:
			errMsg = getErrorMsg()
			error("orm remove error is: %s" % (errMsg))
			return None
Example #4
0
	async def find(cls, pk):
		'find object by primary key'
		try:
			rs = await select('%s where `%s`= ?' % (cls.__select__, cls.__primary_key__), [pk], 1)
			if len(rs) == 0:
				return None
			return cls(**rs[0])
		except Exception as e:
			errMsg = getErrorMsg()
			error("orm find error is: %s, pk is %s" % (str(errMsg),str(pk)))
			return None
Example #5
0
	async def update(self):
		try:
			args = list(map(self.getValue, self.__fields__))
			args.append(self.getValue(self.__primary_key__))
			rows = await execute(self.__update__, args)
			if rows != 1:
				error('failed to update by primary key: affected rows: %s, args : %s' % (rows, str(args)))
			return rows
		except Exception as e:
			errMsg = getErrorMsg()
			error("orm update error is: %s" % (errMsg))
			return None
Example #6
0
	async def save(self):
		try:
			args = list(map(self.getValueOrDefault, self.__fields__))
			args.append(self.getValueOrDefault(self.__primary_key__))
			rows  = await execute(self.__insert__, args)
			if rows != 1:
				error('failed to insert record: affected rows :%s, args : %s' % (rows, str(args)))
			return rows
		except Exception as e:
			errMsg = getErrorMsg()
			error("orm save error is: %s" % (errMsg))
			return None
Example #7
0
async def execute(sql, args):

	global __pool
	with (await __pool) as conn:
		try:
			cur = await conn.cursor()
			await cur.execute(sql.replace('?', '%s'), args or ())
			affected = cur.rowcount
			await cur.close()
		except BaseException as e:
			error("execute Exception is -------------------> : %s,  sql is %s, args is %s"%(str(e), str(sql), str(args)))
			raise
		return affected
Example #8
0
async def token2user(token):
    if not token:
        return None
    try:
        redis_obj = Redis.getInstance()
        user = redis_obj.get(token)
        if user is None:
            return None
        user = json.loads(
            user.decode()) if not isinstance(user, dict) else user
        redis_obj.set_expire(token, 3600 * 24)
        return user
    except Exception as e:
        error("token2user exception is: %s" % str(e))
        return None
Example #9
0
File: orm.py Project: merz9b/coinai
 async def findNumber(cls, selectField, where=None, args=None):
     ' find number by select and where. '
     try:
         sql = ['select %s _num_ from `%s`' % (selectField, cls.__table__)]
         if where:
             sql.append('where')
             sql.append(where)
         rs = await select(' '.join(sql), args, 1)
         if len(rs) == 0:
             return None
         return rs[0]['_num_']
     except Exception as e:
         errMsg = getErrorMsg()
         error(
             "orm findNumber error is: %s, selectField is %s, where is %s, args is %s"
             % (str(errMsg), str(selectField), str(where), str(args)))
         return None
Example #10
0
async def frequency(remote_ip, path_url):
    try:
        fast_rep = 0
        redis_obj = Redis.getInstance()
        data_val = redis_obj.getHash(remote_ip, path_url)
        try:
            data_val = json.loads(data_val.decode())
            val = data_val.get("now_time", "") if isinstance(
                data_val, dict) else data_val
            num = data_val.get("num", "") if isinstance(data_val, dict) else 1
            now_time = int(time.time() * 1000)
            pre_time = data_val.get("pre_time", "") if isinstance(
                data_val, dict) else now_time
        except:
            now_time = int(time.time() * 1000)
            pre_time = now_time
            val = ""
            num = 1

        request_info("frequency val:%s" % str(val))
        if not val:
            data = {"now_time": now_time, "num": 1, "pre_time": now_time}
            redis_obj.setHash(remote_ip, path_url, json.dumps(data))
            redis_obj.setHashExpire(remote_ip, 3600)
        else:
            if now_time - int(val) < 200:
                fast_rep = 1
            if num >= 60 and now_time - pre_time <= 60000:
                fast_rep = 1
                num += 1
            elif now_time - pre_time > 60000:
                pre_time = now_time
                num = 1
            else:
                num += 1

            data = {"now_time": now_time, "num": num, "pre_time": pre_time}
            redis_obj.setHash(remote_ip, path_url, json.dumps(data))
            redis_obj.setHashExpire(remote_ip, 3600)
        return fast_rep
    except Exception as e:
        error("frequency exception is: %s" % str(e))
        return None
Example #11
0
	def  __call__(self, request):

		kw = None
		if self._has_var_kw_arg or self._has_named_kw_arg or self._required_kw_args or self._named_kw_args:
			if request.method in ('POST',"OPTIONS"):
				if not request.content_type:
					r = {"error": 404, "data": {}, "message": 'Missing Content-Type'}
					resp = to_response(r, method=request.method)
					return resp

				ct = request.content_type.lower()
				if ct.startswith('application/json'):
					params = yield from request.json()
					if not isinstance(params, dict):
						r = {"error": 404, "data": {}, "message": 'JSON Body must be object'}
						resp = to_response(r, method=request.method)
						return resp
					kw = params

				elif ct.startswith('application/x-www-form-urlencoded') or ct.startswith('multipart/form-data'):
					params = yield from request.post()
					kw = dict(**params)
				else:
					r = {"error": 404, "data": {}, "message": 'Unsupported Content-Type:%s' % request.content_type}
					resp = to_response(r, method=request.method)
					return resp

			if request.method == 'GET':
				qs = request.query_string
				if qs:
					kw = dict()
					for k, v in parse.parse_qs(qs, True).items():
						kw[k] = v[0]

		if kw is None:
			kw = dict(**request.match_info)
		else:
			if not self._has_var_kw_arg and self._named_kw_args:
				copy =  dict()
				for name in self._named_kw_args:
					if name in kw:
						copy[name] = kw[name]
				kw = copy
			for k, v in request.match_info.items():
				if k in kw:
					error('Duplicate arg name in named arg and kw args: %s' % k)
				kw[k] = v

		if self._has_request_arg:
			kw['request'] = request

		language = toExistLanguage(kw.get("language", "en"))
		if self._required_kw_args:
			for name in self._required_kw_args:
				if not name in kw:
					r = {"error": 500, "data": {}, "message": _("500_SERVER_ERROR", language)}
					resp = to_response(r, method=request.method)
					return resp

		request_info('call with args: %s' % str(kw))
		try:
			res = yield from self.request_frequency(request, kw)
			if res == True:
				resp = yield from self.getToken(request, kw)
				if resp == True:
					if "token" in kw:
						del kw["token"]
					if "language" in kw:
						del kw["language"]
					r = yield from self._func(**kw)
					return r
				else:
					return resp
			else:
				return res
		except Exception as e:
			errMsg = getErrorMsg()
			error("__call__ api error is: %s"%str(errMsg))
			r = {"error": 500, "data": {}, "message": _("500_SERVER_ERROR", language)}
			resp = to_response(r, method=request.method)
			return resp
Example #12
0
async def portfolio_ratios(port_folio=None, folio_id="", db=None, lang="en"):

    try:
        if not db:
            db = Connection.getInstance()

        if not port_folio:
            if folio_id:
                port_folio = await folios_dao.findFolio(folio_id)
                if not port_folio:
                    return None
            else:
                return None

        helper = StatsHelper(lang=lang)
        proforma = await folios_dao.GetFolioPerformance(port_folio.id)
        if proforma:
            fts = proforma["pre_data"]["data"]
            now_data = [nowData["data"] for nowData in proforma["now_data"]]
            now_fts = []
            for d in now_data:
                fts.extend(d)
                now_fts.extend(d)

            prof_fts = [perf["NetReturn"] for perf in now_fts]
            dates = [
                datetime.fromtimestamp(p['EffectiveDate']) for p in now_fts
            ]
            fts_data = calculate_fts(prof_fts, dates)

            dates = [datetime.fromtimestamp(p['EffectiveDate']) for p in fts]
            prof_array = [perf["NetReturn"] for perf in fts]
            fts = Series(data=prof_array, index=dates, name=port_folio.name)

            T = len(fts)
            referenceData = await report_dao.findReferenceData('Risk Free Rate'
                                                               )
            if referenceData:
                rf = float(referenceData.data) * 0.01
            else:
                rf = 0

            stats_all = BasicStats(fts,
                                   risk_free=rf,
                                   folio_name=port_folio.name)
            roll_windows = windows[stats_all.freq[0]]
            roll_results = []
            ratio_items = {
                "Cumulative Return": [],
                "Period volatility": {
                    "volatility": "",
                    "day_7_volatility": ""
                },
                "Max Drawdown": {
                    "max_drawdown": "",
                    "day_7_drawdown": ""
                },
                "entire_history": "",
                "day_7_history": ""
            }

            resultsAll = helper.help(stats_all)
            result_dict = dict(resultsAll)
            ratio_items["entire_history"] = fts_data[
                "entire_history"] if fts_data else 0.0
            ratio_items["day_7_history"] = fts_data[
                "day_7_history"] if fts_data else 0.0
            ratio_items["Period volatility"]["volatility"] = fts_data[
                "total_volatility"] if fts_data else 0.0
            ratio_items["Max Drawdown"]["max_drawdown"] = fts_data[
                "total_max_drawdown"] if fts_data else 0.0
            ratio_items["Cumulative Return"].append(
                result_dict.get(_("Cumulative Return", lang), ""))
            for index, w in enumerate(roll_windows):
                if T >= w:
                    roll_fts = fts[-1 * w:]
                    ratio_data = helper.help(BasicStats(roll_fts,
                                                        risk_free=rf))
                    ratio_dict = dict(ratio_data)
                    val = ratio_dict.get(_("Cumulative Return", lang), "")
                    ratio_items["Cumulative Return"].append(val)
                    if index == 0:
                        ratio_items["Max Drawdown"][
                            "day_7_drawdown"] = fts_data[
                                "week_max_drawdown"] if fts_data else 0.0
                        ratio_items["Period volatility"][
                            "day_7_volatility"] = fts_data[
                                "week_volatility"] if fts_data else 0.0
                    roll_results.append([w, ratio_data])
            await folios_dao.updateFolioHistory(port_folio.id, ratio_items)

            reportData = {
                "ResultsAll": resultsAll,
                "RollResults": roll_results,
                "Coin": {
                    "Name": port_folio.name
                }
            }
            params = "ratios_%s" % lang
            await db.set_cache(port_folio.id,
                               "portfolio",
                               params,
                               data=reportData,
                               modify_at=port_folio.modify_at)
        else:
            roll_results = []
            ratio_items = {
                "Cumulative Return": [],
                "Period volatility": {
                    "volatility": ""
                },
                "Max Drawdown": {
                    "max_drawdown": "",
                    "day_7_drawdown": ""
                }
            }

            resultsAll = helper.init_help()
            result_dict = dict(resultsAll)

            ratio_items["Period volatility"]["volatility"] = result_dict.get(
                "% Volatility", "")
            ratio_items["Max Drawdown"]["max_drawdown"] = result_dict.get(
                "Max Drawdown", "")
            ratio_items["Cumulative Return"].append(
                result_dict.get("Cumulative Return", ""))
            await folios_dao.updateFolioHistory(port_folio.id, ratio_items)

            reportData = {
                "ResultsAll": resultsAll,
                "RollResults": roll_results,
                "Coin": {
                    "Name": port_folio.name
                }
            }

    except Exception as e:
        errMsg = getErrorMsg()
        error("portfolio_ratios exception is: %s, errMsg: %s" %
              (str(e), str(errMsg)))
        reportData = {}

    return reportData