Вычисление скользящего среднего между группами и сглаживание между некоторыми группами, которые являются непрерывными - PullRequest
1 голос
/ 03 апреля 2020

Приношу свои извинения, если название озадачивает, я сделаю все возможное, чтобы объяснить проблему. У меня есть пример данных, установленных здесь: Пример 1

Segment Reach   OutSeg  Elevation
1   1   3   50
1   2   3   74
1   3   3   87
1   4   3   53
1   5   3   97
2   1   3   16
2   2   3   14
2   3   3   31
2   4   3   35
2   5   3   27
3   1   4   193
3   2   4   176
3   3   4   158
3   4   4   154
4   1   6   21
4   2   6   45
4   3   6   42
4   4   6   22
4   5   6   22
5   1   6   10
5   2   6   21
5   3   6   14
5   4   6   16

Я хотел бы рассчитать скользящее среднее (окно ва 3) Высота вдоль каждого Сегмент число в последовательном порядке его Достигните , однако, где Сегмент имеет значение OutSeg Мне бы хотелось, чтобы скользящее среднее к конец каждого сегмента для использования значений Elevation от начала его сегмента, на который имеется ссылка (OutSeg). Например, в 1-м сегменте Reach 5 (1,5) я бы хотел, чтобы скользящее среднее учитывало значения в (1,4), (1,5) и (3,1).

Я полагаю, что для l oop может потребоваться какое-то ... Я пробовал приведенный ниже код, но он вычисляет только скользящее среднее в каждой группе:

df ["moving"] = df.groupby («Сегмент») [«Повышение»]. Transform (лямбда х: х.роллинг (3,1) df["moving"] = df.groupby("Segment")["Elevation"].transform(lambda x: x.rolling(3,1)

Заранее спасибо!

1 Ответ

0 голосов
/ 04 апреля 2020

Я не мог представить себе полностью векторизованный способ, поэтому я бы просто использовал groupby на Segment, применяя указанную c функцию. Эта функция добавит первую строку (если таковая имеется) из подкадра OutSeg, вычислит скользящее значение и вернет только исходные строки.

Код может быть:

df = df.sort_values(['Segment', 'Reach'])  # ensure correct order

def tx(dg):
    seg = dg['Segment'].iat[0]
    outseg = dg['OutSeg'].iat[0]
    x = pd.concat([dg, df[df['Segment'] == outseg].head(1)])
    y = x['Elevation'].rolling(3, 1, center=True).mean()
    return(y[x['Segment'] == seg])

df['Mean3'] = df.groupby('Segment', as_index=False, group_keys=False).apply(tx)

print(df)

It дает:

    Segment  Reach  OutSeg  Elevation       Mean3
0         1      1       3         50   62.000000
1         1      2       3         74   70.333333
2         1      3       3         87   71.333333
3         1      4       3         53   79.000000
4         1      5       3         97  114.333333
5         2      1       3         16   15.000000
6         2      2       3         14   20.333333
7         2      3       3         31   26.666667
8         2      4       3         35   31.000000
9         2      5       3         27   85.000000
10        3      1       4        193  184.500000
11        3      2       4        176  175.666667
12        3      3       4        158  162.666667
13        3      4       4        154  111.000000
14        4      1       6         21   33.000000
15        4      2       6         45   36.000000
16        4      3       6         42   36.333333
17        4      4       6         22   28.666667
18        4      5       6         22   22.000000
19        5      1       6         10   15.500000
20        5      2       6         21   15.000000
21        5      3       6         14   17.000000
22        5      4       6         16   15.000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...