#1
import math as mt

class circulo:
  def __init__(self, diam=0, r=0):
    self.__diam=diam
    self.__r=r
    
  @property
  def diam(self):
    return self.__diam
  
  @diam.setter
  def diam(self, xdiam):
    self.__diam = xdiam
    
  @property
  def r(self):
    return self.__r
  
  @property
  def area(self):
    return mt.pi * self.r**2
  
  @property
  def perimetro(self):
    return mt.pi * self.diam
  
  def __str__(self):
    return "diametro: " + str(self.diam) + " radio: " + str(self.r)
   
   
class rombo:
  def __init__(self, lado, ds, di):
    self.__lado = lado
    self.__ds = ds
    self.__di = di
    
  @property
  def lado(self):
    return self.__lado
  
  @lado.setter
  def lado(self,ladox):
    self.__lado = ladox
  
  @property
  def ds(self):
    return self.__ds
  
  @ds.setter
  def ds(self,dsx):
    self.__ds = dsx
  
  @property
  def di(self):
    return self.__di
  
  @di.setter
  def di(self,dix):
    self.__di = dix
    
  @property
  def area(self):
    return (self.ds*self.di)/2
  
  @property
  def perimetro(self):
    return self.lado*4
  
  def __str__(self):
    return "lado: " + str(self.lado) + " diagonal superior: " + str(self.ds) + " diagonal inferior: " + str(self.di)
   
   
circulo1 = circulo(2,2)
print(circulo1)
## diametro: 2 radio: 2
print(f"area del circulo= {circulo1.area}")
## area del circulo= 12.566370614359172
print(f"perimetro del circulo= {circulo1.perimetro}")
## perimetro del circulo= 6.283185307179586
rombo1 = rombo(2,2,2)
print(rombo1)
## lado: 2 diagonal superior: 2 diagonal inferior: 2
print(f"area del rombo= {rombo1.area}")
## area del rombo= 2.0
print(f"perimetro del rombo= {rombo1.perimetro}")
## perimetro del rombo= 8
#2

import numpy as np
class operacion:
  def __init__(self,x,y):
    self.__x = np.array(x)
    self.__y = np.array(y)
    
  @property
  def x(self):
    return self.__x
  @property
  def y(self):
    return self.__y
  
  @x.setter
  def x(self, nx):
    self.__x = nx
  @y.setter
  def y(self, ny):
    self.__y = ny
    
  def suma(self):
    return self.x + self.y
  def resta(self):
    return self.x - self.y
  def mult(self):
    return np.dot(self.x,self.y)
  def corr(self):
    return np.corrcoef(self.x,self.y)[0,1]
  def cov(self):
    return np.cov(self.x,self.y)[0,1]
  def __str__(self):
    return "x: " + str(self.x)+"y: "+ str(self.y)
  
  
op = operacion([2,4,6,8,10],[5,10,15,20,15])
print(op)
## x: [ 2  4  6  8 10]y: [ 5 10 15 20 15]
print(f"suma: {op.suma()}")
## suma: [ 7 14 21 28 25]
print(f"resta: {op.resta()}")
## resta: [ -3  -6  -9 -12  -5]
print(f"multiplicacion: {op.mult()}")
## multiplicacion: 450
print(f"correlacion: {op.corr()}")
## correlacion: 0.8320502943378437
print(f"covarianza: {op.cov()}")
## covarianza: 15.0
#3

import pandas as pd
class frutas:
  def __init__(self,dicc = {}):
    self.__dicc = dicc
  @property
  def dicc(self):
    return self.__dicc
  
  @dicc.setter
  def dicc(self, ndicc):
    self.__dicc = ndicc
    
  def adf(self):
    return pd.DataFrame(self.dicc, index=[0])
  def agrega(self, nombre, precio):
     self.dicc[nombre]= precio
  def elimina(self,nombre):
    del self.dicc[nombre]
  def precio(self,nombre,kilo):
    return self.dicc[nombre]*kilo
  def maximo(self):
    return max(self.dicc.values())
  def buscar(self, nombre):
    if nombre in self.dicc:
      return (nombre,self.dicc[nombre])
    else:
      return ("Esa fruta no esta en el diccionario")
  def __str__(self):
    return "diccionario: " + str(self.dicc)


f1 = frutas()

f1.agrega("manzana",5)
f1.agrega("mango",6)
f1.agrega("pera",7)
f1.agrega("uvas",4)
f1.agrega("sandia",9)
f1.agrega("moras",2)

print(f1.adf())
##    manzana  mango  pera  uvas  sandia  moras
## 0        5      6     7     4       9      2
f1.elimina("uvas")
print(f1.adf())
##    manzana  mango  pera  sandia  moras
## 0        5      6     7       9      2
print("el total a pagar:" +str(f1.precio("sandia", 10)))
## el total a pagar:90
print(f"el precio maximo es: {str(f1.maximo())}")
## el precio maximo es: 9
print(f1.buscar("moras"))
## ('moras', 2)
#4

import pandas as pd

titanicdata = pd.read_csv("C:/Users/Rodrigo/Desktop/TEC/Concentracion/titanic.csv")

class titanic:
  def __init__(self, df):
    self.__df = df
  
  @property
  def df(self):
    return self.__df
  
  @df.setter
  def df(self, ndf):
    self.__df = ndf
    
  def actualizar(self, nombre, clase):
    self.df.loc[self.df['Name'] == nombre, 'Pclass'] = clase
    return self.df.loc[self.df['Name'] == nombre]
  
  def resumen(self, nombre):
    return self.df.loc[self.df['Name'] == nombre]
  
  def rescol(self, columna):
    if self.df[columna].dtype == 'object':
      return self.df[columna].mode()
    else:
      return self.df[columna].mean()
      
  def sobrevivientes(self):
    return self.df.groupby('Pclass').Survived.sum()
  
  def agregar(self, sv, clase, nombre, sexo, edad, hermanos, padres, tarifa, cabina, embarque):
    nid= (len(self.df)+1)
    self.df.loc[len(self.df.index)] = [nid, 0, clase, nombre, sexo, edad, hermanos, padres, tarifa, cabina, embarque, sv]
    return self.df
  
  def eliminar(self, nombre):
    self.df.drop(self.df[self.df['Name'] == nombre].index, inplace=True)
    return self.df
  
  def __str__(self):
    return "diccionario: " + str(self.df)

data = titanic(titanicdata)
data.agregar(1,2, "Rodrigo Rioseco", "male", 29, 0, 1, 234, 5, "S")  
##       PassengerId  Survived  Pclass  ...      Fare Cabin  Embarked
## 0               1         0       3  ...    7.2500   NaN         S
## 1               2         1       1  ...   71.2833   C85         C
## 2               3         1       3  ...    7.9250   NaN         S
## 3               4         1       1  ...   53.1000  C123         S
## 4               5         0       3  ...    8.0500   NaN         S
## ...           ...       ...     ...  ...       ...   ...       ...
## 1305         1306         1       1  ...  108.9000  C105         C
## 1306         1307         0       3  ...    7.2500   NaN         S
## 1307         1308         0       3  ...    8.0500   NaN         S
## 1308         1309         0       3  ...   22.3583   NaN         C
## 1309         1310         0       2  ...    5.0000     S         1
## 
## [1310 rows x 12 columns]
print(data.actualizar("Rodrigo Rioseco", 2))
##       PassengerId  Survived  Pclass  ... Fare Cabin  Embarked
## 1309         1310         0       2  ...  5.0     S         1
## 
## [1 rows x 12 columns]
print(data.resumen("Rodrigo Rioseco"))
##       PassengerId  Survived  Pclass  ... Fare Cabin  Embarked
## 1309         1310         0       2  ...  5.0     S         1
## 
## [1 rows x 12 columns]
print(data.rescol("Age"))
## 29.880296084049665
print(data.sobrevivientes())
## Pclass
## 1    186
## 2    117
## 3    191
## Name: Survived, dtype: int64