2015-05-17 2 views
2

У меня есть данные (данные) в пандах, у которых есть datetimeindex (около 25 000 дней данных) и 527 столбцов идентификаторов.Участок двоичной матрицы в пандах

    work_id_10 work_id_100 work_id_1007 work_id_1009 
concert_date 
1917-01-27    0   0    0    0 
1917-01-28    0   0    0    0 
1917-01-29    0   0    0    0 
1917-01-30    0   0    0    0 
1917-01-31    0   0    0    0 

Каждый идентификатор столбца указывает наличие или отсутствие конкретного идентификатора либо 0 (отсутствие), либо 1 (наличие). Итак, в основном у меня есть матрица двоичных значений.

Теперь я хочу создать график, который имеет все даты на оси x, и для каждого идентификатора столбца - как точки. Я использую ipython.

%matplotlib 
import matplotlib.pyplot as plt 
fig, ax = plt.subplots() 
ax.set_yticklabels(data.index) 
ax.set_xticklabels(data.columns) 
plt.imshow/data, cmap='Greys', interpolation='none') 

Это дает мне MemoryError:

Traceback (most recent call last): 
    File "C:\Python27\Lib\lib-tk\Tkinter.py", line 1486, in __call__ 
    return self.func(*args) 
    File "C:\Python27\Lib\lib-tk\Tkinter.py", line 533, in callit 
    func(*args) 
    File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", lin 
e 365, in idle_draw 
    self.draw() 
    File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", lin 
e 349, in draw 
    FigureCanvasAgg.draw(self) 
    File "C:\Python27\lib\site-packages\matplotlib\backends\backend_agg.py", line 
469, in draw 
    self.figure.draw(self.renderer) 
    File "C:\Python27\lib\site-packages\matplotlib\artist.py", line 59, in draw_wr 
apper 
    draw(artist, renderer, *args, **kwargs) 
    File "C:\Python27\lib\site-packages\matplotlib\figure.py", line 1079, in draw 
    func(*args) 
    File "C:\Python27\lib\site-packages\matplotlib\artist.py", line 59, in draw_wr 
apper 
    draw(artist, renderer, *args, **kwargs) 
    File "C:\Python27\lib\site-packages\matplotlib\axes\_base.py", line 2092, in d 
raw 
    a.draw(renderer) 
    File "C:\Python27\lib\site-packages\matplotlib\artist.py", line 59, in draw_wr 
apper 
    draw(artist, renderer, *args, **kwargs) 
    File "C:\Python27\lib\site-packages\matplotlib\image.py", line 367, in draw 
    self._draw_unsampled_image(renderer, gc) 
    File "C:\Python27\lib\site-packages\matplotlib\image.py", line 321, in _draw_u 
nsampled_image 
    self._get_unsampled_image(self._A, extent_in_ic, viewLim_in_ic) 
    File "C:\Python27\lib\site-packages\matplotlib\image.py", line 219, in _get_un 
sampled_image 
    x = (x * 255).astype(np.uint8) 
MemoryError 

Это правильный подход, и почему я получаю MemoryError?

Спасибо!

+0

Не видя больше своего кода и минимального примера своих данных, сложно дать вам что-то, что работает. Предполагая, что вы сделали что-то вроде 'fig, ax = plt.subplots()', тогда ваш 'plt.plot (...)' вы хотите установить ваши метки оси y так, как это: 'ax.set_yticklabels (что-то)' где-то список имен столбцов. – Scott

+0

Спасибо, @Scott за то, что указал мне в правильном направлении. У меня не было никакого другого кода, но я попробовал это и теперь столкнулся с MemoryError. Я обновил свой первоначальный вопрос. Спасибо, что посмотрели на него снова! – DigitalMusicology

+0

Разделите проблему вверх. Например, закомментируйте строки с меткой метки, все еще разрывается? Сделайте это с помощью фиктивных «данных» из четырех-четырех единиц и нулей; все еще сломан? И т. Д. Замените «/» в последней строке выборки на «(». (Я настоятельно рекомендую работать в файле сценария вместо интерпретатора. Другие отличаются, но пока вы учитесь, не настраивайте себя на сокращение -and-paste.) – cphlewis

ответ

3

Как я уже упоминал в комментарии, вы можете разбить свои данные на более визуально усваиваемые куски. Вот пример случайной матрицы (1s синий, белый 0s) размером 527 х 2500:

large random matrix

Ваши данные, скорее всего, имеет больше структуры к нему, но все еще может быть трудно интерпретировать. Матрица, которую вы описываете, будет 527 x 25000. Вы можете отображать по году (527 x 365) или десятилетие (527 x 3650ish), или поиграть и посмотреть, что лучше всего работает.

Вот как я бы отображать матрицу данных (это для гораздо меньшего набора):

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

data = pd.read_csv('concertdata.csv') 
print data 

Это печатает мои поддельные данные:

concert_date work_id_10 work_id_100 work_id_1007 work_id_1009 \ 
0 1917-01-27   1   1    0    0 
1 1917-01-28   0   0    1    0 
2 1917-01-29   0   1    1    0 
3 1917-01-30   1   0    0    0 
4 1917-01-31   0   0    0    0 
5 1917-02-01   0   0    1    1 

    work_id_1011 
0    0 
1    0 
2    1 
3    1 
4    1 
5    0 

Затем получить заголовок и значения :

id_labels = data.columns[1:] 
# take the transpose since you want to see id on y-axis 
id_matrix = np.array(data[id_labels].values, dtype=float).T 
concert_dates = pd.to_datetime(data['concert_date']) 
concert_dates = [d.date() for d in concert_dates] 

Теперь сюжет это с помощью imshow():

fig, ax = plt.subplots() 
mat = ax.imshow(id_matrix, cmap='GnBu', interpolation='nearest') 
plt.yticks(range(id_matrix.shape[0]), id_labels) 
plt.xticks(range(id_matrix.shape[1]), concert_dates) 
plt.xticks(rotation=30) 
plt.xlabel('Concert Dates') 

# this places 0 or 1 centered in the individual squares 
for x in xrange(id_matrix.shape[0]): 
    for y in xrange(id_matrix.shape[1]): 
     ax.annotate(str(id_matrix[x, y])[0], xy=(y, x), 
        horizontalalignment='center', verticalalignment='center') 
plt.show() 

enter image description here

Вы можете играть вокруг, чтобы сделать его красивее, но это общая идея.

Смежные вопросы