#1
import pandas as pd
import numpy as np
bc = pd.read_csv('C:/Users/Rodrigo/Desktop/TEC/Concentracion/BankChurners.csv')

#Calcule la dimensi´on de la Tabla de Datos.
bc.shape
#Calcule el resumen num´erico de la tabla.
## (810, 16)
bc.describe(include = np.number)
#Calcule la suma de las columnas con variables cuantitativas (num´ericas).
##                  ID  Customer_Age  ...  Total_Trans_Amt  Total_Trans_Ct
## count  8.100000e+02    810.000000  ...       810.000000      810.000000
## mean   7.382476e+08     46.372840  ...      4345.117284       64.301235
## std    3.643023e+07      7.895126  ...      3430.280147       23.498271
## min    7.081132e+08     26.000000  ...       530.000000       10.000000
## 25%    7.130855e+08     41.000000  ...      2120.500000       44.000000
## 50%    7.177080e+08     46.000000  ...      3822.500000       67.000000
## 75%    7.726768e+08     52.000000  ...      4656.000000       80.000000
## max    8.279684e+08     67.000000  ...     17995.000000      128.000000
## 
## [8 rows x 11 columns]
numericas = numericas = bc.select_dtypes(['int64','float64']).columns
suma = bc[numericas].sum()
suma
#Calcule la moda de las columnas con variables cualitativas (categ´oricas).
## ID                          5.979805e+11
## Customer_Age                3.756200e+04
## Dependent_count             1.850000e+03
## Months_on_book              2.904000e+04
## Total_Relationship_Count    3.073000e+03
## Months_Inactive_12_mon      1.885000e+03
## Contacts_Count_12_mon       1.970000e+03
## Credit_Limit                6.579856e+06
## Total_Revolving_Bal         9.373900e+05
## Total_Trans_Amt             3.519545e+06
## Total_Trans_Ct              5.208400e+04
## dtype: float64
categoricas = bc.select_dtypes(['object']).columns
moda = bc[categoricas].mode()
moda
##       Attrition_Flag Gender Education_Level Marital_Status Income_Category
## 0  Existing Customer      F        Graduate        Married  Less than $40K
#2. Usando for(...) en Python muestre los n´umeros del 1 al 200 m´ultiplos de 17, debe mostrarlos en orden inverso, es decir, de mayor a menor.

for valor in range(200,0,-1):
  if valor % 17 == 0:
    print(valor)
## 187
## 170
## 153
## 136
## 119
## 102
## 85
## 68
## 51
## 34
## 17
#3. Mediante un ciclo, calcule la productoria de los n´umeros enteros terminados en 9, comprendidosentre el 1 y el 100.
flag = 1
for valor in range(1,100):
  if valor % 10 == 9:
    flag = valor * flag
    print(flag)
## 9
## 171
## 4959
## 193401
## 9476649
## 559122291
## 38579438079
## 3047775608241
## 271252029133449
## 26853950884211451
#Mediante un ciclo, guarde en una lista todos los n´umeros pares desde 30 hasta el 50, incluyendo los extremos.

flag = []

for valor in range(30,51):
  if valor % 2 == 0:
    flag.append(valor)
    print(flag)
## [30]
## [30, 32]
## [30, 32, 34]
## [30, 32, 34, 36]
## [30, 32, 34, 36, 38]
## [30, 32, 34, 36, 38, 40]
## [30, 32, 34, 36, 38, 40, 42]
## [30, 32, 34, 36, 38, 40, 42, 44]
## [30, 32, 34, 36, 38, 40, 42, 44, 46]
## [30, 32, 34, 36, 38, 40, 42, 44, 46, 48]
## [30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50]
#5. Programe una funci´on que recibe tres objetos A, B, y C, si el tipo de dichos objetos es str retorna una lista con el tama˜no de cada uno. En caso de que alguno de los tres objetos no seastr retorna None, use isinstance para determinar si el objeto es de tipo str

def tamano(A, B, C):
    largo = []
    for obj in [A, B, C]:
        if isinstance(obj, str):
            largo.append(len(obj))
        else:
            return None
    return largo

A = "tonto"
B = "cel"
C = "gai"

largo = tamano(A,B,C)
print(largo)
## [5, 3, 3]
#6 Programe una funci´on que reciba un n´umero y retorne True en caso de ser un n´umero primo,de lo contrario retorna False. La definici´on de ✭✭n´umero primo✮✮ dice que ✭✭Un n´umero enteromayor que 1 se denomina n´umero primo si y s´olo si tiene como divisores positivos (factores)´unicamente a s´ı mismo y a la unidad 1✮✮. Por ejemplo, son n´umeros primos: 2, 3, 5, 7, 11, 13, 17.

def primo(num):
    if num <= 1:
        return False
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            return False
    return True
ejemplo= 13
primo(ejemplo)
## True
#7.
def primo(num):
    if num == 1:
        return False
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            return False
    return True
  
def minprim(lista):
    minimo = None
    for valor in lista:
        if primo(valor):
            if minimo is None or valor < minimo:
                minimo = valor
    return minimo

ejemplo = [12,45,234,54,54,12,13,2,1,13,35]
minprim(ejemplo)
## 2
#8 Programe una funci´on que reciba un objeto C tipo str (cadena de caracteres) y retorne la primera letra de cada palabra que posee la cadena de caracteres C. Por ejemplo: “Hola Mundo Estoy Programando” → “HMEP”.

def plet(c):
    lista = []
    palabras = c.split()  
    for letras in palabras:
        lista.append(letras[0]) 
    return lista

oracion = "Estoy probando esta funcion"
plet(oracion)
## ['E', 'p', 'e', 'f']
#9. Programe una funci´on que reciba un objeto C tipo str (cadena de caracteres) y retorne solamente las letras consonantes. Por ejemplo: “algoritmos” → “lgrtms”.

def consonante(x):
    lista_vocales = ['A','a','E','e','I','i','O','o','U','u']
    consonantes = []
    for letra in x:
        if letra not in lista_vocales:
            consonantes.append(letra)
    return consonantes

palabra = "tonto"
consonante(palabra)
## ['t', 'n', 't']
#10. Desarrolle una funci´on en Python que recibe dos n´umero enteros y retorne True si alguno de ellos es m´ultiplo del otro

def numeros (x,y):
    n1 = x
    n2 = y
    resp = None
    if n1 % n2 == 0 or n2 % n1 == 0:
        resp = True
    else:
        resp = False
    return resp
  
numeros(5,10)
## True
#11. Programe en Python una funci´on que recibe tres valores A, B, y C y retorna el del medio.

def media(a,b,c):
  lista = [a,b,c]
  return lista[1]

media(2,5,7)
## 5
#12. Programe en Python una funci´on que recibe un n´umero n y retorna la sumatoria de los n´umeros enteros comprendidos entre el 1 y el n.

def sumatoria(num):
  suma = 0
  for flag in range(1, num+1):
    suma = suma + flag
  return suma

sumatoria(10)
## 55
#13. Programe una funci´on en Python que recibe un n´umero n y realice la sumatoria de los n´umerosenteros m´ultiplos de 7, comprendidos entre el 1 y el n.

def sumatoria(num):
  suma = 0
  for flag in range(1, num+1):
    if flag % 7 == 0:
      suma = suma + flag
  return suma

sumatoria(15)
## 21
#14. Programe en Python una funci´on que genera 100 n´umeros al azar entre 1 y 400. Luego de esos 100 n´umeros la funci´on calcula y retorna qu´e porcentaje son impares.

def porcen():
    numeros = np.random.randint(1, 400, size=100)
    impares = np.count_nonzero(numeros % 2 == 1)
    return ((impares / 100) * 100)

print(porcen())
## 56.99999999999999
#15. Programe en Python una funci´on que genera 50 n´umeros al azar entre 1 y 300 y luego calculacu´antos est´an entre el 50 y 150, ambos inclusive.

import random
def cincuenta():
    num = [random.randint(1, 300) for _ in range(50)] 
    d=len([x for x in num if x>=50 and x<=150])
    print(d)
    
cincuenta()
## 22
#16. 
def costo(t):
  if t < 1:
    cost = 0.5
  elif t > 1:
    cost = 0.5 + (t - 1)/4
  return cost

costo(7)
## 2.0
#17. Desarrolle una funci´on en Python que reciba un vector de n´umeros reales y un n´umero real x, tal que retorne el porcentaje de elementos menores o iguales a un valor x.

def menores_x(vector, x):
    resp = (sum(1 for elemento in vector if elemento <= x) / len(vector)) * 100
    return resp
  
porc = menores_x([2,4,6,8,1.2,3.4,7], 5)
print (porc)
## 57.14285714285714
#18

def persona(p):
    precio = 10
    if p > 4:
        print("No se pueden comprar mas de 4 boletos")
    elif p == 2:
        precio = (precio * 0.85)*2
        print("El precio final es:", precio)
    elif p == 3:
        precio= (precio * 0.80)*3
        print("El precio final es:", precio)
    elif p == 4:
        precio = (precio * 0.75)*4
        print("El precio final es:", precio)
    elif p == 1:
        print("El precio final es:", precio)
    else:
        print("Número de boletos inválido")
    
persona(2)
## El precio final es: 17.0
persona(3)
## El precio final es: 24.0
persona(4)
## El precio final es: 30.0
persona(1)
## El precio final es: 10
persona(5)
## No se pueden comprar mas de 4 boletos
#19
def construir_vector(n):
    vector = [1]  
    for k in range(1, n):
        vectork = vector[k-1]/3 + 0.5 
        vector.append(vectork) 
    return vector

construir_vector(5)
## [1, 0.8333333333333333, 0.7777777777777777, 0.7592592592592593, 0.7530864197530864]
#20
def cmatriz(m, n):
    matriz = []
    for i in range(m):
        fila = []
        for j in range(n):
            entrada = i - j/2
            fila.append(entrada)
        matriz.append(fila)
    return matriz
  
  
cmatriz(2,2)
## [[0.0, -0.5], [1.0, 0.5]]
#21
import math

def maxcomdiv_minconmult(a, b):
    mcd = math.gcd(a, b)
    mcm = (a*b) // mcd
    return {"mcd": mcd, "mcm": mcm}

print(maxcomdiv_minconmult(30, 70))
## {'mcd': 10, 'mcm': 210}
#22

def transpuesta(A):
    m = len(A)
    vacia = [[0] * m for i in range(m)]
    for i in range(m):
        for j in range(m):
            vacia[j][i] = A[i][j]  # intercambiar filas por columnas
    return vacia

prueba = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]
transpuesta(prueba)
## [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
#23

def palabra(x):
    x=x.lower()
    if x==x[::-1]:
        return True
    else:
        return False

palabra("reconocer")
## True
#24
#25
import pandas as pd

def rescolum(df, column):
    columna = df[column]
    promedio = columna.mean()
    minimo = columna.min()
    maximo = columna.max()
    varianza = columna.var()
    return {"promedio": promedio, "minimo": minimo, "maximo": maximo, "varianza": varianza}


archivo = pd.read_csv("C:/Users/Rodrigo/Desktop/TEC/Concentracion/BankChurners.csv")
column= archivo["Credit_Limit"]

result = rescolum(archivo, "Credit_Limit")
print(result)
## {'promedio': 8123.279629629629, 'minimo': 1438.3, 'maximo': 34516.0, 'varianza': 74871711.75366364}
#26
import pandas as pd

def correlacion(df, col1, col2):
    matriz = df.corr()
    return matriz.loc[col1, col2]
  
archivo = pd.read_csv("C:/Users/Rodrigo/Desktop/TEC/Concentracion/BankChurners.csv")
col1= archivo["Customer_Age"]
col2= archivo["Dependent_count"]

result = correlacion(archivo, "Customer_Age", "Dependent_count")
## <string>:2: FutureWarning: The default value of numeric_only in DataFrame.corr is deprecated. In a future version, it will default to False. Select only valid columns or specify the value of numeric_only to silence this warning.
print(result)
## -0.1129231721854703