2017-10-12 2 views
3

Zuvor Gebäude, ich war zu get week numbers on multiple year that is ready for plotting fragen, und basierend auf jezrael Antwort habe ich dies:Nicht unterstützte Operandtyp (e) für: - ‚str‘ und ‚float‘, wenn ein Balkendiagramm

sheet2['device_create_week'] = sheet2['device_create_at'].dt.strftime('%Y-%V') 
sheet2.groupby(['device_create_week']).size().reset_index(na‌​me='device created count weekly') 

Dann ich bewege

import matplotlib.pyplot as plt 
from matplotlib import rcParams 
rcParams['figure.figsize'] = (10, 6) 
rcParams['figure.dpi'] = 150 
fig = plt.figure() 
plt.bar(pre['user_create_week'],pre['user created count weekly'], align='center', alpha=0.5) 
plt.xlabel('week') 
plt.ylabel('frequency') 
plt.show() 
fig.savefig('test.jpg') 

zum Plotten Und dann sehe ich einen Fehler:

TypeError: unsupported operand type(s) for -: 'str' and 'float'

Was soll ich denn tun sollen? Ich habe die erwartete Lösung, die wöchentlich ein Balkendiagramm mit Häufigkeit auftragen kann.

Wenn Sie Daten wollen, um zu versuchen, hier ist meine Daten können Sie versuchen:

136  2014-08-27 10:19:46 
245  2014-09-25 09:13:22 
257  2014-09-29 15:22:16 
258  2014-09-29 15:22:16 
480  2015-02-02 10:01:25 
481  2015-02-02 10:01:25 
482  2015-02-02 10:01:25 
483  2015-02-02 10:01:25 
484  2015-02-02 10:01:25 
485  2015-02-02 10:01:25 
486  2015-02-02 10:01:25 
487  2015-02-02 10:01:25 
488  2015-02-02 10:01:25 
536  2015-02-09 08:00:29 
589  2015-02-02 10:01:25 
590  2015-02-02 10:01:25 
591  2015-02-02 10:01:25 
592  2015-02-02 10:01:25 
593  2015-02-02 10:01:25 
594  2015-02-02 10:01:25 
595  2015-02-02 10:01:25 
596  2015-02-02 10:01:25 
597  2015-02-02 10:01:25 
694  2015-02-27 16:02:23 
1573 2015-04-20 16:44:20 
1574 2015-04-20 16:44:20 
1779 2015-04-27 03:06:09 
2119 2015-05-07 06:32:38 
2120 2015-05-07 06:32:38 
2306 2015-05-13 03:29:19 
89876 2017-10-04 06:20:09 
89933 2017-10-06 11:04:38 
89943 2017-10-06 12:12:58 
89947 2017-10-06 12:50:30 
89952 2017-05-22 12:47:37 
89957 2017-10-06 14:37:23 
89958 2017-10-06 14:38:43 
89984 2017-10-06 18:41:46 
90022 2017-10-07 01:19:39 
90053 2017-10-07 01:48:46 
90117 2017-10-03 05:36:33 
90122 2017-10-07 06:52:07 
90129 2017-08-21 14:59:27 
90145 2017-10-07 11:04:50 
90157 2017-10-07 11:51:09 
90164 2017-10-07 12:08:38 
90202 2017-10-08 01:01:45 
90216 2017-10-08 03:12:07 
90222 2017-10-08 04:41:01 
90228 2017-10-08 05:27:24 
90238 2017-10-08 06:22:46 
90250 2017-10-08 07:10:12 
90266 2017-10-08 09:01:40 
90276 2017-10-08 10:15:59 
90291 2017-10-08 11:47:35 
90294 2017-10-08 11:50:42 
90298 2017-08-29 04:21:27 
90313 2017-10-08 16:01:15 
90363 2016-11-26 13:00:18 

Antwort

4

Ich glaube, Sie stattdessen verwenden können:

plt.bar(pre['user_create_week'],pre['user created count weekly'], align='center', alpha=0.5) 

DataFrame.plot.bar:

ax = pre.plot.bar(x='device_create_week', 
        y='device created count weekly', 
        align='center', 
        alpha=0.5) 

Auch für Bild speichern unter:

fig = ax.get_figure() 
fig.savefig('test.jpg') 

graph

Wenn anhängen müssen alle möglichen Kombinationen year s + week s benötigen reindex:

import matplotlib.pyplot as plt 
from matplotlib import rcParams 

rcParams['figure.figsize'] = (10, 6) 
rcParams['figure.dpi'] = 150 
fig = plt.figure() 

sheet2['device_create_at'] = pd.to_datetime(sheet2['device_create_at']) 
sheet2['device_create_week'] = sheet2['device_create_at'].dt.strftime('%Y-%V') 
pre = sheet2.groupby(['device_create_week']).size() 

a = sorted(['{}-{:02d}'.format(x, y) for y in range(1, 54) for x in range(2014, 2017)]) 
print (a[:10]) 
['2014-01', '2014-02', '2014-03', '2014-04', '2014-05', '2014-06', 
'2014-07', '2014-08', '2014-09', '2014-10'] 

pre = pre.reindex(a, fill_value=0) 
print (pre.head()) 

ax = pre.plot.bar(align='center', alpha=0.5, width=1.0) 

plt.xlabel('week') 
plt.ylabel('frequency') 
plt.show() 

fig = ax.get_figure() 
fig.savefig('test.jpg') 

graph

Ist möglich auslassen einige Werte in axis x:

spacing = 10 
visible = ax.xaxis.get_ticklabels()[::spacing] 
for label in ax.xaxis.get_ticklabels(): 
    if label not in visible: 
     label.set_visible(False) 

plt.show() 

graph3

+0

Das funktioniert auch mein Notebook, ist irgendeine Idee, leere Woche auch gezeigt zu machen? –

+0

Und wie macht man keinen Platz zwischen Balken? –

+1

Die zweite Frage ist einfach - benutze den Parameter 'width = 1.0' in' plot'. – jezrael

3

Hier ist meine Antworten auf der Grundlage Ihres Originalcode: die plt.xticks() verwenden, um die str Typen Arbeit

Xweek_str=data1.device_create_week.tolist() 
x = range(len(Xweek_str)) 

rcParams['figure.figsize'] = (10, 6) 
rcParams['figure.dpi'] = 150 
fig = plt.figure() 
plt.bar(x,data1.device_created_count_weekly, align='center', alpha=0.5) 
plt.xticks(x, Xweek_str) 
plt.xlabel('week') 
plt.ylabel('frequency') 
plt.show() 

also in Ihrem Fall zu machen, müssen Sie nur hinzufügen:

Xweek_str=data1.device_create_week.tolist() 
x = range(len(Xweek_str)) 

Und plot wie folgt aus:

plt.bar(x,data1['device created count weekly'], align='center', alpha=0.5) 
plt.xticks(x, Xweek_str) 

enter image description here

+0

Wird versuchen, hoffentlich funktioniert es –

Verwandte Themen