Создайте тепловую карту с помощью pandas TimeSeries

Мне нужно создать MatmotLib heatmap (pcolormesh) с помощью столбца Pandas DataFrame TimeSeries (df_all.ts) в качестве оси X.

Как преобразовать столбец Pandas TimeSeries в нечто, что можно использовать в качестве оси X в функции np.meshgrid(x, y) для создания тепловой карты? Обходной путь заключается в создании функции Matplotlib с использованием тех же параметров, что и в столбце Pandas, но есть ли простой способ?

x = pd.date_range(df_all.ts.min(),df_all.ts.max(),freq='H')
xt = mdates.drange(df_all.ts.min(), df_all.ts.max(), dt.timedelta(hours=1))
y = arange(ylen)
X,Y = np.meshgrid(xt, y)

Ответ 1

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

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from itertools import product
from string import ascii_uppercase
from matplotlib import patheffects

m, n = 4, 7 # 4 rows, 7 columns
df = pd.DataFrame(np.random.randn(m, n),
                  columns=list(ascii_uppercase[:n]),
                  index=list(ascii_uppercase[-m:]))


ax = plt.imshow(df, interpolation='nearest', cmap='Oranges').axes

_ = ax.set_xticks(np.linspace(0, n-1, n))
_ = ax.set_xticklabels(df.columns)
_ = ax.set_yticks(np.linspace(0, m-1, m))
_ = ax.set_yticklabels(df.index)

ax.grid('off')
ax.xaxis.tick_top()

необязательно, чтобы печатать фактические значения в середине каждого квадрата, с некоторыми тенями для удобочитаемости, вы можете сделать:

path_effects = [patheffects.withSimplePatchShadow(shadow_rgbFace=(1,1,1))]

for i, j in product(range(m), range(n)):
    _ = ax.text(j, i, '{0:.2f}'.format(df.iloc[i, j]),
                size='medium', ha='center', va='center',
                path_effects=path_effects)

heat-map