Искаженные результаты при предоставлении данных «extendedEncoded»

1

Я пытаюсь использовать Image-Charts Api в качестве замены устаревших графических графиков Google Api. Я просматривал документацию и пытался построить скрипт python для создания графика, представляющего прошлую 24-часовую криптографию (ethereum).

Мне удалось получить данные из криптовалюта Api просто отлично. Проблема возникает при попытке "ExtendedEncode" этого списка цен, поскольку документация графических карт говорит о необходимости делать для больших наборов данных и больших значений. Я должен делать что-то неправильно в функции кодирования, так как моя диаграмма всегда выглядит так искаженной

Изображение 174551

Они предоставляют функцию 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>
Теги:
python-2.7

1 ответ

3
Лучший ответ

Раскрытие информации: Я основатель графических карт.

Графики изображений имитируют собственную графику изображений Google, таким образом:

масштабирует значения данных в соответствии с полным диапазоном этой кодировки

Поскольку вы используете расширенную кодировку e: она будет масштабировать набор данных от 0 до 4095.

Хорошей новостью является то, что вы можете использовать удивительный текстовый формат a: параметр .

Он имеет числа с плавающей запятой, без ограничения нижнего предела (в отличие от ограничений графического изображения 0-61, 0-100 или 0-4095), автоматического масштабирования (нет необходимости в chds = a). Любое значение ниже или выше нуля является допустимым, без усечения. Его проще всего использовать, читать и писать вручную.

Использование:

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

chart?chs=700x200&cht=ls&chxt=y&chf=b0,lg,90,EA469E,1,03A9F4,0.4&chan=1100,easeInCirc&chl=2014%7C2015%7C2016%7C2017%7C2018&chd=a:30010,-30000.1,50000.5,80000.10,20000&chof=stackoverflow-51661409&chma=0,50,0,0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню