Code ändern, um für Monat und Woche statt Jahr zu arbeiten

Ich mache eine gestapelte Bar-Plot über ein Jahr Zeitspanne, wo die X-Achse ist Firmennamen, y-Achse ist die Anzahl der Anrufe, und die Stacks sind die Monate.

Ich möchte in der Lage sein, diese Handlung für eine Zeitspanne von einem Monat laufen zu lassen, wo die Stapel Tage sind, und eine Zeitspanne von einer Woche, wo die Stapel Tage sind. Ich habe Schwierigkeiten, dies zu tun, da mein Code schon um das Jahr Zeitspanne gebaut ist.

Meine Eingabe ursprüngliche Eingabe ist eine CSV-Datei. Ich ziehe zwei Zeilen wie folgt:

CompanyName recvd_dttm Company1 6/5/2015 18:28:50 PM Company2 6/5/2015 14:25:43 PM Company3 9/10/2015 21:45:12 PM Company4 6/5/2015 14:30:43 PM Company5 6/5/2015 14:32:33 PM 

Dann mache ich ein datatable, das so aussieht

 pivot_table.head(3) Out[12]: Month 1 2 3 4 5 6 7 8 9 10 11 12 CompanyName Customer1 17 30 29 39 15 26 24 12 36 21 18 15 Customer2 4 11 13 22 35 29 15 18 29 31 17 14 Customer3 11 8 25 24 7 15 20 0 21 12 12 17 

Und mein Code ist das so weit.

Zuerst packe ich ein Jahr Wert von Daten (ich würde dies zu einem Monat oder eine Woche für diese Frage ändern)

 # filter by countries with at least one medal and sort df['recvd_dttm'] = pd.to_datetime(df['recvd_dttm']) #Only retrieve data before now (ignore typos that are future dates) mask = df['recvd_dttm'] <= datetime.datetime.now() df = df.loc[mask] # get first and last datetime for final week of data range_max = df['recvd_dttm'].max() range_min = range_max - pd.DateOffset(years=1) # take slice with final week of data df = df[(df['recvd_dttm'] >= range_min) & (df['recvd_dttm'] <= range_max)] 

Dann schaffe ich die oben gezeigte pivot_tabelle.

 ########################################################### #Create Dataframe ########################################################### df = df.set_index('recvd_dttm') df.index = pd.to_datetime(df.index, format='%m/%d/%Y %H:%M') result = df.groupby([lambda idx: idx.month, 'CompanyName']).agg(len).reset_index() result.columns = ['Month', 'CompanyName', 'NumberCalls'] pivot_table = result.pivot(index='Month', columns='CompanyName', values='NumberCalls').fillna(0) s = pivot_table.sum().sort(ascending=False,inplace=False) pivot_table = pivot_table.ix[:,s.index[:30]] pivot_table = pivot_table.transpose() pivot_table = pivot_table.reset_index() pivot_table['CompanyName'] = [str(x) for x in pivot_table['CompanyName']] Companies = list(pivot_table['CompanyName']) pivot_table = pivot_table.set_index('CompanyName') pivot_table.to_csv('pivot_table.csv') 

Dann benutze ich den Pivot-Tisch, um ein OrderedDict für Plotten zu erstellen

 ########################################################### #Create OrderedDict for plotting ########################################################### months = [pivot_table[(m)].astype(float).values for m in range(1, 13)] names = ["Jan", "Feb", "Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov", "Dec"] months_dict = OrderedDict(list(zip(names, months))) ########################################################### #Plot! ########################################################### palette = brewer["RdYlGn"][8] hover = HoverTool( tooltips = [ ("Month", "@months"), ("Number of Calls", "@NumberCalls"), ] ) output_file("stacked_bar.html") bar = Bar(months_dict, Companies, title="Number of Calls Each Month", palette = palette, legend = "top_right", width = 1200, height=900, stacked=True) bar.add_tools(hover) show(bar) 

Bildbeschreibung hier eingeben

Hat jemand Ideen, wie man sich an die Änderung dieses Codes, damit es für kürzere Zeiträume arbeiten kann? Ich denke, dass es eine Änderung im Abschnitt "OrderedDict" sein wird. Möglicherweise macht Len (recvd_dttm) zu iterieren?

  • Beautifulsoup find_all kann nicht div Daten erhalten
  • Django syncdb und ein aktualisiertes Modell
  • Kratzen Sie mehrere Seiten mit BeautifulSoup und Python
  • Warum kann ich die Argumente für die aus der Zukunft importierte Druckfunktion nicht sehen?
  • Verzeichnisübertragungen auf paramiko
  • Wie mache ich Prozesse in der Lage, in einem Array des Hauptprogramms zu schreiben?
  • Schlechtes Timing beim Abspielen von Audiodateien mit PyGame
  • AttributeError: 'Tupel' Objekt hat kein Attribut 'read'
  • One Solution collect form web for “Code ändern, um für Monat und Woche statt Jahr zu arbeiten”

    Für Tage in einem Monat ('2015-07' sagen) Sie könnten sich ändern

     result = df.groupby([lambda idx: idx.month, 'CompanyName']).agg(len).reset_index() 

    Zu etwas wie

     month = '2015-07' result = df.loc[month].groupby([lambda idx: idx.day, 'CompanyName']).agg(len).reset_index() 

    Und ersetze 'Month' mit 'Day' unten. Sie müssten nicht mit dem OrderedDict etc. in diesem Fall zu stören, da sie nur Ints sind. Für eine Woche könntest du tun

     start, end = '2015-07-06', '2015-07-12' result = df.loc[start: end].groupby( [lambda idx: idx.dayofweek, 'CompanyName']).agg(len).reset_index() 
    Python ist die beste Programmiersprache der Welt.