Diplomado de Análisis de datos y Machine Learning en Python

El presente diplomado hace parte del centro de Big Data de la facultad de ciencias exactas y naturales (FCEN) de la Universidad de Antioquia.

1. Taller

Pregunta 1

Definir una función max_de_dos(), que tome dos números como argumentos y devuelva el mayor de ellos. Si los números son iguales que imprima en pantalla "Los números son iguales" y no regrese ningún valor.


In [0]:


In [0]:
# Escriba aquí su código
def max_de_dos(num1, num2):
  if num1==num2 :
    print ("los numeros son iguales") 
    return
  return num1 if num1>num2 else num2

max_de_dos(4,4)


los numeros son iguales

Para ver la solución haga double-click aquí. <!--

def max_de_dos(a, b):

if a>b: output=a elif b>a: output=b else: print('Los números son iguales') output=None return output

-->

Pregunta 2

Escriba un código de python que imprima todos los números pares de una lista dada y que deje de mostrar números cuando se encuentre el número 237

Lista de números de muestra:

numbers = [ 386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345, 399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217, 815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445, 742, 717, 958,743, 527 ]


In [0]:
# Escriba aquí su código
numbers = [386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345, 399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217, 815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445, 742, 717, 958,743, 527 ]
for item in numbers:
  if item!=237:
    print(item) 
  else:
    break


  File "<ipython-input-7-e3f3138f0aea>", line 3
    print(item) if item!=237 else break
                                      ^
SyntaxError: invalid syntax

Para ver la solución haga double-click aquí. <!--

numbers = [ 386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345, 399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217, 815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445, 742, 717, 958,743, 527 ]

listaFin=[] for i in numbers: if (i%2==0): listaFin.append(i) if (i==237): break print(listaFin)

-->

Pregunta 3

  • Mostrar con un while los números del 1 al 20

  • Mostrar con un for los números del 1 al 20


In [0]:
# Escriba aquí su código
for i in range(1,21)
  print("For iteration {}".format(i))

var1=1
while var1<=20:
  print("while iteration {}".format(var1))
  var1+=1

Para ver la solución haga double-click aquí. <!--

a=1 while a<=20: print(a) a+=1

#

for a in range(1,21): print(a)

-->

Pregunta 4

Juguemos al juego de adivinar el numero, generaremos un número entre 1 y 20.

Nuestro objetivo es adivinar el número. Si fallamos nos dirán si es mayor o menor que el número buscado. También poner el número de intentos requeridos.


In [0]:
# Escriba aquí su código

Para ver la solución haga double-click aquí. <!--

def adivina_numero():

import numpy as np
numero_buscado = np.random.randint(1, 21)

encontrado = False intentos = 0

while not encontrado:

  numero_usuario = int(input("Introduce el número buscado: "))

  if numero_usuario > numero_buscado:
      print("El número que buscas es menor")
      intentos = intentos +1
  elif numero_usuario < numero_buscado:
      print("El numero que buscas es mayor")
      intentos = intentos +1
  else:
      encontrado = True
      print("Has acertado el número correcto es " , numero_usuario, " te ha llevado ", intentos," intentos")

-->

Pregunta 5

Defina una función llamada es_cadena_no_vacia() que evalúe si una cadena de caracteres es vacía o no y que retorne un variable booleana según sea el caso


In [0]:
# Escriba aquí su código

Para ver la solución haga double-click aquí. <!--

    def es_cadena_no_vacia(cadena=None):
      if cadena==None:
        salida=False
      else:
        salida=True
      return salida

-->

Pregunta 6

Defina una función llamada es_numero() que evalúa si la entrada es un número y que retorne una variable booleana según sea el caso


In [0]:
# Escriba aquí su código

Para ver la solución haga double-click aquí. <!--

def es_numero(num=None): if type(num)==int or type(num)==float: salida=True else: salida=False

return salida

-->

Pregunta 7

Defina una clase llamada Hotel que contenga los atributos nombre, ubicación, puntaje obtenido por votación, y precio. Se tienen las siguientes restricciones:

  • El nombre y la ubicación deben ser cadenas no vacías.
  • El puntaje debe ser un número (sin restricciones sobre su valor)
  • El precio debe ser un número distinto de cero.

si no se cumple alguna de las condiciones, ejecute un error que muestre en pantalla el problema.

Pista: Use las funciónes es_cadena_no_vacia() y es_numero()


In [0]:
# Escriba aquí su código

Para ver la solución haga double-click aquí. <!--

class Hotel(object): """ Hotel: sus atributos son: nombre, ubicacion, puntaje y precio."""

def __init__(self, nombre = '*', ubicacion = '*',
             puntaje = 0, precio = float("inf")):
    """ nombre y ubicacion deben ser cadenas no vacías,
        puntaje y precio son números.
        Si el precio es 0 se reemplaza por infinito. """

    def es_cadena_no_vacia(cadena=None):
      if cadena==None:
        salida=False
      else:
        salida=True
      return salida

    def es_numero(num=None):
      if type(num)==int or type(num)==float:
        salida=True
      else:
        salida=False

      return salida

    if es_cadena_no_vacia (nombre):
        self.nombre = nombre
    else:
        raise TypeError ("El nombre debe ser una cadena no vacía")

    if es_cadena_no_vacia (ubicacion):
        self.ubicacion = ubicacion
    else:
        raise TypeError ("La ubicación debe ser una cadena no vacía")

    if es_numero(puntaje):
        self.puntaje = puntaje
    else:
        raise TypeError ("El puntaje debe ser un número")

    if es_numero(precio):
        if precio != 0:
            self.precio = precio
        else:
            self.precio = float("inf")
    else:
        raise TypeError("El precio debe ser un número")

def __str__(self):
    """ Muestra el hotel según lo requerido. """
    return self.nombre + " de "+ self.ubicacion+ \
            " - Puntaje: "+ str(self.puntaje) + " - Precio: "+ \
            str(self.precio)+ " pesos."

-->

2. Manipulación de datos


In [0]:
import pandas as pd
import numpy as np

df=pd.read_csv("https://raw.githubusercontent.com/diplomado-bigdata-machinelearning-udea/Curso1/master/s03/dataVentas2009.csv")

In [0]:
df.head()


Out[0]:
Fecha Producto1 Producto2 Producto3 Producto4
0 01/01/2009 29 20 35 NaN
1 02/01/2009 19 3 22 NaN
2 03/01/2009 24 12 22 NaN
3 04/01/2009 24 8 15 NaN
4 05/01/2009 120 111 141 NaN

In [0]:
df.columns


Out[0]:
Index(['Fecha', 'Producto1', 'Producto2', 'Producto3', 'Producto4'], dtype='object')

In [0]:
df.shape


Out[0]:
(365, 5)

In [0]:
df.describe()


Out[0]:
Producto1 Producto2 Producto3 Producto4
count 365.000000 365.000000 365.000000 178.000000
mean 2032.200000 1060.252055 2093.169863 2576.359551
std 1878.879799 1079.533086 1854.368523 2484.004743
min 0.000000 0.000000 0.000000 0.000000
25% 194.000000 90.000000 228.000000 0.000000
50% 1726.000000 678.000000 1686.000000 1443.500000
75% 3540.000000 1882.000000 3520.000000 4638.000000
max 6626.000000 4242.000000 6587.000000 7575.000000

In [0]:
df["Producto4"].unique()


Out[0]:
array([  nan, 2156., 4548., 7575., 7268., 2320., 5081., 4236., 3755.,
       6939., 4278., 5999., 3586., 4132., 7064., 6996., 4331., 6134.,
       4639., 4635., 2144., 5041., 7219., 7208., 5237., 5869., 1753.,
       7194., 5384., 7121., 5259., 5103., 5514., 3524., 4187., 4359.,
       7127., 6971., 6178., 5078., 4416., 5683., 5647., 6901., 4902.,
       3752., 4822., 4015., 5534., 7044., 6242., 6239., 5661., 1445.,
       3064., 5941., 7052., 6864., 5837., 4185., 4036., 4375., 6763.,
       6686., 6520., 6044., 5205., 3959., 4263., 4379., 4256., 3985.,
       2169., 2550., 2605., 3599., 1923., 2044., 3183., 2709., 2547.,
        656., 1415., 1342., 1799., 1588., 1906.,  705., 1116., 1773.,
       2211.,  984., 1967.,  663., 1003.,  825.,  924.,  870., 1373.,
       1311., 1238.,  919., 1006., 1483., 1374., 1442.,  633.,  952.,
        286.,  833., 1191., 1114., 1075., 1230.,  958.,  309.,  859.,
       1208.,  798., 1046.,  906.,  864.,  552., 1063., 1341., 1300.,
       1175., 1108., 1005.,  321.,  404.,    0.])

2.1. Formateo de datos temporales

La función to_datetime permite convertir los datos a un formato especial de tiempo


In [0]:
pd.to_datetime(df.Fecha).head()


Out[0]:
0   2009-01-01
1   2009-02-01
2   2009-03-01
3   2009-04-01
4   2009-05-01
Name: Fecha, dtype: datetime64[ns]

In [0]:
pd.to_datetime(df.Fecha, format='%d/%m/%Y').head()


Out[0]:
0   2009-01-01
1   2009-01-02
2   2009-01-03
3   2009-01-04
4   2009-01-05
Name: Fecha, dtype: datetime64[ns]

In [0]:
df.Fecha=pd.to_datetime(df.Fecha)
df.set_index('Fecha', inplace=True)
df.head()


Out[0]:
Producto1 Producto2 Producto3 Producto4
Fecha
2009-01-01 29 20 35 NaN
2009-02-01 19 3 22 NaN
2009-03-01 24 12 22 NaN
2009-04-01 24 8 15 NaN
2009-05-01 120 111 141 NaN

2.2. Procesamiento de datos nulos


In [0]:
df.isna().head()


Out[0]:
Producto1 Producto2 Producto3 Producto4
Fecha
2009-01-01 False False False True
2009-02-01 False False False True
2009-03-01 False False False True
2009-04-01 False False False True
2009-05-01 False False False True

Usar el comando fillna() para reemplazar los valores nulos con el valor deseado. Puede hacerse en una sola columna df.columna.fillna() o en todas al mismo tiempo df.fillna()


In [0]:
# Solo visual
df.Producto4.fillna(0)


Out[0]:
Fecha
2009-01-01    0.0
2009-02-01    0.0
2009-03-01    0.0
2009-04-01    0.0
2009-05-01    0.0
2009-06-01    0.0
2009-07-01    0.0
2009-08-01    0.0
2009-09-01    0.0
2009-10-01    0.0
2009-11-01    0.0
2009-12-01    0.0
2009-01-13    0.0
2009-01-14    0.0
2009-01-15    0.0
2009-01-16    0.0
2009-01-17    0.0
2009-01-18    0.0
2009-01-19    0.0
2009-01-20    0.0
2009-01-21    0.0
2009-01-22    0.0
2009-01-23    0.0
2009-01-24    0.0
2009-01-25    0.0
2009-01-26    0.0
2009-01-27    0.0
2009-01-28    0.0
2009-01-29    0.0
2009-01-30    0.0
             ... 
2009-02-12    0.0
2009-03-12    0.0
2009-04-12    0.0
2009-05-12    0.0
2009-06-12    0.0
2009-07-12    0.0
2009-08-12    0.0
2009-09-12    0.0
2009-10-12    0.0
2009-11-12    0.0
2009-12-12    0.0
2009-12-13    0.0
2009-12-14    0.0
2009-12-15    0.0
2009-12-16    0.0
2009-12-17    0.0
2009-12-18    0.0
2009-12-19    0.0
2009-12-20    0.0
2009-12-21    0.0
2009-12-22    0.0
2009-12-23    0.0
2009-12-24    0.0
2009-12-25    0.0
2009-12-26    0.0
2009-12-27    0.0
2009-12-28    0.0
2009-12-29    0.0
2009-12-30    0.0
2009-12-31    0.0
Name: Producto4, Length: 365, dtype: float64

In [0]:
# Cambiando los datos
df.Producto4.fillna(df.Producto4.mean(),inplace=True) #Importante inplace

2.3. Indexación y localización

Usando los comandos iloc y loc en un dataframe, se puede acceder a los datos con base en las etiquetas y la ubicación respectivamente


In [0]:
df.iloc[100:110]


Out[0]:
Producto1 Producto2 Producto3 Producto4
Fecha
2009-11-04 0 0 0 2576.359551
2009-12-04 0 0 0 2576.359551
2009-04-13 0 0 0 2576.359551
2009-04-14 0 0 0 2576.359551
2009-04-15 0 0 0 2576.359551
2009-04-16 0 0 0 2576.359551
2009-04-17 1286 820 1436 2576.359551
2009-04-18 1178 667 826 2576.359551
2009-04-19 2131 1155 1426 2576.359551
2009-04-20 2709 1697 2646 2576.359551

Indexación para un subconjunto de columnas


In [0]:
df[['Producto1','Producto4']].iloc[100:110]


Out[0]:
Producto1 Producto4
Fecha
2009-11-04 0 2576.359551
2009-12-04 0 2576.359551
2009-04-13 0 2576.359551
2009-04-14 0 2576.359551
2009-04-15 0 2576.359551
2009-04-16 0 2576.359551
2009-04-17 1286 2576.359551
2009-04-18 1178 2576.359551
2009-04-19 2131 2576.359551
2009-04-20 2709 2576.359551

In [0]:
df.iloc[:,1:3]


Out[0]:
Producto2 Producto3
Fecha
2009-01-01 20 35
2009-02-01 3 22
2009-03-01 12 22
2009-04-01 8 15
2009-05-01 111 141
2009-06-01 146 236
2009-07-01 33 80
2009-08-01 14 14
2009-09-01 20 32
2009-10-01 45 79
2009-11-01 160 306
2009-12-01 99 170
2009-01-13 94 172
2009-01-14 87 175
2009-01-15 90 172
2009-01-16 49 97
2009-01-17 13 20
2009-01-18 22 55
2009-01-19 127 202
2009-01-20 85 176
2009-01-21 63 137
2009-01-22 125 205
2009-01-23 81 153
2009-01-24 1 10
2009-01-25 14 28
2009-01-26 85 136
2009-01-27 119 221
2009-01-28 52 113
2009-01-29 80 117
2009-01-30 60 106
... ... ...
2009-02-12 711 1867
2009-03-12 367 921
2009-04-12 595 1472
2009-05-12 301 746
2009-06-12 276 679
2009-07-12 358 1039
2009-08-12 318 807
2009-09-12 64 274
2009-10-12 110 363
2009-11-12 77 378
2009-12-12 84 210
2009-12-13 49 113
2009-12-14 123 433
2009-12-15 143 395
2009-12-16 155 350
2009-12-17 118 304
2009-12-18 119 373
2009-12-19 73 162
2009-12-20 62 125
2009-12-21 125 383
2009-12-22 107 353
2009-12-23 84 204
2009-12-24 59 129
2009-12-25 21 36
2009-12-26 21 59
2009-12-27 29 52
2009-12-28 41 99
2009-12-29 52 115
2009-12-30 43 115
2009-12-31 46 112

365 rows × 2 columns


In [0]:
df.loc["2009-10-01":"2009-10-10"]


Out[0]:
Producto1 Producto2 Producto3 Producto4
Fecha
2009-10-01 81 45 79 2576.359551
2009-10-02 228 101 260 2576.359551
2009-10-03 366 203 354 2576.359551
2009-10-04 0 0 0 2576.359551
2009-10-05 728 362 523 2576.359551
2009-10-06 3460 2354 3978 2576.359551
2009-10-07 6274 4242 5435 7268.000000
2009-10-08 2999 1545 3185 4187.000000
2009-10-09 5496 2921 6587 6520.000000
2009-10-10 1407 725 1443 1003.000000

Parar reasignar un valor de dataframe, simplemente se debe saber la localización, ya sea por indice o por etiqueta y usar el operador de asignación =


In [0]:
df.iloc[109,0]=1000

In [0]:
df.loc['2009-04-19','Producto1']=999

Validemos la re-asignación de los valores


In [0]:
df[['Producto1']].iloc[108:110]


Out[0]:
Producto1
Fecha
2009-04-19 999
2009-04-20 1000

2.4. Organización de dataframes

El método sort_values permite organizar los dataframes con base a los valores de las columnas o las filas


In [0]:
df.sort_values(by="Producto1").head()


Out[0]:
Producto1 Producto2 Producto3 Producto4
Fecha
2009-11-04 0 0 0 2576.359551
2009-03-31 0 0 0 2576.359551
2009-04-04 0 0 0 2576.359551
2009-05-04 0 0 0 2576.359551
2009-06-04 0 0 0 2576.359551

2.5. Graficando desde pandas

Pandas permite realizar algunas gráficas directamente con el comando DataFrame.plot().


In [0]:
df.Producto1.plot(figsize=(15,3))


Out[0]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f4bc9e812b0>

In [0]:
df.plot(figsize=(15,3))


Out[0]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f4bc9dc3d30>

Además de gráficos de línea, pandas tiene otro tipo de gráficos los cuales se puede usar con el argumento kind dentro del método DataFrame.plot(). Los otro gráficos disponibles son:

  • 'bar' or 'barh' for bar plots
  • 'hist' for histogram
  • 'box' for boxplot
  • 'kde' or 'density' for density plots
  • 'area' for area plots
  • 'scatter' for scatter plots
  • 'hexbin' for hexagonal bin plots
  • 'pie' for pie plots

In [0]:
df.Producto1.plot(kind='hist')


Out[0]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f4bc5d41f28>

In [0]:
df.hist(column='Producto1')


Out[0]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f4bc5cbd0b8>]],
      dtype=object)

2.6. Operaciones con columnas y filas

La función apply regresa algún valor después de aplicarle una función a cada columna/fila del dataframe.


In [0]:
df['Producto3sqrt']=df.Producto3.apply(np.sqrt)

In [0]:
df.tail()


Out[0]:
Producto1 Producto2 Producto3 Producto4 Producto3sqrt
Fecha
2009-12-27 66 29 52 0.0 7.211103
2009-12-28 61 41 99 0.0 9.949874
2009-12-29 89 52 115 0.0 10.723805
2009-12-30 76 43 115 0.0 10.723805
2009-12-31 53 46 112 0.0 10.583005

In [0]:
df.apply(np.sum, axis=0)


Out[0]:
Producto1        738912.000000
Producto2        386992.000000
Producto3        764007.000000
Producto4        940371.235955
Producto3sqrt     14277.399684
dtype: float64

In [0]:
df.apply(np.sum, axis=0).plot(kind='pie')


Out[0]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f4bc5bda0b8>

2.7. Agrupando dataframes

El comando groupby permite agrupar y generar calculos y operaciónes sobre los valores agrupados.


In [0]:
df["month"] = [i.month for i in df.index]
df.head()


Out[0]:
Producto1 Producto2 Producto3 Producto4 Producto3sqrt month
Fecha
2009-01-01 29 20 35 2576.359551 5.916080 1
2009-02-01 19 3 22 2576.359551 4.690416 2
2009-03-01 24 12 22 2576.359551 4.690416 3
2009-04-01 24 8 15 2576.359551 3.872983 4
2009-05-01 120 111 141 2576.359551 11.874342 5

In [0]:
df.groupby("month").max()


Out[0]:
Producto1 Producto2 Producto3 Producto4 Producto3sqrt
month
1 5298 2796 5765 6939.0 75.927597
2 5451 2868 5517 7052.0 74.276510
3 5904 3523 5762 7194.0 75.907839
4 5278 3499 5327 5837.0 72.986300
5 6028 4120 5397 7121.0 73.464277
6 6320 3499 6047 5259.0 77.762459
7 6100 3825 5536 7219.0 74.404301
8 5452 2865 6379 7044.0 79.868642
9 6626 4227 6535 7575.0 80.839347
10 6274 4242 6587 7268.0 81.160335
11 4864 2648 5895 6044.0 76.778903
12 5538 2983 5107 7127.0 71.463277

In [0]:
df.groupby("month")["Producto1"].count()


Out[0]:
month
1     31
2     28
3     31
4     30
5     31
6     30
7     31
8     31
9     30
10    31
11    30
12    31
Name: Producto1, dtype: int64

In [0]:
df2 = pd.DataFrame({"Person": ["John", "Myla", "Lewis", "John", "Myla", "Lewis", "John", "Myla"], "Age": [24, 55, 21, 24, 26, 43, 64, 55]})
df2.head(8)


Out[0]:
Person Age
0 John 24
1 Myla 55
2 Lewis 21
3 John 24
4 Myla 26
5 Lewis 43
6 John 64
7 Myla 55

In [0]:
# Agrupar por persona y aplicar "min" a "Age"
df2.groupby("Person").Age.agg("min")             
#df2.groupby("Person").Age.agg(["min"])


Out[0]:
Person
John     24
Lewis    21
Myla     26
Name: Age, dtype: int64

In [0]:
# Agrupar por persona y edad y aplicar "count" a "Age"
df2.groupby(["Person","Age"]).agg({"Age":"count"})


Out[0]:
Age
Person Age
John 24 2
64 1
Lewis 21 1
43 1
Myla 26 1
55 2

In [0]:
# frecuencia de las edades
df2['Age'].value_counts()
#df2["Age"].value_counts(Normlize=True)


Out[0]:
55    2
24    2
21    1
43    1
26    1
64    1
Name: Age, dtype: int64

2.8. Normalización de datos

En algunos algoritmos de Machine Learning (ML) es importante tener los datos normalizados. Para ellos la función scale se encarga de normalizar los datos quedando con una media cercana a 0 y una desviación estandar de 1


In [0]:
from sklearn import preprocessing

In [0]:
scaled=preprocessing.scale(df[['Producto4', 'Producto3sqrt']])

In [0]:
scaled


Out[0]:
array([[-2.62892112e-16, -1.39909791e+00],
       [-2.62892112e-16, -1.45074910e+00],
       [-2.62892112e-16, -1.45074910e+00],
       [-2.62892112e-16, -1.48519684e+00],
       [-2.62892112e-16, -1.14800841e+00],
       [-2.62892112e-16, -1.00102135e+00],
       [-2.62892112e-16, -1.27148566e+00],
       [-2.62892112e-16, -1.49073110e+00],
       [-2.62892112e-16, -1.41002203e+00],
       [-2.62892112e-16, -1.27384884e+00],
       [-2.62892112e-16, -9.11236397e-01],
       [-2.62892112e-16, -1.09895318e+00],
       [-2.62892112e-16, -1.09573053e+00],
       [-2.62892112e-16, -1.09093149e+00],
       [-2.62892112e-16, -1.09573053e+00],
       [-2.62892112e-16, -1.23336515e+00],
       [-2.62892112e-16, -1.45994772e+00],
       [-2.62892112e-16, -1.33588081e+00],
       [-2.62892112e-16, -1.04946799e+00],
       [-2.62892112e-16, -1.08934097e+00],
       [-2.62892112e-16, -1.15515737e+00],
       [-2.62892112e-16, -1.04503679e+00],
       [-2.62892112e-16, -1.12714948e+00],
       [-2.62892112e-16, -1.51514697e+00],
       [-2.62892112e-16, -1.42541846e+00],
       [-2.62892112e-16, -1.15696086e+00],
       [-2.62892112e-16, -1.02193287e+00],
       [-2.62892112e-16, -1.20044058e+00],
       [-2.62892112e-16, -1.19258087e+00],
       [-2.62892112e-16, -1.21453754e+00],
       [-2.62892112e-16, -1.45994772e+00],
       [-2.62892112e-16, -1.58881284e+00],
       [-2.62892112e-16, -1.09252657e+00],
       [-2.62892112e-16, -1.13400847e+00],
       [-2.62892112e-16, -1.13400847e+00],
       [-2.62892112e-16, -1.29082816e+00],
       [-2.62892112e-16, -1.05542776e+00],
       [-2.62892112e-16, -1.28835352e+00],
       [-2.62892112e-16, -1.27384884e+00],
       [-2.62892112e-16, -1.06753070e+00],
       [-2.62892112e-16, -9.68900164e-01],
       [-2.62892112e-16, -9.13649410e-01],
       [-2.62892112e-16, -1.00791599e+00],
       [-2.62892112e-16, -1.02051710e+00],
       [-2.62892112e-16, -1.25988529e+00],
       [-2.62892112e-16, -1.22489397e+00],
       [-2.62892112e-16, -9.29531393e-01],
       [-2.62892112e-16, -8.62272206e-01],
       [-2.62892112e-16, -8.36709143e-01],
       [-2.62892112e-16, -1.09412624e+00],
       [-2.62892112e-16, -1.11038443e+00],
       [-2.62892112e-16, -1.28835352e+00],
       [-2.62892112e-16, -1.31927494e+00],
       [-2.62892112e-16, -1.19258087e+00],
       [-2.62892112e-16, -1.16977551e+00],
       [-2.62892112e-16, -1.13228517e+00],
       [-2.62892112e-16, -9.02852353e-01],
       [-2.62892112e-16, -1.12037958e+00],
       [-2.62892112e-16, -1.47465634e+00],
       [-2.62892112e-16, -1.27148566e+00],
       [-2.62892112e-16, -1.24201286e+00],
       [-2.62892112e-16, -1.05692708e+00],
       [-2.62892112e-16, -1.12206389e+00],
       [-2.62892112e-16, -8.29087374e-01],
       [-2.62892112e-16, -1.05542776e+00],
       [-2.62892112e-16, -1.05393221e+00],
       [-2.62892112e-16, -9.96919586e-01],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -8.55524121e-01],
       [-2.62892112e-16, -9.30767642e-01],
       [-2.62892112e-16, -1.10545585e+00],
       [-2.62892112e-16, -1.08302360e+00],
       [-2.62892112e-16, -9.49573764e-01],
       [-2.62892112e-16, -7.79642619e-01],
       [-2.62892112e-16, -6.56519091e-01],
       [-2.62892112e-16, -3.37954614e-01],
       [-2.62892112e-16, -6.92069285e-01],
       [-2.62892112e-16, -7.49503055e-01],
       [-2.62892112e-16, -6.21334791e-01],
       [-2.62892112e-16, -7.60435439e-01],
       [-2.62892112e-16, -9.11236397e-01],
       [-2.62892112e-16, -1.01208863e+00],
       [-2.62892112e-16, -8.10866074e-01],
       [-2.62892112e-16, -9.08831258e-01],
       [-2.62892112e-16, -7.70492098e-01],
       [-2.62892112e-16, -8.66803296e-01],
       [-2.62892112e-16, -1.15515737e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -7.57440576e-01],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -1.64840977e+00],
       [-2.62892112e-16, -5.14787873e-02],
       [-2.62892112e-16, -4.37256934e-01],
       [-2.62892112e-16, -5.70488461e-02],
       [-2.62892112e-16,  5.19313536e-01],
       [-2.62892112e-16, -6.40534147e-01],
       [-2.62892112e-16,  2.05811692e-01],
       [-2.62892112e-16,  4.38759641e-01],
       [-2.62892112e-16,  5.59091594e-01],
       [-2.62892112e-16,  7.79388252e-01],
       [-2.62892112e-16, -3.46793064e-01],
       [-2.62892112e-16,  9.91404830e-01],
       [-2.62892112e-16,  4.49368479e-01],
       [-2.62892112e-16,  6.45491664e-01],
       [-2.62892112e-16,  9.89385851e-01],
       [-2.62892112e-16, -1.57365357e-02],
       [-2.62892112e-16, -5.92823362e-02],
       [-2.62892112e-16, -5.98411994e-02],
       [-2.62892112e-16,  9.86017448e-01],
       [-2.62892112e-16,  1.13643199e+00],
       [-2.62892112e-16,  3.87939970e-01],
       [-2.62892112e-16, -3.38632377e-01],
       [-2.62892112e-16,  4.41735543e-01],
       [-2.62892112e-16, -1.41057646e-02],
       [-2.62892112e-16, -6.84670022e-01],
       [-2.62892112e-16,  8.51821939e-01],
       [-2.62892112e-16,  9.73855369e-01],
       [-2.62892112e-16,  1.17412020e+00],
       [-2.62892112e-16,  4.34074630e-01],
       [-2.62892112e-16,  8.66340792e-01],
       [-2.62892112e-16, -6.18744434e-01],
       [-2.62892112e-16, -4.45348541e-01],
       [-2.62892112e-16,  7.73305987e-02],
       [-2.62892112e-16,  5.49012547e-01],
       [-2.62892112e-16,  2.25342887e-01],
       [-2.62892112e-16,  1.44747748e+00],
       [-2.62892112e-16,  9.79605587e-01],
       [-2.62892112e-16,  7.96517716e-01],
       [-2.62892112e-16,  7.97243968e-01],
       [-2.62892112e-16,  9.98794579e-01],
       [-2.62892112e-16,  9.95102287e-01],
       [-2.62892112e-16,  1.08942060e-01],
       [-2.62892112e-16,  1.92354230e-01],
       [-2.62892112e-16, -1.60275378e-01],
       [-2.62892112e-16, -1.71655925e-01],
       [-2.62892112e-16, -8.14014198e-03],
       [-2.62892112e-16,  5.51839334e-01],
       [-2.62892112e-16,  9.33245257e-01],
       [-2.62892112e-16,  7.57343625e-01],
       [-2.62892112e-16,  1.26971081e+00],
       [-2.62892112e-16,  1.09013262e+00],
       [-2.62892112e-16,  7.32485918e-01],
       [-2.62892112e-16, -8.23592567e-02],
       [-2.62892112e-16,  9.29459080e-01],
       [-2.62892112e-16, -1.21983455e-01],
       [-2.62892112e-16,  1.00950663e+00],
       [-2.62892112e-16,  1.27184004e+00],
       [-2.62892112e-16,  9.20833382e-01],
       [-2.62892112e-16,  7.93246909e-01],
       [-2.62892112e-16,  7.05480556e-01],
       [-2.62892112e-16,  8.58206426e-01],
       [-2.62892112e-16,  1.50769671e+00],
       [-2.62892112e-16,  1.62860887e+00],
       [-2.62892112e-16,  4.71683657e-01],
       [-2.62892112e-16,  7.75728069e-01],
       [-2.62892112e-16,  5.71126035e-01],
       [-2.62892112e-16,  4.71683657e-01],
       [-2.62892112e-16,  1.34095728e+00],
       [-2.62892112e-16,  1.44432090e+00],
       [-2.62892112e-16,  7.03216111e-01],
       [-2.62892112e-16,  1.19137011e+00],
       [-2.62892112e-16,  1.01151033e+00],
       [-2.62892112e-16,  6.59735240e-02],
       [-2.62892112e-16,  5.36856328e-01],
       [-2.62892112e-16, -9.43118431e-02],
       [-2.62892112e-16,  1.16971245e+00],
       [-2.62892112e-16,  6.79306440e-01],
       [-2.62892112e-16,  1.18636278e+00],
       [-2.62892112e-16,  6.86162761e-01],
       [-2.62892112e-16,  3.83574799e-01],
       [-2.62892112e-16,  7.76094336e-01],
       [-2.62892112e-16,  1.09854996e+00],
       [-2.43012323e-01,  8.51111545e-01],
       [ 1.13981691e+00,  9.78591757e-01],
       [ 2.88974338e+00,  1.54739773e+00],
       [ 2.71226488e+00,  1.45835736e+00],
       [-1.48202961e-01,  2.09638778e-01],
       [ 1.44794734e+00,  7.16019293e-01],
       [ 9.59447884e-01,  9.86354482e-01],
       [ 6.81378961e-01,  1.02316867e+00],
       [ 2.52206805e+00,  1.48709141e+00],
       [ 9.83728330e-01,  9.40458037e-01],
       [ 1.97864853e+00,  1.12236704e+00],
       [ 5.83679069e-01,  5.83095577e-01],
       [ 8.99324874e-01,  5.45777474e-01],
       [ 2.59433128e+00,  1.35872661e+00],
       [ 2.55502008e+00,  1.43598352e+00],
       [ 1.01436794e+00,  1.00147665e+00],
       [ 2.05669282e+00,  1.28216005e+00],
       [ 1.19242455e+00,  9.58913566e-01],
       [ 1.19011213e+00,  6.82356184e-01],
       [-2.49949594e-01,  9.06569771e-02],
       [ 1.42482311e+00,  1.11723478e+00],
       [ 2.68393769e+00,  1.45892893e+00],
       [ 1.42482311e+00,  1.08623896e+00],
       [ 2.67757853e+00,  1.38547814e+00],
       [ 1.53813186e+00,  1.02449782e+00],
       [ 1.90349477e+00,  7.91063934e-01],
       [-4.75988988e-01, -1.33076392e-01],
       [ 2.66948504e+00,  1.28730645e+00],
       [ 1.62311342e+00,  1.13100625e+00],
       [ 2.62728332e+00,  1.39074176e+00],
       [ 1.55085019e+00,  1.11434370e+00],
       [ 1.46066567e+00,  1.11595023e+00],
       [ 1.69826718e+00,  7.35467629e-01],
       [ 5.47836505e-01,  4.13075692e-01],
       [ 9.31120696e-01,  7.29873854e-01],
       [ 1.03055491e+00,  9.15990318e-01],
       [ 2.63075195e+00,  1.36315256e+00],
       [ 2.54056743e+00,  1.34807766e+00],
       [ 2.08212948e+00,  1.22926451e+00],
       [ 1.44621303e+00,  6.70133138e-01],
       [ 1.06350694e+00,  5.98560659e-01],
       [ 1.79596708e+00,  1.15391391e+00],
       [ 1.77515526e+00,  1.21875411e+00],
       [ 2.50010002e+00,  1.39949425e+00],
       [ 1.34446639e+00,  9.78929744e-01],
       [ 6.79644643e-01,  7.22769461e-01],
       [ 1.29821792e+00,  7.01705269e-01],
       [ 8.31686487e-01,  5.19723120e-01],
       [ 1.70982930e+00,  1.20135838e+00],
       [ 2.58276916e+00,  1.53263770e+00],
       [ 2.11912826e+00,  1.36462643e+00],
       [ 2.11739394e+00,  1.38196398e+00],
       [ 1.78324875e+00,  1.23542920e+00],
       [-6.54045596e-01, -1.69853173e-01],
       [ 2.81907806e-01,  3.08784788e-01],
       [ 1.94511839e+00,  1.32158721e+00],
       [ 2.52206805e+00,  1.55128523e+00],
       [ 2.58739401e+00,  1.48170613e+00],
       [ 2.47871011e+00,  1.55045259e+00],
       [ 1.88499538e+00,  1.42733487e+00],
       [ 9.29964485e-01,  6.82356184e-01],
       [ 8.43826710e-01,  5.79112876e-01],
       [ 1.03980460e+00,  5.11927746e-01],
       [ 2.42032141e+00,  1.71736638e+00],
       [ 2.37580726e+00,  1.75827323e+00],
       [ 2.27984169e+00,  1.77180012e+00],
       [ 2.00466329e+00,  1.58716047e+00],
       [ 1.51963247e+00,  9.74193966e-01],
       [ 7.99312558e-01,  5.72325893e-01],
       [ 9.75056742e-01,  1.34718854e+00],
       [ 1.04211702e+00,  1.60440383e+00],
       [ 9.71010001e-01,  1.65532524e+00],
       [ 8.14343311e-01,  1.65613145e+00],
       [-2.35496947e-01,  9.39771972e-01],
       [-1.52386109e-02,  5.31974864e-01],
       [ 1.65572119e-02,  5.74324216e-01],
       [ 5.91194445e-01,  1.57643980e+00],
       [-3.77710991e-01,  8.80776301e-01],
       [-3.07760180e-01,  1.02682223e+00],
       [ 3.50702404e-01,  1.60003323e+00],
       [ 7.66802223e-02,  1.33679588e+00],
       [-1.69729285e-02,  6.10384826e-01],
       [-1.11017113e+00, -2.92661366e-01],
       [-6.71388772e-01,  5.86276626e-01],
       [-7.13590500e-01,  6.12349508e-01],
       [-4.49396118e-01,  9.77915653e-01],
       [-5.71376457e-01,  8.54661499e-01],
       [-3.87538790e-01,  9.27046797e-01],
       [-1.08184394e+00, -9.31695438e-02],
       [-8.44242427e-01,  4.77487345e-02],
       [-4.64426871e-01,  9.49702189e-01],
       [-2.11216500e-01,  1.21286384e+00],
       [-9.20552401e-01,  5.91436197e-01],
       [-3.52274332e-01,  1.06505118e+00],
       [-1.10612439e+00,  8.19551904e-02],
       [-9.09568390e-01, -4.75912778e-02],
       [-1.01247123e+00, -1.46023167e-01],
       [-9.55238753e-01, -2.33688494e-01],
       [-9.86456470e-01,  3.33132305e-01],
       [-6.95669218e-01,  7.47357366e-01],
       [-7.31511782e-01,  7.65817857e-01],
       [-7.73713511e-01,  6.15097198e-01],
       [-9.58129283e-01,  7.68159899e-02],
       [-9.07834072e-01, -1.79134343e-02],
       [-6.32077573e-01,  8.26478084e-01],
       [-6.95091113e-01,  8.50756273e-01],
       [-6.55779913e-01,  8.73744911e-01],
       [-1.12346756e+00,  1.71981511e-01],
       [-9.39051789e-01,  4.90032566e-01],
       [-1.32407030e+00, -5.04365920e-01],
       [-1.00784639e+00, -9.77437897e-02],
       [-8.00884487e-01,  7.30247181e-01],
       [-8.45398638e-01,  7.23143907e-01],
       [-8.67944767e-01,  6.38125106e-01],
       [-7.78338358e-01,  7.13764950e-01],
       [-9.35583154e-01,  4.45979497e-01],
       [-1.31077386e+00, -5.64957818e-01],
       [-9.92815635e-01, -1.49573515e-01],
       [-7.91056687e-01,  6.62076623e-01],
       [-1.02808009e+00,  3.48754570e-01],
       [-8.84709838e-01,  5.38481061e-01],
       [-9.65644659e-01,  4.45555489e-01],
       [-9.89925106e-01,  3.80075900e-01],
       [-1.17029414e+00, -2.39348660e-01],
       [-8.74882038e-01,  8.02054019e-03],
       [-7.14168606e-01,  7.32112941e-01],
       [-7.37870947e-01,  8.19651785e-01],
       [-8.10134180e-01,  6.41229703e-01],
       [-8.48867274e-01,  6.32292595e-01],
       [-9.08412178e-01,  4.87539724e-01],
       [-1.30383659e+00, -5.86480016e-01],
       [-1.25585381e+00, -3.39988957e-01],
       [-1.48940858e+00,  4.86708129e-01],
       [-1.48940858e+00,  5.52646321e-01],
       [-1.48940858e+00,  5.17674426e-01],
       [-1.48940858e+00,  5.08225365e-01],
       [-1.48940858e+00, -2.00932432e-02],
       [-1.48940858e+00, -1.20239300e-01],
       [-1.48940858e+00, -3.01861898e-01],
       [-1.48940858e+00,  3.95339363e-01],
       [-1.48940858e+00,  4.89617294e-01],
       [-1.48940858e+00,  3.20545250e-01],
       [-1.48940858e+00,  4.14797902e-01],
       [-1.48940858e+00, -5.59332757e-02],
       [-1.48940858e+00, -3.57754242e-01],
       [-1.48940858e+00, -4.91246608e-01],
       [-1.48940858e+00, -2.03875464e-01],
       [-1.48940858e+00, -3.10363546e-02],
       [-1.48940858e+00,  1.72469225e-01],
       [-1.48940858e+00, -3.69503425e-01],
       [-1.48940858e+00, -3.15854544e-02],
       [-1.48940858e+00, -4.97401774e-01],
       [-1.48940858e+00, -5.50304909e-01],
       [-1.48940858e+00, -2.90044089e-01],
       [-1.48940858e+00, -4.51267697e-01],
       [-1.48940858e+00, -9.50845532e-01],
       [-1.48940858e+00, -8.45508326e-01],
       [-1.48940858e+00, -8.29087374e-01],
       [-1.48940858e+00, -1.03772291e+00],
       [-1.48940858e+00, -1.20044058e+00],
       [-1.48940858e+00, -7.71504107e-01],
       [-1.48940858e+00, -8.10866074e-01],
       [-1.48940858e+00, -8.60016427e-01],
       [-1.48940858e+00, -9.13649410e-01],
       [-1.48940858e+00, -8.34524212e-01],
       [-1.48940858e+00, -1.11203736e+00],
       [-1.48940858e+00, -1.17725463e+00],
       [-1.48940858e+00, -8.23686377e-01],
       [-1.48940858e+00, -8.56644808e-01],
       [-1.48940858e+00, -1.04651023e+00],
       [-1.48940858e+00, -1.16977551e+00],
       [-1.48940858e+00, -1.39556139e+00],
       [-1.48940858e+00, -1.32471556e+00],
       [-1.48940858e+00, -1.34452384e+00],
       [-1.48940858e+00, -1.22910817e+00],
       [-1.48940858e+00, -1.19649364e+00],
       [-1.48940858e+00, -1.19649364e+00],
       [-1.48940858e+00, -1.20242715e+00]])

In [0]:
scaled.mean(axis=0)


Out[0]:
array([-3.60367507e-16,  1.94669243e-16])

In [0]:
scaled.std(axis=0)


Out[0]:
array([1., 1.])

2.9. Bineado de datos

La función cut nos permite separar los datos en bloques (bins)


In [0]:
df.Producto1[:10]


Out[0]:
Fecha
2009-01-01     29
2009-02-01     19
2009-03-01     24
2009-04-01     24
2009-05-01    120
2009-06-01    261
2009-07-01     60
2009-08-01     24
2009-09-01     35
2009-10-01     81
Name: Producto1, dtype: int64

Se puede seleccionar el número de bins deseado y el programa obtiene la distribución óptima de los mismos


In [0]:
pd.cut(df.Producto1[:10], bins=3)


Out[0]:
Fecha
2009-01-01     (18.758, 99.667]
2009-02-01     (18.758, 99.667]
2009-03-01     (18.758, 99.667]
2009-04-01     (18.758, 99.667]
2009-05-01    (99.667, 180.333]
2009-06-01     (180.333, 261.0]
2009-07-01     (18.758, 99.667]
2009-08-01     (18.758, 99.667]
2009-09-01     (18.758, 99.667]
2009-10-01     (18.758, 99.667]
Name: Producto1, dtype: category
Categories (3, interval[float64]): [(18.758, 99.667] < (99.667, 180.333] < (180.333, 261.0]]

Se puede seleccionar los intervalos de los bins deseados


In [0]:
pd.cut(df.Producto1[:10],bins=[0,100,200,300])


Out[0]:
Fecha
2009-01-01      (0, 100]
2009-02-01      (0, 100]
2009-03-01      (0, 100]
2009-04-01      (0, 100]
2009-05-01    (100, 200]
2009-06-01    (200, 300]
2009-07-01      (0, 100]
2009-08-01      (0, 100]
2009-09-01      (0, 100]
2009-10-01      (0, 100]
Name: Producto1, dtype: category
Categories (3, interval[int64]): [(0, 100] < (100, 200] < (200, 300]]

Se pueden poner etiquetas sobre los bins


In [0]:
pd.cut(df.Producto1[:10],bins=3, labels=['bajo','medio','alto'])


Out[0]:
Fecha
2009-01-01     bajo
2009-02-01     bajo
2009-03-01     bajo
2009-04-01     bajo
2009-05-01    medio
2009-06-01     alto
2009-07-01     bajo
2009-08-01     bajo
2009-09-01     bajo
2009-10-01     bajo
Name: Producto1, dtype: category
Categories (3, object): [bajo < medio < alto]

2.10. Concatenación y combinación de dataframes

La concatenación se realiza mediante la función concat() y la combinación mediante la función merge()


In [0]:
raw_data_1 = {
        'subject_id': ['1', '2', '3', '4', '5'],
        'first_name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'], 
        'last_name': ['Anderson', 'Ackerman', 'Ali', 'Aoni', 'Atiches']}

raw_data_2 = {
        'subject_id': ['4', '5', '6', '7', '8'],
        'first_name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 
        'last_name': ['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']}

raw_data_3 = {
        'subject_id': ['1', '2', '3', '4', '5', '7', '8', '9', '10', '11'],
        'test_id': [51, 15, 15, 61, 16, 14, 15, 1, 61, 16]}

data1 = pd.DataFrame(raw_data_1, columns = ['subject_id', 'first_name', 'last_name'])
data2 = pd.DataFrame(raw_data_2, columns = ['subject_id', 'first_name', 'last_name'])
data3 = pd.DataFrame(raw_data_3, columns = ['subject_id','test_id'])

In [0]:
# Concatenar por filas
all_data = pd.concat([data1, data2])
all_data


Out[0]:
subject_id first_name last_name
0 1 Alex Anderson
1 2 Amy Ackerman
2 3 Allen Ali
3 4 Alice Aoni
4 5 Ayoung Atiches
0 4 Billy Bonder
1 5 Brian Black
2 6 Bran Balwner
3 7 Bryce Brice
4 8 Betty Btisan

In [0]:
# Concatenar por columnas
all_data_col = pd.concat([data1, data2], axis = 1)
all_data_col


Out[0]:
subject_id first_name last_name subject_id first_name last_name
0 1 Alex Anderson 4 Billy Bonder
1 2 Amy Ackerman 5 Brian Black
2 3 Allen Ali 6 Bran Balwner
3 4 Alice Aoni 7 Bryce Brice
4 5 Ayoung Atiches 8 Betty Btisan

In [0]:
# Combinar all_data y data3 a lo largo del valor de subject_id
pd.merge(all_data, data3, on='subject_id')


Out[0]:
subject_id first_name last_name test_id
0 1 Alex Anderson 51
1 2 Amy Ackerman 15
2 3 Allen Ali 15
3 4 Alice Aoni 61
4 4 Billy Bonder 61
5 5 Ayoung Atiches 16
6 5 Brian Black 16
7 7 Bryce Brice 14
8 8 Betty Btisan 15

In [0]:
# Combinar solo los datos que tienen el mismo 'subject_id' en data1 y data2 (interseccion)
pd.merge(data1, data2, on='subject_id', how='inner')


Out[0]:
subject_id first_name_x last_name_x first_name_y last_name_y
0 4 Alice Aoni Billy Bonder
1 5 Ayoung Atiches Brian Black

In [0]:
# Combinar solo los datos que tienen el mismo 'subject_id' en data1 y data2 (union)
pd.merge(data1, data2, on='subject_id', how='outer')


Out[0]:
subject_id first_name_x last_name_x first_name_y last_name_y
0 1 Alex Anderson NaN NaN
1 2 Amy Ackerman NaN NaN
2 3 Allen Ali NaN NaN
3 4 Alice Aoni Billy Bonder
4 5 Ayoung Atiches Brian Black
5 6 NaN NaN Bran Balwner
6 7 NaN NaN Bryce Brice
7 8 NaN NaN Betty Btisan

3. Taller Pandas

Ejercicio 1

Cargue el dataset provisto en la dirección 'https://pynative.com/wp-content/uploads/2019/01/company_sales_data.csv' grafique la ganancia total (total_profit) para todos los meses. La gráfica debe tener las siguientes propiedades:

  • El estilo de línea punteado y de color rojo
  • Mostrar la legenda (legend) en la parte inferior derecha
  • X label name = Month Number
  • Y label name = Profits in dollars
  • Título : Company sales data of last year
  • Los markers deben ser circulares y de color negro
  • El grosor de la línea debe ser 3

Solución esperada:

Para ver la solución haga double-click aquí. <!--

import pandas as pd import matplotlib.pyplot as plt
df = pd.read_csv('https://pynative.com/wp-content/uploads/2019/01/company_sales_data.csv') profitList = df ['total_profit'].tolist() monthList = df ['month_number'].tolist() plt.plot(monthList, profitList, label = 'Profit data of last year', color='r', marker='o', markerfacecolor='k', linestyle='--', linewidth=3)

plt.xlabel('Month Number') plt.ylabel('Profit in dollar') plt.legend(loc='lower right') plt.title('Company Sales data of last year') plt.xticks(monthList) plt.yticks([100000, 200000, 300000, 400000, 500000]) plt.show() -->

Ejercicio 2

Dataset: https://raw.githubusercontent.com/justmarkham/DAT8/master/data/u.user

  1. Importar el dataset, asignarlo a una variable llamada users y usar el user_id como índice.
  2. ¿Cuál es el número de observaciones y columnas en el dataset?
  3. Mostrar el nombre de las columnas y el tipo de dato que contiene.
  4. Mostrar la indexación del dataset.
  5. ¿Cuántas ocupaciones diferentes hay en este conjunto de datos?
  6. ¿Cuál es la ocupación más frecuente?
  7. ¿Cuál es la edad media de los usuarios?
  8. ¿Cuál es la edad con menos ocurrencia?

Para ver la solución haga double-click aquí. <!--

  1. import pandas as pd

users = pd.read_csv('https://raw.githubusercontent.com/justmarkham/DAT8/master/data/u.user', delimiter='|', index_col='user_id') users.head()

2. print("Número de observaciones:",users.shape[0]) print("Número de columnas: ",users.shape[1])

3. print("Columnas: ",users.columns) print("Tipo de datos: \n",users.dtypes)

4. print("Indexación: ",users.index)

5. print("Número de ocupaciones diferentes:",users.occupation.nunique())

6. print("Ocupaciones más frecuentes:\n",users.occupation.value_counts().head())

7. print("Edad media de los usuarios:",round(users.age.mean()))

8. print("Edades de menos ocurrencia:\n",users.age.value_counts().tail(10))

-->

Ejercicio 3

Diccionario dado:

raw_data = {'regiment': ['Nighthawks', 'Nighthawks', 'Nighthawks', 'Nighthawks', 'Dragoons', 'Dragoons', 'Dragoons', 'Dragoons', 'Scouts', 'Scouts', 'Scouts', 'Scouts'], 'company': ['1st', '1st', '2nd', '2nd', '1st', '1st', '2nd', '2nd','1st', '1st', '2nd', '2nd'], 'deaths': [523, 52, 25, 616, 43, 234, 523, 62, 62, 73, 37, 35], 'battles': [5, 42, 2, 2, 4, 7, 8, 3, 4, 7, 8, 9], 'size': [1045, 957, 1099, 1400, 1592, 1006, 987, 849, 973, 1005, 1099, 1523], 'veterans': [1, 5, 62, 26, 73, 37, 949, 48, 48, 435, 63, 345], 'readiness': [1, 2, 3, 3, 2, 1, 2, 3, 2, 1, 2, 3], 'armored': [1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1], 'deserters': [4, 24, 31, 2, 3, 4, 24, 31, 2, 3, 2, 3], 'origin': ['Arizona', 'California', 'Texas', 'Florida', 'Maine', 'Iowa', 'Alaska', 'Washington', 'Oregon', 'Wyoming', 'Louisana', 'Georgia']}

  1. Crea un DataFrame llamado army a partir del diccionario dado

(No olvide incluir los nombres de las columnas en el orden presentado en el diccionario ('regimen', 'company', ...) para que el orden del índice de la columna sea coherente con las soluciones. Si se omite, Pandas ordenará las columnas alfabéticamente.

  1. Establezca la columna 'origin' como índice del dataset.
  2. Imprima las columnas 'veterans' y 'deaths'
  3. Seleccione las columnas 'deaths', 'size' y 'deserters' de Maine a Alaska.
  4. Seleccione la tercera columna hasta la séptima columna.
  5. Seleccione las filas donde deaths sea mayor que 50.
  6. Seleccione las filas donde deaths sea mayor que 500 o menor que 50.
  7. Selecciona todos los regiments no nombrados Dragoons.
  8. Seleccione la tercera celda en la fila llamada Arizona
  9. Seleccione la tercera celda en la columna llamada deaths

Para ver la solución haga double-click aquí. <!-- 1. raw_data = {'regiment': ['Nighthawks', 'Nighthawks', 'Nighthawks', 'Nighthawks', 'Dragoons', 'Dragoons', 'Dragoons', 'Dragoons', 'Scouts', 'Scouts', 'Scouts', 'Scouts'], 'company': ['1st', '1st', '2nd', '2nd', '1st', '1st', '2nd', '2nd','1st', '1st', '2nd', '2nd'], 'deaths': [523, 52, 25, 616, 43, 234, 523, 62, 62, 73, 37, 35], 'battles': [5, 42, 2, 2, 4, 7, 8, 3, 4, 7, 8, 9], 'size': [1045, 957, 1099, 1400, 1592, 1006, 987, 849, 973, 1005, 1099, 1523], 'veterans': [1, 5, 62, 26, 73, 37, 949, 48, 48, 435, 63, 345], 'readiness': [1, 2, 3, 3, 2, 1, 2, 3, 2, 1, 2, 3], 'armored': [1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1], 'deserters': [4, 24, 31, 2, 3, 4, 24, 31, 2, 3, 2, 3], 'origin': ['Arizona', 'California', 'Texas', 'Florida', 'Maine', 'Iowa', 'Alaska', 'Washington', 'Oregon', 'Wyoming', 'Louisana', 'Georgia']}

army = pd.DataFrame(raw_data, columns = ['regiment', 'company', 'deaths', 'battles', 'size', 'veterans', 'readiness', 'armored', 'deserters', 'origin'])

army.head()

2. army = army.set_index("origin") army.head()

  1. army[['veterans', 'deaths']]

4. army.loc[['Maine','Alaska'] , ["deaths","size","deserters"]]

5. army.iloc[: , 4:7]

6. army[army['deaths'] > 50]

  1. army[(army['deaths'] > 500) | (army['deaths'] < 50)]

8. army[(army['regiment'] != 'Dragoons')]

9. army.loc[['Arizona'], ['deaths']]

O

army.iloc[[0]

10. army.loc['Texas', 'deaths']

O

army.iloc[[2]

-->

Ejercicio 4

Dataset: https://raw.githubusercontent.com/justmarkham/DAT8/master/data/u.user

  1. Importar el dataset, asignarlo a una variable llamada users y usar el user_id como índice.
  2. ¿Cuál es la edad media por ocupación?
  3. Descubra la proporción de hombres por ocupación y clasifíquela de mayor a menor (cree una columna).
  4. Para cada ocupación calcule las edades mínimas y máximas.
  5. Para cada combinación de ocupación y género calcule la edad media.
  6. Para cada ocupación muestre el porcentaje de mujeres y hombres.

Para ver la solución haga double-click aquí. <!--

  1. import pandas as pd

users = pd.read_csv('https://raw.githubusercontent.com/justmarkham/DAT8/master/data/u.user', delimiter='|', index_col='user_id') users.head()

2. users.groupby('occupation').age.mean()

3.

funcion que mapea el genero a un numero

def gender_to_numeric(x): if x == 'M': return 1 if x == 'F': return 0

aplica la funcion a la columna genero y saca el porcentaje de hombres por ocupacion

users['gender_n'] = users['gender'].apply(gender_to_numeric)

se

a = users.groupby('occupation').gender_n.sum() / users.occupation.value_counts() * 100

ordenamiento de mayor a menor

a.sort_values(ascending = False)

4. users.groupby('occupation').age.agg(['min', 'max'])

5. users.groupby(['occupation', 'gender']).age.mean()

6.

crea un dataframe y aplica "count" al genero

gender_ocup = users.groupby(['occupation', 'gender']).agg({'gender': 'count'})

crea un dataframe y aplica "count" para cada ocupacion

occup_count = users.groupby(['occupation']).agg('count')

divida gender_ocup por occup_count y multiplique por 100

occup_gender = gender_ocup.div(occup_count, level = "occupation") * 100

mostrar todas las filas de la columna genero

occup_gender.loc[: , 'gender']

-->