Saltar al contenido principal

11 publicaciones etiquetados con "python"

Ver Todas las Etiquetas

· 3 min de lectura
Darvin Cotrina

Para crear un modelo de deep learning en keras se pueden usar dos API’s: la secuencial y la funcional. La secuencial es la más sencilla de usar, pero la funcional es más flexible y permite crear modelos más complejos. En este notebook se muestra como crear un modelo funcional.

1. Importar modulo

import tensorflow as tf

2. Modelo Sequencial

Crearemos un modelo secuencial, que es una pila lineal de capas. Para ello, usaremos la función Sequential(), en el que nos basaremos para crear nuestro modelo funcional.

def sequential_model():
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
return model

Modelo con el API funcional

Ahora crearemos un modelo usando el api funcional de Keras. Este modelo es un poco más flexible que el modelo secuencial, ya que nos permite crear modelos con múltiples entradas y salidas, y también nos permite crear modelos con capas compartidas.

def functional_model():
# creamos nuestra entrada
input = tf.keras.Input(shape=(28, 28))
# creamos nuestra capas
x = tf.keras.layers.Flatten()(input)
x = tf.keras.layers.Dense(128, activation='relu')(x)
x = tf.keras.layers.Dense(64, activation='softmax')(x)
# definimos nuestro modelo
model = tf.keras.Model(inputs=input, outputs=x)
return model

model_func = functional_model()

3. Entrenar nuestro modelo

Ahora vamos a entrenar nuestro modelo usando los datos de fashion_mnist que es uno de los datasets de ejemplo que vienen con tensorflow.

fashion_mnist = tf.keras.datasets.fashion_mnist

(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()

# normalizar los datos
X_train = X_train / 255.0
X_test = X_test / 255.0

# configurar y conpilar nuestro modelo
model_func.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])

# entrenar el modelo
model_func.fit(X_train, y_train, epochs=5)
Epoch 1/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.2289 - accuracy: 0.9147
Epoch 2/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.2180 - accuracy: 0.9187
Epoch 3/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.2137 - accuracy: 0.9207
Epoch 4/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.2063 - accuracy: 0.9226
Epoch 5/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.2003 - accuracy: 0.9247
<keras.callbacks.History at 0x212d77f6d50>

4. Evalular el modelo

Por ultimo vamos a evaluar el modelo con el conjunto de test. Para ello vamos a utilizar la función evaluate del modelo. Esta función nos devuelve el valor de la función de perdida y el valor de la métrica que hemos definido.

model_func.evaluate(X_test, y_test)
313/313 [==============================] - 1s 2ms/step - loss: 0.3422 - accuracy: 0.8854
[0.34223565459251404, 0.8853999972343445]

Como hemos visto crear un modelo usando el API funcional de keras, no es complicado, pero si es un poco más complejo que usando el API secuencial. Sin embargo, debemos tener en cuenta que el API funcional nos permite crear modelos más complejos, con más de una entrada y más de una salida, lo cual no es posible con el API secuencial.

· 3 min de lectura
Darvin Cotrina

Comparar series de tiempo con pandas

Comparar series de tiempo con pandas, de algunas acciones de las principales empresas tecnológicas.

1. Importar librerías

Para este ejercicio, se necesitara de las siguientes librerías:

pip install pandas
pip install matplotlib
pip install yfinance

Usaremos la librería yfinance para obtener los datos de las acciones de las empresas tecnológicas, hay otras librearías que también pueden ayudar con esta tarea como pandas_datareader o quandl.

import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf

2. Obtener datos

Para este ejemplo, se obtendrán los datos de las acciones de las empresas tecnológicas desde el 2015 de google, amazon, facebook, apple y microsoft.

tickets = ['GOOG', 'AMZN', 'META', 'AAPL', 'MSFT']
start_date = '2015-01-01'
end_date = '2023-01-01'

df = yf.download(tickets, start=start_date, end=end_date)['Adj Close']
df.head()
[*********************100%***********************]  5 of 5 completed
AAPLAMZNGOOGMETAMSFT
Date
2015-01-0224.53176315.426026.16865378.44999740.620667
2015-01-0523.84066615.109525.62315277.19000240.247116
2015-01-0623.84291314.764525.02928276.15000239.656406
2015-01-0724.17723814.921024.98640176.15000240.160259
2015-01-0825.10618415.023025.06518478.18000041.341694

3. Normalizar datos

Para poder comparar los datos vamos a normalizarlos, para esto se usará la siguiente fórmula:

$$ \frac{P_t}{P_0} * 100 $$ Donde PtP_t es el precio en el tiempo tt y P0P_0 es el precio inicial.

normalized_df = df / df.iloc[0] * 100
normalized_df.head()
AAPLAMZNGOOGMETAMSFT
Date
2015-01-02100.000000100.000000100.000000100.000000100.000000
2015-01-0597.18284797.94827197.91543898.39388899.080393
2015-01-0697.19200695.71178595.64604397.06820297.626183
2015-01-0798.55483496.72630595.48217997.06820298.866569
2015-01-08102.34154097.38752895.78323899.655836101.775026

4. Graficar datos

Por ultimo grafiaremos los datos para poder compararlos y ver como se han comportado en el tiempo.

normalized_df.plot(figsize=(15, 10))
plt.show()

5. Conclusiones

Como hemos podido ver hacer una comparación de series de tiempo es muy sencillo con pandas, y nos permite ver como se han comportado las acciones de las empresas tecnológicas en los últimos años, las concluciones respecto al comportamiento de las acciones de las empresas tecnológicas se las dejo a ustedes.

· 2 min de lectura
Darvin Cotrina

¿Como ver los días de la semana usando pandas?`

Con pandas podemos ver de forma muy sencilla los días de la semana de una fecha en específico, para esto usaremos la función weekday_name y con dayofweek podemos ver el número del día de la semana.

import pandas

day = pandas.to_datetime('2023-07-10')
print(day.dayofweek, day.day_name())
0 Monday
# todos los días de la semana
week = pandas.date_range(start='2023-07-10', periods=7, freq='D')
for day in week:
print(day.dayofweek, day.day_name())
0 Monday
1 Tuesday
2 Wednesday
3 Thursday
4 Friday
5 Saturday
6 Sunday
# df con los dias de la semana
df = pandas.DataFrame(week, columns=['date'])
df['dayofweek'] = df['date'].dt.dayofweek
df['dayname'] = df['date'].dt.day_name()
df.set_index('date', inplace=True)
df
dayofweekdayname
date
2023-07-100Monday
2023-07-111Tuesday
2023-07-122Wednesday
2023-07-133Thursday
2023-07-144Friday
2023-07-155Saturday
2023-07-166Sunday

· 9 min de lectura
Darvin Cotrina

En esta sección vamos a ver cómo podemos extraer información de páginas web usando la librería BeautifulSoup de Python, veremos el poder de esta librería y cómo podemos usarla para extraer información de páginas web.

1. Requerimientos

Antes de empezar, debemos instalar las siguientes librerías:

pip install requests
pip install beautifulsoup4

2. Importar librerías

Como en todo codigo de Python, lo primero que debemos hacer es importar las librerías que vamos a usar, en este caso

from bs4 import BeautifulSoup
import requests

3. Obtener el contenido de una página web

BeautifulSoup no puede optener el contenido directamente desde una url, por lo que nos vamos ayudar en el módulo requests

url = 'https://peps.python.org/pep-0020/'
r = requests.get(url)
html = r.text

4. Ver el contenido de la página

BeautifulSoup nos permite ver el contenido de la página de una forma más amigable, para ello usamos el método prettify()

soup = BeautifulSoup(html, 'html')
print(soup.prettify())
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<meta content="light dark" name="color-scheme"/>
<title>
PEP 20 – The Zen of Python | peps.python.org
</title>
<link href="../_static/py.png" rel="shortcut icon"/>
<link href="https://peps.python.org/pep-0020/" rel="canonical"/>
<link href="../_static/style.css" rel="stylesheet" type="text/css"/>
<link href="../_static/mq.css" rel="stylesheet" type="text/css"/>
<link href="../_static/pygments.css" id="pyg-light" media="(prefers-color-scheme: light)" rel="stylesheet" type="text/css"/>
<link href="../_static/pygments_dark.css" id="pyg-dark" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css"/>
<link href="https://peps.python.org/peps.rss" rel="alternate" title="Latest PEPs" type="application/rss+xml"/>
<meta content="Python Enhancement Proposals (PEPs)" name="description"/>
</head>
<body>
<svg style="display: none;" xmlns="http://www.w3.org/2000/svg">
<symbol id="svg-sun-half" pointer-events="all" viewbox="0 0 24 24">
<title>
Following system colour scheme
</title>
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="9">
</circle>
<path d="M12 3v18m0-12l4.65-4.65M12 14.3l7.37-7.37M12 19.6l8.85-8.85">
</path>
</svg>
</symbol>
<symbol id="svg-moon" pointer-events="all" viewbox="0 0 24 24">
<title>
Selected dark colour scheme
</title>
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0h24v24H0z" fill="none" stroke="none">
</path>
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z">
</path>
</svg>
</symbol>
<symbol id="svg-sun" pointer-events="all" viewbox="0 0 24 24">
<title>
Selected light colour scheme
</title>
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="5">
</circle>
<line x1="12" x2="12" y1="1" y2="3">
</line>
<line x1="12" x2="12" y1="21" y2="23">
</line>
<line x1="4.22" x2="5.64" y1="4.22" y2="5.64">
</line>
<line x1="18.36" x2="19.78" y1="18.36" y2="19.78">
</line>
<line x1="1" x2="3" y1="12" y2="12">
</line>
<line x1="21" x2="23" y1="12" y2="12">
</line>
<line x1="4.22" x2="5.64" y1="19.78" y2="18.36">
</line>
<line x1="18.36" x2="19.78" y1="5.64" y2="4.22">
</line>
</svg>
</symbol>
</svg>
<script>
document.documentElement.dataset.colour_scheme = localStorage.getItem("colour_scheme") || "auto"
</script>
<section id="pep-page-section">
<header>
<h1>
Python Enhancement Proposals
</h1>
<ul class="breadcrumbs">
<li>
<a href="https://www.python.org/" title="The Python Programming Language">
Python
</a>
»
</li>
<li>
<a href="../pep-0000/">
PEP Index
</a>
»
</li>
<li>
PEP 20
</li>
</ul>
<button id="colour-scheme-cycler" onclick="setColourScheme(nextColourScheme())">
<svg aria-hidden="true" class="colour-scheme-icon-when-auto">
<use href="#svg-sun-half">
</use>
</svg>
<svg aria-hidden="true" class="colour-scheme-icon-when-dark">
<use href="#svg-moon">
</use>
</svg>
<svg aria-hidden="true" class="colour-scheme-icon-when-light">
<use href="#svg-sun">
</use>
</svg>
<span class="visually-hidden">
Toggle light / dark / auto colour theme
</span>
</button>
</header>
<article>
<section id="pep-content">
<h1 class="page-title">
PEP 20 – The Zen of Python
</h1>
<dl class="rfc2822 field-list simple">
<dt class="field-odd">
Author
<span class="colon">
:
</span>
</dt>
<dd class="field-odd">
Tim Peters &lt;tim.peters at gmail.com&gt;
</dd>
<dt class="field-even">
Status
<span class="colon">
:
</span>
</dt>
<dd class="field-even">
<abbr title="Currently valid informational guidance, or an in-use process">
Active
</abbr>
</dd>
<dt class="field-odd">
Type
<span class="colon">
:
</span>
</dt>
<dd class="field-odd">
<abbr title="Non-normative PEP containing background, guidelines or other information relevant to the Python ecosystem">
Informational
</abbr>
</dd>
<dt class="field-even">
Created
<span class="colon">
:
</span>
</dt>
<dd class="field-even">
19-Aug-2004
</dd>
<dt class="field-odd">
Post-History
<span class="colon">
:
</span>
</dt>
<dd class="field-odd">
22-Aug-2004
</dd>
</dl>
<hr class="docutils"/>
<section id="contents">
<details>
<summary>
Table of Contents
</summary>
<ul class="simple">
<li>
<a class="reference internal" href="#abstract">
Abstract
</a>
</li>
<li>
<a class="reference internal" href="#the-zen-of-python">
The Zen of Python
</a>
</li>
<li>
<a class="reference internal" href="#easter-egg">
Easter Egg
</a>
</li>
<li>
<a class="reference internal" href="#references">
References
</a>
</li>
<li>
<a class="reference internal" href="#copyright">
Copyright
</a>
</li>
</ul>
</details>
</section>
<section id="abstract">
<h2>
<a class="toc-backref" href="#abstract" role="doc-backlink">
Abstract
</a>
</h2>
<p>
Long time Pythoneer Tim Peters succinctly channels the BDFL’s guiding
principles for Python’s design into 20 aphorisms, only 19 of which
have been written down.
</p>
</section>
<section id="the-zen-of-python">
<h2>
<a class="toc-backref" href="#the-zen-of-python" role="doc-backlink">
The Zen of Python
</a>
</h2>
<div class="highlight-text notranslate">
<div class="highlight">
<pre><span></span>Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
</pre>
</div>
</div>
</section>
<section id="easter-egg">
<h2>
<a class="toc-backref" href="#easter-egg" role="doc-backlink">
Easter Egg
</a>
</h2>
<div class="highlight-pycon notranslate">
<div class="highlight">
<pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">this</span>
</pre>
</div>
</div>
</section>
<section id="references">
<h2>
<a class="toc-backref" href="#references" role="doc-backlink">
References
</a>
</h2>
<p>
Originally posted to
<a class="reference external" href="mailto:comp.lang.python/python-list%40python.org">
comp
<span>
.
</span>
lang
<span>
.
</span>
python/python-list
<span>
@
</span>
python
<span>
.
</span>
org
</a>
under a
thread called
<a class="reference external" href="https://groups.google.com/d/msg/comp.lang.python/B_VxeTBClM0/L8W9KlsiriUJ">
“The Way of Python”
</a>
</p>
</section>
<section id="copyright">
<h2>
<a class="toc-backref" href="#copyright" role="doc-backlink">
Copyright
</a>
</h2>
<p>
This document has been placed in the public domain.
</p>
</section>
</section>
<hr class="docutils"/>
<p>
Source:
<a class="reference external" href="https://github.com/python/peps/blob/main/pep-0020.txt">
https://github.com/python/peps/blob/main/pep-0020.txt
</a>
</p>
<p>
Last modified:
<a class="reference external" href="https://github.com/python/peps/commits/main/pep-0020.txt">
2022-03-15 17:40:34+00:00 GMT
</a>
</p>
</article>
<nav id="pep-sidebar">
<h2>
Contents
</h2>
<ul>
<li>
<a class="reference internal" href="#abstract">
Abstract
</a>
</li>
<li>
<a class="reference internal" href="#the-zen-of-python">
The Zen of Python
</a>
</li>
<li>
<a class="reference internal" href="#easter-egg">
Easter Egg
</a>
</li>
<li>
<a class="reference internal" href="#references">
References
</a>
</li>
<li>
<a class="reference internal" href="#copyright">
Copyright
</a>
</li>
</ul>
<br/>
<a href="https://github.com/python/peps/blob/main/pep-0020.txt" id="source">
Page Source (GitHub)
</a>
</nav>
</section>
<script src="../_static/colour_scheme.js">
</script>
<script src="../_static/wrap_tables.js">
</script>
<script src="../_static/sticky_banner.js">
</script>
</body>
</html>

Una vez que tenemos el contenido de la página, podemos navegar por el contenido usando los métodos find() y find_all().

a = soup.find_all('a')
for link in a:
print(link.get('href'))
https://www.python.org/
../pep-0000/
#abstract
#the-zen-of-python
#easter-egg
#references
#copyright
#abstract
#the-zen-of-python
#easter-egg
#references
mailto:comp.lang.python/python-list%40python.org
https://groups.google.com/d/msg/comp.lang.python/B_VxeTBClM0/L8W9KlsiriUJ
#copyright
https://github.com/python/peps/blob/main/pep-0020.txt
https://github.com/python/peps/commits/main/pep-0020.txt
#abstract
#the-zen-of-python
#easter-egg
#references
#copyright
https://github.com/python/peps/blob/main/pep-0020.txt

Para navegar por el contenido del documento, BeautifulSoup tiene varios métodos que nos permiten navegar por el contenido del documento, los más usados son:

  • find(): Nos permite encontrar el primer elemento que cumpla con las condiciones especificadas.
  • find_all(): Nos permite encontrar todos los elementos que cumplan con las condiciones especificadas.
  • select(): Nos permite encontrar todos los elementos que cumplan con las condiciones especificadas usando selectores CSS.
  • select_one(): Nos permite encontrar el primer elemento que cumpla con las condiciones especificadas usando selectores CSS.
  • find_parent(): Nos permite encontrar el elemento padre que cumpla con las condiciones especificadas.
  • find_parents(): Nos permite encontrar todos los elementos padres que cumplan con las condiciones especificadas.

Entre otros, para mas información ir a la documentación

# buscar elementos a por class
elements = soup.find_all('a', {'class': 'reference internal'})
for element in elements:
print(element.get('href'))
#abstract
#the-zen-of-python
#easter-egg
#references
#copyright
#abstract
#the-zen-of-python
#easter-egg
#references
#copyright
# buscar elementos por id
elements = soup.find_all(id = 'copyright')
print(elements)
[<section id="copyright">
<h2><a class="toc-backref" href="#copyright" role="doc-backlink">Copyright</a></h2>
<p>This document has been placed in the public domain.</p>
</section>]
# buscar elementos por texto
elements = soup.find_all(string='PEP 20')
elements
[]
# buscar elementos por texto con expresiones regulares
import re
elements = soup.find_all(re.compile('^sy'))
elements
[<symbol id="svg-sun-half" pointer-events="all" viewbox="0 0 24 24">
<title>Following system colour scheme</title>
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="9"></circle>
<path d="M12 3v18m0-12l4.65-4.65M12 14.3l7.37-7.37M12 19.6l8.85-8.85"></path>
</svg>
</symbol>,
<symbol id="svg-moon" pointer-events="all" viewbox="0 0 24 24">
<title>Selected dark colour scheme</title>
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0h24v24H0z" fill="none" stroke="none"></path>
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z"></path>
</svg>
</symbol>,
<symbol id="svg-sun" pointer-events="all" viewbox="0 0 24 24">
<title>Selected light colour scheme</title>
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" x2="12" y1="1" y2="3"></line>
<line x1="12" x2="12" y1="21" y2="23"></line>
<line x1="4.22" x2="5.64" y1="4.22" y2="5.64"></line>
<line x1="18.36" x2="19.78" y1="18.36" y2="19.78"></line>
<line x1="1" x2="3" y1="12" y2="12"></line>
<line x1="21" x2="23" y1="12" y2="12"></line>
<line x1="4.22" x2="5.64" y1="19.78" y2="18.36"></line>
<line x1="18.36" x2="19.78" y1="5.64" y2="4.22"></line>
</svg>
</symbol>]

6. Conclusiones

Como hemos visto, BeautifulSoup es una librería muy poderosa que nos permite extraer información de páginas web de una forma rapida y sencilla, pero tiene sus limitaciones y no es la mejor opción para extraer información de páginas web complejas, para ello existen otras librerías como Scrapy que nos permiten extraer información de páginas web de una forma más eficiente.

Cuando hagamos scraping de páginas web, debes de tener en cuenta que tienes que respetar las políticas de privacidad de la página web, para ello debes de leer los términos y condiciones de la página web, asi como el acceso a los robots de búsqueda, del archivo robots.txt de la página web.

· 11 min de lectura
Darvin Cotrina

Broadcasting con NumPy

image.png

El broadcasting es una forma de hacer operaciones entre arrays de diferentes tamaños, que usualmente no son compatibles. El broadcasting es posible cuando se cumplen ciertas reglas.

  • El tamaño de cada dimensión es igual.
  • Una de las dimensiones es 1.

El broadcasting se realiza en la dimensión que tiene tamaño 1. El array con tamaño 1 se extiende para que tenga el mismo tamaño que el otro array.

Ejemplos de broadcasting

Array 1Array 2Resultado
10 x 51 x 510 x 5
10 x 5510 x 5
10 x 510 x 110 x 5
10 x 5scalar10 x 5
import numpy as np
from rich import print
# matris de 10x5
m10_5 = np.random.randint(0, 10, (10, 5))
m1_5 = np.random.randint(0, 10, (1, 5))
m5 = np.random.randint(0, 10, (5))
m10_1 = np.random.randint(0, 10, (10, 1))
scalar = 5

print('Broadcasting de 10x5 + 1x5')
print(m10_5 + m1_5)
print('Broadcasting de 10x5 + 5')
print(m10_5 + m5)
print('Broadcasting de 10x5 + 10x1')
print(m10_5 + m10_1)
print(m10_5 + scalar)
Broadcasting de 10x5 + 1x5
[[ 9  2  6  5  1]
 [ 5  9 10 10  8]
 [ 6  9  3 10  3]
 [ 8  8  7  4  8]
 [ 5  2  6 10  5]
 [ 7  9  9  8  3]
 [ 7  5  3  5  7]
 [ 4  7  7  3  1]
 [ 2  8  6 12  7]
 [ 9  9 12 10 10]]
Broadcasting de 10x5 + 5
[[ 7 11  9  2  5]
 [ 3 18 13  7 12]
 [ 4 18  6  7  7]
 [ 6 17 10  1 12]
 [ 3 11  9  7  9]
 [ 5 18 12  5  7]
 [ 5 14  6  2 11]
 [ 2 16 10  0  5]
 [ 0 17  9  9 11]
 [ 7 18 15  7 14]]
Broadcasting de 10x5 + 10x1
[[14  9 10  9  7]
 [ 5 11  9  9  9]
 [ 5 10  1  8  3]
 [11 13  9  6 12]
 [ 9  8  9 13 10]
 [11 15 12 11  8]
 [ 6  6  1  3  7]
 [ 3  8  5  1  1]
 [ 8 16 11 17 14]
 [ 7  9  9  7  9]]
[[12  7  8  7  5]
 [ 8 14 12 12 12]
 [ 9 14  5 12  7]
 [11 13  9  6 12]
 [ 8  7  8 12  9]
 [10 14 11 10  7]
 [10 10  5  7 11]
 [ 7 12  9  5  5]
 [ 5 13  8 14 11]
 [12 14 14 12 14]]

Ejemplos de no broadcasting

Array 1Array 2Resultado
10 x 55 x 10Error
10 x 510Error
m10_5 = np.random.randint(0, 10, (10, 5))
m5_10 = np.random.randint(0, 10, (5, 10))
m10 = np.random.randint(0, 10, (10))

print('Broadcasting de 10x5 + 5x10')
print(m10_5 + m5_10)
Broadcasting de 10x5 + 5x10
ValueError: operands could not be broadcast together with shapes (10,5) (5,10) 
print('Broadcasting de 10x5 + 10')
print(m10_5 + m10)
Broadcasting de 10x5 + 10
ValueError: operands could not be broadcast together with shapes (10,5) (10,) 

· 3 min de lectura
Darvin Cotrina

La detección de anomalías es el proceso de identificar patrones inusuales en los datos. Es un problema de aprendizaje no supervisado, lo que significa que no necesitamos tener etiquetas para entrenar nuestro modelo. En cambio, nuestro modelo aprenderá a identificar patrones inusuales en los datos por sí mismo.

La detección de anomalías se puede aplicar a una amplia gama de dominios, como la detección de fraudes con tarjetas de crédito, la detección de fallas en equipos de fabricación o la detección de anomalías médicas.

Estimación de densidad

La detección de anomalías se puede realizar utilizando un modelo de estimación de densidad. La idea es que los datos normales se distribuirán de manera diferente a los datos anormales. Por lo tanto, podemos estimar la densidad de los datos normales y luego identificar los puntos de datos que tienen una densidad significativamente menor como anomalías.

Dado el conjunto de datos de entrenamiento {x(1),x(2),,x(m)}\{x^{(1)}, x^{(2)}, \ldots, x^{(m)} \}, donde cada ejemplo tiene nn características, podemos estimar la densidad de los datos como:

p(x)=p(x1;μ1,σ12)×p(x2;μ2,σ22)××p(xn;μn,σn2)p(x) = p(x_1; \mu_1, \sigma_1^2) \times p(x_2; \mu_2, \sigma_2^2) \times \ldots \times p(x_n; \mu_n, \sigma_n^2) =j=1np(xj;μj,σj2)= \prod_{j=1}^n p(x_j; \mu_j, \sigma_j^2)

Algoritmo de detección de anomalías

  1. Elija las características xix_i que crea que pueden indicar anomalías.

  2. Ajuste los parámetros μ1,,μn,σ12,,σn2\mu_1, \ldots, \mu_n, \sigma_1^2, \ldots, \sigma_n^2 en el conjunto de entrenamiento {x(1),x(2),,x(m)}\{x^{(1)}, x^{(2)}, \ldots, x^{(m)} \}. μ=1mi=1mx(i)\vec{\mu} = \frac{1}{m} \sum_{i=1}^m \vec{x^{(i)}} σ2=1mi=1m(x(i)μ)2\vec{\sigma^2} = \frac{1}{m} \sum_{i=1}^m (\vec{x^{(i)}} - \vec{\mu})^2

  3. Dado un nuevo ejemplo xx, compute p(x)p(x):

p(x)=j=1np(xj;μj,σj2)=j=1n12πσjexp((xjμj)22σj2)p(x) = \prod_{j=1}^n p(x_j; \mu_j, \sigma_j^2) = \prod_{j=1}^n \frac{1}{\sqrt{2\pi}\sigma_j} \exp \left( - \frac{(x_j - \mu_j)^2}{2\sigma_j^2} \right)

  1. Si p(x)<ϵp(x) < \epsilon, marque un ejemplo de anomalía.

image.png

Escoger que caracteristicas usar

En Deteción de Anomalías, se debe escoger que caracteristicas usar, ya que si se usan todas las caracteristicas, el algoritmo no funcionará correctamentem.

Caracteristicas no gaussianas

Cuando encontramos caracteristicas que no son gaussianas, se debe aplicar una transformación a los datos para que se vuelvan gaussianos.

por ejemplo:

  • x1=log(x1)x_1 = \log(x_1)
  • x2=log(x2+c)x_2 = \log(x_2 + c)
  • x3=x3x_3 = \sqrt{x_3}
  • x4=x41/3x_4 = x_4^{1/3}

En python

from scipy.stats import skewnorm
import matplotlib.pyplot as plt

numValues = 1000
maxValue = 100
skewness = 20

randomValues = skewnorm.rvs(a=skewness, loc=maxValue, size=numValues)

randomValues = randomValues - min(randomValues) # cambia el conjunto de datos para que comience en 0
randomValues = randomValues / max(randomValues) # cambia el conjunto de datos para que termine en 1
randomValues = randomValues * maxValue # cambia el conjunto de datos para que termine en maxValue

x = randomValues

fig, ax = plt.subplots(1, 3, figsize=(15, 5))

ax[0].hist(x, bins=50)
ax[0].set_title('X')

# x**2
ax[1].hist(x**2, bins=50)
ax[1].set_title('X^2')

# x**0.4
ax[2].hist(x**0.4, bins=50)
ax[2].set_title('X^0.4')

plt.show()

Error en el analisis para detección de anomalías

El problema más común en la detección de anomalías es que el conjunto de datos de entrenamiento contiene muy pocos ejemplos de anomalías. Por lo tanto, el algoritmo de detección de anomalías no puede aprender lo suficiente sobre los ejemplos de anomalías para identificarlos correctamente en el conjunto de prueba.

· 4 min de lectura
Darvin Cotrina

Las expresiones regulares son una secuencia de caracteres que forman un patrón de búsqueda, principalmente utilizadas para la búsqueda de patrones de cadenas de caracteres u operaciones de sustituciones.

Caracteres especiales

Los caracteres especiales son aquellos que tienen un significado especial para las expresiones regulares. Por ejemplo, el punto y coma (;) es un caracter especial que se utiliza para separar instrucciones en Python. Sin embargo, en las expresiones regulares, el punto y coma (;) es un caracter especial que se utiliza para indicar que el patrón de búsqueda debe coincidir con cualquier caracter.

A continuación se muestra una lista de los caracteres especiales más utilizados en las expresiones regulares:

CaracterDescripción
.Coincide con cualquier caracter
^Coincide con el inicio de una cadena
$Coincide con el final de una cadena
*Coincide con 0 o más ocurrencias del caracter anterior
+Coincide con 1 o más ocurrencias del caracter anterior
?Coincide con 0 o 1 ocurrencia del caracter anterior
{n}Coincide con n ocurrencias del caracter anterior
{n,}Coincide con n o más ocurrencias del caracter anterior
{n,m}Coincide con un rango de ocurrencias del caracter anterior
[]Coincide con cualquier caracter dentro de los corchetes
[^...]Coincide con cualquier caracter que no esté dentro de los corchetes
(…)Agrupa una serie de patrones
Coincide con un espacio en blanco
Coincide con cualquier caracter que no sea un espacio en blanco
Coincide con cualquier caracter alfanumérico
Coincide con cualquier caracter que no sea alfanumérico
Coincide con cualquier caracter numérico
Coincide con cualquier caracter que no sea numérico

Trabajando en python

para trabajar con expresiones regulares en python, se debe importar el módulo re. A continuación se muestra un ejemplo de como utilizar el módulo re para buscar un patrón en una cadena de caracteres:

import re

Encontrar todas las coincidencias

text = "Hola, mi nombre es Juan y mi número de teléfono es 123456789"
pattern = r"mi"

print(re.findall(pattern, text))
pattern = r"\d+"
print(re.findall(pattern, text))
['mi', 'mi']
['123456789']

Sustituir un patrón en una cadena de caracteres

text = "Hol, mi nombre es Juan y mi nUmero de teléfono es 123456789"

text = re.sub(r"Hol", "Hola", text)
print(text)
text = re.sub(r"U", "ú", text)
print(text)
Hola, mi nombre es Juan y mi nUmero de teléfono es 123456789
Hola, mi nombre es Juan y mi número de teléfono es 123456789

Dividir una cadena de caracteres

text = "Hola, mi nombre es Juan y mi número de teléfono es 123456789"

text_split = re.split(r"y", text)
text_split
['Hola, mi nombre es Juan ', ' mi número de teléfono es 123456789']

Python tambien tiene integrado funciones de expresiones regulares en el módulo string.

text = "Hola, mi nombre es Juan y mi número de teléfono es 123456789"
print(text.replace("Juan", "Darvin"))
print(text.split(','))
Hola, mi nombre es Darvin y mi número de teléfono es 123456789
['Hola', ' mi nombre es Juan y mi número de teléfono es 123456789']

Estos son solo alguno de todos los metodos que tiene python para trabajar con expresiones regulares. Para más información, puede consultar la documentación oficial de python en el siguiente enlace: https://docs.python.org/3/library/re.html

· 4 min de lectura
Darvin Cotrina

El comando mágico %timeit en Jupyter Lab es una forma conveniente de medir el tiempo de ejecución de una expresión o una función directamente en tus celdas de código. Puedes utilizar %timeit para obtener rápidamente el tiempo promedio de ejecución y comparar diferentes enfoques de implementación.

1. Uso básico de %timeit

Para utilizar %timeit, simplemente coloca el comando mágico antes de la expresión o función que deseas medir. Por ejemplo, para medir el tiempo de ejecución de la expresión '1 + 1', puedes usar el siguiente código en una celda de Jupyter Lab:

%timeit 1 + 1
10.1 ns ± 0.491 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each)

Después de ejecutar la celda, %timeit ejecutará la expresión '1 + 1' varias veces y mostrará el tiempo promedio de ejecución. En este caso, el tiempo promedio de ejecución en unidades de tiempo

2. Tabla de tiempos

AbreviaturaUnidad de tiempo
nsnanosegundos
usmicrosegundos
msmilisegundos
ssegundos
mminutos
hhoras

3. Especificar el número de ejecuciones y repeticiones

Por defecto, %timeit ejecuta la expresión o función 100.000 veces y repite la operación tres veces. Puedes especificar el número de ejecuciones y repeticiones utilizando la sintaxis %timeit -r <repeticiones> -n <ejecuciones>. Por ejemplo, para ejecutar la expresión '1 + 1' 10.000 veces y repetir la operación cinco veces, puedes usar el siguiente código:

%timeit -r5 -n50 1 + 1
25.6 ns ± 5.28 ns per loop (mean ± std. dev. of 5 runs, 50 loops each)

En el comando anterior espesificamps que se ejecute 50 veces en 5 repeticiones

5. Medir el tiempo de ejecución de una función

También puedes utilizar %timeit para medir el tiempo de ejecución de una función. Por ejemplo, para medir el tiempo de ejecución de la función sum() de Python, puedes usar el siguiente código:

def mi_funcion():
# puedes colocar cualquier código aquí
return 1 + 1

Jupyter Lab ejecutara el código y te devolvera el tiempo de ejecución de la función

6. Medir el tiempo de ejecución de una celda

También puedes utilizar %timeit para medir el tiempo de ejecución de una celda completa. Por ejemplo, para medir el tiempo de ejecución de la siguiente celda, puedes usar el siguiente código:

%%timeit
x = 1
x += 1
36.7 ns ± 1.13 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)

7. Obtener el tiempo de ejecución como variable

En caso de que desees obtener información más detallada sobre el tiempo de ejecución, podrias asignar el resultado de %timeit a una variable, para esto utilizaremos las opciones -o para almacenar el resultado y -q para silenciar la salida de la celda. Por ejemplo, para obtener el tiempo de ejecución de la expresión '1 + 1' como una variable, puedes usar el siguiente código:

resultado = %timeit -o -q 1 + 1
print(f'El mejor tiempo fue {resultado.best}')
print(f'El peor tiempo fue {resultado.worst}')
El mejor tiempo fue 9.775258000008763e-09
El peor tiempo fue 1.1235137999756262e-08

Hemos visto de forma muy rapida como usar el comando magico %timeit en Jupyter Lab, con expresiones muy sencillas, pero en la practica se utiliza para medir el tiempo de ejecución de funciones y celdas completas, lo cual es muy util para comparar diferentes enfoques de implementación.

· Lectura de un minuto
Darvin Cotrina

Tanto numpy como pandas tienen funciones que permiten aplicar una funcion a un array o dataframe, respectivamente, de forma vectorizada. Esto significa que la funcion se aplica a todos los elementos del array o dataframe, sin necesidad de iterar sobre ellos. Esto es mucho mas eficiente que iterar sobre los elementos, ya que no se necesita hacer un loop en python, sino que la funcion se aplica en C.

import numpy as np
import pandas as pd

# comparación de vectorize de numpy vs apply de pandas

# vectorize de numpy
def f(x):
return x**2 + 1

array = np.arange(100000, dtype=np.int16)

%timeit np.vectorize(f)(array)
# pandas apply
df = pd.DataFrame({'x': array})
%timeit df['x'].apply(f)
24.2 ms ± 1.56 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
40.7 ms ± 1.01 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Esta es una comparación muy simple entre ambas formas de aplicar una funcion, pero nos da una idea bastante clara de la diferencia de performance entre ambas, como podemos ver vectorize fue mucho mas rapido que apply.

· 2 min de lectura
Darvin Cotrina

¿Alguna vez has tenido que optimizar el código de un programa? line_profiler es una herramienta que te permite perfilar el código de un programa para encontrar las partes que más tiempo consumen. En este notebook veremos cómo usarla.

Instalación

Como line_profiler no viene instalado por defecto en Anaconda, lo instalaremos con conda:

En la terminal:

pip install line_profiler

En el notebook:

! pip install line_profiler

¿Cómo funciona en Jupyter?

line_profiler es una herramienta que permite perfilar el código de un programa. Esto significa que nos permite ver cuánto tiempo se tarda en ejecutar cada línea de código. Para ello, line_profiler nos permite usar el comando %lprun en Jupyter. Este comando nos permite perfilar una función. Para ello, debemos añadir el decorador @profile a la función que queremos perfilar.

cargar el módulo line_profiler en el notebook:

%load_ext line_profiler
The line_profiler extension is already loaded. To reload it, use:
%reload_ext line_profiler

Perfilando una función

Perfilar una funcion en en jupyter lab ees muy sencillo con el comando %lprun. Para ello vamos a crear una funcion de prueba que calcule el doble de una lista de números:


def funcion_prueba():
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
doble = []
for item in data:
doble.append(item * 2)

return doble
%lprun -f funcion_prueba funcion_prueba()
Timer unit: 1e-07 s

Total time: 8e-06 s

Could not find file C:\Users\WillyCotrina\AppData\Local\Temp\ipykernel_14792\1026023441.py
Are you sure you are running this program from the same directory
that you ran the profiler from?
Continuing without the function's contents.

Line # Hits Time Per Hit % Time Line Contents
==============================================================
1
2 1 7.0 7.0 8.8
3 1 3.0 3.0 3.8
4 9 24.0 2.7 30.0
5 9 43.0 4.8 53.8
6
7 1 3.0 3.0 3.8

Como pudimos notar pefilar una funcion es muy sencillo y extremaente util para optimizar el codigo de un programa.