Рассчитать процентное изменение (со временем) значений столбца панд на основе значения другого столбца - PullRequest
0 голосов
/ 13 июня 2019

Я работаю с примером набора данных:

       date      name     point
0   4/24/2019   Martha   3617138
1   4/25/2019   Martha   3961918
2   4/26/2019   Martha   4774966
3   4/27/2019   Martha   5217946
4   4/24/2019   Alex     62700321
5   4/25/2019   Alex     66721020
6   4/26/2019   Alex     71745138
7   4/27/2019   Alex     88762943
8   4/28/2019   Alex    102772578
9   4/29/2019   Alex    129089274
10  3/1/2019    Josh     1063259
11  3/3/2019    Josh     1063259
12  3/4/2019    Josh     1063259
13  3/5/2019    Josh     1063259
14  3/6/2019    Josh     1063259

и списком значений имен

nameslist = ['Martha', 'Alex', 'Josh']

Я хочу рассчитать процентное изменение всех строк на основеидентификатор в столбце имени.

ожидаемый вывод:

name    percent change
Martha      30.7
Alex        51.4
Josh          0

Сначала я попытался перебрать свой список и таблицу, добавить все строки, соответствующие значению списка, добавить список с помощьюрассчитать изменение, затем переместить следующее значение в моем списке, но я не могу правильно сформулировать свой код, чтобы это произошло.

df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(by='date')

growthlist=[]
temptable=[]
for i in nameslist:
    for j in df:
        temptable.append(df[df['name'].str.match(nameslist[i])])
        length=[]
        growth=temptable[0]-temptable[length-1]
        growthlist.append(i,growth)

, но это приводит к ошибке:

TypeError: list indices must be integers or slices, not str

Я также не возражаю против использования .groupby () и .pct_change () для достижения этой цели, но

growth = df.groupby('name').pct_change()

генерирует длинную обратную трассировку, которая заканчивается:

TypeError: unsupported operand type(s) for /: 'str' and 'float'

в конечном итогеЯ хотел бы вложить это в функцию, чтобы я мог использовать ее в других наборах данных и иметь возможность выбрать имя моего столбца (фактические наборы данных, с которыми я работаю, не стандартизированы, поэтому имена целевых столбцов часто различаются)

def calc_growth(dataset,colname):

но я не уверенесли это слишком много, спросите об этом одном вопросе.

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

Спасибо

1 Ответ

1 голос
/ 13 июня 2019

Вы можете использовать apply при значениях last и first, приближенных к .values, чтобы вычислить процентное изменение по всей группе:

df.groupby('name',sort=False).apply(lambda x: (x['point'].values[-1] - x['point'].values[0]) / x['point'].values[-1] * 100)\
    .reset_index(name='pct change')

     name               pct change
0  Martha  30.67889165583545363347
1    Alex  51.42871358932579539669
2    Josh   0.00000000000000000000

Объяснение

Сначала мы используем groupby на name, что даст нам группу (читай: фрейм данных) на основе каждого уникального имени:

for _, d in df.groupby('name', sort=False):
    print(d, '\n')

        date    name    point
0 2019-04-24  Martha  3617138
1 2019-04-25  Martha  3961918
2 2019-04-26  Martha  4774966
3 2019-04-27  Martha  5217946 

        date  name      point
4 2019-04-24  Alex   62700321
5 2019-04-25  Alex   66721020
6 2019-04-26  Alex   71745138
7 2019-04-27  Alex   88762943
8 2019-04-28  Alex  102772578
9 2019-04-29  Alex  129089274 

         date  name    point
10 2019-03-01  Josh  1063259
11 2019-03-03  Josh  1063259
12 2019-03-04  Josh  1063259
13 2019-03-05  Josh  1063259
14 2019-03-06  Josh  1063259 

Затем мы применяем нашу собственную сделанную lambda функцию к каждой отдельной группе и применяем следующий расчет:

процентное изменение = (точка последнего значения - точка первого значения) / точка последнего значения * 100


Затем мы используем reset_index, чтобы получить наш name столбец из индекса, поскольку groupby помещает его в качестве индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...