Конвертировать Pandas в mapData для JVectorMap - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть сайт фляги / python, который должен возвращать pandas столбцы - CountryCode ("US") и значение (192656.56) - в шаблон html, который представляет JVectorMap

mapData должен выглядеть так:

var gdpData = {
  "AF": 16.63,
  "AL": 11.58,
  "DZ": 158.97,
  ...
};

Кадр данных выглядит следующим образом:

enter image description here

Если это pandas df было json список (см. - http://api.worldbank.org/v2/country/all/indicator/NY.GDP.PCAP.PP.CD?format=json&mrv=1&per_page=300), следующий код python работает правильно, но я не могу получить правильно отформатированную переменную для возврата из функции с pandas кадром данных. Я пробовал дюжину подходов l oop / print, и все они пока выводят нужную переменную.

mapData = "var mapData = {\n"
for item in y[1]:   
    mapData += item['country']['id'] + ": " + "{:.2f}".format(item['value']) +",\n"
mapData += "}"
print(mapData)

Затем эти данные добавляются в сценарий Jvector следующим образом:

function createList(country.value, country.id,indicator.id){
    var gdpData = {
        results.gdpdata   # data to be filled in from the python and pandas df
      };

    $('#world-map-gdp').vectorMap({
    map: 'world_mill',
    series: {
    regions: [{
        values: gdpData,
        scale: ['#C8EEFF', '#0071A4'],
        normalizeFunction: 'polynomial'
    }]
    },
    onRegionTipShow: function(e, el, code){
    el.html(el.html()+' (GDP - '+gdpData[code]+')');
    }
});

} ​​

1 Ответ

0 голосов
/ 14 апреля 2020

Мне удалось «обмануть» и заставить работать строку (с ошибками консоли) через скрипт Regex и pandas дамп строки.

Я нашел лучшее решение, используя pandas собственную функцию "to_ json" следующим образом. Однако это не подтягивание значений ВВП к карте - это говорит о том, что значения не определены - я предполагаю, что мне нужно настроить небольшой параметр:

def MapData():
    global conn
    import wbdata
    ind_id=1

    qry = "SELECT * FROM indicator WHERE id = '" + str(ind_id) + "' ;"

    cur = conn.cursor()
    df = pd.read_sql(qry, conn)
    cur.close()

    ind_label = "GDP"
    ind_code = "NY.GDP.MKTP.CD"
    indicators = { ind_code : ind_label }

    data = wbdata.get_dataframe(indicators, country=u'all', convert_date=False, keep_levels=True).dropna()

    # Get most recent data only
    data2 = data.reset_index().drop_duplicates(subset='country', keep='first').set_index('country')
    # Merge data with country data from database - this removes
    rslt = pd.merge(data2, df, left_on='country', right_on="name", right_index=False, how='inner', sort=False);

    rslt.reset_index()
    rsl2 = rslt[['iso2c',ind_label]]
    rsl3 = rsl2.dropna()
    rssl = rsl3.round({ind_label:2}) 

    return (pd.DataFrame(rssl).to_json(orient='values')) # see other options for to_json - orient - like columns, records, split, etc.

Это отображает карту, но значения gdpData[code] отображаются как неопределенные

enter image description here

Примечание RE: Wbdata.get_dataframe ... Внимание - МЕДЛЕННО! Почему? Потому что это получает данные за 60 лет (1500 строк) !! Команда Most-Recent-Only для каждой страны нуждается в команде pandas '.drop_duplicates(subset='country', keep='first'). Это можно значительно ускорить, используя локально кэшированный файл или сводку базы данных, или другой отличный вариант - запросить Javascript для получения JSON данные непосредственно из внешнего интерфейса - см. Использование JQuery и оперативные JSON данные для заполнения JVectorMaps

У кого-нибудь есть решение для этого?

...