Построить новые столбцы на основе всех предыдущих пар информации с использованием панд - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь создать 3 новых столбца в кадре данных, которые основаны на информации о предыдущих парах.

Вы можете думать о кадре данных как о результатах завершения (столбец 'xx') в разных типах (столбец 'type') в разные даты (столбец date).

Идея заключается в создании следующих новых столбцов:

(i) numb_comp_past: сумма количества раз, с которым сталкивался каждый типконкуренты в прошлом.

(ii) win_comp_past: сумма выигрыша (+1), ничьих (+0) и проигрыша (-1) предыдущих соревнований, которые все типы соревнуются друг с другомимел в прошлом.

(iii) win_comp_past_difs: сумма разницы результатов предыдущих соревнований, которые имели все типы, конкурирующие друг с другом в прошлом.

  • Исходный кадр данных (df) выглядит следующим образом:

    idx = [np.array(['Jan-18', 'Jan-18', 'Feb-18', 'Mar-18', 'Mar-18', 'Mar-18','Mar-18', 'Mar-18', 'May-18', 'Jun-18', 'Jun-18', 'Jun-18','Jul-18', 'Aug-18', 'Aug-18', 'Sep-18', 'Sep-18', 'Oct-18','Oct-18', 'Oct-18', 'Nov-18', 'Dec-18', 'Dec-18',]),np.array(['A', 'B', 'B', 'A', 'B', 'C', 'D', 'E', 'B', 'A', 'B', 'C','A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'A', 'B', 'C'])]
    data = [{'xx': 1}, {'xx': 5}, {'xx': 3}, {'xx': 2}, {'xx': 7}, {'xx': 3},{'xx': 1}, {'xx': 6}, {'xx': 3}, {'xx': 5}, {'xx': 2}, {'xx': 3},{'xx': 1}, {'xx': 9}, {'xx': 3}, {'xx': 2}, {'xx': 7}, {'xx': 3}, {'xx': 6}, {'xx': 8}, {'xx': 2}, {'xx': 7}, {'xx': 9}]
    df = pd.DataFrame(data, index=idx, columns=['xx'])
    df.index.names=['date','type']
    df=df.reset_index()
    df['date'] = pd.to_datetime(df['date'],format = '%b-%y') 
    df=df.set_index(['date','type'])
    df['xx'] = df.xx.astype('float')
    

И это выглядит так:

                  xx
date       type
2018-01-01 A     1.0
           B     5.0
2018-02-01 B     3.0
2018-03-01 A     2.0
           B     7.0
           C     3.0
           D     1.0
           E     6.0
2018-05-01 B     3.0
2018-06-01 A     5.0
           B     2.0
           C     3.0
2018-07-01 A     1.0
2018-08-01 B     9.0
           C     3.0
2018-09-01 A     2.0
           B     7.0
2018-10-01 C     3.0
           A     6.0
           B     8.0
2018-11-01 A     2.0
2018-12-01 B     7.0
           C     9.0
  • 3 новыхстолбцы, которые мне нужно добавить в фрейм данных, показаны ниже (ожидаетсяположить код Панды):

                      xx  numb_comp_past  win_comp_past  win_comp_past_difs
    date       type
    2018-01-01 A     1.0             0.0            0.0                 0.0
               B     5.0             0.0            0.0                 0.0
    2018-02-01 B     3.0             0.0            0.0                 0.0
    2018-03-01 A     2.0             1.0           -1.0                -4.0
               B     7.0             1.0            1.0                 4.0
               C     3.0             0.0            0.0                 0.0
               D     1.0             0.0            0.0                 0.0
               E     6.0             0.0            0.0                 0.0
    2018-05-01 B     3.0             0.0            0.0                 0.0
    2018-06-01 A     5.0             3.0           -3.0               -10.0
               B     2.0             3.0            3.0                13.0
               C     3.0             2.0            0.0                -3.0
    2018-07-01 A     1.0             0.0            0.0                 0.0
    2018-08-01 B     9.0             2.0            0.0                 3.0
               C     3.0             2.0            0.0                -3.0
    2018-09-01 A     2.0             3.0           -1.0                -6.0
               B     7.0             3.0            1.0                 6.0
    2018-10-01 C     3.0             5.0           -1.0               -10.0
               A     6.0             6.0           -2.0               -10.0
               B     8.0             7.0            3.0                20.0
    2018-11-01 A     2.0             0.0            0.0                 0.0
    2018-12-01 B     7.0             4.0            2.0                14.0
               C     9.0             4.0           -2.0               -14.0
    

Обратите внимание, что:

(i) для numb_comp_past, если нет предыдущих соревнований, я присваиваю значение 0. Вкл.2018-06-01, например, тип A имеет значение 3, учитывая, что он ранее конкурировал с типом B на 2018-01-01 и 2018-03-01 и с типом C на 2018-03-01.

(ii) для win_comp_past, если нет предыдущих соревнований, я присваиваю значение 0. Например, 2018-06-01 тип A имеет значение -3, учитывая, что он ранее проиграл с типом B на2018-01-01 (-1) и 2018-03-01 (-1) и с типом C на 2018-03-01 (-1).Таким образом, добавляя -1-1-1 = -3.

(iii) для win_comp_past_value, если нет предыдущих соревнований, я присваиваю значение 0. Например, 2018-06-01 тип A имеетзначение -10, учитывая, что он ранее проиграл с типом B на 2018-01-01 с разницей -4 (= 1-5) и на 2018-03-01 с разницей -5 (= 2-7)и с типом C на 2018-03-01 на -1 (= 2-3).Таким образом, добавив -4-5-1 = -10.

Я действительно не знаю, как начать решать эту проблему.Любые идеи о том, как решить новые столбцы, описанные в (i), (ii) и (ii), очень приветствуются.

1 Ответ

1 голос
/ 14 мая 2019

Вот мой дубль:

# get differences of pairs, useful for win counts and win_difs
def get_diff(x):
    teams = x.index.get_level_values(1)
    tmp = pd.DataFrame(x[:,None]-x[None,:],
                       columns = teams.values,
                       index=teams.values).stack()
    return tmp[tmp.index.get_level_values(0)!=tmp.index.get_level_values(1)]

new_df = df.groupby('date').xx.apply(get_diff).to_frame()

# win matches
new_df['win'] = new_df.xx.ge(0).astype(int) - new_df.xx.le(0).astype(int)

# group by players
groups = new_df.groupby(level=[1,2])

# sum function
def cumsum_shift(x):
    return x.cumsum().shift()

# assign new values
df['num_comp_past'] = groups.xx.cumcount().sum(level=[0,1])
df['win_comp_past'] = groups.win.apply(cumsum_shift).sum(level=[0,1])
df['win_comp_past_difs'] = groups.xx.apply(cumsum_shift).sum(level=[0,1])

Выход:

+------------+------+-----+---------------+---------------+--------------------+
|            |      | xx  | num_comp_past | win_comp_past | win_comp_past_difs |
+------------+------+-----+---------------+---------------+--------------------+
| date       | type |     |               |               |                    |
+------------+------+-----+---------------+---------------+--------------------+
| 2018-01-01 | A    | 1.0 | 0.0           | 0.0           | 0.0                |
|            | B    | 5.0 | 0.0           | 0.0           | 0.0                |
| 2018-02-01 | B    | 3.0 | NaN           | NaN           | NaN                |
| 2018-03-01 | A    | 2.0 | 1.0           | -1.0          | -4.0               |
|            | B    | 7.0 | 1.0           | 1.0           | 4.0                |
|            | C    | 3.0 | 0.0           | 0.0           | 0.0                |
|            | D    | 1.0 | 0.0           | 0.0           | 0.0                |
|            | E    | 6.0 | 0.0           | 0.0           | 0.0                |
| 2018-05-01 | B    | 3.0 | NaN           | NaN           | NaN                |
| 2018-06-01 | A    | 5.0 | 3.0           | -3.0          | -10.0              |
|            | B    | 2.0 | 3.0           | 3.0           | 13.0               |
|            | C    | 3.0 | 2.0           | 0.0           | -3.0               |
| 2018-07-01 | A    | 1.0 | NaN           | NaN           | NaN                |
| 2018-08-01 | B    | 9.0 | 2.0           | 0.0           | 3.0                |
|            | C    | 3.0 | 2.0           | 0.0           | -3.0               |
| 2018-09-01 | A    | 2.0 | 3.0           | -1.0          | -6.0               |
|            | B    | 7.0 | 3.0           | 1.0           | 6.0                |
| 2018-10-01 | C    | 3.0 | 5.0           | -1.0          | -10.0              |
|            | A    | 6.0 | 6.0           | -2.0          | -10.0              |
|            | B    | 8.0 | 7.0           | 3.0           | 20.0               |
| 2018-11-01 | A    | 2.0 | NaN           | NaN           | NaN                |
| 2018-12-01 | B    | 7.0 | 4.0           | 2.0           | 14.0               |
|            | C    | 9.0 | 4.0           | -2.0          | -14.0              |
| 2018-01-01 | A    | 1.0 | 0.0           | 0.0           | 0.0                |
|            | B    | 5.0 | 0.0           | 0.0           | 0.0                |
| 2018-02-01 | B    | 3.0 | NaN           | NaN           | NaN                |
| 2018-03-01 | A    | 2.0 | 1.0           | -1.0          | -4.0               |
|            | B    | 7.0 | 1.0           | 1.0           | 4.0                |
|            | C    | 3.0 | 0.0           | 0.0           | 0.0                |
|            | D    | 1.0 | 0.0           | 0.0           | 0.0                |
|            | E    | 6.0 | 0.0           | 0.0           | 0.0                |
| 2018-05-01 | B    | 3.0 | NaN           | NaN           | NaN                |
| 2018-06-01 | A    | 5.0 | 3.0           | -3.0          | -10.0              |
|            | B    | 2.0 | 3.0           | 3.0           | 13.0               |
|            | C    | 3.0 | 2.0           | 0.0           | -3.0               |
| 2018-07-01 | A    | 1.0 | NaN           | NaN           | NaN                |
| 2018-08-01 | B    | 9.0 | 2.0           | 0.0           | 3.0                |
|            | C    | 3.0 | 2.0           | 0.0           | -3.0               |
| 2018-09-01 | A    | 2.0 | 3.0           | -1.0          | -6.0               |
|            | B    | 7.0 | 3.0           | 1.0           | 6.0                |
| 2018-10-01 | C    | 3.0 | 5.0           | -1.0          | -10.0              |
|            | A    | 6.0 | 6.0           | -2.0          | -10.0              |
|            | B    | 8.0 | 7.0           | 3.0           | 20.0               |
| 2018-11-01 | A    | 2.0 | NaN           | NaN           | NaN                |
| 2018-12-01 | B    | 7.0 | 4.0           | 2.0           | 14.0               |
|            | C    | 9.0 | 4.0           | -2.0          | -14.0              |
+------------+------+-----+---------------+---------------+--------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...