2016-03-20 8 views
2

içinde DateTimeIndex ile çizilen karşılaşılan bir zaman serisi Pandalar çizme entegrasyonu ile çizmeye çalışıyorum ve hata TypeError: Empty 'DataFrame': no numeric data to plot alıyorum. Matplotlib'i kullanmak doğrudan işe yarıyor, fakat sanırım kütüphaneyi yanlış kullanıyorum ve Panda'ları kullanmamla yanlış yoldan gitmediğime emin olmak istiyorum.Boş DataFrame hatası, Pandalar

Ben iki sütun içeren bir veri dosyası vardır:

İşte oluyor budur. İlk sütun bir zaman damgasıdır ve ikinci sütun geçen bir süredir. Her ikisi de nanosaniye birimlerindedir. Ben kullanılan veriler okuyorum: Bu veri içeren

data = pd.read_table('trace.log', sep=" ", header=None, 
    names=("start", "latency")) 
print(data.head()) 
print(data.dtypes) 

:

  start latency 
0 27668827345634 754210039 
1 27668827918895 753710503 
2 27668827809194 754495193 
3 27668827974232 754464123 
4 27669581667404 60338395 
start  int64 
latency int64 
dtype: object 

Sonra datetime64[ns] için start dönüştürmek ve bu indeks yapmak ve bir timedelta64[ns] için latency dönüştürün.

data.start = pd.to_datetime(data.start, unit="ns") 
data.latency = pd.to_timedelta(data.latency, unit="ns") 
data.set_index('start', inplace=True) 

print(data.head()) 
print(data.dtypes) 
print(data.index) 

Yani şimdi bir DateTimeIndex ile zaman serileri var ve benim gecikme bir zaman delta olarak ifade: Ben bu çizmek çalıştığınızda

         latency 
start           
1970-01-01 07:41:08.827345634 00:00:00.754210 
1970-01-01 07:41:08.827495897 00:00:01.395999 
1970-01-01 07:41:08.827574509 00:00:01.395592 
1970-01-01 07:41:08.827605687 00:00:01.381083 
1970-01-01 07:41:08.827634020 00:00:01.381130 
latency timedelta64[ns] 
dtype: object 
DatetimeIndex(['1970-01-01 07:41:08.827345634', 
       '1970-01-01 07:41:08.827495897', 
       ... 
       '1970-01-01 08:11:07.739615123', 
       '1970-01-01 08:11:07.756520620'], 
       dtype='datetime64[ns]', name='start', length=437915, freq=None) 

gördüğüm sorundur. Ben çalıştırmak mümkün olmalıdır gördük örnekler dayanarak:

data.latency.plot() 

başlangıç ​​zamanı vs gecikmenin bir arsa üretmek için, ama aşağıdaki hatayı alıyorum: Ben çizmek eğer

/opt/conda/lib/python3.5/site-packages/pandas/tools/plotting.py in _compute_plot_data(self) 
    1092   if is_empty: 
    1093    raise TypeError('Empty {0!r}: no numeric data to ' 
-> 1094        'plot'.format(numeric_data.__class__.__name__)) 
    1095 
    1096   self.data = numeric_data 

TypeError: Empty 'DataFrame': no numeric data to plot 

Not plt.plot(data.index, data.latency) kullanarak verileri bekliyorum. Bence çok önemli bir anlayışı kaçırmam gerekiyor ya da bir hata görüyorum. Plot çizme entegrasyonunu kullanabilmek güzel olurdu.

cevap

0

size zaman keneler özelleştirmek için set_major_formatter() kullanabilirsiniz:

import io 
import datetime 
import matplotlib 
import matplotlib.pyplot as plt 
import pandas as pd 

data = """\ 
      start latency 
0 27668827345634 754210039 
1 27668827918895 753710503 
2 27668827809194 754495193 
3 27668827974232 754464123 
4 27669581667404 60338395 
""" 
data = pd.read_csv(io.StringIO(data), sep='\s+', index_col=0) 

data.start = pd.to_datetime(data.start, unit="ns") 
# convert nanoseconds to seconds 
data.latency /= 10**9 

# define custom Ticker formatter function 
def timeTicks(x, pos): 
    return str(datetime.timedelta(seconds=x)) 

formatter = matplotlib.ticker.FuncFormatter(timeTicks) 

ax = data.plot(x='start', y='latency') 

# format yticks 
ax.yaxis.set_major_formatter(formatter) 

plt.show() 

enter image description here

+0

Sana atıfta ne hüner emin değilim. Plot komutunda 'x' verisinin açık bir şekilde ayarlanması, ancak 'x' ayarlanmadan değişkeni çizmenin tamamen 'x' verileri için indeksi kullanması bekledim. –

+0

@NoahWatkins, hile 'set_major_formatter() 'kullanmaktır. Ben sadece 'çizmek için' ('kurtulmak için)' data.set_index ('start') 'yapmak için x '' açıkça ayarladım. x' ekseni - daha hızlı olmalı. – MaxU