Blogia
analisis de datos con python

lectura de doc.CSV y analisis de dataframe con libreria pandas

MODELADO DE DATOS

//

importar librerias

la librería PANDAS ofrece para python unas estructuras de datos fáciles de usar y alto performance, atra ves de funciones esenciales para el análisis de datos. MATPLOTLIB libreria para visualizaciones gráficas, NUMPY paquete fundamental para la computación científica en python

In [1]:
import pandas as pd
import matplotlib.pyplot as p
import numpy as np

Lectura de archivo formato csv

se utiliza la función read_csv llamada por el objeto creado 'pd' de la libreria pandas para llamar el archivo "channel.csv", donde se da la direccion del directorio en el cual esta ubicado. Al leer el archivo es guardado en un DataFrame llamado tabla. con el atributo index_col al definrle 0 se crea el data frame sin indice.

In [2]:
tabla=pd.read_csv('/home/adrian/Documentos/csv/channel', index_col=0)

con la función replace, remplazamos el texto 'Frame is not being retransmitted'por un 0 y el texto 'Frame is being retransmitted' por un 1, a la columna Retry.

In [3]:
tabla.Retry=tabla.Retry.replace(['Frame is not being retransmitted','Frame is being retransmitted'],[0,1])
#df = df.rename(columns={'$a': 'a', '$b': 'b'})
#df.reset_index(level=['a','b'])

seleccion y agrupacion de columnas

con la funcion groupby agrupamos por las columnas channel y Source del DataFrame tabla y se guarda en una nueva llamada fuente, como indice las agrupaciones realizadas. con la funcion reset_index declaramos los indices como columnas, que luego las selecionamos guardandolas en un nuevo Dataframe llamado fuentes, ya que el objetivo es saber el numero de fuentes por canal, agrupamos de nuevo por canal las fuentes sin repetir resultado de la priemra agrupacion, y las contamos con la funcion count()

In [4]:
fuente=tabla.groupby(['channel','Source']).sum()
fuente= fuente.reset_index()# tomar los indices como columnas
fuentes=fuente[['channel','Source']]
fuente=fuentes.groupby('channel') .count()

agrupamos por Channel y Destination del dataframe tabla para saber el numero de terminales por canal, en este caso se utiliza como atributo as_index igualada a False para asignar los indices como columnas de la nueva agrupacion, tomamos las columnas con las que necitamos trabajar, agrupandolas de nuevo para ser contadas.

In [5]:
destino=tabla.groupby(['channel','Destination'], as_index=False).count()
destino=destino[['channel','Destination']]
destinos=destino.groupby('channel').count()

se realiza el mismo cazo anterio para mirar las retramisiones por canal, realizando la agrupacion sin indices. con la funcion set_index tomamos la columna channel como el nuevo index del dataframe

In [6]:
retry=tabla.groupby(['channel','Retry'], as_index=False ).count()
retry=retry[['channel','Retry','Destination']]
retry.set_index('channel', append=True, inplace=True) #tomamos la columna 'channel' como index

retry
Out[6]:
    Retry Destination
  channel    
0 2417 [BG 2] 0 93
1 2422 [BG 3] 0 4
2 2427 [BG 4] 0 2
3 2432 [BG 5] 0 190
4 2437 [BG 6] 0 3428
5 2437 [BG 6] 1 42
6 2442 [BG 7] 0 137
7 2447 [BG 8] 0 84
8 2447 [BG 8] 1 13
9 2452 [BG 9] 0 1063
10 2452 [BG 9] 1 193
11 2457 [BG 10] 0 102
12 2457 [BG 10] 1 14
13 2462 [BG 11] 0 791
14 2462 [BG 11] 1 108

union de data frame

se tiene el data frame fuente con la columna 'Source' y el data frame destinos con la culumna 'Destination' en la cual son unidas por medio de la funcion JOIN y guardadas en el dataframe tabla final

In [7]:
tablafinal=fuente.join(destinos)

se imprime el data frame tabla final con los primeros 5 elementos

In [8]:
tablafinal.head()
Out[8]:
  Source Destination
channel    
2417 [BG 2] 12 9
2422 [BG 3] 2 2
2427 [BG 4] 2 1
2432 [BG 5] 10 14
2437 [BG 6] 21 30

agrupacion por channel y Source y el conteo de las mismas

In [9]:
mm=tabla.groupby(['channel','Source']).count().head()
mm
Out[9]:
    Time Destination Length Info Retry SSI Signal (dBm)
channel Source            
2417 [BG 2] 30:10:b3:19:1e:b5 1 1 1 1 1 1
30:10:b3:19:1e:b5 (TA) 2 2 2 2 2 2
Apple_94:bd:34 (TA) 12 12 12 12 12 12
AskeyCom_54:1c:53 5 5 5 5 5 5
Shenzhen_a4:b8:51 (BSSID) 2 2 2 2 2 2

generar grafica en notebook

In [10]:
%matplotlib inline 

Graficas

grafica en barras del dataframe tablafinal fuentes y destinos por canal. se importa la libreria matplotlib y graficamos con la funcion plot y le decimos como tipo barras

In [11]:
tablafinal.plot(kind='bar')
p.show()

renombramos las columnas time por total y el Source por ftotal fuentes con la funcion RENAME

In [12]:
channelretry=tabla.groupby(['channel','Retry']).count()
channelretry=channelretry[['Time','Source']]
channelretry = channelretry.rename(columns={'Time': 'total','Source':'total fuentes'})#cambiar nombre a una columna
In [13]:
channelretry.plot(kind='bar')
p.show()
In [14]:
ssi=tabla['SSI Signal (dBm)']
ssi.hist()
Out[14]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f044137b850>
In [15]:
rssi=tabla[['SSI Signal (dBm)','Time']]
rssi=rssi.groupby('SSI Signal (dBm)').count()
rssi.sort(columns='Time' , ascending=True)
/home/adrian/anaconda2/lib/python2.7/site-packages/ipykernel/__main__.py:3: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)
app.launch_new_instance()
Out[15]:
  Time
SSI Signal (dBm)  
-38 1
-46 1
-54 1
-55 1
-95 2
-30 3
-94 3
-31 5
-56 5
-57 5
-58 5
-36 5
-35 6
-60 7
-59 8
-93 8
-32 9
-74 19
-34 20
-73 20
-92 23
-33 25
-75 28
-61 28
-76 28
-72 30
-62 38
-63 48
-77 51
-91 52
-64 67
-65 77
-85 105
-87 125
-90 126
-88 130
-86 134
-89 148
-71 151
-84 155
-81 161
-66 161
-78 211
-82 215
-83 280
-70 288
-80 379
-67 465
-79 651
-68 773
-69 941

0 comentarios