keepSimple, 1991.

"La gente generalmente no elige Python para escribir código rápido.

Las principales ventajas de Python son la legibilidad y la simplicidad
"

Notación
En lo sucesivo cuando encuentre >>> estaremos refiriendo un entorno Python o el shell de Python, continue leyendo para saber a que me refiero.

Index


Básico

References



Python

Intro

Un lenguaje de programación es un lenguaje formal que proporciona una serie de instrucciones que permiten a un programador escribir secuencias de órdenes y algoritmos a modo de controlar el comportamiento físico y lógico de una computadora con el objetivo de que produzca diversas clases de datos.

El nombre del lenguaje Python proviene del popular programa de Monty Python grupo británico de seis humoristas que sintetizó en clave de humor la idiosincrasia británica de los años 1960 y 1970.

Desarrollado inicialmente por un programador holandés llamado Guido van Rossum a fines de la década de 1980 pero aparece en 1991.


Python es un lenguaje de programación moderno de:

Compilación

El programa fuente se traduce una vez obteniendo un archivo que contiene el código de la máquina; el programa que realiza esta traducción se llama compilador o traductor.

Interpretación

Cualquier usuario del código puede traducir el programa fuente cada vez que se ejecute; el programa que realiza este tipo de transformación se denomina intérprete, ya que interpreta el código cada vez que está destinado a ejecutarse; también significa que no puede distribuir el código fuente tal como está, porque el usuario final también necesita que el intérprete lo ejecute.

Un programa de computadora es en realidad una pieza de texto, por lo que el código fuente generalmente se coloca en archivos de texto.

El intérprete lee el código fuente y verifica si todas las líneas subsiguientes son correctas.

Si el compilador encuentra un error, termina su trabajo inmediatamente. El único resultado en este caso es un mensaje de error. El intérprete le informará dónde se encuentra el error y qué lo causó.

También es posible que una parte significativa del código se ejecute con éxito antes de que el intérprete encuentre un error. Este es el comportamiento normal en este modelo de ejecución.

Si deseas programar en Python, necesitarás el intérprete de Python.

Python es un lenguaje de programación de alto nivel, interpretado, orientado a objetos y de uso generalizado con semántica dinámica, que se utiliza para la programación de propósito general.

En 1999, Guido van Rossum definió sus objetivos para Python:

Posibles usos:

Lanzamientos:



Logotipo de Pyhton

Python es un lenguaje de programación que te permite trabajar rápidamente e integrar sistemas de forma más eficaz.

Python es un lenguaje de programación orientado a objetos claro y poderoso, comparable a Perl, Ruby, Scheme o Java.

Python es un lenguaje de programación interpretado cuya filosofía hace hincapié en la legibilidad de su código.​

Se trata de un lenguaje de programación multiparadigma, ya que soporta parcialmente la orientación a objetos, programación imperativa y, en menor medida, programación funcional.

Instalación Python

Ir a Distribución en Windows

Distribución de Python en la Microsoft Store

Distro Python

Así se muestra la terminal de la Distribución de Python en la Microsoft Store

Consola

Para Visual Studio Code se puede configurar de la siguiente manera:



Puede usar la siguiente extensión: ms-python.pyhton



python -m pip install --upgrade pip
python -m pip install -U pip
python -m pip install -U matplotlib

PATH: Variable de ambiente de windows

Verifique o agregue al path la ubicación del ejecutable de Python:

- Panel de control\Sistema y seguridad\Sistema > Configuración avanzada del sistema
- Propiedades del sistema > Variables de entorno > Variables del sistema > Path > Editar C:\PythonXX

Verifique que Python este correctamente instalado

- Abra una ventana de símbolo del sistema o CMD
- Puede ingresar: - Si ya esta instalado Python, entonres ingrese python y [enter]
- Esto hará que acceda al entorno de Python o shell
- Indicando la versión de Python instalada
- A continuación se presenta el prompt en espera de comandos de Python

Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information.
>>>

NOTA: la versión 2.7 su mantenimiento ha llegado a su end-of-life.

Para salir del entorno de Python ingrese:

>>>exit()

Compilador en línea

Puede ser de utilidad un: Compilador en línea de Python

print() : Hola Mundo

- En el entorno de Python escriba:

>>>print("Hola Mundo") y [enter]

- print es una función que sirve para desplegar mensajes al usuario.

El uso de comillas simples y dobles es valido, la regla es que unas estén contenidas en las otras (y viceversa).

Las siguientes instrucciones son validas:



Es posible escribir cadenas de varias líneas en Python, para hacer eso, debe usar comillas triples en cada lado del literal de cadena.



También se pueden usar las comillas simples '''

Indentado en python

El sangrado se utiliza para delimitar la estructura del programa permitiendo establecer bloques de código.

Es muy importante para la correcta ejecución del código.

Python usa la indentación para establecer el ámbito (scope), a diferencia de otros programas que usan { } para ello.

Ejecutar archivos de Python

Los archivos de Python tienen la extensión .py

- Cree un archivo con la extensión .py
- En el contenido del archivo escriba print("Hola Mundo")
- Asegurese de estar en el directorio que contiene el archivo creado .py
- Ingrese el nombre del archivo y [enter]

Nota: o desde donde se encuentre indique la ruta y nombre del archivo a ejecutar.

Otras extensiones validas de Python son: .py, .pyc, .pyd, .pyo, .pyw, .pyz, .pyi

Comentarios #

Un comentario sirve para cualquier tipo de anotación que deseamos hacer en el código, pero que no debe formar parte del código a interpretar como parte de la ejecución del programa.

La sintaxis de Python para los comentarios se realiza escribiendo el símbolo # (almohadilla​ o el numeral​ o cardinal o signo de número)

Todo lo que este escrito despues del símbolo # será ignorado por Python.

A veces es necesario explicar para qué sirven algunas partes particulares del código.

Python brinda la oportunidad de satisfacer esas necesidades, puede dejar notas especiales llamadas comentarios. Son especialmente útiles para principiantes.

Se llama comentario en línea ( inline comment ) porque está escrito en la misma línea que el código.

print("This will run.") # This won't run

Comentarios de acuerdo con las mejores prácticas

Después de una marca de almohadilla # debe haber un espacio y, en los comentarios en línea, debe haber dos espacios entre el final del código y la marca de almohadilla.

También es aceptable poner más de dos espacios entre el final del código y la marca de almohadilla, pero lo más común es que haya exactamente dos espacios.

Aplica una sangría a tu comentario al mismo nivel que la declaración que explicar

Un comentario no debería ser demasiado largo, la guía PEP-8 indica que la longitud del comentario debe limitarse a 72 caracteres.

Es mejor dividir un comentario largo en varias líneas: puede hacerlo agregando una marca de almohadilla al comienzo de cada nueva línea

Los comentarios que abarcan varias líneas se denominan multi-line o de bloque.

Comentarios para Documentación

Puede encontrar comentarios de varias líneas entre comillas triples "" "..." "".

Las comillas triples están reservadas para cadenas de documentación. También son informativos, pero su uso se limita a funciones, métodos y varios otros casos.

Tipos de datos / Estructuras de datos / Data Structures

https://docs.python.org/3/tutorial/datastructures.html

Cada objeto de datos como una variable o una constante tiene un tipo que describe cómo mantenerlo en la memoria, qué operaciones se pueden aplicar a este objeto y cómo calcularlas.

Literales

Es el valor mismo. Un literal se refiere a datos cuyos valores están determinados por el literal mismo.

But a literal is not a name -- it is the value itself.

Literales son notaciones para representar valores fijos en el código.

Existe un literal especial más utilizado en Python: el literal None. Este literal es llamado un objeto de NonType (ningún tipo), y puede ser utilizado para representar la ausencia de un valor.

Cuando los datos y operadores se unen, forman juntos expresiones. La expresión más sencilla es el literal.

Constante

La variable es un lugar con nombre donde puede almacenar algún valor y acceder al valor más tarde.

Par nombre-valor, donde su valor no puede cambiar, permanece fijo durante toda la ejecución del programa.

Nombre será aquel que designemos para identificar a un valor cambiante.

Variable

Par nombre-valor, donde su valor si puede cambiar durante la ejecución del programa.

Una variable puede ser declarada con ámbito global anteponiendo global en su declaración

Una variable se crea cuando se le asigna un valor. A diferencia de otros lenguajes de programación, no es necesario declararla.

Si se le asigna cualquier valor a una variable no existente, la variable será automáticamente creada. No se necesita hacer algo más.

Para eliminar la definición de una variable use la instrucción del

PEP 8, un espacio antes y después del signo de asignación (=) se considera una buena práctica.

Utilice minúsculas y guiones bajos para dividir palabras. Si desea definir una constante, es común escribir su nombre en mayúsculas y, nuevamente, separar las palabras con guiones bajos. Normalmente, las constantes se almacenan en archivos especiales llamados módulos.

Evite los nombres de una letra que podrían confundirse fácilmente con números como las letras: 'l' 'O/o', 'I'.

Aunque puede utilizar cualquier símbolo Unicode, la convención de estilo de código recomienda limitar los nombres de variable con caracteres ASCII.

Si el nombre de variable más adecuado es alguna palabra clave de Python, agregue un guión bajo al final.

Elija un nombre que tenga sentido. El nombre de la variable debe ser legible y descriptivo y debe explicar al lector qué tipo de valores se almacenarán en él.

No uses nombres demasiado genéricos. Intente elegir un nombre que explique el significado de la variable, de 1 a 3 palabras suelen ser suficientes.

Si una palabra es larga, intente encontrar la forma corta más común y esperada.

Evite los nombres de la lista de tipos built-in (incorporada).

Todas las convenciones de nomenclatura y las mejores prácticas son opcionales, pero se recomienda encarecidamente seguirlas, ya que hacen que su código sea más legible y autodescriptivo para usted y otros programadores.

Cada variable tiene un nombre específico que la distingue de otras variables. Existen algunas reglas para nombrar variables que debe seguir:

Cada variable tiene un nombre que la identifica de forma única entre otras variables.

Dar un buen nombre a una variable puede no ser tan simple como parece.

Los programadores experimentados son cuidadosos al nombrar sus variables para asegurarse de que sus programas sean fáciles de entender.

Es importante porque los programadores pasan mucho tiempo leyendo y entendiendo el código escrito por otros programadores.

Si las variables tienen nombres incorrectos, incluso su propio código le parecerá confuso de leer en unos meses.

Siempre que usa un signo igual =, en realidad asigna algún valor a un nombre. Por esa razón, al signo de = se le suele denominar operador de asignación.

Operadores de asignación compuesta

Hay otros operadores de asignación que puede usar en Python, se denominan operadores de asignación compuesta, ya que realizan una operación aritmética y una asignación en un solo paso:

+=, -=, *=, /=, %=, **=, //= .

Operadores lógicos

Otro tipo son los operadores lógicos:

&, |, ^, ~, <<, >>, In, Not in, Is, Is not,

Operadores comparación

Las operaciones de comparación o relación le permiten comparar dos valores y determinar la relación entre ellos.

Hay diez operadores de comparación en Python:

  1. < menor que
  2. <= menor que o igual
  3. > mayor que
  4. >= mayor que o igual
  5. == igual
  6. != no igual
  7. is
  8. is not
  9. in esta en
  10. not is no esta en
El resultado de aplicar estos operadores siempre es bool.

Operadores aritméticos

Un signo de ** (doble asterisco) es un operador de potencia (exponenciación).

El argumento a la izquierda es la base, el de la derecha, el exponente.

Cuando ambos ** argumentos son enteros, el resultado es entero también.

Cuando al menos un ** argumento es flotante, el resultado también es flotante.

Un símbolo de * (asterisco) es un operador de multiplicación.

Un símbolo de / (diagonal) es un operador de división.

El valor después de la diagonal es el dividendo, el valor antes de la diagonal es el divisor.

Hay una excepción a la regla, el resultado producido por el operador de división siempre es flotante,

Un símbolo de // (doble diagonal) es un operador de división entera.

El resultado carece de la parte fraccionaria, está ausente (para los enteros), o siempre es igual a cero (para los flotantes); esto significa que los resultados siempre son redondeados. Se ajusta a la regla entero vs flotante. El redondeo siempre va hacia abajo. La division entera también se le suele llamar en inglés floor division.

Módulo / es el residuo que queda de la división entera, es el valor que sobra después de dividir un valor entre otro para producir un resultado entero.

La división entre cero no funciona.

No se debe intentar, dividir entre cero, realizar una división entera entre cero o encontrar el residuo de una división entre cero.

Se pueden emplear tantos paréntesis como se necesiten, y seguido son utilizados para mejorar la legibilidad de una expresión, aun si no cambian el orden de las operaciones.

Una expresión es una combinación de valores (o variables, operadores, llamadas a funciones, aprenderás de ello pronto) las cuales son evaluadas y dan como resultado un valor

Los operadores son símbolos especiales o palabras clave que son capaces de operar en los valores y realizar operaciones matemáticas

Un operador unario es un operador con solo un operando.

Un operador binario es un operador con dos operados

Algunos operadores actúan antes que otros, a esto se le llama jerarquía de prioridades.

Números

Los números enteros se pueden usar para contar cosas en el mundo real, mientras que los números de punto flotante son una buena opción para cálculos estadísticos y científicos.

Los sistemas de numeración Octales y Hexadecimales son similares pues emplean 8 y 16 como sus bases respectivamente. El sistema hexadecimal utiliza los números decimales más seis letras adicionales.

Nota: octal 0o... hexadecimal 0x...

Enteros

Para aquellos valores sin un componente fraccionario.

int (enteros con signo). Llamados enteros o ints, son números enteros (positivo, negativo o cero), sin punto decimal.

El uso de guion bajo es permitido en los literales numéricos:



Floating

Se refiere a números decimales

float (Números de punto flotante). Llamados flotantes, representan números reales y tienen un punto decimal.

La letra E (también se puede utilizar la letra minúscula e - proviene de la palabra exponente) la cual significa por diez a la n potencia.

3E8

El exponente (el valor después de la E) debe ser un valor entero.

La base (el valor antes de la E) puede o no ser un valor entero.

String

Secuencia de caracteres.

Las cadenas de Python son secuencias, no son listas, pero pueden ser tratadas como tal.

El truco de las comillas simples y dobles para su combinación

Como sabemos para representar un conjunto (cadena) de caracteres en la sintaxis de Python permite el uso de comillas simples o dobles.

La sintaxis es la regla el lenguaje define para escribir código y que sea considerado como correcto, pero ¿Cuál es tu estilo? o cual es tu costumbre al escribir ¿Comilla simple o doble?.

El truco para su combinación es otra regla, unas debes estar contenidas en otras, recuerda que van por pares, comilla al inicio y comilla al final del string.

Si tienes que escribir código sin combinaciones de comillas puedes usar el carácter de escape \



Las cadenas de Python son inmutables. Con las listas podemos usar del para eliminar un elemento. No se puede eliminar un caracter de una cadena, sin embargo al aplicar del a la cadena esta es eliminada por completo. Tampoco se puede usar el método append() para expander una cadena.

Lo que se estila al manipular cadenas es sobreescribirlas.



Iterar una cadena



Slice:



Siempre que desee trabajar con algún tipo de información textual en su programa, tendrá que trabajar con cadenas.

El tipo de cadena se llama str.

Los literales de cadena se pueden delimitar mediante comillas simples o dobles.

Concatenación. Combinación de secuencia de caracteres (strings)
>>> a = "Hola"
>>> b = "Mundo"
>>> print(a + " " + b)
Hola Mundo


Se puede utilizar print() para combinar texto con variables utilizando el operador + para mostrar cadenas con variables

El signo de * (asterisco), cuando es aplicado a una cadena y a un número (o a un número y cadena) se convierte en un operador de replicación.

¿Podemos multiplicar strings?, veamos...

>>> c = a + " " + b
>>> print(c*3)
Hola MundoHola MundoHola Mundo


Un número menor o igual que cero produce una cadena vacía.

En general, las cadenas pueden ser: concatenadas (unidas) + y replicadas *.

La capacidad de usar el mismo operador en tipos de datos completamente diferentes (como números o cadenas) se llama overloading - sobrecarga (debido a que el operador está sobrecargado con diferentes tareas).

El operador + es empleado en dos o más cadenas y produce una nueva cadena que contiene todos los caracteres de sus argumentos

El operador * necesita una cadena y un número como argumentos; en este caso, el orden no importa: puedes poner el número antes de la cadena, o viceversa, el resultado será el mismo: una nueva cadena creada por la enésima replicación de la cadena del argumento.

in, not in

Los operadores in y not in pueden ser aplicados a cadenas



La función ord()

Dada una cadena que representa un carácter Unicode, devuelve un número entero que representa el punto de código Unicode de ese carácter.



La función necesita una cadena de un caracter como argumento - incumplir este requisito provoca una excepción TypeError

La función chr()

Devuelve la cadena que representa un carácter cuyo punto de código Unicode es el entero i.



Invocándolo con un argumento inválido (por ejemplo, un punto de código negativo o inválido) provoca las excepciones ValueError o TypeError

min() y max()

¿Se puede aplicar la función min() y max() a una cadena?.

Si, para determinar el caractér cuyo punto de código Unicode entero es el menor o mayor.



String Methods

str.index(sub[, start[, end]])

python.org/3/library/stdtypes.html#string-methods

Las cadenas tienen varios métodos para su manipulación. El método index() devuelve el índice correspondiente de un carácter en la cadena



Si index() no encuentra el carácter que se pasa como argumento, genera una excepción ValueError



str.count(sub[, start[, end]])

Devuelve el número de apariciones no superpuestas de subcadena sub en el rango [inicio, fin]. Los argumentos opcionales start y end se interpretan como en notación de sector.

print("Hello".count("l")) # 2

str.capitalize()

Devuelve una copia de la cadena con su primer carácter en mayúsculas y el resto en minúsculas.

print("ángeles".capitalize()) # Ángeles

str.center(width[, fillchar])

Retorno centrado en una cadena de largo y width. El relleno se realiza utilizando el fillchar especificado (el valor predeterminado es un espacio ASCII).

Se devuelve la cadena original si el width es menor o igual que len(s).

print('*' + 'Python'.center(12) + '*') # * Python *

print('#' + 'Python'.center(12,"-") + '#') # #---Python---#

str.endswith(suffix[, start[, end]])

Devuelve True si la cadena termina con el suffix especificado; de lo contrario, devuelve False.

suffix también puede ser una tupla de sufijos a buscar. Con inicio start, pruebe comenzando en esa posición.

Con el end opcional, deja de comparar en esa posición. print("Python".endswith("n")) # True

print("Python".endswith("P")) # False

str.find(sub[, start[, end]])

Devuelve el índice más bajo en la cadena donde la subcadena sub se encuentra dentro del segmento s[inicio: fin].

Los argumentos opcionales start y end se interpretan como en notación de sector. Devuelve -1 si no se encuentra sub.

print("Python".find("h")) # 3

print("Python".find("J")) # -1 (no se encuentra)

Podríamos encontrar las coincidencias en un texto de una subcadena:



Salida:

' i ' se encontro en la pos: 2
' i ' se encontro en la pos: 6
' i ' se encontro en la pos: 14

str.isalnum()

Devuelve True si todos los caracteres de la cadena son alfanuméricos y hay al menos un carácter, False en caso contrario.

Un carácter c es alfanumérico si uno de los siguientes devuelve True:

c.isalpha (), c.isdecimal (), c.isdigit () o c.isnumeric ().



str.isalpha()

Devuelve True si todos los caracteres de la cadena son alfabéticos y hay al menos un carácter, False en caso contrario.

Los caracteres alfabéticos son aquellos definidos en la base de datos de caracteres Unicode como "Letra".



str.isdigit()

Devuelve True si todos los caracteres de la cadena son dígitos y hay al menos un carácter, False en caso contrario.

Los dígitos incluyen caracteres decimales y dígitos que necesitan un manejo especial, como los dígitos de superíndice de compatibilidad.



str.islower()

Devuelve True si todos los caracteres en mayúsculas en la cadena están en minúsculas y hay al menos un carácter en mayúsculas, de lo contrario es False.



str.lower()

Devuelve una copia de la cadena con todos los caracteres en mayúscula convertidos a minúsculas.



str.isupper()

Devuelve True si todos los caracteres en mayúscula de la cadena están en mayúsculas y hay al menos un carácter en mayúsculas, de lo contrario es False.



str.isspace()

Devuelve True si solo hay espacios en blanco en la cadena y hay al menos un carácter, False en caso contrario.



str.join(iterable)

Devuelve una cadena que es la concatenación de las cadenas en iterable.

Se generará un TypeError si hay valores que no son cadenas en iterables, incluidos los objetos de bytes.

El separador entre elementos es la cadena que proporciona este método.



str.lstrip([chars])

Devuelve una copia de la cadena sin los caracteres iniciales.

El argumento chars es una cadena que especifica el conjunto de caracteres que se eliminarán.

Si se omite o Ninguno, el argumento chars elimina los espacios en blanco de forma predeterminada.

El argumento chars no es un prefijo; más bien, todas las combinaciones de sus valores se eliminan



str.replace(old, new[, count])

Devuelve una copia de la cadena con todas las apariciones de la subcadena antigua reemplazada por nueva. Si se proporciona el recuento de argumentos opcional, solo se reemplazan las primeras apariciones del recuento.



str.rsplit(sep=None, maxsplit=-1)

Devuelve una lista de las palabras de la cadena, utilizando sep como cadena delimitadora. Si se da maxsplit, como máximo se realizan divisiones de maxsplit, las más a la derecha. Si no se especifica sep o None, cualquier cadena de espacios en blanco es un separador.





Boolean

El tipo booleano, o simplemente bool, es un tipo de datos especial que solo tiene dos valores posibles: Verdadero y Falso.

En Python, los nombres de los valores booleanos comienzan con una letra MAYÚSCULA (True, False).

El tipo booleano o lógico es una forma común de representar algo que tiene solo dos estados opuestos como encendido o apagado, sí o no, etc.



Operaciones booleanas

Operadores booleanos integrados en Python: (not, and, or)

Los dos primeros son operadores binarios, lo que significa que esperan dos argumentos.

not es un operador unario, siempre se aplica a un solo operando.

  1. not es un operador unario, invierte el valor booleano de su argumento.

    ser = True # ser es True
    no_ser = not ser # no_ser es False

  2. and es un operador binario, toma dos argumentos y devuelve True si ambos argumentos son verdaderos; de lo contrario, devuelve False.

    w = True and True # True
    x = True and False # False
    y = False and False # False
    z = False and True # False

  3. or es un operador binario, devuelve True si al menos un argumento es verdadero; de lo contrario, devuelve False.

    w = True or True # True
    x = True or False # True
    y = False or False # False
    z = False or True # True
w and z devuelven w si w es Falso; de lo contrario, evalúa y devuelve z

w or z devuelve w si w es True; de lo contrario, evalúa y devuelve z



La precedencia de las operaciones booleanas

Los operadores lógicos tienen una prioridad diferente y afecta el orden de evaluación.

Estos son los operadores en orden de prioridades: not, and, or

print("False or not False = ", False or not False) # True

Primero, se evalúa la parte not False.

Después de la evaluación, nos queda False o True. Esto da como resultado True.

Valores de verdad y falsedad

Python permite probar la veracidad de casi cualquier objeto. Cuando se utilizan con operadores lógicos, los valores de tipos no booleanos, como enteros o cadenas, se denominan truthy o falsy. Depende de si se interpretan como True o False.

Valores que Python considera falsos

None
False
0, 0.0, 0j
{}, (), [], ''
__bool__(), __len()__
Método que devuelve: 0, False


Evaluación de cortocircuito (Short-circuit)

También llamado Lazy.

Significa que el segundo operando en dicha expresión se evalúa solo si el primero no es suficiente para evaluar la expresión completa.

True or

lazy_or = True or "lo que sea" # La segunda expresión nunca se evalua, porque el primer argumento es True

False and

lazy_and = False and "nunca me evaluo" # La segunda expresión nunca se evalua, porque el primer argumento es False



or exclusivo, o simplemente XOR, es una operación lógica binaria.

Devuelve True solo si ambos argumentos son diferentes (uno es True, el otro es False).

None

Valor que es ninguno.

No es un valor en lo absoluto.

Use None de forma segura, cuando:

Si una función no devuelve un cierto valor utilizando una cláusula de expresión return, se asume que devuelve implícitamente None.

Excepciones

Incluso si una declaración o expresión es sintácticamente correcta, puede causar un error cuando se intenta ejecutarla.

Los errores detectados durante la ejecución se denominan excepciones y no son incondicionalmente fatales.

Las excepciones son clases. cuando se genera una excepción, se crea una instancia de un objeto de la clase y pasa por todos los niveles de ejecución del programa, buscando la rama "except" que está preparada para tratar con la excepción.

Todas las excepciones integradas de Python forman una jerarquía de clases:



Sin embargo, la mayoría de las excepciones no son manejadas por programas y dan como resultado mensajes de error.

Por ejemplo: NameError. Se genera cuando no se encuentra un nombre local o global. Esto se aplica solo a los nombres no calificados. El valor asociado es un mensaje de error que incluye el nombre que no se pudo encontrar.

Cada vez que tu código intenta hacer algo erroneo, irresponsable o inaplicable, Python hace dos cosas:

Ambas actividades llevan por nombre lanzar una excepción.

Podemos decir que Python siempre lanza una excepción (o que una excepción ha sido lanzada) cuando no tiene idea de qué hacer con el código.

¿Entonces?

Python proporciona herramientas efectivas que permiten observar, identificar y manejar las excepciones eficientemente.

Esto es posible debido a que todas las excepciones potenciales tienen un nombre específico, por lo que se pueden clasificar y reaccionar a ellas adecuadamente.

Si el programa tiene un error no debería terminarse de manera abrupta, sino recuperarse a ese fallo y continuar su funcionamiento, aunque esa parte del código sea erronea.

Por ejemplo la división entre cero es un error: ZeroDivisionError: division by zero

Otro ejemplo es leer una colección pero acceder a un índice fuera de rango: IndexError: list index out of range

try-except: ¿Cómo manejar un error, con excepciones?

Se debe colocar el bloque de código que deseamos controlar, sabiendo de antemano que podría generar un error.

Para colocar el código en un bloque se utiliza la palabra reservada try, con lo cual estamos indicando, "intenta ejecutar este bloque y si ocurre un error entonces..."



Si se esta familiarizado con las excepciones entonces podemos usarlas, además de que las excepciones se pueden anidar.



Python 3 define 63 excepciones integradas, y todos ellos forman una jerarquía en forma de árbol, aunque el árbol es un poco extraño ya que su raíz se encuentra en la parte superior. Podemos decir que cuanto más cerca de la raíz se encuentra una excepción, más general (abstracta) es.

Exception es un caso especial de una clase más general llamada BaseException.

Por ejemplo: ArithmeticError es una clase general que incluye (entre otras) la excepción ZeroDivisionError.





Se pueden manejar dos o mas excepciones de la misma manera, usando la siguiente sintaxis:



as

Cuando ocurre una excepción, puede tener un valor asociado, también conocido como el argumento de la excepción.

La presencia y el tipo de argumento depende del tipo de excepción.

La cláusula except puede especificar una variable después del nombre de excepción.

La variable se vincula a una instancia de la excepción con los argumentos almacenados en instance.args.

Por conveniencia, la instancia de excepción define __str__() para que se pueda mostrar los argumentos directamente, sin necesidad de hacer referencia a .args.

También se puede instanciar la excepción primero, antes de generarla, y agregarle los atributos que se desee







raise

La instrucción raise genera la excepción especificada denominada exc como si fuese generada de manera natural:

raise exc

La instrucción permite:

try-except-else

Las declaraciones try … except tienen un bloque else opcional, el cual, cuando está presente, debe seguir a los except.

Es útil para aquel código que debe ejecutarse si el bloque try no genera una excepción.

El uso de la cláusula else es mejor que agregar código adicional en la cláusula try porque evita capturar accidentalmente una excepción que no fue generada por el código que está protegido por la declaración try … except.



try-except-else

La cláusula finally se ejecuta independientemente de que la cláusula try produzca o no una excepción.



assert

assert expresión

La declaración raise permite al programador forzar a que ocurra una excepción específica.

raise NameError('Hola mundo')

El único argumento de raise indica la excepción a generarse. Tiene que ser o una instancia de excepción, o una clase de excepción (una clase que hereda de Exception).

¿Como funciona?

assert 5 < 0

Se lanza AssertionError y el programa termina.



Type

Con un argumento, devuelve el tipo de objeto.

Con tres argumentos, devuelve un nuevo tipo de objeto.

Si necesita saber el tipo de un objeto, simplemente imprímalo usando la función type().

Dynamic typing

Python es un lenguaje dinámicamente y fuertemente tipado.

La escritura dinámica significa que solo los objetos en tiempo de ejecución (valores) tienen un tipo, pero no las variables que los almacenan.

Puede almacenar varios valores de diferentes tipos en una sola variable durante la ejecución del código y no se producirán errores.

Lo cual significa que puede cambiar el tipo de una variable al asignar un valor con tipo de dato distinto al inicial:



Weak typing

El mismo operando puede dar resultados diferentes dependiendo de los tipos de argumentos proporcionados.

Por ejemplo, puede agregar dos cadenas para obtener una concatenación. También es posible multiplicar una cadena por un número entero



Explicit type casting

El proceso de convertir un valor en otro tipo también se denomina conversión de tipos.

Aunque la conversión de tipos implícitos no está permitida en Python, a menudo se encontrará en la necesidad de definir una conversión de tipos explícita dentro de su código.

Si no se permite la conversión entre dos tipos, verá un error.

Indexación: index

En Python existen varios tipos de colecciones para almacenar datos en Python.

Las colecciones de elementos ordenados posicionalmente generalmente se denominan secuencias, y tanto las listas como las cadenas les pertenecen.

Cada elemento de una lista, así como cada carácter de una cadena, tiene un índice que corresponde a su posición.

Los índices se utilizan para acceder a elementos dentro de una secuencia. La indexación se basa en cero.

La siguiente instrucción permite conocer la posición de un caracter en un string.

>>> vocales = "aeiou"
>>> print(vocales.index("i"))
2

¡Oh si!, la numeración inicia desde cero
Entonces para visualizar de alguna manera esto sería:
01234
aeiou
Donde la posición del caracter "i" es la número 2

Para acceder a un elemento de una lista por su índice, debe escribir el nombre de la lista, seguido de corchetes y, entre ellos, escribe el índice de un elemento que desea obtener.

No olvide que los índices comienzan en 0, por lo que el índice del primer elemento es 0.

El índice del último elemento es igual a len(lista) - 1.

Donde len() es una función que recibe como parametro una colección y regresa el número de elementos que contiene.

Matrices y Cadenas



IndexError

Si trata de acceder a un índice que no este en el rango de su secuencia obtendrá un error llamado IndexError



En Python Sin embargo, cuando se trata de cadenas, la reasignación es imposible.

Las cadenas, a diferencia de las listas, son inmutables, por lo que no puede modificar su contenido con índices. Al intentar hacer esto indica el error El objeto 'str' no admite la asignación de elementos



Sin embargo en las listas si es posible la reasignación:



índices negativos

La forma más fácil de acceder a los elementos al final de una lista o una cadena es usar índices negativos.

El menos antes del número cambia tu perspectiva de alguna manera y miras la secuencia desde el final. Entonces, el último elemento de una lista, en este caso, tiene el índice igual a -1, y el primer elemento de la lista tiene el índice -len(lista) (la longitud de la lista).



split()

split() ayuda a convertir un valor a una lista.

Operaciones matemáticas

Python admite operaciones aritméticas básicas como:

Python genera un error si intenta dividir por cero: ZeroDivisionError: division by zero

El operador de módulo de Python % se usa para obtener el resto de una división.

Puede resultar útil cuando desee comprobar si un número es par. Para los números impares devuelve 1 y para los pares devuelve cero.



Practique y vea los resultados, por ejemplo que sucede cuando uno de los números es decimal o cuando uno de los números tiene signo negativo.

Recuerda la prioridad de los operadores es importante: paréntesis, potencia, unario menos, multiplicación, división y resto, Adición y sustracción

Slicing (Rebanando, partiendo, troceando)

Es posible obtener una parte de un string.

>>> print(c)
Hola Mundo
>>> print(c[5:10])
Mundo
>>> print(c[0:4])
Hola


Listas

La lista es un tipo de dato en Python que se utiliza para almacenar múltiples objetos. Es una colección ordenada y mutable de elementos separados por comas entre corchetes

Una lista contiene elementos o items de cualquier tipo de dato separados por comas (,) y esta lista esta encerrada o contenida entre corchetes []

>>> lista = [1,"a","palabra", 0]
>>> print(lista[2])
palabra


Dentro de la jerga de Python se dice que una lista es mutable, es decir, que puede ser alterada o cambiada.
Mejor con un ejemplo:
>>> print(lista)
[1, 'a', 'palabra', 0]
>>> lista[2] = "python"
>>> print(lista)
[1, 'a', 'python', 0]
>>> print(lista[2])
python


Otra forma de crear listas es a través de la función list() la cual creaa una lista a partir de un objeto iterable: es decir, un tipo de objeto en el que puede obtener sus elementos uno por uno. Tiene un parámetro que es de tipo string o se puede crear una lista vacía al omitir el parámetro.

list("Hola")

En este caso el string "Hola" es divido caracter por caracter, por tanto, cada caracter corresponde a un elemento en la lista:

['H', 'o', 'l', 'a']

La función list() toma su argumento (una cadena) y crea una nueva lista que contiene todos los caracteres de la cadena, uno por elemento de la lista.

Operadores in, in not

El operador in puede ser usado para evaluar si un elemento esta contenido en una lista.

El operador in not puede ser usado para evaluar si un elemento no esta contenido en una lista.





Función len()

Hay una función incorporada llamada len() que se puede aplicar a cualquier objeto iterable y devuelve simplemente la longitud de ese objeto.

len(objeto_iterable)

Método append()

Toma el valor de su argumento y lo coloca al final de la lista que posee el método.

Método insert()

Puede agregar un nuevo elemento en cualquier lugar de la lista, no solo al final.



Slicing

Da acceso a un rango específico de elementos de secuencia.

secuencia [start:stop[:step]]

start

Opcional. Índice inicial del corte. El valor predeterminado es 0.

stop

Opcional. El último índice del sector o la cantidad de elementos que se van a obtener. El valor predeterminado es len(secuencia).

step

Opcional. Sintaxis de segmento extendida. Valor de paso de la rebanada. Por defecto es 1.



Nota: los índices pueden ser negativos

in - not in

in - not in pueden ser de utilidad para saber si un elemento se encuentra o no en una lista.



sort(*, key=None, reverse=False)

Ordena los elementos de una lista

Este método ordena la lista en su lugar, utilizando solo < comparaciones entre elementos.

Las excepciones no se suprimen: si falla alguna operación de comparación, la operación de clasificación completa fallará (y la lista probablemente se dejará en un estado parcialmente modificado).



La funcion sorted(iterable, *, key=None, reverse=False) Devuelve una nueva lista ordenada de los elementos en iterable.

reverse()

Invierte el orden de los elementos de una la lista.



Secuencia

Una secuencia es un tipo de dato en Python capaz de almacenar mas de un valor (o ninguno si la secuencia esta vacía), los cuales pueden ser secuencialmente examinados, elemento por elemento.

Una secuencia es un tipo de dato que puede ser escaneado por el bucle for.

list es una secuencia.

Mutabilidad

Propiedad de cualquier tipo de dato en Python que describe su disponibilidad para poder cambiar libremente durante la ejecución de un programa.

Existen dos tipos de datos en Python: mutables e inmutables.

Los datos mutables pueden ser actualizados libremente en cualquier momento, a esta operación se le denomina "in situ".

Tuplas

Lo primero que distingue una lista de una tupla es la sintaxis empleada para crearlas.

Las tuplas utilizan paréntesis, mientras que las listas usan corchetes, aunque también es posible crear una tupla tan solo separando los valores por comas.

Una tupla es una secuencia inmutable. Se puede comportar como una lista pero no puede ser modificada en el momento.

Una tupla es un conjunto de elementos, separados por comas (,) encerrados o contenidos entre paréntesis ()

Si se necesita definir una tupla de un solo elemento, es necesario incluir una coma (,), lo que estaría indicando que se trata de una tupla.

>>> t = ("x",)

tuplaVacia = ()

Si se desea crear una tupla de un solo elemento, se debe de considerar el hecho de que, debido a la sintaxis (una tupla debe de poder distinguirse de un valor entero ordinario), se debe de colocar una coma al final: t = ("x",)

El quitar las comas no arruinará el programa en el sentido sintáctico, pero serán variables no tuplas.

Si se intenta cambiar el valor de un tupla se genera el error:

TypeError: 'tuple' object does not support item assignment

El operador + puede unir tuplas.

El operador * puede multiplicar las tuplas.

Los operadores in y not in pueden ser aplicados a las tuplas.

Las Tuplas son colecciones de datos ordenadas e inmutables, no se puede agregar, modificar, cambiar o quitar elementos.

Cada elemento de la tupla puede ser de un tipo de dato diferente Las tuplas pueden contener otras tuplas o listas (y viceversa).

Tupla vacía: t = ()

También se puede crear una tupla utilizando la función integrada de Python tuple().

Número de elementos en tuplas

La función len() permite conocer el número de elementos contenidos en una tupla.
>>> t1 = (10,20,30)
>>> len(t1)
3


min y max en tuplas

min(tupla). Obtiene o regresa el primer elemento en la lista.
max(tupla). Obtiene o regresa el último elemento en la lista.
>>> t = ("x","y","z")
>>> min(t)
'x'
>>> max(t)
'z'


Convertir una lista en tupla

Si tiene una lista pero quiere convertirla en tupla use tuple(lista)
>>> l = ["a","b","c"]
>>> tupla = tuple(l)
>>> print(l)
['a', 'b', 'c']
>>> print(tupla)
('a', 'b', 'c')


Diccionarios

Diccionario. Permite almacenar objetos Python, es mutable.

Son colecciones indexadas de datos, mutables y desordenadas.

Los diccionarios utilizan llaves a diferencia de listas y tuplas.

Consiste del par: clave y valor.

Cada clave debe de ser única. No es posible tener una clave duplicada.

Una clave puede ser un tipo de dato de cualquier tipo: puede ser un número (entero o flotante), o incluso una cadena.

Un diccionario almacena pares de valores.

Si necesita correlacionar datos y valores use diccionarios.

Hash. Convertir un valor en otro.

En la jerga de Python un diccionario se conoce como tablas hash.

Sintaxis

El conjunto de claves valor son encerrados o contenidos entre llaves (curly braces)

{ } # Diccionario vacío

Cada par clave y valor es separado por comas (,)

Al escribir el par clave y valor, escriba entre comillas (") el nombre o identificador de la clave.

A continuación escriba dos puntos (:) para indicar que despues de los dos puntos se asigna un valor.

>>> fecha = { "anio": 2020, "mes": "septiembre","dia": 7 }
>>> print(fecha)
{'anio': 2020, 'mes': 'septiembre', 'dia': 7}


La lista de todos los pares es encerrada con llaves, mientras que los pares son separados por comas, y las claves y valores por dos puntos.

Los diccionarios no son listas - no guardan el orden de sus datos, el orden no tiene significado.

El orden en que un diccionario almacena sus datos esta fuera de nuestro control, lo que es normal.

Método keys()

El método retorna o regresa una lista de todas las claves dentro del diccionario. Al tener una lista de claves se puede acceder a todo el diccionario de una manera fácil y útil.

Método item()

Este método regresa una lista de tuplas donde cada tupla es un par de cada clave con su valor.

Método values()

Regresa una lista de valores

Modificar, agregar y eliminar



print()

La función print() envía datos a la consola..

input()

Con la función input() podemos capturar la entrada del teclado. Los datos de entrada que queremos obtener no son más que un valor introducido por el usuario. Cualquier dato pasado a esta función se trata como una secuencia de caracteres (cadena).

El resultado de la función input() es una cadena.

La función input() deja de esperar la entrada del usuario, hasta que el usuario da ENTER

La función input() puede tomar un argumento opcional, que es un mensaje:

>>> lectura = input("Ingrese letras, números o símbolos y de enter... ")
Ingrese letras, números o símbolos y de enter... El valor de pi es de: 3.14
>>> lectura
'El valor de pi es de: 3.14'
>>>respuesta = input("¿Qué día de la semana es hoy? ")
>>>print("Hoy es", respuesta,", gracias!") Hoy es Viernes , gracias!


Cualquier valor que ingrese, la función lo verá como una cadena. No importa si ingresa dígitos o letras, la entrada se convertirá en una cadena.

Si desea que un número sea un número, debe escribirlo explícitamente:



Si un usuario ingresa un valor no entero, aparecerá un error.

def - Funciones

Una función permite dividir el código en bloques organizados y reusables, empleados para realizar una acción específica.

No se debe invocar una función antes de que se haya definido.

Los parámetros solo existen dentro de las funciones (este es su entorno natural).

Los argumentos existen fuera de las funciones, y son los que pasan los valores a los parámetros correspondientes.

La técnica que asigna cada argumento al parámetro correspondiente, es llamada paso de parámetros posicionales, los argumentos pasados de esta manera son llamados argumentos posicionales.

Una variable que existe fuera de una función tiene alcance dentro del cuerpo de la función, excluyendo a aquellas que tienen el mismo nombre..

Funciones vs. métodos

Un método es un tipo específico de función: se comporta como una función y se parece a una función, pero difiere en la forma en que actúa y en su estilo de invocación.

Una función no pertenece a ningún dato: obtiene datos, puede crear nuevos datos y (generalmente) produce un resultado.

Un método es similar a una función, pero también puede cambiar el estado de una entidad seleccionada.

Un método es propiedad de los datos para los que trabaja, mientras que una función es propiedad de todo el código.

Invocar un método requiere alguna especificación de los datos a partir de los cuales se invoca el método.

El nombre del método está precedido por el nombre de los datos que posee el método. A continuación, se agrega un punto, seguido del nombre del método y un par de paréntesis que encierran los argumentos.

Python usa la indentación para establecer el ámbito (scope)

A diferencia de otros programas que usan { } para ello.

print() es una función incorporada de Python.

La keyword def permite definir funciones al codificador de Python.

La sintaxis para declarar una función es la siguiente:

def nombreFuncion(argumentos):
   sentencias
   return expresión


Los dos puntos después de los parentesis que encierran los argumentos indican que inicia la función.

Todo el cuerpo de la función debe ir indentado (4 espacios), lo que esta indentado, no pertenecera a la función.

¿Qué es un argumento? un valor, que se usará dentro del cuerpo de la función.

Después de def, escriba el nombre de la función y los nombres de los parámetros, que la función puede aceptar, entre paréntesis. No olvidar los dos puntos al final de la línea. Los nombres de una función y sus parámetros siguen la misma convención que los nombres de las variables, es decir, deben escribirse en minúsculas con guiones bajos entre las palabras.

Puede hacer cálculos dentro de la función y usar la palabra clave return para devolver el resultado.

Solo cuando no hay sangría, finaliza la definición de la función.

Posteriormente, los parámetros toman valores pasados en una llamada de función. Los valores que pasamos a una función se conocen como argumentos.

La única distinción entre parámetros y argumentos es que introducimos parámetros en una definición de función y damos argumentos (algunos valores específicos) en una llamada de función.

En caso de que no desee pasar ningún argumento, los corchetes permanecen vacíos.

pass

La sentencia pss no hace nada.

Se puede usar cuando se requiere una declaración sintácticamente pero el programa no requiere ninguna acción.

Esto se usa comúnmente para crear clases mínimas:



También puede declarar una especie de función vacía con la declaración pass:



Cuando elige llamar a lazy_func() con un valor arbitrario como argumento, no sucederá nada. Así que pass es solo un placeholder, pero al menos su código será válido con él.

Parámetros vs argumentos

Los parámetros son solo alias de valores, que se pueden pasar a una función.



Los parámetros de una función son simplemente alias o placeholder para los valores que les pasará.

Los parámetros se reinicializan cada vez que llama a la función. Dentro de la función, tiene acceso a estos valores, lo que significa que puede realizar cálculos sobre ellos.

Ejecución y devolución

La palabra clave return se usa para indicar qué valores genera la función (como salida o devolución). Básicamente, es el resultado de la llamada a la función.



El intérprete de Python deja de realizar la función después de return.

Pero, ¿qué pasa si el cuerpo de la función contiene más de una declaración de retorno? Entonces la ejecución terminará después de la primera.

Una función puede simplemente realizar una acción sin devolver nada o devolver un resultado específico. Si su función no devuelve nada, asignar su resultado a una variable o imprimirlo le dará None.

Funciones con argumentos o paso de argumentos con palabras clave

Python ofrece otra manera de pasar argumentos, donde el significado del argumento esta definido por su nombre, no su posición, a esto se le denomina paso de argumentos con palabras clave.

En Python se pueden invocar funciones con sus parámetros con nombre junto con su valor, el intérprete de Python determina a qué argumentos proporcionar los valores. No se tiene que invocar la función con los argumentos, en un orden particular solamente proporciona los nombres junto con los valores.

def datos(nombre, ap, am, edad, genero):
    print("NOMBRE: ", nombre, "PATERNO: ", ap, "MATERNO: ", am, "EDAD: ", edad, "GENERO: ", genero)

datos(ap = "Paterno", genero = "masculino", nombre = "Homero", edad = 5, am = "Materno")


Es posible combinar ambos tipos si se desea, solo hay una regla inquebrantable: se deben colocar primero los argumentos posicionales y después los de palabras clave.

Funciones con múltiples argumentos

En Python es posible indicar que una función recibe 0 o n argumentos.

Para ello solo debe definir un argumento anteponiendo a este el caracter *

def data(*a):
    dato = 1
    for x in a:
        print("Argumento número ", dato, " Valor: ", str(x))
        dato = dato + 1
    return dato

data("v", "a", "r", "i", "o", "s", "argumentos", "-", 3.14)


Funciones con argumentos con valores por defecto

Es posible que el valor de un argumento tenga un valor por defecto.

Esto es posible al definir el valor del argumento en la definición de los argumentos de la función, con la condición que los argumentos por defecto sean declarados al final de la lista de argumentos, de lo contrario Python indicará: non-default argument follows default argument

def porDefecto(a, b, c, pi=3.14):
    print(pi)
    print(a)
    print(b)
    print(c)

porDefecto(a = 10, b = 20, c = 20)
porDefecto(10, 9, 8)
porDefecto(10, 9, 8, 3.1416)
porDefecto(a = 100, b = 200, c = 300, pi = 5)


global

Existe un método especial en Python el cual puede extender el alcance de una variable incluyendo el cuerpo de las funciones para poder no solo leer los valores de las variables sino también modificarlos.

Este efecto es causado por la palabra reservada llamada global

Iniciar con

Cuando Python inicia la ejecución de un programa, es necesario indicar por donde iniciar, para ello se utiliza la siguiente sintaxis:

if __name__ == "__main__":
    funcion_inicial()


Ejemplo:

def fx():
    Print(2 + 2)

def clasica():
    Print("Hello world")

def hoy():
    respuesta = input("¿Qué día de la semana es hoy? ")
    print("Hoy es", respuesta, " gracias!")

if __name__ == "__main__":
    hoy()

¿Qué día de la semana es hoy?

int(), float()

La función int() toma un argumento e intenta convertirlo a un valor entero;

La función float() toma un argumento e intenta convertirlo a flotante.

Estructura de control if, else, elif

¿Para que sirve una estructura de control: if

Sirve para que se ejecute alguna parte del código solo si una condición particular es verdadera.

Tal parte del código debe colocarse dentro del cuerpo de una declaración if.

Seguida de una condición y la una lista de expresiones a ejecutar (si conoces otros lenguajes de programación no lleva parantesis, aunque se pueden colocar).

La condición es siempre una expresión booleana, es decir, su valor es Verdadero o Falso.

Si conoces otros lenguajes de programación encontraras que el inicio de un bloque o ámbito de una función o estructura de control if es el sangrado o sangría normalmente 4 espacios (indentado Este término significa mover un bloque de texto hacia la derecha insertando espacios o tabuladores, para así separarlo del margen izquierdo y distinguirlo mejor del texto adyacente), fuera de este no se reconoce como parte del if.

El inicio del bloque es con dos puntos (:) tanto para una función como para un if.

Un fragmento de código en el que todas las líneas están en el mismo nivel de sangría se denomina bloque de código.

En Python, solo se usa sangría para separar diferentes bloques de código.

En esta estructura si un caso no se cumple se puede pasar al caso contrario con un else:, nuevamente si conoces otros lenguajes de programación tendrás que practicar para acostumbrarte a escribir dos puntos después del else:.

elif

Para varios casos se usa elif (si conoces otro lenguaje pensaras que esta mal escrito, pero así es correcto).

La declaración Elif se usa cuando queremos especificar varias condiciones en el código.

La declaración Elif difiere de else en un momento clave: representa otra opción específica, mientras que else se ajusta a todos los casos que no caen en la condición dada en la declaración if.

Si conoces otros lenguajes, en Python else no tiene un fin de bloque



El código dentro del bloque else se ejecuta solo si todas las condiciones anteriores son falsas.

Los condicionales con múltiples ramas forman un árbol de decisión, en el que un nodo es una expresión booleana y las ramas se marcan con Verdadero o Falso. La rama marcada como Verdadero conduce a la acción que debe ejecutarse y la rama Falsa conduce a la siguiente condición.

else

Una declaración if-else es otro tipo de expresiones condicionales en Python.

Se diferencia de una instrucción if por la presencia de la palabra clave adicional else.

El bloque de código que else contiene se ejecuta cuando la condición de su declaración if no se cumple (el valor booleano es Falso).

Dado que una instrucción else es una alternativa para una instrucción if, solo se puede ejecutar un bloque de código. Además, else no requiere ninguna condición:



Estructura de control if en una línea

Si conoces otros lenguajes, esta estructura es similar al operador ternario.
En Python se puede hacer uso de esta estructura escribiendola en una sola línea.



alternativa_1 if condición else alternativa_2



if anidado

Las declaraciones if-else pueden anidarse de la misma manera que las declaraciones if.

Puede aparecer una expresión condicional adicional después de la sección if y después de la sección else.

Una vez más, no olvide aplicar la sangría correctamente



Loop

Loops permiten que un bloque de código se ejecute de manera iterativa o repetitiva.
Python solo tiene los tipos de loops: while , for

break empleado para interrumpir la iteración de un loop. Sale del ciclo inmediatamente, e incondicionalmente termina la operación del ciclo; el programa comienza a ejecutar la instrucción más cercana después del cuerpo del ciclo.
continue Se comporta como si el programa hubiera llegado repentinamente al final del cuerpo; el siguiente turno se inicia y la expresión de condición se prueba de inmediato.
pass para indicar que no se ejecute una sentencia.

while

Repite un bloque de código (aunque pueda contener una sola línea) mientras una condición de control sea verdadera.


Fuente: https://hyperskill.org/learn/step/5940

Cuando la condición de control es falsa se interrumpe el ciclo.

Recuerda el sangrado (indentado), para definir el ámbito y los dos puntos (:) para indicar su inicio.



El ciclo while ejecuta una sentencia o un conjunto de declaraciones siempre que una condición booleana especificada sea verdadera por ejemplo:


for

Repite un bloque de código (aunque pueda contener una sola línea) mientras una condición de control es definida por un rango: desde-hasta.

Se usa para iterar sobre una secuencia.

En el caso del for: Recuerda el sangrado (indentado), para definir el ámbito y los dos puntos (:) para indicar su inicio.



Iteradores


Ejemplo break (sale del ciclo o rompe el ciclo y no termina el ciclo completo)


Ejemplo continue (ignora la iteración que cumpla con la condición y continua con el ciclo)


Ejemplo enumerate(índice, valor)


Protocolo iterador

El protocolo iterador es una forma en que un objeto debe comportarse para ajustarse a las reglas impuestas por el contexto de las sentencias for e in. Un objeto conforme al protocolo iterador se llama iterador.

Hay dos funciones específicas para trabajar con iteradores.

  1. Devuelve verdadero si el objeto o admite el protocolo de iterador. Esta función siempre tiene éxito.

    __iter__() el cual debe devolver el objeto en sí y que se invoca una vez (es necesario para que Python inicie con éxito la iteración).

  2. Retorna el siguiente valor de la iteración o.

    El objeto debe ser un iterador (depende de quién llama comprobar esto).

    Si no quedan valores restantes, retorna NULL sin establecer ninguna excepción.

    Si se produce un error al recuperar el elemento, retorna NULL y pasa la excepción.

    __next__() el cual debe devolver el siguiente valor (primero, segundo, etc.) de la serie deseada: será invocado por las sentencias for/in para pasar a la siguiente iteración; si no hay más valores a proporcionar, el método deberá lanzar la excepción StopIteration.
Expresión yield

La expresión yield se usa al definir una función generator o una función generator asynchronous y, por lo tanto, solo se puede usar en el cuerpo de una definición de función.

El uso de una expresión yield en el cuerpo de una función hace que esa función sea un generador, y su uso en el cuerpo de una async def hace que esa función de rutina sea un generador asincrónico.

Sentencia yield

Una sentencia yield es semánticamente equivalente a una expresión yield.

La sentencia yield se puede utilizar para omitir los paréntesis que de otro modo serían necesarios en la declaración de expresión de rendimiento equivalente.

PEP 8

Existe un documento que se llama PEP 8 (Python Enhancement Proposal - Propuesta de mejora de Python). La idea clave es usar el mismo estilo de código para todos los proyectos de Python como si fueran escritos por el mismo programador.

Este documento garantiza que incluso un principiante comprenderá fácilmente el código escrito por cualquier otro desarrollador.

Existen diferentes tipos de PEP y el más útil para los principiantes es el PEP informativo.

Los PEP de este tipo suelen describir pautas o convenciones comúnmente aceptadas sobre el idioma, por lo que pueden ser muy útiles.

Además de PEP 8, que es una guía de estilo oficial, otro gran PEP a tener en cuenta es el PEP 20 Zen de Python.

La longitud de una línea

No utilice más de 79 caracteres en una línea de código.

Las líneas más cortas se ven mejor en los editores de código. Durante este curso, aprenderemos varias formas de lograrlo.

Evite espacios extra

A veces, puede agregar algunos espacios incluso si realmente no los necesita. Esto reducirá la legibilidad de su código.

Evite espacios adicionales entre paréntesis.

En lo personal hoy en día he visto algunos programadores adoptar un estilo personal que adopte cuando programaba y es colocar espacios para según yo mayor legibilidad, es decir, contrario a lo que dicta el PEP, aunque siento que su punto de vista es Evite espacios adicionales .

Comillas

Es posible usar comillas simples o dobles para definir cadenas. Elija un estilo y utilícelo constantemente en su código.

La única recomendación en PEP 8 es que si una cadena contiene comillas simples o dobles, debe usar la otra para evitar barras diagonales inversas.

Procedimientos o Clases

Con Python puedes escribir código como procedimientos o código como objetos.

Escribir código orientado a objetos usando clases las cuales se puede encapsular la funcioncionalidad.

Recuerda que en la programación todo trata de ordenarse, estructurarse, organizarse de una manera lógica, el truco esta en entender ese pensamiento o filosofia y listo!.

Una clase se define usando la keyword class



Métodos

Comenzaremos por una parte de la estructura de una clase, diciendo que, una clase puede tener métodos. Estos métodos son definidos como funciones.

Es aquí donde cada autor en su afán de explicar de manera pura o de una manera particular (ya sea porque es su estilo o ya sea por intentar ser claro), en mi experiencia esto en ocasiones trae confusión, cuando ya más o menos entendí la programación siempre opte por las formas puras u ortodoxas, en lo personal considero es lo mejor (ahora con la edad he perdido ese estilo).

Usualmente el primer argumento de cualquiera de los métodos de una clase es el argumento de uno mismo y el argumento de uno mismo se refiere al objeto en sí.

Método es una función que está dentro de una clase.

Un método está obligado a tener al menos un parámetro self, no existen métodos sin parámetros; un método puede invocarse sin un argumento, pero no puede declararse sin parámetros.

Al invocar un método, no se debe pasar el argumento para el parámetro self, Python lo gestiona de manera automática e interna.



self

En otros lenguajes esto se conoce como this

El parámetro self es usado para obtener acceso a la instancia del objeto y las variables de clase.



self también se usa para invocar otros métodos desde dentro de la clase.



[ Python apareció en 1991, Java 5 años después (1996), sin embargo Eiffel apareció en 1985 pero C++ dos años antes (1983), esto según wikipedia ].

Bien, una forma de entender una clase podría ser visualizarla como una plantilla o molde, donde a través del uso de esta plantilla o molde se obtiene algo a lo cual llamaremos objeto, cuando se crea un objeto se dice que se instancia la clase.

Cuando se invoquen los métodos de clase no se tiene que proporcionar la keyword self, ya que lo maneja Python automáticamente en tiempo de ejecución.

Cuando se nombra un método como: __init__, no será un método regular, será un constructorS.

Si una clase tiene un constructor, este se invoca automática e implícitamente cuando se instancia el objeto de la clase.

Para crear un objeto usamos:



Cada clase de Python y cada objeto de Python está pre-equipado con un conjunto de atributos útiles que pueden usarse para examinar sus capacidades.

Los objetos de Python, cuando se crean, están dotados de un pequeño conjunto de propiedades y métodos predefinidos.

Cada objeto los tiene, los quieras o no. Uno de ellos es una variable llamada __dict__ (es un diccionario).



__dict__ es un diccionario.

La propiedad __name__ contiene el nombre de la clase, es solo una cadena y está ausente del objeto, es decir, existe solo dentro de las clases.

__module__ es una cadena y almacena el nombre del módulo que contiene la definición de la clase.

Cualquier módulo llamado __main__ en realidad no es un módulo, sino es el archivo actualmente en ejecución.

__bases__ es una tupla. La tupla contiene clases (no nombres de clases) que son superclases directas para la clase.



Introspección capacidad de un programa para examinar el tipo o las propiedades de un objeto en tiempo de ejecución.

Reflexión capacidad de un programa para manipular los valores, propiedades y/o funciones de un objeto en tiempo de ejecución



Ejemplo de una clase:



Constructor

El constructor es un método que se llama cuando se crea un objeto.

Este método se define en la clase y se puede utilizar para inicializar variables básicas.

La operación de instanciación ("invocar" a un objeto de clase) crea un objeto vacío.

A muchas clases les gusta crear objetos con instancias personalizadas para un estado inicial específico.

Por lo tanto, una clase puede definir un método especial llamado __init __().

Considere lo siguiente:

Cuando una clase define un método __init __(), la instanciación de clase invoca automáticamente __init __() para la instancia de clase recién creada.

Un constructor se puede utilizar para configurar el objeto, es decir, inicializa adecuadamente su estado interno, crea variables de instancia, crea instancias de cualquier otro objeto si es necesario, etc.

Un constructor no devuelve un valor, esta diseñado para devolver un objeto recién creado.

Un constructor No se puede invocar directamente desde el objeto o desde dentro de la clase. Es posible invorcar un constructor desde cualquiera de las superclases (las más generales) del objeto.

Objeto

Cada vez que se describe un objeto y se usa:

Un sustantivo: probablemente se este definiendo el nombre del objeto.

Un adjetivo: probablemente se este definiendo una propiedad del objeto.

Un verbo: probablemente se este definiendo una actividad del objeto.

Spirit es un corcel indomable y salvaje que corre por la pradrera.

Una Motocileta negra de competencia.

La programación orientada a objetos es el arte de definir y expandir clases. Una clase es un modelo de una parte muy específica de la realidad, que refleja las propiedades y actividades que se encuentran en el mundo real.

El proceso no necesita tener un final. Puedes crear tantas clases como necesites.

La clase que se define no tiene nada que ver con el objeto: la existencia de una clase no significa que ninguno de los objetos compatibles se creará automáticamente. La clase en sí misma no puede crear un objeto: debes crearlo tu mismo y Python te permite hacerlo.

Encapsulamiento

La capacidad de ocultar (proteger) los valores seleccionados contra el acceso no autorizado se llama encapsulamiento; no se puede acceder a los valores encapsulados ni modificarlos si deseas utilizarlos exclusivamente.

Variables privadas

Las variables de instancia "privadas" a las que no se puede acceder excepto desde el interior de un objeto no existen en Python.

Sin embargo, existe una convención que es seguida por la mayoría del código Python: un nombre prefijado con un guión bajo debe tratarse como una parte no pública, es decir, privada de la API: ya sea una función, método o un miembro de datos.

Debe considerarse un detalle de implementación y sujeto a cambios sin previo aviso.



Fuente: Networking Academy - Python Institute - PCAP - Programming Essentials in Python Español 0321a cga

Variables de clase e instancia

En términos generales, las variables de instancia son para datos únicos para cada instancia.

Las variables de clase son para atributos y métodos compartidos por todas las instancias de la clase.

Una variable de clase es una propiedad que existe en una sola copia y se almacena fuera de cualquier objeto.

Las variables de clase no se muestran en el diccionario de un objeto __dict__ esto es natural ya que las variables de clase no son partes de un objeto.

Una variable de clase siempre presenta el mismo valor en todas las instancias de clase (objetos).

Las variables de clase existen incluso cuando no se creó ninguna instancia de clase (objeto).



Herencia

Cuando una clase esta basada en una superclase de la que estaba heredando, se coloca el nombre de esa otra clase dentro de estos paréntesis.

Herencia es pasar atributos y métodos de la superclase a una clase recién creada, llamada subclase.

Es posible construir clases más especializadas (más concretas, las subclases).

La herencia múltiple ocurre cuando una clase tiene más de una superclase. Python busca una entidad de abajo hacia arriba.

Python busca componentes de objetos en el siguiente orden:



Identificador de objeto interno utilizado por Python



Salida más cordial para el usuario:



issubclass()

Si B es una subclase de A y
C es una subclase de B, esto también significa que C es una subclase de A, ya que la relación es totalmente transitiva.

Para comprobar la herencia de la clase

issubclass(bool, int) es True ya que bool es una subclase de int.

Sin embargo, issubclass(float, int) es False ya que float no es una subclase de int.

Cada clase se considera una subclase de sí misma.



isinstance()

Se emplea para verificar el tipo de una instancia:

isinstance(obj, int) será True solo si obj.__ class__ es int o alguna clase derivada de int.

Polimorfismo

Es cuando la subclase puede modificar el comportamiento de su superclase.



La herencia extiende las capacidades de una clase agregando nuevos componentes y modificando los existentes.

La composición proyecta una clase como contenedor capaz de almacenar y usar otros objetos (derivados de otras clases) donde cada uno de los objetos implementa una parte del comportamiento de una clase.

Módulos

Divide una pieza de software en partes separadas pero cooperantes.

Los módulos, junto con las funciones integradas, forman la Biblioteca estándar de Python

Cada módulo consta de entidades. Estas entidades pueden ser funciones, variables, constantes, clases y objetos.

Módulo math.

Módulos en Python son archivos escritos en Python y almacenados con la extensión .py
La instalación estándar de Python contiene bastantes módulos pero puedes ampliar su biblioteca.

De esta manera podemos ir creando nuestro propio código reutilizable en diferentes proyectos, sin la necesidad de estar copiando código.

Para que un módulo sea utilizable, hay que importarlo, empleando la sentencia import. En otros lenguajes seria un use.



La instrucción import puede colocarse en cualquier parte del código, pero debe colocarse antes del primer uso de cualquiera de las entidades del módulo.

Si se desea importar más de un módulo, se puede hacer repitiendo la cláusula import, o listando los módulos despues de la palabra reservada import, y separando el nombre de cada módulo con una coma (,)

Para acceder a la entidad de un módulo se utiliza la notación de punto:

math.pi

__pycache__

Cuando creamos modulos y los importamos se crea un directorio llamado __pycache__ y un archivo, por ejemplo:

<nombre_modulo>.cpython-39.pyc.

Donde los digitos corresponden versión de Python y la ultima parte (pyc) viene de las palabras Python y compilado.

Cuando Python importa un módulo por primera vez, traduce el contenido a una forma "semi" compilada.

El archivo no contiene código en lenguaje máquina: es código semi-compilado interno de Python, listo para ser ejecutado por el intérprete de Python.

Como tal archivo no requiere tantas comprobaciones como las de un archivo fuente, la ejecución comienza más rápido y también se ejecuta más rápido.

Python puede verificar si el archivo fuente del módulo ha sido modificado (en este caso, el archivo pyc será reconstruido) o no (cuando el archivo pyc pueda ser ejecutado al instante). Este proceso es completamente automático y transparente, no se tiene que estar tomando en cuenta.

__name__

También crea una variable llamada __name__.

Con tan solo hacer el import del módulo creado, se ejecuta como una extensión del programa desde el cual se importa, por ejemplo si el modulo solo tiene una línea que es un print("Hola módulo", al ejecutar el programa aparecerá dicho mensaje.

Archivo que importa el módulo:



Módulo creado:



Salida de la ejecución del archivo que importa el módulo:

Hola módulo mimodulo

  • Cuando se ejecuta un archivo directamente, su variable __name__ se establece a __main__.
  • Cuando un archivo se importa como un módulo, su variable __name__ se establece al nombre del archivo (excluyendo a .py).


Archivo que importa el módulo:



Módulo creado:



Salida de la ejecución del archivo que importa el módulo:

Hola módulo mimodulo
soy módulo
soy el programa que invoca el módulo


Se debe tener en mente que el módulo solo existe en un archivo independiente, pero al importar el módulo es una extensión del código por lo que, si se declara una variable en el módulo, el programa que importa, puede acceder a la variable anteponiendo el nombre del módulo y usando la notación de punto.

mimodulo.variable

A diferencia de muchos otros lenguajes de programación, Python no tiene medios para permitirte ocultar tales variables a los ojos de los usuarios del módulo.

Solo puedes informar a tus usuarios que esta es tu variable, que pueden leerla, pero que no deben modificarla bajo ninguna circunstancia. Esto se hace anteponiendo al nombre de la variable _ (un guión bajo) o __ (dos guiones bajos), pero recuerda, es solo un acuerdo. Los usuarios de tu módulo pueden obedecerlo o no. Python como se menciono no puede impedir que se altere la variable fuera del módulo.

path

¿Qué sucede cuando el archivo que invoca a un módulo se encuentra en otro directorio?

Hay una variable especial (en realidad una lista) que almacena todas las ubicaciones (carpetas o directorios) que se buscan para encontrar un módulo que ha sido solicitado por la instrucción import.

Python examina estas carpetas en el orden en que aparecen en la lista: si el módulo no se puede encontrar en ninguno de estos directorios, la importación falla.

De lo contrario, se tomará en cuenta la primera carpeta que contenga un módulo con el nombre deseado (si alguna de las carpetas restantes contiene un módulo con ese nombre, se ignorará).

La variable se llama path (ruta), y es accesible a través del módulo llamado sys.

Si hay un archivo zip listado como uno de los elementos de la ruta, Python puede tratar los archivos zip como carpetas ordinarias, esto puede ahorrar mucho almacenamiento.

Una solución podría ser:



__init__.py

Los paquetes, como los módulos, pueden requerir inicialización.

La inicialización de un módulo se realiza mediante un código independiente (que no forma parte de ninguna función) ubicado dentro del archivo del módulo. Como un paquete no es un archivo, esta técnica es inútil para inicializar paquetes.

En su lugar, debes usar un truco diferente: Python espera que haya un archivo con un nombre muy exclusivo dentro de la carpeta del paquete: __init__.py.

El contenido del archivo se ejecuta cuando se importa cualquiera de los módulos del paquete.

Si no deseas ninguna inicialización especial, se puede dejar el archivo vacío, pero no se debe omitir.

from

Existe una forma más óptima de importar un módulo y sus entidades:

from math import pi

Lo cual expresa que solo se importe esa parte del módulo y no el módulo completo.

De la misma manera que se pueden importar varios módulos, se pueden usar varias entidades de un módulo:

from math import pi, sin

Para importar todo:

from module import *

Para usar un alias

import math as m

from module import nombre as alias

from module import n as a, m as b, o as c

dir()

La función devuelve una lista ordenada alfabéticamente la cual contiene todos los nombres de las entidades disponibles en el módulo:

namespace

Un namespace es un espacio en el que existen algunos nombres y los nombres no entran en conflicto entre sí (es decir, no hay dos objetos diferentes con el mismo nombre).

El grupo tiende a nombrar a cada uno de sus miembros de una manera única.

Dentro de un determinado namespace, cada nombre debe permanecer único.
from

Para obtener cierta funcionalidad que Python proporciona se debe indicar a Python dónde obtenerla especificamente, esto con el uso de la keyword from.



Módulo Random

Un generador de números aleatorios toma un valor llamado semilla, lo trata como un valor de entrada, calcula un número "aleatorio" basado en él (el método depende de un algoritmo elegido) y produce una nueva semilla.

La duración de un ciclo en el que todos los valores semilla son únicos puede ser muy largo, pero no es infinito: tarde o temprano los valores iniciales comenzarán a repetirse y los valores generadores también se repetirán. Esto es normal. Es una característica, no un error.

El valor de la semilla inicial, establecido durante el inicio del programa, determina el orden en que aparecerán los valores generados.

El factor aleatorio del proceso puede ser aumentado al establecer la semilla tomando un número de la hora actual - esto puede garantizar que cada lanzamiento del programa comience desde un valor semilla diferente (por lo tanto, usará diferentes números aleatorios).

Afortunadamente, Python realiza dicha inicialización al importar el módulo.



El módulo cuenta con algunas funciones:



random.seed(a=None, version=2)

Inicializa el generador de números aleatorios.

Si se omite a o None, se utiliza la hora actual del sistema.

Si el sistema operativo proporciona las fuentes de aleatoriedad, se utilizan en lugar de la hora del sistema.

Si a es un int, se usa directamente.

Es capaz de establecer la semilla del generador.



random.randint(a, b)

Devuelve un entero aleatorio N tal que a <= N <= b.

Python y su entorno

Las niveles son:

Las capas son: ¿Qué sucede para que se ejecute el código?

Módulo platform

El módulo platform permite acceder a los datos de la plataforma subyacente, es decir, hardware, sistema operativo e información sobre la versión del intérprete.

Existe también una función que puede mostrar todas las capas subyacentes en un solo vistazo, llamada platform.

Simplemente devuelve una cadena que describe el entorno; por lo tanto, su salida está más dirigida a los humanos que al procesamiento automatizado.

machine() devuelve el nombre genérico del procesador.

processor() devuelve el nombre real del procesador.

system() devuelve el nombre genérico del sistema operativo.

version devuelve la versión del sistema operativo. python_implementation() y python_version_tuple() devuelven la versión de Python está ejecutando y el número de versión respectivamente.



Paquetes

Existe una jerarquía entre:

Un módulo es un contenedor lleno de funciones - puedes empaquetar tantas funciones como desees en un módulo y distribuirlo.

Un paquetes puede agrupar modulos.

Lambda

Al escribir programas de estilo funcional, a menudo necesitará pequeñas funciones que actúen como predicados o que combinen elementos de alguna manera.

Si la función que necesita no existe, debe escribirla.

Una forma de escribir funciones pequeñas es usar la expresión lambda.

lambda toma varios parámetros y una expresión que combina estos parámetros y crea una función anónima que: devuelve el valor de la expresión:

El siguiente código sirva para ejemplificar, sin embargo no es del todo correcto, PEP 8 indica que:

"no asigne una expresión lambda, use def".



Expresiones lambda

Se pueden crear pequeñas funciones anónimas con la palabra clave lambda.

Esta función devuelve la suma de sus dos argumentos: lambda a, b: a + b.

Las funciones Lambda se pueden utilizar siempre que se requieran objetos de función.

Están restringidos sintácticamente a una sola expresión.

Semánticamente, son simplemente azúcar sintáctico para una definición de función normal.

Utilidad

La utilidad de una función lambda es escribir partes anónimas de código destinadas a evaluar un resultado.



Manejo de fechas

Para el manejo de fechas se debe indicar al intérprete de Python que desde el módulo estándar de fecha y hora que viene con la biblioteca estándar, se importen las clases de fecha, hora y fecha y hora.



timedelta Objects

Un objeto timedelta representa una duración, la diferencia entre dos fechas u horas.



La diferncia entre time y timedelta es el formato que manejan, donde timedelta pudiera resultar más entendible para una persona, el estar su formato expresado en horas, minutos, segundos y milisegundos:



Módulo Calendario

Este módulo permite generar calendarios y proporciona funciones útiles relacionadas con el calendario.

De forma predeterminada, estos calendarios tienen el lunes como primer día de la semana y el domingo como último (la convención europea).

Utilice setfirstweekday() para establecer el primer día de la semana en domingo (6) o en cualquier otro día de la semana.

Los parámetros que especifican fechas se dan como números enteros.

Las funciones y clases definidas en este módulo utilizan un calendario idealizado, el actual calendario gregoriano extendido indefinidamente en ambas direcciones.
Esto coincide con la definición del calendario "gregoriano proléptico" en el libro "Calendrical Calculations" de Dershowitz y Reingold, donde es el calendario base para todos los cálculos.

Los años cero y negativos se interpretan según lo prescrito por la norma ISO 8601. El año 0 es 1 AC, el año -1 es 2 AC, y así sucesivamente.



Manejo de archivos

open()

Podemos acceder a un archivo a través de la función open(filename, mode) la cual regresa un objeto de tipo file, esta función tiene 2 argumentos, el primero indica el archivo a trabajar y el segundo el modo de acceso a este.

  1. El primer parámetro filename de la función especifica el nombre del archivo que se asociará al stream.

  2. El segundo parámetro mode especifica el modo de apertura utilizado para el stream; es una cadena llena de una secuencia de caracteres, y cada uno de ellos tiene su propio significado especial.
    • r solo lectura.
      El archivo asociado con el stream debe existir y tiene que ser legible, de lo contrario la función open() lanzará una excepción.
    • w solo escritura
      El archivo asociado con el stream no necesita existir.
      Si no existe, se creará;
      Si existe un archivo con el mismo nombre, podría ser eliminado. Si existe, se truncará a la longitud de cero (se borrá);
      Si la creación no es posible por ejemplo, debido a los permisos del sistema, la función open() lanzará una excepción.
    • a se abre para agregar contenido.
      El archivo asociado con el stream no necesita existir;
      Si no existe, se creará;
      Si existe, el cabezal de grabación virtual se establecerá al final del archivo y el contenido anterior del archivo permanece intacto.
      Cualquier dato agregado al archivo será agregado en automático al final.
    • r+ lectura y escritura
      Se abre el archivo tanto en modo lectura como escritura.
      El argumento de modo de acceso es opcional.
      El archivo asociado con el stream no necesita existir;
      Si no existe, se creará;
      Si existe, el contenido anterior del archivo permanece intacto.

    Nota: r por defecto si el modo de acceso es omitido su modo es de lectura. También puedes abrir un archivo para su creación exclusiva. Puedes hacer esto usando el modo de apertura x. Si el archivo ya existe, la función open() lanzará una excepción.

  3. El tercer parámetro opcional encoding especifica el tipo de codificación, por ejemplo, UTF-8 cuando se trabaja con archivos de texto.
Si la apertura es exitosa, la función devuelve un objeto stream; de lo contrario, se genera una excepción (por ejemplo, FileNotFoundError si el archivo que vas a leer no existe).

os

os este módulo proporciona una forma portátil de utilizar la funcionalidad dependiente del sistema operativo. Si desea manipular rutas, vea el módulo os.path



FileNotFoundError

Se genera cuando se solicita un archivo o directorio, pero no existe. Corresponde a errno ENOENT.



close

Si un archivo es abierto, este debe ser cerrado con el método close(), después de acceder a su modo.

Ejemplo, validar si el archivo existe, entonces mostrar su contenido, en caso contrario mostrar que no existe el archivo.



El siguiente ejemplo intenta abrir un archivo pero si no existe este, entonces lo crea:



write

El método write() espera solo un argumento: una cadena que se transferirá a un archivo abierto, el modo de apertura debe reflejar la forma en que se transfieren los datos (escribir en un archivo abierto en modo de lectura no tendrá éxito).

No se agrega carácter de nueva línea al argumento de write(), por lo que debe agregar si se desea que el archivo se complete con varias líneas.

El siguiente ejemplo creará el mismo archivo con el mismo contenido cada que se ejecute el programa:



Para escribir en el archivo se usa el método write(contenido), ejemplo que crea un archivo diferente cada vez que se ejecuta el programa:



Streams pre-abiertos

Cualquier operación del stream debe estar precedida por la invocación de la función open().

Hay tres excepciones bien definidas a esta regla: sys.stdin, sys.stdout y sys.stderr.

Cuando comienza nuestro programa, los tres streams ya están abiertos y no requieren ninguna preparación adicional.

sys.stdin

Entrada estándar. Se utiliza para todas las entradas interactivas (incluidas las llamadas a input ());

El stream stdin normalmente se asocia con el teclado, se abre previamente para la lectura y se considera como la fuente de datos principal para los programas en ejecución.

La función bien conocida input() lee datos de stdin por default.

sys.stdout

Salida estándar. Se usa para la salida de print() y declaraciones de expresión y para las solicitudes de input();

El stream stdout normalmente está asociado con la pantalla, preabierta para escritura, considerada como el objetivo principal para la salida de datos por el programa en ejecución.

La función bien conocida print() envía los datos al stream stdout.

sys.stderr

Salida de error estándar. Las propias indicaciones del intérprete y sus mensajes de error van a stderr.

El stream stderr normalmente está asociado con la pantalla, preabierta para escribir, considerada como el lugar principal donde el programa en ejecución debe enviar información sobre los errores encontrados durante su trabajo.

La separación de stdout resultados útiles producidos por el programa de stderr (mensajes de error, indudablemente útiles pero no proporcionan resultados) ofrece la posibilidad de redirigir estos dos tipos de información a los diferentes objetivos.

stream.close()

La última operación realizada en un stream (esto no incluye a los streams stdin, stdout, y stderr pues no lo requieren) debe ser cerrarlo.

Esa acción se realiza mediante un método invocado desde dentro del objeto del stream: stream.close().

Errores con streams

El objeto IOError está equipado con una propiedad llamada errno (el nombre viene de la frase error number, número de error).

El valor del atributo errno se puede comparar con una de las constantes simbólicas predefinidas en módulo errno.

https://docs.python.org/es/3/library/errno.html

https://docs.python.org/3/library/errno.html

strerror()

Devuelve el mensaje de error correspondiente al código de error en el código.

En plataformas donde strerror() devuelve NULL cuando se le da un número de error desconocido, se genera ValueError.



Ejemplo de lectura de un archivo con strerror():



Ejemplo de lectura de los caracteres que tiene de un archivo con strerror():



mode

Podemos conocer el modo de acceso del archivo con la propiedad mode.

read

Para obtener el contenido del archivo se usa el método read()

Para obtener todo el contenido del archivo por líneas se usa el método readlines().

tell

El método tell() devuelve un número entero que da la posición actual del objeto de archivo en el archivo representado como el número de bytes desde el principio del archivo cuando está en modo binario y un número opaco cuando está en modo texto.

readline

El método readline() lee solamente una línea del archivo.

El método intenta leer una línea completa de texto del archivo, y la devuelve como una cadena en caso de éxito. De lo contrario, devuelve una cadena vacía.

Ejemplo de lectura de los caracteres y líneas que tiene de un archivo con readline() strerror():



Para cambiar la posición del objeto de archivo, se usa el método seek(desplazamiento, de dónde). La posición se calcula sumando el desplazamiento a un punto de referencia; el punto de referencia se selecciona mediante el argumento de origen. Un valor de donde 0 mide desde el principio del archivo, 1 usa la posición actual del archivo y 2 usa el final del archivo como punto de referencia. donde se puede omitir y el valor predeterminado es 0, utilizando el comienzo del archivo como punto de referencia.

readlines

Cuando el método readlines(), se invoca sin argumentos, intenta leer todo el contenido del archivo y devuelve una lista de cadenas, un elemento por línea del archivo.

Si no estás seguro de si el tamaño del archivo es lo suficientemente pequeño y no deseas probar el sistema operativo, puede indicar al método readlines() de leer no más de un número especificado de bytes a la vez.

El tamaño máximo del búfer de entrada aceptado se pasa al método como argumento.

Ejemplo de lectura de los caracteres y líneas que tiene de un archivo con readlines() strerror():







Falta de portabilidad

Un programa capaz de procesar un archivo de texto y está escrito para Windows, puedes reconocer los extremos de las líneas al encontrar los caracteres \r\n, pero si el mismo programa se ejecuta en un entorno Unix/Linux será completamente inútil, y viceversa: el programa escrito para sistemas Unix/Linux podría ser inútil en Windows.

Estas características indeseables del programa, que impiden o dificultan el uso del programa en diferentes entornos, se denomina falta de portabilidad.

El rasgo del programa que permite la ejecución en diferentes entornos se llama portabilidad.

Un programa dotado de tal rasgo se llama programa portable.

Shutil

El módulo shutil ofrece una serie de operaciones de alto nivel en archivos y colecciones de archivos.
En particular, se proporcionan funciones que admiten la copia y eliminación de archivos.

El método copy() solo copia el contenido del archivo.
Si desea copiar cosas como la hora de modificación y otros metadatos asociados con el archivo, necesita usar el método copystat()



bytearrays

Objetos de arreglos de bytes (bytearrays)

Clases especializadas de Python que usa para almacenar datos amorfos.

Datos amorfos son datos que no tienen forma específica, son solo una serie de bytes.

Estos datos amorfos no se pueden almacenarse como cadenas o listas.

Debe haber un contenedor especial capaz de manejar dichos datos.

Este subtipo de PyObject representa un objeto arreglo de bytes de Python, es un arreglo que contiene bytes (amorfos).

data = bytearray(100)

La invocación crea un objeto bytearray capaz de almacenar diez bytes.

Nota: dicho constructor llena todo el arreglo con ceros.

Los bytearrays son mutables, son suceptibles a la función len(), y se puede acceder a cualquiera de sus elementos usando indexación convencional.

No se debe establecer ningún elemento del arreglo de bytes con un valor que no sea un entero, violar esta regla causará una excepción TypeError y tampoco está permitido asignar un valor fuera del rango de 0 a 255 un valor diferente provoca una excepción ValueError.

hex()

Convierte un número entero en una cadena hexadecimal en minúscula con el prefijo "0x".

Si x no es un objeto int de Python, tiene que definir un método __index __() que devuelva un número entero:

print(hex(255)) # 0xff
print(hex(-42)) # -0x2a


En el siguiente ejemplo se usa la función hex() para ver los elementos impresos como valores hexadecimales.



Cómo escribir y leer bytes de un stream

Herramientas principales para trabajar con streams

El método write() devuelve la cantidad de bytes escritos correctamente.

El método readinto(b) lee bytes en objeto pre-asignado y grabable bytes-like object b, y retorna el número de bytes leído.

Por ejemplo, b puede ser una clase de tipo bytearray. Si el objeto está en modo sin bloquear y no hay bytes disponibles, se retorna None.



read(size=-1)

Lee y retorna hasta size en bytes. Si el argumento está omitido, None, o es negativo, los datos son leídos y retornados hasta que se alcance el fin del archivo. Un objeto bytes vacío se retorna si el stream está al final del archivo.

Si el argumento es positivo, y el stream subyacente no es interactiva, varias lecturas sin formato pueden ser otorgadas para satisfacer la cantidad de byte (al menos que primero se llegue al fin del archivo). Pero para los streams sin formato interactivas, a lo sumo una lectura sin formato será emitida y un resultado corto no implica que se haya llegado al fin del archivo.

Un BlockingIOError se lanza si el stream subyacente está en modo no bloqueo y no tiene datos al momento.

read() invocado sin argumentos, intenta leer todo el contenido del archivo en la memoria, haciéndolo parte de un objeto recién creado de la clase bytes.

Esta clase tiene algunas similitudes con bytearray, con la excepción de una diferencia significativa: es immutable.



Si el método read() se invoca con un argumento, se especifica el número máximo de bytes a leer.

El método intenta leer la cantidad deseada de bytes del archivo, y la longitud del objeto devuelto puede usarse para determinar la cantidad de bytes realmente leídos.



URL handling modules

urllib es un paquete que recopila varios módulos para trabajar con URL: Proporciona las clases y el código necesario para realizar solicitudes http, la clase request, devolverá un objeto response.

Códigos de estado de respuesta HTTP

Los códigos de estado de respuesta HTTP indican si se ha completado satisfactoriamente una solicitud HTTP específica. Las respuestas se agrupan en cinco clases:

json

JSON (JavaScript Object Notation), es un formato de intercambio de datos ligero, inspirado en la sintaxis literal de objetos JavaScript (aunque no es un subconjunto estricto de JavaScript).

json expone una API familiar para los usuarios de los módulos estándar de biblioteca marshal y pickle.

json.loads() Deserializar s (una instancia de str, bytes o bytearray que contiene un documento JSON) a un objeto Python usando esta tabla de conversión.

Si los datos que se deserializan no son un documento JSON válido, se generará un JSONDecodeError.



HTML parser

Módulo que define una clase HTMLParser que sirve como base para analizar archivos de texto formateados en HTML y XHTML.

getpos()obtiene una tupla que indica número de línea [0] y una posición de carácter [1] en los datos donde, se encontró la coincidencia.

Los manejadores de tags HTML deben tener el nombre correcto handle_comment, con otro nombre no funciona.

Es mejor indicar la codificación que tiene el archivo para evitar errores open("fileName.ext", encoding="utf8")



xml.dom.minidom

xml.dom.minidom es una implementación mínima de la interfaz Document Object Model, con una API similar a la de otros lenguajes.

Está destinado a ser más simple que el DOM completo y también significativamente más pequeño.

Los usuarios que aún no dominan el DOM deberían considerar el uso del módulo xml.etree.ElementTree para su procesamiento XML.





pip- The Python Package Installer

pip es un sistema de gestión de paquetes utilizado para instalar y administrar paquetes de software escritos en Python. Muchos paquetes pueden ser encontrados en el Python Package Index (PyPI). Python 2.7.9 y posteriores (en la serie Python2), Python 3.4 y posteriores incluyen pip (pip3 para Python3) por defecto.

pip es un acrónimo recursivo que se puede interpretar como Pip Instalador de Paquetes o Pip Instalador de Python.

Jupyter

El Proyecto Jupyter es una organización sin ánimo de lucro creada para "desarrollar software de código abierto, estándares abiertos y servicios para computación interactiva en docenas de lenguajes de programación".

Creado a partir de IPython en 2014 por Fernando Pérez, el proyecto Jupyter soporta entornos de ejecución en varias docenas de lenguajes de programación.

El nombre del proyecto Jupyter es una referencia a los tres lenguajes de programación principales soportados por Jupyter, que son Julia, Python y R, y también un homenaje a los cuadernos de Galileo que registran el decubrimiento de los satélites de Júpiter.

El proyecto Jupyter ha desarrollado y respaldado los productos de computación interactiva Jupyter Notebook, JupyterHub y JupyterLab, la versión de próxima generación de Jupyter Notebook.

Installing the Jupyter Software
Getting started with the classic Jupyter Notebook

Anaconda

Anaconda es un distribución libre y abierta1​ de los lenguajes Python y R, utilizada en ciencia de datos, y aprendizaje automático (machine learning). Esto incluye procesamiento de grandes volúmenes de información, análisis predictivo y cómputos científicos. Está orientado a simplificar el despliegue y administración de los paquetes de software

Las diferentes versiones de los paquetes se administran mediante el sistema de gestión de paquetes conda, el cual lo hace bastante sencillo de instalar, correr, y actualizar software de ciencia de datos y aprendizaje automático como ser Scikit-team, TensorFlow y SciPy.

La distribución Anaconda es utilizada por 6 millones de usuarios e incluye más de 250 paquetes de ciencia de datos válidos para Windows, Linux y MacOS.



Pandas

Pandas es una herramienta de análisis y manipulación de datos de código abierto rápida, potente, flexible y fácil de usar, construido sobre el lenguaje de programación Python.

En Computación y Ciencia de datos, pandas es una biblioteca de software escrita como extensión de NumPy para manipulación y análisis de datos para el lenguaje de programación Python.
En particular, ofrece estructuras de datos y operaciones para manipular tablas numéricas y series temporales.
Es un software libre distribuido bajo la licencia BSD versión tres cláusulas.
El nombre deriva del término "datos de panel", término de econometría que designa datos que combinan una dimensión temporal con otra dimensión transversal.

Como instalar pandas de: PyPI

Instalación Jupyter

Anaconda es una distribución libre y abierta​ de los lenguajes Python y R, utilizada en ciencia de datos, y aprendizaje automático (machine learning).

Anaconda fue construida por científicos de datos, para científicos de datos.

Las soluciones Anaconda son una tecnología seria para aplicaciones de ML y ciencia de datos reales. Anaconda es versátil: estará listo para resolver problemas que ni siquiera sabe que tiene todavía.

Al descargar e instalar Anaconda una de sus herramientas es Jupyter

Acceda al sitio de Anaconda y descargue la versión que le convenga: Installing on Windows

Proyecto Jupyter

El Proyecto Jupyter es una organización sin ánimo de lucro creada para "desarrollar software de código abierto, estándares abiertos y servicios para computación interactiva en docenas de lenguajes de programación".

Creado a partir de IPython en 2014 por Fernando Pérez, el proyecto Jupyter soporta entornos de ejecución en varias docenas de lenguajes de programación.

El nombre del proyecto Jupyter es una referencia a los tres lenguajes de programación principales soportados por Jupyter, que son Julia, Python y R, y también un homenaje a los cuadernos de Galileo que registran el descubrimiento de los satélites de Júpiter.

El proyecto Jupyter ha desarrollado y respaldado los productos de computación interactiva Jupyter Notebook, JupyterHub y JupyterLab, la versión de próxima generación de Jupyter Notebook.

Una vez instalado Anaconda puede abrir o ejecutar Jupyter.

Jupyter Notebook

Jupyter Notebook (anteriormente IPython Notebooks) es un entorno informático interactivo basado en la web para crear documentos de Jupyter notebook.

El término "notebook" puede hacer referencia coloquialmente a muchas entidades diferentes, principalmente la aplicación web Jupyter, el servidor web Jupyter Python o el formato de documento Jupyter según el contexto.

Un documento de Jupyter Notebook es un documento JSON, que sigue un esquema versionado y que contiene una lista ordenada de celdas de entrada/salida que pueden contener código, texto (usando Markdown), matemáticas, gráficos y texto enriquecidos, generalmente terminado con la extensión ".ipynb".

Home page, crear o seleccionar una notebook

De inicio si nunca has utilizado Jupyter tendras una pequeña curva de aprendizaje para familiarizarte con su forma de trabajo, por ejemplo:

Lo primero que debes saber es que Jupyter abre un entorno web, es decir, vas a trabajar en una página web que se abre al iniciar Jupyter.

Por cierto puedes abrir Anacanda Navigator que es una aplicación de escritorio y que muestra todas sus herramientas, entre ella Jupyter y desde ahí solo basta un clic para abrir.

O bien puedes ejecutar directamente Jupyter sin abrir Anaconda Navigator, en este caso se abre un servidor web por lo que se tiene una consola, la cual indica instrucciones para su uso.

En un browser o navegador se abre la siguiente URL http://localhost:8888/tree

Donde localhost hace referencia a un servidor web o http local y los dos puntos sirven para especificar el puerto 8888 donde estará funcionando, es decir, donde el servidor HTTP “escucha” la petición hecha por un cliente.

Se presentan tres pestañas: Files, donde puede navegar entre los directorios de la máquina, Running, Actualmente ejecutando procesos de Jupyter y clusters, ipyparallel.

Los botones:

Nueva notebook

Al dar clic en el kernel de Python por ejemplo, se abre una nueva página, la cual no tiene título, pero que es posible almacenar con un nombre. Además indica cuando se hizo el último checkpoint



Un menú principal con las opciones: File, Edit, View, insert, Cell, Kernel, Widgets, Help, al extremo derecho de este menú se muestra el lenguaje seleccionado que puede ser Python 3 por ejemplo.

Debajo del menú principal tenemos unos accesos directos representados por un ícono, así como una lista seleccionable que contiene por ejemplo: Code, Markdown, Raw NBconvert, Heading, con estas opciones cambiamos el tipo de edición, por ejemplo si estamos documentando tal vez lo estemos haciendo con Markdown, pero si estamos codificando será Code.

Celdas

Debajo del menú se inicia la notebook, por defecto muestra una celda.



Aquí es donde escribes las instrucciones por ejemplo en Python, despúes de donde se indica In [ ]: y en la parte sombreada, podrías escribir

print("Hola mundo")

y para ejecutar la instrucción debes dar CTRL + Intro o con el ícono que dice Run

Ejecutada la celda inicia una numeración In [n]:

Si la instrucción esta procesandose se mostrara un *

Al final de su ejecución debajo de la celda se muestra el resultado o un mensaje de error si lo hubo.

Insertar una celda

De lo más simple, de los accesos director, dar clic en el ícono de +.

Cambiar orden de celdas

Simple, coloca el cursor en la celda que deseas mover y con los íconode de las flechas arriba y abajo, situar en el lugar que mejor convenga.

Al ejecutar las celdas, el número de celda cambia y se reordena.

Cortar, copiar y pegar celdas

Es posible Cortar, copiar y pegar celdas, como en cualquier editor de texto, las cortamos o copiamos y pegamos en donde sea conveniente.

Kernel: Interrupt, restart, reconnect, shutdown

Permite controlar la ejecución de celdas o la notebook, es decir el kernel.

Instalación de paquetes en Anaconda

Si es necesario instalar paquetes, podemos usar la herramienta de Anaconda llamada Anaconda prompt, al ejecutar la herramienta se abre una terminal.

Escribimos el comando: conda install nombre_paquete

Apache spark para windows

Apache Spark es un framework de computación en clúster open-source.

Fue desarrollada originariamente en la Universidad de California, en el AMPLab de Berkeley.

El código base del proyecto Spark fue donado más tarde a la Apache Software Foundation que se encarga de su mantenimiento desde entonces.

Spark proporciona una interfaz para la programación de clusters completos con Paralelismo de Datos implícito y tolerancia a fallos.

Apache Spark se puede considerar un sistema de computación en clúster de propósito general y orientado a la velocidad.

Proporciona APIs en Java, Scala, Python, R y un motor optimizado que soporta la ejecución de grafos en general.

También soporta un conjunto extenso y rico de herramientas de alto nivel entre las que se incluyen Spark SQL (para el procesamiento de datos estructurados basada en SQL), MLlib para implementar machine learning, GraphX para el procesamiento de grafos y Spark Streaming.

Para instalar lo usual, acceder al sitio del producto spark.apache.org buscar la sección de descarga, para cuando se consulto la página indicaba seleccionar la versión de spark y el tipo de paquete.

Para la instalación y configuración sigan las instrucciones del sitio oficial.

Una vez instalado para trabajar con el ambiente de Spark deben acceder al directorio donde este fue instalado y configurado, el comando es el siguiente:

C:\Spark\spark-2.4.5-bin-hadoop2.7\bin\spark-shell

	Welcome to
	____              __
   / __/__  ___ _____/ /__
  _\ \/ _ \/ _ `/ __/  '_/
 /___/ .__/\_,_/_/ /_/\_\   version 2.4.7
	/_/

Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 11.0.9)
Type in expressions to have them evaluated.
Type :help for more information.
scala>

Pandas

10 minutes to pandas

Su principal desarrollador, Wes McKinney, empezó a desarrollar Pandas en el año 2008 mientras trabajaba en AQR Capital por la necesidad que tenía de una herramienta flexible de alto rendimiento para realizar análisis cuantitativo en datos financieros.

Antes de dejar AQR convenció a la administración de la empresa de distribuir esta biblioteca bajo licencia de código abierto.

Otro empleado de AQR, Chang Ella, se unió en 2012 al esfuerzo de desarrollo de la biblioteca.

Pandas es una herramienta de análisis y manipulación de datos de código abierto rápida, potente, flexible y fácil de usar, construido sobre el lenguaje de programación Python.

En Computación y Ciencia de datos, Pandas es una biblioteca de software escrita como extensión de NumPy para manipulación y análisis de datos para el lenguaje de programación Python.

En particular, ofrece estructuras de datos y operaciones para manipular tablas numéricas y series temporales.

Es un software libre distribuido bajo la licencia BSD versión tres cláusulas.​

El nombre deriva del término "datos de panel", término de econometría que designa datos que combinan una dimensión temporal con otra dimensión transversal.

Para usar Pandas se hace a través de un import y se recomienda se declare como pd como convención.



pandas.read_csv

De la misma manera por convención un DataFrame se declara como df, por ejemplo pandas.read_csv que lee un archivo de valores separados por comas (csv) en un Dataframe

DataFrame es una estructura de datos etiquetada bidimensional con columnas de tipos potencialmente diferentes.

Puede pensar en ello como una hoja de cálculo o una tabla SQL, o un dict de objetos Series. Generalmente es el objeto de pandas más utilizado.

Junto con los datos, puede pasar opcionalmente argumentos de índice (etiquetas de fila) y columnas (etiquetas de columna).

Si pasa un índice y / o columnas, está garantizando el índice y / o columnas del DataFrame resultante.

Por lo tanto, un dict de Serie más un índice específico descartará todos los datos que no coincidan con el índice pasado.

Si no se pasan las etiquetas de los ejes, se construirán a partir de los datos de entrada basándose en reglas de sentido común.

Ejemplo de un un archivo csv: Import_User_Sample_en.csv

En Windows debemos tener en cuenta la sintaxis, los signos / (diagonal o barra) y \ slash (diagonal inversa o barra inversa) tienen significados y usos diferentes en Jupyter.

Las siguientes rutas o paths pueden resultar correctos:

"C:\\Users\\usuarioWindows>\\Documents\\pandas\\ejemplo.csv"

"C:/Users/usuarioWindows/Documents/pandas/ejemplo.csv"

pandas.DataFrame.head

DataFrame.head(n=5)[source]

Devuelve las primeras n filas. Si no se especifica el número de filas por defecto son las primeras 5.

Esta función devuelve las primeras n filas del objeto según la posición.

Su contraparte es .tail(), devuelve las últims n filas del objeto.

Leer y ver el contenido de un archivo csv



Note que el índice inicia en 0 y que también puede limitar el número de renglones o filas a leer desde la lectura del archivo al incluir nrows:

df = pd.read_csv("C:/Users/usuarioWindows/Documents/pandas/ejemplo.csv", nrows = 3)

DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

pandas.DataFrame.sample

Devuelve una muestra aleatoria de elementos de un eje de objeto.



Donde frac decimal, opcional. Fracción de elementos del eje para devolver. 1 genera un índice aleatorio en todas las filas.

pandas.DataFrame.columns: Index

pandas.DataFrame.columns

Muestra las etiquetas de columna del DataFrame.



Out[n]: Index(['User Name', 'First Name', 'Last Name', 'Display Name', 'Job Title', 'Department', 'Office Number', 'Office Phone', 'Mobile Phone', 'Fax', 'Address', 'City', 'State or Province', 'ZIP or Postal Code', 'Country or Region'], dtype='object')

pandas.DataFrame.index

DataFrame.index: Index

El index (etiquetas de fila) del DataFrame. Recupere las etiquetas de índice.



Out[n]: RangeIndex(start=0, stop=5, step=1)

Si deseamos ver los valores de una columna basta con indicar a través de la notación de punto el nombre de la columna, ya que es un atributo del dataframe.



Si la columna tiene espacios:



Nota: Working With Pandas: Fixing Messy Column Names:

df.columns = df.columns.str.strip().str.lower().str.replace(' ', '_').str.replace('(', '').str.replace(')', '')

Si se necesita conocer el tipo de datos de cada columna:



pandas.DataFrame.values

property DataFrame.values

Devuelve una representación Numpy del DataFrame.

Se recomienda usar DataFrame.to_numpy() en su lugar.



Out[n]: array([['chris@contoso.com', 'Chris', 'Green', 'Chris Green', 'IT Manager', 'Information Technology', 123451, '123-555-1211', '123-555-6641', '123-555-9821', '1 Microsoft way', 'Redmond', 'Wa', 98052, 'United States'], ['ben@contoso.com', 'Ben', 'Andrews', 'Ben Andrews', 'IT Manager', 'Information Technology', 123452, '123-555-1212', '123-555-6642', '123-555-9822', '1 Microsoft way', 'Redmond', 'Wa', 98052, 'United States'], ['david@contoso.com', 'David', 'Longmuir', 'David Longmuir', 'IT Manager', 'Information Technology', 123453, '123-555-1213', '123-555-6643', '123-555-9823', '1 Microsoft way', 'Redmond', 'Wa', 98052, 'United States'], ['cynthia@contoso.com', 'Cynthia', 'Carey', 'Cynthia Carey', 'IT Manager', 'Information Technology', 123454, '123-555-1214', '123-555-6644', '123-555-9824', '1 Microsoft way', 'Redmond', 'Wa', 98052, 'United States'], ['melissa@contoso.com', 'Melissa', 'MacBeth', 'Melissa MacBeth', 'IT Manager', 'Information Technology', 123455, '123-555-1215', '123-555-6645', '123-555-9825', '1 Microsoft way', 'Redmond', 'Wa', 98052, 'United States']], dtype=object)

Obtener filas por rango



Obtiene un rango de filas desde el limite inferior y hasta el limite superior.

Recuerde que el índice inicia en 0

Obtener filas por condiciones



Obtener filas por funciones con condiciones



pandas.isna

Detecta valores faltantes para un objeto tipo matriz.

Esta función toma un objeto escalar o similar a una matriz e indica si faltan valores (NaN (Not a Number) en matrices numéricas, Ninguno o NaN en matrices de objetos, NaT (Not a Time) en datetimelike).



pandas.DataFrame

DataFrame

Datos tabulares bidimensionales, de tamaño mutable y potencialmente heterogéneos.

La estructura de datos también contiene ejes etiquetados (filas y columnas).

Las operaciones aritméticas se alinean en las etiquetas de fila y columna.

Se puede considerar como un contenedor similar a un dict para los objetos de la serie. La estructura de datos primaria de los pandas.

Crear un dataframe con pandas

Creando un DataFrame pasando un dict de objetos que se pueden convertir a series.



Almacenar DataFrame como archivo excel

Escribe el objeto en una hoja de Excel.



Leer y ver el contenido de un archivo excel con pandas

pandas.read_excel

Escribe el objeto en una hoja de Excel.



Crear un DataFrame y almacenar como archivo csv

pandas.DataFrame.to_csv

Escriba el objeto en un archivo de valores separados por comas (csv).



Leer y mostrar un archivo csv con pandas

pandas.read_csv

Lea un archivo de valores separados por comas (csv) en DataFrame.

También admite, opcionalmente, iterar o dividir el archivo en trozos.



Crear un archivo zip que contenga un archivo csv



Trabajar con columnas

Es posible cambiar los valores de una columna y adecuarlos a conveniencia.



Así como aplicar funciones como round() y otras funciones.

Se puede aplicar a la propia columna o al dar un nombre se crea una nueva columna:



La nueva columna es creada al final de todas.

Para eliminar esta columna use del(dataframe["nombre columna"])



Para eliminar más de una columna use drop(dataframe["col a","col b","col b",..."col n"]) Elimina las etiquetas especificadas de filas o columnas.

pandas.DataFrame.drop

Elimina filas o columnas especificando los nombres de las etiquetas y el eje correspondiente, o especificando directamente los nombres de índice o columna.

Cuando se utiliza un índice múltiple, las etiquetas de diferentes niveles se pueden eliminar especificando el nivel.



NOTA 1: Si no especifica axis se genera un error, es necesario indicar de que eje se quiere eliminar.

NOTA 2: Para afectar el dataframe con esta función, sera necesario entonces asignar el resultado a la variable dataframe



Otra manera es usar el parámetro inplace = True



Para eliminar una columna puede usar df.drop(índice)



Para eliminar más de una columna puede usar df.drop( range(start, stop[, step]) )

El siguiente ejemplo elimina los pares incluso el 10.



NOTA: Recuerde el uso de asignar a la variable dataframe el resultado.

pandas.DataFrame.append

pandas.DataFrame.append

Agrega filas de otros al final del dataframe que invoca, devolviendo un nuevo objeto.

Las columnas en otros que no están en quien invoca se agregan como nuevas columnas.

Podemos crear nuevos dataframes a partir de uno existente:



Así como es posible agregar un dataframe a otro:



pandas.read_excel

pandas.read_excel

Lee un archivo de Excel en un DataFrame de pandas. Admite extensiones de archivo xls, xlsx, xlsm, xlsb, odf, ods y odt leídas desde un sistema de archivos local o URL.

(archivo MS-Excel ejemplo: Financial Sample.xlsx)



Admite una opción para leer una sola hoja o una lista de hojas.

pandas.DataFrame.groupby

pandas.DataFrame.groupby

Una operación de grupo implica una combinación de:
  1. Dividir el objeto,
  2. Aplicar una función y
  3. Combinar los resultados.
Esto se puede utilizar para agrupar grandes cantidades de datos y calcular operaciones en estos grupos.

(archivo MS-Excel ejemplo: Financial Sample.xlsx)

Muestra todas las columnas del dataframe con las filas agrupadas por la columna Country:





Es necesario señalar que el orden en el cual se lista más de una columna en groupby cambia el sentido de la lectura y la información que deseamos obtener:



pandas.core.groupby.DataFrameGroupBy.describe

pandas.core.groupby.DataFrameGroupBy.describe

Genera estadísticas descriptivas.

Las estadísticas descriptivas incluyen aquellas que resumen la tendencia central, la dispersión y la forma de la distribución de un conjunto de datos , excluyendo los valores de NaN.

Analiza series numéricas y de objetos, así como conjuntos de columnas DataFrame de tipos de datos mixtos. La salida variará según lo que se proporcione. Consulte las notas a continuación para obtener más detalles.



La salida agrupa por Country, que forma parte de las columnas y las columnas de describe() son count, mean, std, min, 25%, 50%, 75% (cuartiles), max.

pandas.DataFrame.drop_duplicates

drop_duplicates

Devuelve DataFrame con filas duplicadas eliminadas.

Tener en cuenta ciertas columnas es opcional. Los índices, incluidos los índices de tiempo, se ignoran.

El siguiente ejercicio del dataframe ramen contiene valores repetidos, que se pueden tratar:



De forma predeterminada, elimina las filas duplicadas en función de todas las columnas:



Para eliminar duplicados en columnas específicas, use subset.



Para eliminar duplicados y conserva última coincidencia, use keep.



pandas.io.formats.style.Styler.background_gradient

Colorea el fondo con un estilo degradado.

El color de fondo se determina según los datos de cada columna (opcionalmente fila). Requiere matplotlib.

dataframe.style.background_gradient()

BIBLIOTECA NumPy

NumPy v1.20 Manual

El paquete fundamental para la informática científica con Python (numpy.org/install)

Distribución de Anaconda: incluye Python, NumPy y muchos otros paquetes de uso común para la informática científica y la ciencia de datos.

NumPy es el paquete fundamental para la computación científica en Python. Es una biblioteca de Python que proporciona un objeto de matriz multidimensional, varios objetos derivados (como matrices y matrices enmascaradas) y una variedad de rutinas para operaciones rápidas en matrices, que incluyen manipulación matemática, lógica, de formas, clasificación, selección, E/S, transformadas discretas de Fourier, álgebra lineal básica, operaciones estadísticas básicas, simulación aleatoria y mucho más.

En el núcleo del paquete NumPy , está el objeto ndarray. Esto encapsula matrices n-dimensionales de tipos de datos homogéneos, con muchas operaciones que se realizan en código compilado para el rendimiento.

Existen varias diferencias importantes entre las matrices NumPy y las secuencias estándar de Python

NumPy es una biblioteca para el lenguaje de programación Python que da soporte para crear vectores y matrices grandes multidimensionales, junto con una gran colección de funciones matemáticas de alto nivel para operar con ellas.

El precursor de NumPy, Numeric, fue creado originalmente por Jim Hugunin con contribuciones de varios otros desarrolladores.

En 2005, Travis Oliphant creó NumPy incorporando características de la competencia Numarray en Numeric, con amplias modificaciones.

NumPy es un software de código abierto y cuenta con muchos colaboradores.



pandas.series

series

ndarray unidimensional con etiquetas de eje (incluidas series de tiempo).

Las etiquetas no necesitan ser únicas, pero deben ser de tipo hashtable.

El objeto admite la indexación basada tanto en números enteros como en etiquetas y proporciona una serie de métodos para realizar operaciones relacionadas con el índice.

Los métodos estadísticos de ndarray se han anulado para excluir automáticamente los datos faltantes (actualmente representados como NaN).



pandas.get_dummies

get_dummies

Convierte la variable categórica en variables ficticias/indicadoras.



numpy.array

numpy.array

Crea una matriz y devuelve ndarray un objeto de matriz que cumple los requisitos especificados.



Out[n]: array([1, 2, 3])



Upcasting

Out[n]: array([1. 2., 3.])

Más de una dimensión:



Out[n]:
array([[1, 2],
	   [3, 4]])
Acceso a los elementos de un array

Creación de la matriz:



Mostrar la matriz:



Out[n]:
array([['a', 'b', 'c'],
       ['x', 'y', 'z'],
       ['d', 'e', 'f'],
       ['m', 'n', 'o']], dtype='<U1')				
			
El acceso al array se hace mediante corchetes haciendo referencia al índice del elemento.

Nota: recuerde que los elementos de una matriz inician con el índice 0



Out[n]: 'y'



Out[n]: 'y'



Out[n]: array(['d', 'e', 'f'], dtype='<U1')

De la siguiente matriz...

cuatro = np.array(
   [
      [#0i
         [0,0,0,0], ##0j
         [0,0,4,0]  ##1j
      ],
      [#1i
         [0,0,0,0], ##0j
         [0,0,0,0]  ##1j
      ],
      [#2i
         [0,0,0,0], ##0j
         [0,0,0,0]  ##1j
      ]
    ###k  0 1 2 3 
   ]
)
cuatro
¿Cuál sería la salida?



De la siguiente matriz...

cinco = np.array(
   [
      [#0i
         [0,0,0,0], ##0j
         [0,0,4,0]  ##1j
      ],
      [#1i
         [0,0,0,0], ##0j
         [0,0,0,0]  ##1j
      ],
      [#2i
         [0,0,0,0], ##0j
         [5,0,0,0]  ##1j
      ]
    ###k  0 1 2 3 
   ]
)
cinco
¿Cuál sería la salida?



numpy.ndarray

ndarray

Un objeto de matriz representa una matriz homogénea y multidimensional de elementos de tamaño fijo.

Un objeto de tipo de datos asociado describe el formato de cada elemento en el array (su orden de bytes, cuántos bytes ocupa en la memoria, si es un entero, un número de coma flotante u otra cosa, etc.)

np.ndarray(shape=(2,2), dtype=float, order='F')

numpy.ma.zeros

numpy.ma.zeros

Devuelve una nueva matriz de forma y tipo dados, llena de ceros.



Out[n]: array([], dtype=float64)



Out[n]: array([0.])



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



Out[n]: array([[0, 0, 0],[0, 0, 0]])



Out[n]: array([[0, 0],[0, 0],[0, 0]])

numpy.ma.ones

numpy.ma.ones

Devuelve una nueva matriz de forma y tipo dados, llena de unos.



Out[n]: array([[1, 1],[1, 1],[1, 1]])

Operaciones entre arrays

Es posible hacer operaciones entre arrays siempre y cuando tengan las mismas dimensiones.



Out[n]: array([[2, 2], [2, 2], [2, 2]])

numpy.ma.reshape

numpy.ma.reshape

Devuelve una matriz que contiene los mismos datos con una nueva forma.



Out[n]: array([[[1], [2], [3]], [[1], [2], [3]], [[1], [2], [3]]])



Out[n]: array([[[1, 2, 3], [1, 2, 3], [1, 2, 3]]])

numpy.random.rand

numpy.random.rand

Valores aleatorios en una forma determinada.



Out[n]: array([[0.24841231, 0.27484909, 0.16803216, 0.7224534 ], [0.36331669, 0.24167854, 0.2862648 , 0.52071995]])

Correlación

En probabilidad y estadística, la correlación indica la fuerza y la dirección de una relación lineal y proporcionalidad entre dos variables estadísticas cuantitativas.

Se considera que dos variables cuantitativas están correlacionadas cuando los valores de una de ellas varían sistemáticamente con respecto a los valores homónimos de la otra:

   si tenemos dos variables (A y B)

existe correlación entre ellas

   si al disminuir los valores de A lo hacen también los de B y viceversa.

La correlación entre dos variables no implica, por sí misma, ninguna relación de causalidad.

¿Y cómo se hace esto en Python?

Recordemos que para eso se crean las bibliotecas, funciones, paquetes, etc.

numpy.corrcoef

Devuelve los coeficientes de correlación producto-momento de Pearson.

Consulte la documentación de cov para obtener más detalles.

La relación entre la matriz de coeficientes de correlación, R, y la matriz de covarianzas, C, es



Los valores de R se encuentran entre -1 y 1, inclusive.

Para usar numpy.corrcoef() es necesario que el dataframe no contenga valores NaN o la función no permite valores faltantes.

Por lo que será necesario omitirlos o limpiarlos, para ello puede usar de Pandas: pandas.DataFrame.dropna que elimina valores faltantes.

dataframe.dropna( inplace = True, subset = ["col_a", "col_b"] )

Cuando el dataframe no tiene valores faltantes entonces ya se puede usar numpy.corrcoef():



pandas.DataFrame.dropna

dropna

Elimina los valores faltantes.



pandas.DataFrame.corr

pandas.DataFrame.corr

Calcula la correlación de columnas por pares, excluyendo NA/valores nulos.

Como buena practica elimine primero del dataframe aquellas columnas que no son numéricas, esto se puede hacer usando dataframe.drop()

(archivo MS-Excel ejemplo: Financial Sample.xlsx)

df.drop( inplace= True, columns = ["Segment", "Country", "Product", "Discount Band", "Month Name"])

Limpio el dataframe puede ejecutar:

dataframe.corr()

numpy.percentile

percentile

Calcule el percentil q-ésimo de los datos a lo largo del eje especificado.

Devuelve el q-ésimo percentil (s) de los elementos de la matriz.

Nota: La mediana es el segundo cuartil

¿Qué es el rango intercuartílico?

El rango intercuartílico es la diferencia entre el tercer cuartil y el primer cuartil.

Es una medida de la dispersión estadística.



pandas.DataFrame.from_records

from_records

Convierte un ndarray estructurado o de registro en DataFrame.

Crea un objeto DataFrame a partir de un ndarray estructurado, una secuencia de tuplas o dictados, o un DataFrame.

Ejercicio

Podemos definir en un array los valores de un DataFrame:



Y en otro array los datos para ese DataFrame:



Solo resta convertir a DataFrame:



Si deseamos obtener valores únicos de una columna podemos usar drop_duplicates: (manteniendo solo la primer coincidencia)



Si necesitamos utilizar solo ciertos datos o columnas, entonces:



pandas.DataFrame.join

join

Une columnas de otro DataFrame.

Unir columnas con otro DataFrame en el índice o en una columna clave.

Une eficientemente varios objetos DataFrame por índice a la vez pasando una lista.

Si tenemos un primer DataFrame:



Y tenemos otro DataFrame:



Es posible unirlos a un DataFrame utilizando sus índices:



Si queremos unir usando las columnas de clave, debemos configurar la clave para que sea el índice tanto en df como en otros.

El DataFrame unido tendrá key como índice.



Otra opción para unir usando las columnas clave es usar el parámetro on.

DataFrame.join siempre usa el índice de other, pero podemos usar cualquier columna en df.

Este método conserva el índice del DataFrame original en el resultado.



pandas.merge

merge

merge u objetos de serie con nombre, con un join de estilo de base de datos.

La unión se realiza en columnas o índices.

Si une columnas en columnas, se ignorarán los índices de DataFrame.

De lo contrario:

Si se unen índices en índices o índices en una columna o columnas, el índice se transferirá.

Al realizar una fusión cruzada, no se permiten especificaciones de columna para fusionar.



Hacer merge de df1 y df2 en las columnas clave y clave.

Las columnas de valor tienen los sufijos predeterminados, _x y _y, agregados.



Combine DataFrames df1 y df2 con los sufijos left y right especificados adjuntos a las columnas superpuestas.



matplotlib

Matplotlib es una biblioteca completa para crear visualizaciones estáticas, animadas e interactivas en Python.

Matplotlib es una biblioteca para la generación de gráficos a partir de datos contenidos en listas o arrays en el lenguaje de programación Python y su extensión matemática NumPy.

Proporciona una API, pylab, diseñada para recordar a la de MATLAB que es un sistema de cómputo numérico que ofrece un entorno de desarrollo integrado con un lenguaje de programación propio.

Ejemplos de lo que se puede hacer:

Usage Guide

Usage Guide : A simple example

La forma más sencilla de crear una figura con ejes es utilizando pyplot.subplots.

Luego podemos usar Axes.plot para dibujar algunos datos en los ejes:

subplots

matplotlib.pyplot.pie

matplotlib.pyplot.pie : Basic pie chart



subplots

Nota: observe los parámetros shadow y startangle, sobre todo startangle donde se indica en donde comenzar a partir las rebanadas.

matplotlib.pyplot.scatter

matplotlib.pyplot.scatter : Scatter plot



seaborn

statistical data visualization

Seaborn es una biblioteca de visualización de datos de Python basada en matplotlib.

Proporciona una interfaz de alto nivel para dibujar gráficos estadísticos atractivos e informativos.

Seaborn es una biblioteca para hacer gráficos estadísticos en Python. Se basa en matplotlib y se integra estrechamente con las estructuras de datos de pandas.

Seaborn le ayuda a explorar y comprender sus datos. Sus funciones de trazado operan en marcos de datos y matrices que contienen conjuntos de datos completos y realizan internamente el mapeo semántico y la agregación estadística necesarios para producir gráficos informativos.

Su API declarativa y orientada a conjuntos de datos le permite centrarse en lo que significan los diferentes elementos de sus gráficos, en lugar de en los detalles de cómo dibujarlos.



subplots

Aprendizaje automático - Machine Learning

¿Qué es machine learning?

Machine learning es una forma de la IA que permite a un sistema aprender de los datos en lugar de aprender mediante la programación explícita.

Sin embargo, machine learning no es un proceso sencillo.

Conforme el algoritmo ingiere datos de entrenamiento, es posible producir modelos más precisos basados en datos.

Un modelo de machine learning es la salida de información que se genera cuando entrena su algoritmo de machine learning con datos.

Después del entrenamiento, al proporcionar un modelo con una entrada, se le dará una salida.

Por ejemplo, un algoritmo predictivo creará un modelo predictivo. A continuación, cuando proporcione el modelo predictivo con datos, recibirá un pronóstico basado en los datos que entrenaron al modelo.

Aprendizaje iterativo

Machine learning permite modelos a entrenar con conjuntos de datos antes de ser implementados.

Algunos modelos de machine learning están online y son continuos.

Este proceso iterativo de modelos online conduce a una mejora en los tipos de asociaciones hechas entre los elementos de datos.

Debido a su complejidad y tamaño, estos patrones y asociaciones podrían haber sido fácilmente pasados por alto por la observación humana.

Después de que un modelo ha sido entrenado, se puede utilizar en tiempo real para aprender de los datos.

Las mejoras en la precisión son el resultado del proceso de entrenamiento y la automatización que forman parte del machine learning.

Enfoques hacia el machine learning

Las técnicas de machine learning son necesarias para mejorar la precisión de los modelos predictivos.

Dependiendo de la naturaleza del problema empresarial que se está atendiendo, existen diferentes enfoques basados en el tipo y volumen de los datos.

Aprendizaje supervisado

Aprendizaje supervisado

En aprendizaje automático y minería de datos, el aprendizaje supervisado es una técnica para deducir una función a partir de datos de entrenamiento.

Los datos de entrenamiento consisten de pares de objetos: una componente del par son los datos de entrada y el otro, los resultados deseados.

El aprendizaje supervisado comienza típicamente con un conjunto establecido de datos y una cierta comprensión de cómo se clasifican estos datos.

El aprendizaje supervisado tiene la intención de encontrar patrones en datos que se pueden aplicar a un proceso de analítica.

Estos datos tienen características etiquetadas que definen el significado de los datos.

Por ejemplo, se puede crear una aplicación de machine learning con base en imágenes y descripciones escritas que distinga entre millones de animales.

El objetivo del aprendizaje supervisado es el de crear una función capaz de predecir el valor correspondiente a cualquier objeto de entrada válida después de haber visto una serie de ejemplos, los datos de entrenamiento.

Para ello, tiene que generalizar a partir de los datos presentados a las situaciones no vistas previamente

Aprendizaje no supervisado

El aprendizaje no supervisado se utiliza cuando el problema requiere una cantidad masiva de datos sin etiquetar.

Por ejemplo, las aplicaciones de redes sociales, tales como Twitter, Instagram y Snapchat, tienen grandes cantidades de datos sin etiquetar.

La comprensión del significado detrás de estos datos requiere algoritmos que clasifican los datos con base en los patrones o clústeres que encuentra.

El aprendizaje no supervisado lleva a cabo un proceso iterativo, analizando los datos sin intervención humana.

Se utiliza con la tecnología de detección de spam en e-mails. Existen demasiadas variables en los e-mails legítimos y de spam para que un analista etiquete una cantidad masiva de e-mail no solicitado.

En su lugar, los clasificadores de machine learning, basados en clustering y asociación, se aplican para identificar e-mail no deseado.

Aprendizaje de refuerzo

El aprendizaje de refuerzo es un modelo de aprendizaje conductual.

El algoritmo recibe retroalimentación del análisis de datos, conduciendo el usuario hacia el mejor resultado.

El aprendizaje de refuerzo difiere de otros tipos de aprendizaje supervisado, porque el sistema no está entrenado con el conjunto de datos de ejemplo.

Más bien, el sistema aprende a través de la prueba y el error.

Por lo tanto, una secuencia de decisiones exitosas conduce al fortalecimiento del proceso,

porque es el que resuelve el problema de manera más efectiva.

Aprendizaje profundo o Deep learning

El deep learning es un método específico de machine learning que incorpora las redes neuronales en capas sucesivas para aprender de los datos de manera iterativa.

El deep learning es especialmente útil cuando se trata de aprender patrones de datos no estructurados.

Las redes neuronales complejas de deep learning están diseñadas para emular cómo funciona el cerebro humano, así que las computadoras pueden ser entrenadas para lidiar con abstracciones y problemas mal definidos.

Las redes neuronales y el deep learning se utilizan a menudo en el reconocimiento de imágenes, voz y aplicaciones de visión de computadora.

Big data

Aplicación de machine learning a las necesidades empresariales

Machine learning requiere que el correcto conjunto de datos se aplique a un proceso de aprendizaje.

Una organización no necesita de big data para utilizar las técnicas del machine learning; sin embargo, el big data puede ayudar a mejorar la precisión de los modelos de machine learning.

Con big data, ahora es posible virtualizar los datos para que se puedan almacenar de la forma más eficiente y eficaz en función de los costos, ya sea en el entorno local o en la nube.

Además, las mejoras en la velocidad y confiabilidad en la red han eliminado otras limitaciones físicas asociadas con la gestión de cantidades masivas de datos a una velocidad aceptable.

Añada a esto el impacto de los cambios en el precio y la sofisticación de la memoria de computadora y ahora es posible imaginar cómo las compañías pueden aprovechar los datos de formas que hubieran sido inconcebibles hace sólo cinco años.

¿Cómo unir todo?

La ventaja de machine learning es que es posible aprovechar algoritmos y modelos para predecir resultados.

Es importante asegurarse de que los científicos de datos que realizan el trabajo usen los algoritmos correctos, asimilando los datos más apropiados (que sean precisos y limpios) y utilizando los mejores modelos de rendimiento.

Si todos estos elementos se reúnen, es posible entrenar continuamente al modelo y explotar los resultados aprendiendo de los datos.

La automatización de este proceso de modelado, entrenamiento del modelo y pruebas conduce a predicciones precisas para dar soporte a los cambios empresariales.





References

Røcket       CDMX 1994 -