Автоматизация блоков, созданных с использованием диапазона значений - PullRequest
0 голосов
/ 09 апреля 2019

Справочная информация: у меня есть фрейм данных 'test1' с именем столбца 'y', в котором содержатся исходные значения.Я применил некоторую модель и получил прогноз с именем столбца «Yhat», используя «y». Мне нужно изменить свой «Yhat», поэтому я добавил «y» и «Yhat».Для определенного сегмента 'yhat' есть соответствующий сегмент 'y'.

Теперь в будущем, если у меня есть прогноз на 3 очка вперед, то есть 'yhat', тогда я могу предоставить соответствующую категорию сегментов 'y'.Например, см. Dataframe, т. Е. «Test2» и коды.

Основной запрос: чтобы избежать ручного создания значений сегментов, я хочу автоматизировать весь этот процесс.Причина автоматизации в том, что при увеличении выборочного пространства соответствующие значения сегмента также изменятся.

test1

y   Yhat
1   1
2   1
6   5
2   3
3   4
1   2
4   2
3   4
7   6
5   8

def catY(r):
    if((r['y']>=1) & (r['y']<3)):
        return 'Y_cat_1'
    elif((r['y']>=3) & (r['y']<6)):
        return 'Y_cat_2'
    elif((r['y']>=6)):
        return 'Y_cat_3'
test1['Actual_Y'] = test1.apply(catY,axis=1)

def cat(r):
    if((r['Yhat']>=1) & (r['Yhat']<3)):
        return 'Yhat_cat_1'
    elif((r['Yhat']>=3) & (r['Yhat']<6)):
        return 'Yhat_cat_2'
    elif((r['Yhat']>=6)):
        return 'Yhat_cat_3'

test1['yhat_cat'] = test1.apply(cat,axis=1)

test1.groupby('yhat_cat')['Actual_Y'].value_counts(normalize=True)
yhat_cat    Actual_Y
Yhat_cat_1  Y_cat_1    0.75
            Y_cat_2    0.25
Yhat_cat_2  Y_cat_2    0.50
            Y_cat_1    0.25
            Y_cat_3    0.25
Yhat_cat_3  Y_cat_2    0.50
            Y_cat_3    0.50


test2

y   Yhat
1   1
2   1
6   5
2   3
3   4
1   2
4   2
3   4
7   6
5   8
    2
    5
    1

filter_method1 = lambda x: '0.75' if ( x >=1 and x <3) else '0.25' if (x >=3 and x <6) else '0' if  x >=6 else None
test2['Y_cat_1'] = test2['Yhat'].apply(filter_method1)

filter_method2 = lambda x: '0.25' if ( x >=1 and x <3) else '0.50' if (x >=3 and x <6) else '0.50' if  x >=6 else None
test2['Y_cat_2'] = test2['Yhat'].apply(filter_method2)

filter_method3 = lambda x: '0' if ( x >=1 and x <3) else '0.25' if (x >=3 and x <6) else '0.50' if  x >=6 else None
test2['Y_cat_3'] = test2['Yhat'].apply(filter_method3)



print(test2)
      y  Yhat Y_cat_1 Y_cat_2 Y_cat_3
0  1.00     1    0.75    0.25       0
1  2.00     1    0.75    0.25       0
2  6.00     5    0.25    0.50    0.25
3  2.00     3    0.25    0.50    0.25
4  3.00     4    0.25    0.50    0.25
5  1.00     2    0.75    0.25       0
6  4.00     2    0.75    0.25       0
7  3.00     4    0.25    0.50    0.25
8  7.00     6       0    0.50    0.50
9  5.00     8       0    0.50    0.50
10  nan     2    0.75    0.25       0
11  nan     5    0.25    0.50    0.25
12  nan     1    0.75    0.25       0

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