代码之家  ›  专栏  ›  技术社区  ›  CaffeinatedMike

提供“扩展编码”数据时结果失真

  •  1
  • CaffeinatedMike  · 技术社区  · 6 年前

    我一直想用 Image-Charts Api 作为现在被弃用的Google图像图表Api的替代品。我一直在查看文档,并试图构建一个python脚本来创建表示过去24小时加密(ethereum)定价的图。

    我已经能够从加密货币Api获取数据了。当试图对价格列表进行“扩展编码”时,问题就出现了,因为图像图表的文档显示需要对大数据集和大值进行编码。我必须在编码函数中做一些错误的事情,因为我的图表总是这样扭曲

    distorted data output

    他们提供 javascript function 为了对这些值和数据集进行编码,我尝试将其转换为python。我怀疑在翻译这个函数时我弄错了一些东西,但我不能百分之百确定。

    问题

    在编码和/或绘制数据时,有人能指出我哪里出错了吗?

    压缩的工作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>
    1 回复  |  直到 6 年前
        1
  •  3
  •   FGRibreau    6 年前

    披露:我是图像图表的创始人。

    图像图表模仿谷歌图像图表自身的实现,因此:

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

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

    好消息是,你可以使用 awesome text format a: 参数ðŸ‰。

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

    用法:

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