2016-11-01 11 views
14

Jak mogę utworzyć timewheel podobny do poniższego z czasami zdarzeń logowania/wylogowania? W szczególności szukasz korelacji średniego czasu zalogowania/wylogowania skorelowanego z dniem tygodnia w modzie czasowej? Poniższy obrazek jest przykładem, ale szukam czasu, który upływa z czasem, z dniami tygodnia, w których na obrazku są godziny. Mam dostęp do Pythona i zestawy danych, które zawierają czasy logowania. Chciałbym również skorelować kolory z typami użytkowników, takimi jak administratorzy kontra zwykli użytkownicy lub coś podobnego. Wszelkie przemyślenia na temat tego, jak to osiągnąć, będą wspaniałe.Koło czasu w python3 pandy

Niektóre dane próbki jest poniżej w dataframe pandy

df:

TimeGenerated  EventID Username Message 
2012-04-01 00:00:13 4624  Matthew This guy logged onto the computer for the first time today 
2012-04-01 00:00:14 4624  Matthew This guy authenticated for some stuff 
2012-04-01 00:00:15 4624  Adam  This guy logged onto the computer for the first time today 
2012-04-01 00:00:16 4624  James  This guy logged onto the computer for the first time today 
2012-04-01 12:00:17 4624  Adam  This guy authenticated for some stuff 
2012-04-01 12:00:18 4625  James  This guy logged off the computer for the last time today 
2012-04-01 12:00:19 4624  Adam  This guy authenticated for some stuff 
2012-04-01 12:00:20 4625  Adam  This guy logged off the computer for the last time today 
2012-04-01 12:00:21 4625  Matthew This guy logged off the computer for the last time today 

Time Wheel

enter image description here

+0

Jeśli to nie wystarczy, aby rozpocząć Wita, mogę oczyścić niektóre dane jutro @https: //stackoverflow.com/users/3877338/johne – johnnyb

+0

Może [to] (https: //stackoverflow.com/a/25266569/3941704), z @Weir_Doe, być źródłem inspiracji? –

+0

Możesz skonstruować taki wykres z koncentrycznych wykresów pączków, takich jak tutaj: https://stackoverflow.com/questions/33019879/hierarchic-pie-donut-chart-from-pandas-dataframe-using-bokeh-or-matplotlib –

Odpowiedz

12

Zasadniczo trzeba zrobić 2 rozłączne zadania:

  • utworzyć tabelę częstotliwości idziesz do wizualizacji
  • zdefiniować funkcję wizualizacji danej tabeli

Dla pierwszego zadania, zakładam, trzeba tylko stół obrotowy z dniem tygodnia i godziny. Generuję losowy:

import pandas as pd 
import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 
import matplotlib as mpl 
import matplotlib.cm as cm 
import calendar 

# generate the table with timestamps 
np.random.seed(1) 
times = pd.Series(pd.to_datetime("Nov 1 '16 at 0:42") + pd.to_timedelta(np.random.rand(10000)*60*24*40, unit='m')) 
# generate counts of each (weekday, hour) 
data = pd.crosstab(times.dt.weekday, times.dt.hour.apply(lambda x: '{:02d}:00'.format(x))).fillna(0) 
data.index = [calendar.day_name[i][0:3] for i in data.index] 
print(data.T) 

To wygląda tak. Każda liczba to licznik logowania w tej chwili:

 Mon Tue Wed Thu Fri Sat Sun 
col_0         
00:00 55 56 67 60 60 62 45 
01:00 51 65 70 65 60 59 40 
02:00 47 76 67 68 61 63 51 
.... 

Teraz narysuj koło dla tego stołu! Będzie się ona składać z kilku wykresów kołowych:

# make a heatmap building function 
def pie_heatmap(table, cmap=cm.hot, vmin=None, vmax=None,inner_r=0.25, pie_args={}): 
    n, m = table.shape 
    vmin= table.min().min() if vmin is None else vmin 
    vmax= table.max().max() if vmax is None else vmax 

    centre_circle = plt.Circle((0,0),inner_r,edgecolor='black',facecolor='white',fill=True,linewidth=0.25) 
    plt.gcf().gca().add_artist(centre_circle) 
    norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax) 
    cmapper = cm.ScalarMappable(norm=norm, cmap=cmap) 
    for i, (row_name, row) in enumerate(table.iterrows()): 
     labels = None if i > 0 else table.columns 
     wedges = plt.pie([1] * m,radius=inner_r+float(n-i)/n, colors=[cmapper.to_rgba(x) for x in row.values], 
      labels=labels, startangle=90, counterclock=False, wedgeprops={'linewidth':-1}, **pie_args) 
     plt.setp(wedges[0], edgecolor='white',linewidth=1.5) 
     wedges = plt.pie([1], radius=inner_r+float(n-i-1)/n, colors=['w'], labels=[row_name], startangle=-90, wedgeprops={'linewidth':0}) 
     plt.setp(wedges[0], edgecolor='white',linewidth=1.5) 



plt.figure(figsize=(8,8)) 
pie_heatmap(data, vmin=-20,vmax=80,inner_r=0.2) 

plt.show(); 

Time wheel Mam nadzieję, że pomaga.

+0

Czy możesz dodać 'plt.setp (kołowy, szerokość = szerokość, edgecolor = 'biały')', aby wyglądać równomiernie lepszy? [link odnośnika] (https: // stackoverflow.com/questions/44153457/double-donut-chart-in-matplotlib) –

+1

@UdayrajDeshmukh, możesz edytować odpowiedź! –

+0

Dzięki. Dodałem wewnętrzny okrąg i zwiększyłem szerokość linii. Teraz jest o wiele piękniejsza i czytelniejsza! –

6

Wybierając dane z odpowiedzi @ DavidDale, można wykreślić wykres tabeli na osiach biegunowych pcolormesh. To bezpośrednio dałoby pożądany wykres.

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

# generate the table with timestamps 
np.random.seed(1) 
times = pd.Series(pd.to_datetime("Nov 1 '16 at 0:42") + 
        pd.to_timedelta(np.random.rand(10000)*60*24*40, unit='m')) 
# generate counts of each (weekday, hour) 
data = pd.crosstab(times.dt.weekday, 
        times.dt.hour.apply(lambda x: '{:02d}:00'.format(x))).fillna(0) 
data.index = [calendar.day_name[i][0:3] for i in data.index] 
data = data.T 

# produce polar plot 
fig, ax = plt.subplots(subplot_kw=dict(projection='polar')) 
ax.set_theta_zero_location("N") 
ax.set_theta_direction(-1) 

# plot data 
theta, r = np.meshgrid(np.linspace(0,2*np.pi,len(data)+1),np.arange(len(data.columns)+1)) 
ax.pcolormesh(theta,r,data.T.values, cmap="Reds") 

# set ticklabels 
pos,step = np.linspace(0,2*np.pi,len(data),endpoint=False, retstep=True) 
pos += step/2. 
ax.set_xticks(pos) 
ax.set_xticklabels(data.index) 

ax.set_yticks(np.arange(len(data.columns))) 
ax.set_yticklabels(data.columns) 
plt.show() 

enter image description here