Skip to content

Commit 9590a69

Browse files
committed
⚡ Update reame projects and data engineering notes
1 parent fe2df41 commit 9590a69

24 files changed

+1031
-2
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Reuní trabajo relacionado con datos de forma ordenada y organizada que se irá
99

1010
Proyectos realizados con Python
1111

12+
* [News Scrapper with Python full ETL Process](https://github.com/eocode/News-Scrapper)
1213
* [COVIT-19 México with Python, Sheets and DataStudio](https://github.com/eocode/COVIT-19-Mexico)
1314
* [Rider App with Docker-Django-DRF-Celery-Redis-Postgresql](https://github.com/eocode/Rider-App)
1415
* [Photogram with Django](https://github.com/eocode/PhotoGram)

learn/DataScience/Ingenieria de datos/README.md

+194-1
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,21 @@
1616
- [Herramientas para encontrar DataSets](#herramientas-para-encontrar-datasets)
1717
- [ETL](#etl)
1818
- [Web Scrapping](#web-scrapping)
19+
- [Requests](#requests)
20+
- [Beautiful Soup](#beautiful-soup)
21+
- [Solicitudes a la web: Requests](#solicitudes-a-la-web-requests)
22+
- [Page Object Patter (Patrón de diseño)](#page-object-patter-patr%c3%b3n-de-dise%c3%b1o)
1923
- [Pandas](#pandas)
24+
- [Estructuras de datos: Series](#estructuras-de-datos-series)
25+
- [Estructura de datos: DataFrames](#estructura-de-datos-dataframes)
26+
- [Índices y selección](#%c3%8dndices-y-selecci%c3%b3n)
27+
- [Dictionary like:](#dictionary-like)
28+
- [Numpy like:](#numpy-like)
29+
- [Label based:](#label-based)
30+
- [Data wrangling o domado de datos](#data-wrangling-o-domado-de-datos)
31+
- [Trabajar con datos faltanntes](#trabajar-con-datos-faltanntes)
2032
- [Sistemas de información](#sistemas-de-informaci%c3%b3n)
33+
- [SQLite](#sqlite)
2134
- [Nube](#nube)
2235

2336
# Introducción
@@ -247,8 +260,188 @@ Elementos básicos de la web:
247260
* **Javascript:** nos permite añadir interactividad y cómputo a nuestra web.
248261
* **JSON:** Simplemente es una forma de transmitir datos entre servidores y clientes. Es la forma estándar en las que en la web y las aplicaciones se comunican con los servidores backend.
249262

263+
Conceptos clave
264+
265+
> **Pipeline** en su definición más sencilla es una serie de pasos para **convertir una entrada en algo diferente**, el automatizar estos pipelines es disminuir la intervención humana para que se ejecuten estos pipelines.
266+
267+
Resumiendo web scrapping
268+
269+
> **Web Scrapping** es **tomar la información publica de un sitio web, manipularla (transformarla, analizarla) para poder obtener otra información**, esta transformación y análisis se hacen por medio de pipelines para descargar la información, revisarla y poder convertirla en información útil para lo que necesitas.
270+
271+
## Requests
272+
273+
https://requests.readthedocs.io/es/latest/
274+
275+
Para poder experimentar con la web necesitamos un método programático para solicitar URLs y obtener HTML
276+
277+
> **Requests:** Nos permite **generar solicitudes a la web dentro de Python y utilizar los diferentes verbos HTTP**, normalmente utilizaremos el método **GET** porque vamos a traer datos.
278+
279+
* requests.get('url') para hacer una solicitud a la web y nos devolverá un objeto response
280+
281+
> Todas las solicitudes HTTP tienen metadatos para que los diferentes sistemas y computadoras puedan entender de qué va la solicitud.
282+
283+
## Beautiful Soup
284+
285+
https://www.crummy.com/software/BeautifulSoup/bs4/doc/
286+
287+
En el caso de Python la **librería estándar para manipular los documentos HTML se llama BeautifulSoup.**
288+
289+
BeautifulSoup nos ayuda a **organizar gramaticalmente(parsear) el documento HTML** para que tengamos una estructura con la cual podamos manejar y extraer información. **BeautifulSoup convierte el string de HTML en un árbol de nodos para poder manipularlo.**
290+
291+
Para manipularlo podemos usar los selectores CSS con **soup.select()**
292+
293+
294+
## Solicitudes a la web: Requests
295+
296+
**Un buen Data engineer utiliza los conceptos de la ingeniería de software para poder desarrollar sus programa.** En nuestro caso para poder desarrollar nos apoyaremos de un patrón.
297+
298+
## Page Object Patter (Patrón de diseño)
299+
300+
> Es un patrón que consiste en esconder los queries especificos que se utilizan para manipular un documento HTML detrás de un objeto que representa la página web.
301+
302+
**Si estos queries se añaden directamente al código principal, el código se vuelve frágil** y va a depender mucho de la modificación que hagan a la web otras personas y arreglarlo se vuelve muy complicado
303+
304+
https://medium.com/tech-tajawal/page-object-model-pom-design-pattern-f9588630800b
305+
306+
<div align="center">
307+
<img src="img/2.png">
308+
</div>
309+
250310
# Pandas
251311

312+
**Pandas nos otorga diversas facilidades para el ““domado de datos””. Nos otorga dos estructuras de datos:**
313+
314+
* **Series:** Es un **array** unidimensional que representa una **columna**.
315+
* **DataFrame:** Es un **conjunto de series que forman una tabla.** Se pueden acceder a través de indices como una etiqueta(label) o pueden ser posicionales es decir 0 o índice 100.
316+
317+
> También pueden ser rangos o slices
318+
Estas estructuras de datos no son contenedores de datos. En Pandas **las utilizamos para transformar y enriquecer nuestros datos, manipularlos, manejar los faltantes, realizar operaciones aritméticas, combinar diferentes dataframes en uno solo para obtener una nueva tabla.**
319+
320+
https://likegeeks.com/es/tutorial-de-python-pandas/
321+
322+
https://www.learnpython.org/es/Pandas%20Basics
323+
324+
https://s3.amazonaws.com/assets.datacamp.com/blog_assets/PandasPythonForDataScience.pdf
325+
326+
## Estructuras de datos: Series
327+
328+
Series es un **vector unidimensional**, para poder acceder a esta lista **podemos usar posiciones o labels**, siendo este último el preferido para manipular las series. **Una diferencia importante sobre las listas de Python es que los datos son homogéneos**, es decir solo podemos tener un tipo de dato por cada Serie.
329+
330+
> Las Series se pueden crear a partir de cualquier secuencia(listas, tuplas, arrays de numpy y diccionarios).
331+
332+
En Python tenemos la **filosofía del Duck Typing, si se ve como un pato y hace cuac, a ese animal le llamamos pato,** si una serie se comporta una lista, se accede como una lista en principio deberíamos llamarla lista, pero esto no es así.
333+
334+
> Una mejor aproximación para inicializar Series es utilizar **diccionarios**.
335+
336+
<div align="center">
337+
<img src="img/4.png">
338+
</div>
339+
340+
<div align="center">
341+
<img src="img/3.png">
342+
</div>
343+
344+
345+
346+
## Estructura de datos: DataFrames
347+
348+
DataFrames **son simplemente una tabla donde las filas y las columnas tienen etiquetas**, se puede construir de diferentes formas pero siempre debemos considerar que la estructura que necesitamos construir para inicializarla tiene que ser bidimensional.
349+
350+
> Una matriz y puede ser una lista de listas, lista de tuplas, un diccionario de Python u otro DataFrame.
351+
352+
**Si solo tenemos una dimensión a eso no le llamamos DataFrame, le llamamos Serie**. Cuando utilizamos un diccionario las llaves se convierten en las llaves de la columna.
353+
354+
## Índices y selección
355+
Existen muchas formas de manipular los DataFrames y de seleccionar los elementos que queremos transformar.
356+
357+
### Dictionary like:
358+
359+
```python
360+
df['col1']
361+
df[['col1', 'col3']]
362+
```
363+
364+
### Numpy like:
365+
366+
```python
367+
iloc = index location
368+
df.iloc[:]
369+
df.iloc[:,:]
370+
```
371+
372+
### Label based:
373+
```python
374+
loc = location
375+
df.loc[:]
376+
df.loc[:,:]
377+
```
378+
|
379+
Existe una gran diferencia en la forma en la que utilizamos estos slices porque varia de la forma tradicional de Python. loc va a incluir el final del que necesitamos.
380+
381+
382+
## Data wrangling o domado de datos
383+
384+
**Data wrangling es una de las actividades más importantes de todos los profesionales de datos.** Simplemente es limpiar, transformar y enriquecer el dataset para objetivos posteriores.
385+
386+
Pandas es una de las herramientas más poderosas para realizar este ““domado”” de datos. Recordemos que Pandas trae muchas de sus abstracciones del lenguaje R, pero nos otorga lo mejor de ambos mundos, por eso es tan popular.
387+
388+
Nos permite:
389+
390+
* Generar transformaciones con gran facilidad.
391+
* Trabajar rápidamente con datasets grandes
392+
* Detectar y reemplazar faltantes
393+
agrupar y resumir nuestros datos
394+
* Visualizar nuestros resultados.
395+
396+
## Trabajar con datos faltanntes
397+
398+
Los datos faltantes representan un verdadero problema sobre todo cuando estamos realizando agregaciones. **Imagina que tenemos datos faltantes y los llenamos con 0, pero eso haría que la distribución de datos se modificaría radicalmente.** Podemos eliminar los registros, pero la fuerza de nuestras conclusiones se debilita.
399+
400+
Pandas nos otorga varias funcionalidades para identificarlas y para trabajar con ellas.
401+
402+
**Existe el concepto que se llama NaN, cuando existe un dato faltante simplemente se rellena con un NaN y en ese momento podemos preguntar cuáles son los datos faltantes con .isna().**
403+
404+
* **notna()** para preguntar dónde hay datos completos.
405+
* **dropna()** para eliminar el registro.
406+
407+
Para reemplazar:
408+
409+
* **fillna()** donde le damos un dato centinela
410+
* **ffill()** donde utiliza el último valor.
411+
412+
https://www.geeksforgeeks.org/difference-between-map-applymap-and-apply-methods-in-pandas/
413+
414+
https://www.geeksforgeeks.org/how-to-get-a-list-of-class-attributes-in-python/
415+
252416
# Sistemas de información
253417

254-
# Nube
418+
**Los sistemas de datos vienen en muchos sabores y colores, SQL, NoSQL especializados en procesamiento en bloque, chorro y streaming.** Este tipo de sistema nos permite realizar queries sofisticadas y compartir nuestro trabajo con otros miembros del equipo.
419+
420+
* **Procesamiento de bloque:** Estamos hablando de datos históricos, qué sucedió ayer, en el trimestre pasado, cuáles fueron las ventas del año anterior o de los últimos cinco años. Nos permite realizar el procesamiento de manera eficiente.
421+
422+
* **Procesamiento en chorro:** Significa que estamos procesando los datos conforme van llegando, las transformaciones se realizan en tiempo real, Este tipo de sistema nos sirven para cuando queremos realizar decisiones en donde la importancia del tiempo es fundamental.
423+
424+
El criterio principal a tener en cuenta: **El tiempo que tienes.** Si bien los sistemas open source son gratis, para poderlos implementar necesitas tener conocimientos de cloud, debes poder saber trabajar y mantener máquinas.
425+
426+
SQL vs NoSQL
427+
428+
La discusión más relevante en el mundo de las aplicaciones web y móvil, donde dependiendo de la aplicación, la decisión puede ser fundamental para el crecimiento de la app.
429+
La verdad es que para los profesionales de los datos, especialmente los profesionales de los datos. Es necesario saber ambos.
430+
431+
## SQLite
432+
433+
# Nube
434+
435+
La nube nos da un poder de cómputo casi inimaginable, nos permite procesar terabytes de datos en segundos. La nube se puede usar en dos grandes ocasiones. Cuando los datos ya no caben en tu computadora loca o cuando el tiempo de procesamiento esta siendo muy extenso, es en ese momento donde deberías usar la nube.
436+
437+
Si estas en un entorno de producción, si estas trabajando en una empresa y los datos de esa empresa ya viven en la nube, lo lógico es realizar el trabajo en la nube. Automatizar los scripts en ese mismo ambiente.
438+
439+
Diversas nubes ya ofrecen paquetes completos para el ciclo de datos, como Google Cloud:
440+
441+
* Dataflow
442+
* Pub/Sub
443+
* Cloud Storage
444+
* Datalab
445+
* BigQuery
446+
* Dataproc
447+
* Firestore
14.1 KB
Loading
5.53 KB
Loading
4.23 KB
Loading
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import pandas as pd
2+
3+
frame = pd.DataFrame({
4+
1999: [74, 38, 39],
5+
2000: [34, 32, 32],
6+
2001: [23, 39, 23]
7+
})
8+
9+
print(frame)
10+
11+
frame2 = pd.DataFrame([
12+
[74, 38, 39],
13+
[34, 32, 32],
14+
[23, 39, 23]
15+
], columns=[1999,2000,2001])
16+
17+
print(frame2)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import pandas as pd
2+
3+
universal = pd.read_csv('learn/DataScience/Ingenieria de datos/pandas/eluniversal_2020_04_29_articles.csv', encoding='latin-1', sep=',')
4+
5+
universal['newspaper_uid'] = 'eluniversal'
6+
7+
print(universal)

0 commit comments

Comments
 (0)