Средневзвешенное значение сгруппировано по стране и году - PullRequest
0 голосов
/ 23 июня 2018

У меня есть код, который вызывает несколько API из базы данных Comtrade ООН, повторяющихся годами. Затем он складывает их вместе в единый набор данных всех репортеров и лет с 1991 по 2018 год. Я пытаюсь затем получить среднее значение стоимости торговли, взвешенное по весу нетто для каждой страны каждый год.

import requests
import pandas as pd
import json
import numpy as np

base = "http://comtrade.un.org/api/get?"
maxrec = "50000"
item = "C"
freq = "A"
px="H0"
ps="all"
r="all"
p="0"
rg="2"
cc="AG2"
fmt="json"

comtrade = pd.DataFrame(columns=['Year', 'Reporter Code', 'Reporter', 'Commodity Code', 'Commodity', 'Trade Value (US$)'])

for year in range(1991,2018):
    print(r)
    ps="{}".format(year)
    url = base + "max=" + maxrec + "&" "type=" + item + "&" + "freq=" + freq + "&" + "px=" +px + "&" + "ps=" + str(ps) + "&" + "r="+ str(r) + "&" + "p=" + p + "&" + "rg=" +rg + "&" + "cc=" + cc + "&" + "fmt=" + fmt
#    print(url)
    t = requests.get(url)
    x = t.json()
    new = pd.DataFrame(x["dataset"])
    comtrade = comtrade.append(new)
group = comtrade.groupby([ 'rtCode', 'yr'])
finalvalue = group.apply(lambda x: np.average(x['TradeValue'], 
weights=x['NetWeight']))

Это может быть очевидным, но вот здесь проблема, похоже, возникает:

group = comtrade.groupby([ 'rtCode', 'yr'])
finalvalue = group.apply(lambda x: np.average(x['TradeValue'], weights=x['NetWeight']))

где я получаю ошибку:

TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'

1 Ответ

0 голосов
/ 24 июня 2018

Как вы можете видеть в приведенном ниже описании на этом примере URL-адреса из вашего соскоба , ноль - это основная особенность данных, которые вводятся в ваш фрейм данных как «Нет».

Вы можете изменить свой тип None, используя «fillna» от Pandas.Я использовал 0 в этом примере, который мог бы работать с вашей группой, или вы могли бы сделать «нан», поскольку «группы NA в GroupBy автоматически исключаются», согласно их документам.

from numpy import nan
comtrade =  comtrade.fillna(value=0, inplace=True)

enter image description here

...