Как определить изменения в переменной на человека за время (в данных панели)? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть данные панели (повторные наблюдения за идентификатором в разные моменты времени).Данные несбалансированы (есть пробелы).Мне нужно проверить и, возможно, скорректировать изменение переменной на человека за эти годы.

Я попробовал две версии.Во-первых, for настройка петли, чтобы сначала получить доступ к каждому человеку и каждому его году.Во-вторых, комбинация из одной строки с groupby.Groupby выглядит более элегантно для меня.Здесь основной вопрос заключается в выявлении «следующего элемента».Я предполагаю, что в цикле я могу решить это с помощью счетчика.

Вот мои данные панели MWE:

import pandas as pd
df = pd.DataFrame({'year': ['2003', '2004', '2005', '2006', '2007', '2008', '2009','2003', '2004', '2005', '2006', '2007', '2008', '2009'],
                   'id': ['1', '1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '2', '2', '2'],
                   'money': ['15', '15', '15', '16', '16', '16', '16', '17', '17', '17', '18', '17', '17', '17']}).astype(int)
df

Вот как выглядит временной ряд на человека:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

fig, ax = plt.subplots()

for i in df.id.unique():
    df[df['id']==i].plot.line(x='year', y='var', ax=ax, label='id = %s'%i)
    df[df['id']==i].plot.scatter(x='year', y='var', ax=ax)
    plt.xticks(np.unique(df.year),rotation=45)    

enter image description here

Вот чего я хочу достичь : Для каждого человека сравните временной ряд значений и отбросьте каждого преемника, который отличается от своего значения предшественника (выделите красные кружки).Затем я попробую разные стратегии, чтобы справиться с этим:

  • Отбрасывание (очень сомнительно): если преемник отличается, отбросьте его
  • Smooth (абсолютное значение): если преемник отличается (скажем)1 единица, присвойте ему значение предшественника
  • Smooth (относительное значение): если преемник отличается, скажем, на 1 процент, присвойте ему значение предшественника

Решение для отбрасывания

df['money_difference'] = df['money']-df.groupby('id')['money'].shift(1)
df_new = df.drop(df[df['money_difference'].abs()>0].index)

Идея сглаживания

# keep track of change of variable by person and time
df['money_difference'] = df['money']-df.groupby('id')['money'].shift(1)
# first element has no precursor, it will be NaN, replace this by 0
df = df.fillna(0)
# now: whenever change_of_variable exceeds a threshold, replace the value by its precursor - not working so far
df['money'] = np.where(abs(df['money_difference'])>=1, df['money'].shift(1), df['money'])

1 Ответ

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

Чтобы получить следующее событие в вашей базе данных, вы можете использовать комбинацию с groupby и shift, а затем выполнить вычитание до предыдущего события:

df['money_difference'] =df.groupby(['year', 'id'])['money'].shift(-1)-df['money']
...