首页 > 解决方案 > 提供“扩展编码”数据时结果失真

问题描述

我一直在尝试使用Image-Charts Api作为现已弃用的 Google Image Charts Api 的替代品。我一直在查看文档并尝试构建一个 python 脚本来创建代表过去 24 小时加密(以太坊)定价的图表。

我已经能够很好地从加密货币 Api 中获取数据。当尝试“扩展编码”该价格列表时会出现问题,因为 Image-Charts 的文档说需要为大型数据集和大型值完成。我必须在编码功能中做错事,因为我的图表总是像这样扭曲

失真的数据输出

它们提供了用于编码这些值和数据集的javascript 函数,我试图将其翻译成 python。我怀疑在翻译函数时我搞砸了,但我不是 100% 确定。

问题

在编码和/或绘制数据时,谁能发现我哪里出错了?

精简的工作 python 代码 - 输出图表 url

from datetime import datetime
import requests
import time
import math

EXTENDED_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.'
EXTENDED_MAP_LENGTH = len(EXTENDED_MAP)

def extendedEncode(arrVals, maxVal):
    chartData = 'e:'
    for val in arrVals:
        numericVal = int(float(val))
        scaledVal = int(math.floor(EXTENDED_MAP_LENGTH * EXTENDED_MAP_LENGTH * numericVal / maxVal))
        if scaledVal > (EXTENDED_MAP_LENGTH * EXTENDED_MAP_LENGTH - 1):
            chartData += '..'
        elif scaledVal < 0:
            chartData += '__'
        else:
            quotient = int(math.floor(scaledVal / EXTENDED_MAP_LENGTH))
            remainder = int(scaledVal - EXTENDED_MAP_LENGTH * quotient)
            chartData += EXTENDED_MAP[quotient] + EXTENDED_MAP[remainder]
    return chartData

ts = time.time()
utc_offset = int((datetime.fromtimestamp(ts) - datetime.utcfromtimestamp(ts)).total_seconds())
cryptocompare = 'https://min-api.cryptocompare.com/data/histohour?fsym=ETH&tsym=USD&limit=24'
chartbase= 'https://image-charts.com/chart?cht=lc&chs=700x500&chxt=x,y'

resp = requests.get(cryptocompare).json()['Data']
print '{0} data points'.format(len(resp))

lvals = [dp['close'] for dp in resp]
labels = 'chxl=0:|{0}'.format('|'.join([datetime.utcfromtimestamp(dp['time']+utc_offset).strftime('%I%p') 
                                        for dp in resp]))
values = 'chd={0}'.format(extendedEncode(lvals, max(lvals)))
print '&'.join([chartbase, labels, values])

(扭曲的)图的可运行示例

var i = document.getElementById("output");
i.src = `
https://image-charts.com/chart?
cht=lc&
chs=700x500&
chxt=x,y&
chxl=0:|02PM|03PM|04PM|05PM|06PM|07PM|08PM|09PM|10PM|11PM|12AM|01AM|02AM|03AM|04AM|05AM|06AM|07AM|08AM|09AM|10AM|11AM|12PM|01PM|02PM&
chd=e:-7.Y9494.i.Y.1...s.s.P.Y.Y.s.F-y-o-o-L-B-V-L-V94-B`;
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <img id="output"></img>
</body>
</html>

标签: javascriptpythonpython-2.7image-charts

解决方案


披露:我是 Image-charts 的创始人。

Image-charts 模仿 Google Image Charts 自己的实现,因此它:

缩放数据值以适应该编码的完整范围

由于您使用的是扩展编码e:,因此它将在 0 到 4095 之间缩放数据集。

好消息是,您可以使用很棒的文本格式 a:参数。

它具有浮点数、没有下上限值限制(与 Google Image Charts 0-61、0-100 或 0-4095 限制不同)、自动缩放(不需要 chds=a)。任何低于或高于零的值都是有效的,不再截断。它是最容易手动使用、读写的。

用法:

chd=a:30010,-30000.1,50000.5,80000.10,20000


推荐阅读