2016-08-09 2 views
0

У меня есть dataframe df1HeatMap визуализация

df1.info() 


<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 38840 entries, 0 to 38839 
Data columns (total 7 columns): 
TIMESTAMP     38840 non-null datetime64[ns] 
ACT_TIME_AERATEUR_1_F1 38696 non-null float64 
ACT_TIME_AERATEUR_1_F3 38697 non-null float64 
ACT_TIME_AERATEUR_1_F5 38695 non-null float64 
ACT_TIME_AERATEUR_1_F6 38695 non-null float64 
ACT_TIME_AERATEUR_1_F7 38693 non-null float64 
ACT_TIME_AERATEUR_1_F8 38696 non-null float64 
dtypes: datetime64[ns](1), float64(6) 
memory usage: 2.1 MB 

который выглядит следующим образом:

TIMESTAMP ACT_TIME_AERATEUR_1_F1 ACT_TIME_AERATEUR_1_F3 ACT_TIME_AERATEUR_1_F5 ACT_TIME_AERATEUR_1_F6 ACT_TIME_AERATEUR_1_F7 
ACT_TIME_AERATEUR_1_F8 
2015-08-01 05:10:00 100 100 100 100 100 100 
2015-08-01 05:20:00 100 100 100 100 100 100 
2015-08-01 05:30:00 100 100 100 100 100 100 
2015-08-01 05:40:00 100 100 100 100 100 100 

Я пытаюсь создать Heatmap с Сиборн для визуализации данных, которые находятся между двумя даты (например, здесь между '2015-08-01 23:10:00' и '2015-08-02 2:00:00'): я так:

df1['TIMESTAMP']= pd.to_datetime(df_no_missing['TIMESTAMP'], '%d-%m-%y %H:%M:%S') 
df1['date'] = df_no_missing['TIMESTAMP'].dt.date 
df1['time'] = df_no_missing['TIMESTAMP'].dt.time 
date_debut = pd.to_datetime('2015-08-01 23:10:00') 
date_fin = pd.to_datetime('2015-08-02 02:00:00') 

df1 = df1[(df1['TIMESTAMP'] >= date_debut) & (df1['TIMESTAMP'] < date_fin)] 

sns.heatmap(df1.iloc[:,1:6:],annot=True, linewidths=.5) 

Я получил Heatmap как в прилагаемом

enter image description here

Мой вопрос теперь, как я могу заменить число в левой части карты Heatmap (145 ... 161) их соответствующими значениями временной метки (2015 -08-01 5:10:00, 5:20:00 2015-08-01, 2015-08-01 5:30:00, ...)

Спасибо

BESTS

Я стараюсь вносить изменения:

df1.set_index("TIMESTAMP", inplace=1) 
sns.heatmap(df1.iloc[:, 1:6:], annot=True, linewidths=.5) 
ax = plt.gca() 
ax.set_yticklabels([i.strftime("%Y-%m-%d %H:%M:%S") for i in df1.TIMESTAMP], rotation=0) 

EDIT

Но я получаю ошибку и предупреждение:

C:\Users\Demonstrator\Anaconda3\lib\site-packages\ipykernel\__main__.py:2: 

SettingWithCopyWarning: Значение пытается установить на копию кусочка из DataFrame. Попробуйте использовать .loc [row_indexer, col_indexer] = значение вместо

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    from ipykernel import kernelapp as app 
C:\Users\Demonstrator\Anaconda3\lib\site-packages\ipykernel\__main__.py:3: 

SettingWithCopyWarning: Значение пытается установить на копию кусочка из DataFrame. Попробуйте использовать .loc [row_indexer, col_indexer] = значение вместо

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    app.launch_new_instance() 
C:\Users\Demonstrator\Anaconda3\lib\site-packages\ipykernel\__main__.py:4: 

SettingWithCopyWarning: Значение пытается установить на копию кусочка из DataFrame. Попробуйте использовать.LOC [row_indexer, col_indexer] = значение вместо

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 




--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-129-cec498d88cac> in <module>() 
     9 
    10 #sns.heatmap(df1.iloc[:,1:6:],annot=True, linewidths=.5) 
---> 11 sns.heatmap(df1.iloc[:, 1:6:], annot=True, linewidths=.5) 
    12 ax = plt.gca() 
    13 ax.set_yticklabels([i.strftime("%Y-%m-%d %H:%M:%S") for i in df1.TIMESTAMP], rotation=0) 

C:\Users\Demonstrator\Anaconda3\lib\site-packages\seaborn\matrix.py in 

Heatmap (данные, Vmin, Vmax, CMAP, центр, прочный, ANNOT, FMT, annot_kws, ширины линий, LineColor, CBAR, cbar_kws, cbar_ax, квадрат, ах , xticklabels, yticklabels, маска, ** kwargs) 483 плоттер = _HeatMapper (данные, Vmin, Vmax, CMAP, центр, прочный, ANNOT, FMT, 484 annot_kws, CBAR, cbar_kws, xticklabels, -> 485 yticklabels , маска) 487 # Добавить pcolormesh kwargs здесь

C:\Users\Demonstrator\Anaconda3\lib\site-packages\seaborn\matrix.py in 

INIT (самостоятельно, данные, Vmin, Vmax, CMAP, центр, надежная, ANNOT, FMT, annot_kws, CBAR, cbar_kws, xticklabels, yticklabels, маска) 165 # Определить хорошие значения по умолчанию для преобразования цвета 166 самостоятельно ._determine_cmap_params (plot_data, Vmin, Vmax, -> 167 CMAP, центр, надежный) 169 # Разобраться аннотациями

C:\Users\Demonstrator\Anaconda3\lib\site-packages\seaborn\matrix.py in 

_determine_cmap_params (самость, plot_data, Vmin, Vmax, CMAP, центр, надежный) 204 calc_data = plot_data.data [~ np.i snan (plot_data.data)] 205 Если vmin is None: -> 206 vmin = np.percentile (calc_data, 2), если надежный else calc_data.min() 207, если vmax is None: 208 vmax = np. процентиля (calc_data, 98), если другое надежный calc_data.max()

C:\Users\Demonstrator\Anaconda3\lib\site-packages\numpy\core\_methods.py 

в _amin (а, по оси, из, keepdims) 28 защиту _amin (а, ось = None, из = нет, keepdims = False): ---> 29 return umr_minimum (a, axis, None, out, keepdims) 31 def _sum (a, axis = None, dtype = None, out = None, keepdims = False):

ValueError: zero-size array to reduction operation minimum which has no identity 

@jeanrjc, посмотрите на последнее изображение, есть проблема: изображение слишком мало, и есть две вертикальные линии (шкала) справа. Я надеюсь, что теперь ясно i'am enter image description here

ответ

0

Это потому, что TIMESTAMP не указательный, из sns.heatmap:

строку документации

yticklabels: список-как, INT или BOOL, опционально Если True, то сюжет имена строк в кадре данных. Если False, не стройте имена строк. Если список-подобный, нарисуйте эти альтернативные метки как yticklabels. Если целое число, используйте имена индексов, но запишите только каждую метку n.

Имена строк, являющиеся индексом.

Таким образом, вы можете просто установить индекс соответственно:

df1.set_index("TIMESTAMP", inplace=1) 

и с вашей командой sns, он будет работать почти нормально. Проблема в том, что у вас будет уродливое представление даты.

В качестве альтернативы, вы можете сделать, вместо изменении индекса:

import matplotlib.pyplot as plt 
import seaborn as sns 
import pandas as pd 
... 
... 
ax = sns.heatmap(df1.iloc[:, 1:6:], annot=True, linewidths=.5) 
ax.set_yticklabels([i.strftime("%Y-%m-%d %H:%M:%S") for i in df1.TIMESTAMP], rotation=0) 

НТН

+0

спасибо за ваш ответ. Я редактирую свой пост, чтобы больше объяснить проблему – Bio

+1

@Bio либо вы делаете 'df1.set_index (« TIMESTAMP », inplace = 1)' или вы делаете трюк с помощью 'ax.set_yticklabels (...)', а не оба! – jrjc

+0

это работает !! Большое спасибо – Bio