Добавить квартальные данные из списка в годовой - PullRequest
1 голос
/ 06 августа 2020

У меня есть набор данных с квартальными данными.

Пример: [2019, 1, 10, 20, 5],

[2019, 10, 56, 34],
[2019, 74, 66 ,32],
[2019, 20, 96, 31],
[2018, 13, 16, 35],
.....

Я хочу суммировать и вычислить среднее и найдите максимальное и минимальное значение (в зависимости от столбца) для каждого года и добавьте результат в новый список. столбец 1 -> среднее значение, столбец 2, найти максимум, столбец 3 найти минимум;

[2019, 26.25,  96, 31]
[2018 .....]
...

Я не знаю, как подойти к этой проблеме, и я не могу использовать pandas или numpy

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

создать dict d = {} формы year: [list, number of quartals]

перебрать исходный список

for yr, x,y,z in data: 
    if yr not in d:
        d[yr] = [[yr, x, y, z], 1]
    # now make changes
    else:
        a = d[yr]
        e, n = a
        e[1] += x
        e[2] = max(e[2], y)
        e[3] = min(e[3], z)
        a[1] += 1

теперь перебрать d снова, чтобы разделить e[1] / a[1] для получения среднего и поместите e в список результатов

0 голосов
/ 06 августа 2020

Вы можете сделать следующее -

СПОСОБ 1: Использование PANDAS

#Mention all the columns and respective aggregations as key, value for a dict
g = {'var2':'mean', 'var3':'max', 'var4':'min'}


#Apply groupby with agg() using the above dict
df.groupby(['var1']).agg(g).reset_index()

Просто замените var1, var2, var3, var4 с фактическими именами переменных в коде.

   var1       var2  var3  var4
0  2018  13.000000    16    35
1  2019  34.666667    96    31

РЕДАКТИРОВАТЬ: если вы не должны использовать какие-либо pandas или numpy, тогда я должен предположить, что ваш набор данных на самом деле список списков, а НЕ pandas фрейм данных иначе, что нарушило бы цель. В этом случае вы можете использовать понимание списка, чтобы решить эту проблему следующим образом -

МЕТОД 2: Использование понимания списка

data = [[2019, 10, 56, 34],[2019, 74, 66 ,32],[2019, 20, 96, 31],[2018, 13, 16, 35], [2018, 14, 27, 33]]
#function to calculate average on a list
def average(lst): 
    return sum(lst) / len(lst)

#get set list of years
unique_years = set([i[0] for i in data])

[[[j[0] for j in data if j[0]==i][0],
   average([j[1] for j in data if j[0]==i]),
   max([j[2] for j in data if j[0]==i]),
   min([j[3] for j in data if j[0]==i])] for i in unique_years]
#output: [[2018, 13.5, 27, 33], [2019, 34.666666666666664, 96, 31]]

Вы также можете сделать это с помощью явных циклов for, если вас не устраивает понимание списков -

МЕТОД 3: Использование явного FOR - IF

yr = []
v1 = []
v2 = []
v3 = []

#function to calculate average on a list
def average(lst): 
    return sum(lst) / len(lst)

#get set list of years
unique_years = set([i[0] for i in data])

for i in unique_years:
    for j in data:
        if j[0]==i:
            v1.append(j[1])
            v2.append(j[2])
            v3.append(j[3])
    yr.append([i,average(v1),max(v2), min(v3)])
    
print(yr)
#output: [[2018, 13.5, 27, 33], [2019, 26.2, 96, 31]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...