Преобразование временного ряда в тепловую карту - PullRequest
0 голосов
/ 20 ноября 2018

Я ищу хорошее преобразование в пандах, которое позволило бы мне перейти от временного ряда измерений к списку счетчиков на бин на время.

Допустим, у меня естьmy:

x = list(range(count))
y = [random.gauss(1, 0.1) for _ in range(count)]

Я могу преобразовать это в бин-интервалы с обеих сторон:

df = pandas.DataFrame.from_dict({'x': x, 'y': y})
df['x'].update(pandas.cut(df['x'], 20))
df['y'].update(pandas.cut(df['y'], 20))

Я знаю, что могу получить значения счетчиков для y с использованием:

df['y'].value_counts()

Но у меня возникли проблемы с помещением "run value_counts в y, сгруппированных по уникальным x значениям, затем развернуть и вернуть его" в допустимую операцию.


Пример:

y = [1, 1, 2, 3, 4, 4]
x = [0, 1, 2, 3, 4, 5]
bin_count = 2

Ожидается:

df: x    y  count
    0-2  1  2
    0-2  2  1
    3-5  3  1
    3-5  4  2

1 Ответ

0 голосов
/ 20 ноября 2018

Я считаю, что вам нужно SeriesGroupBy.value_counts с reset_index:

y = [1, 1, 2, 3, 4, 4]
x = [0, 1, 2, 3, 4, 5]
bin_count = 2
df = pd.DataFrame.from_dict({'x': x, 'y': y})
df['x'].update(pd.cut(df['x'], bin_count))

df1 = df.groupby('x')['y'].value_counts().reset_index(name='count')
print (df1)
               x  y  count
0  (-0.005, 2.5]  1      2
1  (-0.005, 2.5]  2      1
2     (2.5, 5.0]  4      2
3     (2.5, 5.0]  3      1

Для столбцов с y используйте unstack:

df1 = df.groupby('x')['y'].value_counts().unstack(fill_value=0)
print (df1)
y              1  2  3  4
x                        
(-0.005, 2.5]  2  1  0  0
(2.5, 5.0]     0  0  1  2

РЕДАКТИРОВАТЬ:

Если нужны уникальные значения для бункеров, добавьте параметр labels=False в cut:

df['x'].update(pd.cut(df['x'], bin_count, labels=False))

df1 = df.groupby('x')['y'].value_counts().unstack(fill_value=0)
print (df1)
y  1  2  3  4
x            
0  2  1  0  0
1  0  0  1  2
...