Более быстрый способ агрегирования значений ключа из массива списков вместо использования групповых панд - PullRequest
0 голосов
/ 11 июля 2019

Я имею дело с функцией, которая работает правильно, но не так быстро, как хотелось бы. Эта функция имеет массив входных данных вида:

item = [{
         "var0057":31,
         "var0001":"A",
         "var0002":2,
         "data":[{
                   "var0046":"tr100",
                   "var0055":55,
                   "var0054":1000,
                   "var0058":2038
                  },
                  {
                   "var0046":"tr200",
                   "var0055":12,
                   "var0054":8000,
                   "var0058":2038
                   }]
         },
         {
         "var0057":31,
         "var0001":"B",
         "var0002":3,
         "data":[{
                   "var0046":"tr100",
                   "var0055":110,
                   "var0054":14000,
                   "var0058":2038
                  },
                  {
                   "var0046":"tr300",
                   "var0055":3,
                   "var0054":30000,
                   "var0058":2038
                   }]  
 }]

Итак, моя средняя цель с использованием этого массива dicts - получить массив dicts, используя только ключ data, где значения для ключей var0055 и var0054 агрегируются объектами с одинаковым значением для ключа. var0046, пример:

data = [{
            "var0046":"tr100",
            "var0055":165,
            "var0054":15000
         },
         {
            "var0046":"tr200",
            "var0055":12,
            "var0054":8000
         },
         {
            "var0046":"tr300",
            "var0055":3,
            "var0054":30000
         }]  
 }]

И моя конечная цель - получить массив значений var0055 и var0054, где каждая позиция массива представляет значение объекта для ключа, деленное на сумму всех объектов в одном и том же ключ, пример:

sum_var0054 = 15000+8000+30000
var0054 = [15000/sum_var0054,8000/sum_var0054,30000/sum_var0054]

мой код, который работает, но медленно:

def my_func(response):

    data2 = []

    for items in response['item']:
        data2.extend(items['data'])

   response2 = pd.DataFrame(data2)
   response2 = response2.drop(columns = ['var0058'])
   response2 = response2.groupby('var0046', as_index=False).sum()

   sum_var0054 = sum(response2['var0054'])
   ind0054 = sum((response2['var0054'] ** 2)/sum_var0054)

   sum_var0055 = sum(response2['var0055'])
   ind0055 = sum((response2['var0055'] ** 2)/sum_var0055)

   response.clear()
   response['ind0054'] = ind0054
   response['ind0055'] = ind0055

Есть ли причина для агрегирования этого диктата, чтобы быстрее получить результат ind0054 и ind0055? Без необходимости конвертировать в панды DataFrame? Работаете напрямую с форматом dict?

...