我正在尝试使用MySQL来保存一些时间序列 bool 数据,然后根据保存的数据做出决定。
我需要保存最后 144 个样本,然后检查是否有超过 X% 的非零值。
我尝试使用比例为 44 的数字
字段。有时数据会被截断为 9999999999。
这就是我创建专栏的方式:
op.add_column('object', sa.Column('data_history', sa.Numeric(scale=44), nullable=False, default=0))
这是我处理计算的代码:
happens_now = data < DATA_THRESHOLD
mask = 0
for i in xrange(144):
mask <<= 1
mask |= 1
safe_logging.info('History: {} LongHistory: {}'.format(my_object.data_history, long(my_object.data_history)))
my_object.data_history *= 2
safe_logging.info('History: {} LongHistory: {}'.format(my_object.data_history, long(my_object.data_history)))
my_object.data_history += happens_now
safe_logging.info('History: {} LongHistory: {}'.format(my_object.data_history, long(my_object.data_history)))
history_to_consider = long(my_object.data_history) & mask
safe_logging.info('Mask: {} Data: {} Happens now: {} History: {}'.format(mask, data, happens_now, history_to_consider))
pop_count = self._PopCount(history_to_consider)
if (not my_object.is_total) and pop_count/144 > PERCENTAGE_THERSHOLD:
my_object.is_total = True
这是我两次连续数据插入的日志输出:
INFO: History: 8589934591 LongHistory: 8589934591
INFO: History: 17179869182 LongHistory: 17179869182
INFO: History: 17179869183 LongHistory: 17179869183
INFO: Mask: 22300745198530623141535718272648361505980415 Data: 10 Happens now: True History: 17179869183
INFO: History: 9999999999 LongHistory: 9999999999
INFO: History: 19999999998 LongHistory: 19999999998
INFO: History: 19999999999 LongHistory: 19999999999
INFO: Mask: 22300745198530623141535718272648361505980415 Data: 10 Happens now: True History: 19999999999
我试图在 MySQL 文档中找到限制,但找不到。 Python 似乎可以很好地处理长数字(请参阅掩码)。
这是 SQLAlchemy 的限制吗?我错过了一些 MySQL 限制?
最佳答案
因此,正如 @Shadow 指出的那样,我混淆了比例和精度。
小数位数是小数点后的位数,精度是总位数。
此外,最大精度为 30,因此我必须连接两个左右的 BigInt,以获得更大的数字。
关于Python 和 MySQL - 数字类型有限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34389748/