El presente diplomado hace parte del centro de Big Data de la facultad de ciencias exactas y naturales (FCEN) de la Universidad de Antioquia.
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)
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
-->
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
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)
-->
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
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")
-->
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
-->
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
-->
Defina una clase llamada Hotel que contenga los atributos nombre, ubicación, puntaje obtenido por votación, y precio. Se tienen las siguientes restricciones:
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."
-->
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]:
In [0]:
df.columns
Out[0]:
In [0]:
df.shape
Out[0]:
In [0]:
df.describe()
Out[0]:
In [0]:
df["Producto4"].unique()
Out[0]:
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]:
In [0]:
pd.to_datetime(df.Fecha, format='%d/%m/%Y').head()
Out[0]:
In [0]:
df.Fecha=pd.to_datetime(df.Fecha)
df.set_index('Fecha', inplace=True)
df.head()
Out[0]:
In [0]:
df.isna().head()
Out[0]:
Es lo mismo que df.isnull, ver: https://datascience.stackexchange.com/questions/37878/difference-between-isna-and-isnull-in-pandas
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]:
In [0]:
# Cambiando los datos
df.Producto4.fillna(df.Producto4.mean(),inplace=True) #Importante inplace
In [0]:
df.iloc[100:110]
Out[0]:
Indexación para un subconjunto de columnas
In [0]:
df[['Producto1','Producto4']].iloc[100:110]
Out[0]:
In [0]:
df.iloc[:,1:3]
Out[0]:
In [0]:
df.loc["2009-10-01":"2009-10-10"]
Out[0]:
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]:
In [0]:
df.sort_values(by="Producto1").head()
Out[0]:
In [0]:
df.Producto1.plot(figsize=(15,3))
Out[0]:
In [0]:
df.plot(figsize=(15,3))
Out[0]:
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]:
In [0]:
df.hist(column='Producto1')
Out[0]:
In [0]:
df['Producto3sqrt']=df.Producto3.apply(np.sqrt)
In [0]:
df.tail()
Out[0]:
In [0]:
df.apply(np.sum, axis=0)
Out[0]:
In [0]:
df.apply(np.sum, axis=0).plot(kind='pie')
Out[0]:
In [0]:
df["month"] = [i.month for i in df.index]
df.head()
Out[0]:
In [0]:
df.groupby("month").max()
Out[0]:
In [0]:
df.groupby("month")["Producto1"].count()
Out[0]:
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]:
In [0]:
# Agrupar por persona y aplicar "min" a "Age"
df2.groupby("Person").Age.agg("min")
#df2.groupby("Person").Age.agg(["min"])
Out[0]:
In [0]:
# Agrupar por persona y edad y aplicar "count" a "Age"
df2.groupby(["Person","Age"]).agg({"Age":"count"})
Out[0]:
In [0]:
# frecuencia de las edades
df2['Age'].value_counts()
#df2["Age"].value_counts(Normlize=True)
Out[0]:
In [0]:
from sklearn import preprocessing
In [0]:
scaled=preprocessing.scale(df[['Producto4', 'Producto3sqrt']])
In [0]:
scaled
Out[0]:
In [0]:
scaled.mean(axis=0)
Out[0]:
In [0]:
scaled.std(axis=0)
Out[0]:
In [0]:
df.Producto1[:10]
Out[0]:
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]:
Se puede seleccionar los intervalos de los bins deseados
In [0]:
pd.cut(df.Producto1[:10],bins=[0,100,200,300])
Out[0]:
Se pueden poner etiquetas sobre los bins
In [0]:
pd.cut(df.Producto1[:10],bins=3, labels=['bajo','medio','alto'])
Out[0]:
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]:
In [0]:
# Concatenar por columnas
all_data_col = pd.concat([data1, data2], axis = 1)
all_data_col
Out[0]:
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]:
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]:
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]:
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:
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() -->
Dataset: https://raw.githubusercontent.com/justmarkham/DAT8/master/data/u.user
Para ver la solución haga double-click aquí. <!--
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))
-->
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']}
(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.
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()
4. army.loc[['Maine','Alaska'] , ["deaths","size","deserters"]]
5. army.iloc[: , 4:7]
6. army[army['deaths'] > 50]
8. army[(army['regiment'] != 'Dragoons')]
9. army.loc[['Arizona'], ['deaths']]
10. army.loc['Texas', 'deaths']
-->
Dataset: https://raw.githubusercontent.com/justmarkham/DAT8/master/data/u.user
Para ver la solución haga double-click aquí. <!--
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.
def gender_to_numeric(x): if x == 'M': return 1 if x == 'F': return 0
users['gender_n'] = users['gender'].apply(gender_to_numeric)
a = users.groupby('occupation').gender_n.sum() / users.occupation.value_counts() * 100
a.sort_values(ascending = False)
4. users.groupby('occupation').age.agg(['min', 'max'])
5. users.groupby(['occupation', 'gender']).age.mean()
6.
gender_ocup = users.groupby(['occupation', 'gender']).agg({'gender': 'count'})
occup_count = users.groupby(['occupation']).agg('count')
occup_gender = gender_ocup.div(occup_count, level = "occupation") * 100
occup_gender.loc[: , 'gender']
-->