> For the complete documentation index, see [llms.txt](https://difacquim.gitbook.io/quimioinformatica/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://difacquim.gitbook.io/quimioinformatica/2.-introduccion-a-python-google-colab-y-linux/2.2-manejo-y-limpieza-de-datos.md).

# 2.2 Manejo y limpieza de datos

El manejo de bases de datos es un aspecto importante en cualquier disciplina que involucre el análisis de grandes cantidades de información. Una base de datos moleculares es un conjunto de estructuras químicas (datos), pertenecientes a un mismo contexto y almacenados sistemáticamente para su posterior uso. En Quimioinformática, el uso de bases de datos moleculares o quimiotecas es fundamental para realizar análisis y predicciones en la búsqueda de nuevas moléculas con propiedades específicas.

En esta sección, nos enfocamos en el manejo de bases de datos moleculares con Python y la librería `Pandas`. Comenzamos por importar una base de datos y luego realizamos el pre-tratamiento de dicha base de datos, incluyendo la limpieza de datos irrelevantes o duplicados.

### <mark style="color:green;">Importar una base de datos</mark>

Antes de comenzar a trabajar con una base de datos en Python, es necesario importarla en el entorno de programación. Para importar una base de datos en Python, podemos usar la librería `Pandas` y la función `read_csv`(esto depende del tipo de archivo cargado).&#x20;

Por ejemplo, si tenemos un archivo con extensión csv llamado "datos.csv" que contiene los datos de nuestra base de datos, podemos importarla con el siguiente código:

{% code lineNumbers="true" %}

```python
import pandas as pd
data = pd.read_csv("datos.csv")
```

{% endcode %}

Este código importa la base de datos y la almacena en un objeto llamado `data`.

### <mark style="color:green;">Pre-tratamiento de la base de datos moleculares</mark>

Una vez que tenemos nuestra base de datos importada en Python, es importante realizar un pre-tratamiento para limpiar los datos y prepararlos para su análisis posterior.

<mark style="color:purple;">**Limpieza de datos irrelevantes o duplicados**</mark>

En ocasiones, la base de datos puede contener información que no es relevante para el análisis que se quiere hacer o contiene datos que se repiten en varias filas. Para limpiar estos datos, se pueden usar las funciones de `Pandas` para filtrar y eliminar filas duplicadas.

Por ejemplo, si se quieren eliminar filas duplicadas, se puede usar la función `drop_duplicates`:

{% code lineNumbers="true" %}

```python
data = data.drop_duplicates()
```

{% endcode %}

Esta función eliminará todas las filas que contengan valores duplicados en todas las columnas.

Si se quieren eliminar columnas que contengan información irrelevante para el análisis de interés, se puede usar la función `drop` y especificar la columna o columnas a eliminar:

{% code lineNumbers="true" %}

```python
data = data.drop("columna_irrelevante", axis=1)
```

{% endcode %}

Esta función eliminará la columna especificada.

<mark style="color:purple;">**Cambiar nombres de columnas**</mark>

La base de datos puede tener nombres de columnas poco descriptivos o difíciles de entender. Para cambiar el nombre de las columnas, podemos usar la función `rename`. Por ejemplo, el nombre de la columna "old\_name" se puede cambiar a "new\_name" con la función:

{% code lineNumbers="true" %}

```python
data = data.rename(columns={"old_name": "new_name"})
```

{% endcode %}

<mark style="color:purple;">**Cambiar tipos de datos**</mark>

Es posible que se necesite cambiar el tipo de datos de una columna. Por ejemplo, si una columna se está interpretando como objeto, pero en realidad es una variable numérica, se puede cambiar el tipo de datos a `float` o `int`.

Para cambiar el tipo de datos de una columna en `Pandas`, se puede usar la función `astype()`. Este método permite convertir una columna a un tipo de datos específico.&#x20;

Ejemplo: Supongamos que se tiene una base de datos con una columna de números representados como objetos. Para convertirlos a tipo de datos numéricos, se puede hacer lo siguiente:

{% code lineNumbers="true" %}

```python
import pandas as pd

# Importar la base de datos
df = pd.read_csv('datos.csv')

# Verificar los tipos de datos de las columnas
print(df.dtypes)

# Convertir la columna 'numeros' a tipo float
df['numeros'] = df['numeros'].astype(float)

# Verificar que el tipo de datos de la columna haya cambiado
print(f"Tipo de datos de columna: {df.dtypes}")
```

{% endcode %}

En este ejemplo, primero importamos la base de datos con la función `read_csv()` de `Pandas` y verificamos los tipos de datos de las columnas con el método `dtypes`. Luego, usamos `astype()` para convertir la columna 'numeros' a tipo `float`. Finalmente, verificamos que el tipo de datos de la columna haya cambiado correctamente.

Es importante tener en cuenta que, si hay valores en la columna que no se pueden convertir al nuevo tipo de dato, `Pandas` arrojará un error. En estos casos, es necesario limpiar la columna antes de realizar la conversión.

En resumen, el método `astype()` de `Pandas` permite cambiar el tipo de datos de una columna en una base de datos. Es importante verificar que la conversión se haya realizado correctamente y tener en cuenta posibles errores en la conversión.

<mark style="color:purple;">**Tratamiento de datos faltantes**</mark>

Los datos faltantes, también conocidos como "*missing values*", son una de las situaciones más comunes en el manejo de bases de datos. Es probable que nos encontremos con datos faltantes en una o varias columnas de nuestra base de datos, ya sea porque no se recolectaron o porque se perdieron en algún momento del proceso. En cualquier caso, es importante tratar estos datos faltantes antes de realizar cualquier análisis o modelo predictivo. Métodos comunes para el tratamiento de datos faltantes son:

* Eliminar las filas o columnas con datos faltantes: este enfoque es útil cuando el número de faltantes es pequeño en comparación con el tamaño total de la base de datos. Sin embargo, esta estrategia puede reducir significativamente el tamaño de la base de datos y, por lo tanto, reducir la cantidad de datos disponibles para el análisis.
* Imputación de datos faltantes: este enfoque implica la sustitución de los datos faltantes por un valor estimado o promedio. Por ejemplo, podemos imputar el promedio de una columna en lugar de los datos faltantes en esa columna. `Pandas` proporciona la función `fillna()` para realizar este proceso.
* Análisis de los patrones de los datos faltantes: en algunos casos, los datos faltantes pueden estar correlacionados con otras variables de la base de datos. En estos casos, podemos utilizar el conocimiento de las relaciones entre las variables para estimar los datos faltantes. Por ejemplo, si los faltantes en una columna están relacionados con otra columna, podemos utilizar la información de la segunda columna para estimar los datos faltantes en la primera columna.

1. <mark style="background-color:purple;">Eliminación de filas con datos faltantes:</mark>

Esta técnica consiste en eliminar todas las filas que contengan datos faltantes. Aunque es una solución rápida y sencilla, tiene el riesgo de eliminar información importante que puede ser relevante para el análisis posterior.

Veamos un ejemplo de cómo eliminar filas con datos faltantes utilizando la librería `Pandas`:

```python
# Eliminar filas con valores faltantes
df.dropna(inplace=True)
```

En este ejemplo, `df` es el nombre de nuestro DataFrame. La función `dropna()` elimina todas las filas que contienen al menos un valor faltante. El parámetro `inplace=True` indica que los cambios se aplicarán directamente al DataFrame original.

```
#Otro ejemplo:
df_without_na = df.dropna()
```

En este código, `df_without_na` es el DataFrame resultante después de eliminar las filas con valores faltantes. Es importante tener en cuenta que esta opción puede no ser adecuada si se eliminan demasiados datos y la cantidad resultante es insuficiente para el análisis.

2. <mark style="background-color:purple;">Imputación de datos faltantes:</mark>

Esta técnica consiste en reemplazar los datos faltantes por otros valores estimados a partir de los datos existentes. Existen diferentes formas de realizar la imputación de datos faltantes, como la imputación por media, mediana, moda, entre otros.

Veamos un ejemplo utilizando la librería `Pandas`:

```python
# Imputar datos faltantes por la media
df.fillna(df.mean(), inplace=True)
```

En este ejemplo, `df` es el nombre de nuestro DataFrame. La función `fillna()` reemplaza todos los valores faltantes por la media de cada columna. El parámetro `inplace=True` indica que los cambios se aplicarán directamente al DataFrame original.

3. <mark style="background-color:purple;">Utilizar algoritmos de aprendizaje automático:</mark>

Otra forma de tratar los datos faltantes es utilizar algoritmos de aprendizaje automático que permiten estimar los valores faltantes a partir de los datos existentes. Estos algoritmos pueden ser útiles cuando los datos faltantes no son aleatorios, sino que están relacionados con otras variables.

Veamos un ejemplo de cómo utilizar el algoritmo K-Nearest Neighbors (K-NN) para estimar los datos faltantes utilizando la librería Scikit-learn:

```python
# Importar el modelo K-NN
from sklearn.impute import KNNImputer

# Crear una instancia del modelo con k=5
imputer = KNNImputer(n_neighbors=5)

# Imputar valores faltantes utilizando el modelo K-NN
df_imputed = imputer.fit_transform(df)
```

En este ejemplo, `df` es el nombre de nuestro DataFrame. Primero importamos el modelo K-NN de la librería Scikit-learn. Luego, creamos una instancia del modelo con k=5, lo que significa que se utilizarán los 5 vecinos más cercanos para estimar los datos faltantes. A continuación, se utiliza la función fit\_transform para ajustar el modelo a los datos y transformar los faltantes utilizando el algoritmo de K-NN. En este código, `df_imputed` es el DataFrame resultante después de aplicar la imputación de datos faltantes.

En resumen, el tratamiento de valores faltantes es un paso importante en el preprocesamiento de datos. `Pandas` y `Scikit-learn` proporcionan herramientas útiles para imputar o eliminar los datos faltantes. Es importante evaluar cuidadosamente la cantidad de datos faltantes y seleccionar el método más adecuado para cada situación.

## <mark style="color:orange;">**Para saber más:**</mark>&#x20;

* Lo esencial de Pandas para la ciencia de datos. <https://www.datasource.ai/es/data-science-articles/lo-esencial-de-pandas-para-la-ciencia-de-datos> Fecha de acceso: Octubre de 2023.&#x20;
* Preprocesamiento de datos con Python, Scikit-learn y Pandas. <https://aprendeconejemplos.org/python/preprocesamiento-de-datasets-con-scikit-learn-y-pandas> Fecha de acceso: Octubre de 2023.
