Есть ли способ пересчитать данные временных рядов в x часов и получить вывод в формате One-Hot? - PullRequest
1 голос
/ 24 июня 2019

Есть ли способ пересчитать данные временных рядов в x часов и получить выходные данные в формате закодированного One-Hot?

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

df_out = pd.DataFrame(df.values.tolist(),index=df.index).fillna('').resample("24H").sum()

Ввод:

No. TimeStamp             Event
0   30-03-2019 23:59:50   A
1   31-03-2019 00:02:00   B
2   02-04-2019 18:44:00   A
3   02-04-2019 06:37:00   A
4   31-03-2019 00:04:19   C
5   30-03-2019 10:20:00   B
6   30-03-2019 10:21:22   D
7   30-03-2019 10:21:00   E
8   02-04-2019 18:44:00   B
9   02-04-2019 18:44:11   B
10  02-04-2019 18:44:00   C
11  04-04-2019 14:49:44   D
12  04-04-2019 14:49:44   E
13  04-04-2019 14:49:44   E
14  04-04-2019 14:49:44   C
15  01-04-2019 15:16:32   C
16  06-04-2019 01:04:00   A
17  06-04-2019 01:16:00   B
18  06-04-2019 01:16:00   B
19  06-04-2019 01:16:00   D
20  06-04-2019 01:18:00   E
21  06-04-2019 01:18:00   C
22  06-04-2019 01:19:00   A

Ожидаемый результат (Каждое событие будет столбцом):

                    A   B   C   D   E
30-03-2019 00:00:00 1   1   0   1   1
31-03-2019 00:00:00 0   1   1   0   0
01-04-2019 00:00:00 0   0   1   0   0
02-04-2019 00:00:00 1   1   1   0   0
03-04-2019 00:00:00 0   0   0   0   0
04-04-2019 00:00:00 0   0   1   1   1
05-04-2019 00:00:00 0   0   0   0   0
06-04-2019 00:00:00 1   1   1   1   1

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

                    A   B   C   D   E
30-03-2019 00:00:00 1   1   0   1   1
31-03-2019 00:00:00 0   1   1   0   0
01-04-2019 00:00:00 0   0   1   0   0
02-04-2019 00:00:00 2   2   1   0   0
03-04-2019 00:00:00 0   0   0   0   0
04-04-2019 00:00:00 0   0   1   1   2
05-04-2019 00:00:00 0   0   0   0   0
06-04-2019 00:00:00 2   2   1   1   1

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

Сначала удалите время из datetime с Series.dt.floor и позвоните get_dummies:

#if necessary convert to datetimes
df['TimeStamp'] = pd.to_datetime(df['TimeStamp'])

df1 = pd.get_dummies(df.set_index(df['TimeStamp'].dt.floor('d'))['Event'])

Только для вывода 0 или 1 значения используют max:

df2 = df1.max(level=0)
print (df2)
            A  B  C  D  E
TimeStamp                
2019-03-30  1  1  0  1  1
2019-03-31  0  1  1  0  0
2019-02-04  1  1  1  0  0
2019-04-04  0  0  1  1  1
2019-01-04  0  0  1  0  0
2019-06-04  1  1  1  1  1

print (df2.index)
DatetimeIndex(['2019-03-30', '2019-03-31', '2019-02-04', '2019-04-04',
               '2019-01-04', '2019-06-04'],
              dtype='datetime64[ns]', name='TimeStamp', freq=None)

Для подсчета 1 значений используйте sum:

df3 = df1.sum(level=0)
print (df3)
            A  B  C  D  E
TimeStamp                
2019-03-30  1  1  0  1  1
2019-03-31  0  1  1  0  0
2019-02-04  2  2  1  0  0
2019-04-04  0  0  1  1  2
2019-01-04  0  0  1  0  0
2019-06-04  2  2  1  1  1
1 голос
/ 24 июня 2019

Вы можете использовать df.pivot():

data = {'No.': {0: 0,  1: 1,  2: 2,  3: 3,  4: 4,  5: 5,  6: 6,  7: 7,  8: 8,  9: 9,  10: 10,  11: 11,  12: 12,  13: 13,  14: 14,  15: 15,  16: 16,  17: 17,  18: 18,  19: 19,  20: 20,  21: 21,  22: 22}, 'TimeStamp': {0: '30-03-2019 23:59:50',  1: '31-03-2019 00:02:00',  2: '02-04-2019 18:44:00',  3: '02-04-2019 06:37:00',  4: '31-03-2019 00:04:19',  5: '30-03-2019 10:20:00',  6: '30-03-2019 10:21:22',  7: '30-03-2019 10:21:00',  8: '02-04-2019 18:44:00',  9: '02-04-2019 18:44:11',  10: '02-04-2019 18:44:00',  11: '04-04-2019 14:49:44',  12: '04-04-2019 14:49:44',  13: '04-04-2019 14:49:44',  14: '04-04-2019 14:49:44',  15: '01-04-2019 15:16:32',  16: '06-04-2019 01:04:00',  17: '06-04-2019 01:16:00',  18: '06-04-2019 01:16:00',  19: '06-04-2019 01:16:00',  20: '06-04-2019 01:18:00',  21: '06-04-2019 01:18:00',  22: '06-04-2019 01:19:00'}, 'Event': {0: 'A',  1: 'B',  2: 'A',  3: 'A',  4: 'C',  5: 'B',  6: 'D',  7: 'E',  8: 'B',  9: 'B',  10: 'C',  11: 'D',  12: 'E',  13: 'E',  14: 'C',  15: 'C',  16: 'A',  17: 'B',  18: 'B',  19: 'D',  20: 'E',  21: 'C',  22: 'A'}}
df = pd.DataFrame(data, columns =['No.', 'TimeStamp', 'Event'], dtype=str)

#Convert TimeStamp to datetime
df.TimeStamp = pd.to_datetime(df.TimeStamp, format='%d-%m-%Y %H:%M:%S')
#Add a count column which we will use in a pivot table
df['count'] = 1
#Pivot table
df2 = df.pivot(index='No.', columns='Event', values='count').reset_index()

#Merging original df and df2
final_df  = pd.merge(df, df2, on='No.')[ ['TimeStamp'] + list(df.Event.unique())]
final_df['date'] = final_df.TimeStamp.apply(lambda x : x.date())
final_df = final_df.groupby(by='date').agg({x: 'count' for x in list(df.Event.unique())}).reset_index()
print(final_df)

выход

+----+-------------+----+----+----+----+---+
|    |    date     | A  | B  | C  | D  | E |
+----+-------------+----+----+----+----+---+
| 0  | 2019-03-30  | 1  | 1  | 0  | 1  | 1 |
| 1  | 2019-03-31  | 0  | 1  | 1  | 0  | 0 |
| 2  | 2019-04-01  | 0  | 0  | 1  | 0  | 0 |
| 3  | 2019-04-02  | 2  | 2  | 1  | 0  | 0 |
| 4  | 2019-04-04  | 0  | 0  | 1  | 1  | 2 |
| 5  | 2019-04-06  | 2  | 2  | 1  | 1  | 1 |
+----+-------------+----+----+----+----+---+
...