No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Creación de la receta: preparando la automatización

26/38
Recursos

Aportes 52

Preguntas 11

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Noto en los comentarios que varios no lo pueden probar por que no tienen un dataset.

Adjunto link para descargar el que acabo de generar, contiene 100 articulos.

https://drive.google.com/open?id=1c3ztruA25--rH9fq7mC4pODfuEtqW_D_

Noté que se me dificultó el curso porque el profe fragmenta mucho el código a mi gusto y por eso les dejo el mismo código sin tantas funciones. 😃 Espero ayude

import argparse
import logging
from urllib.parse import urlparse
import pandas as pd

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def main(filename):
    logger.info('Starting cleaning process')
    
    logger.info('Reading file {}'.format(filename))
    df = pd.read_csv(filename)
    
    logger.info('Extracting newspaper uid')
    newspaper_uid = filename.split('_')[0]
    
    logger.info('Newspaper uid detected: {}'.format(newspaper_uid))
    
    logger.info('Filling newspaper_uid column with {}'.format(newspaper_uid))
    df['newspaper_uid'] = newspaper_uid
    
    logger.info('Extracting host from urls')
    df['host'] = df['url'].apply(lambda url: urlparse(url).netloc)
    
    
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('filename',
                        help='The path to the dirty data',
                        type=str)

    args = parser.parse_args()

    df = main(args.filename)
    print(df)

Al igual que en jupyter notebooks, acá tambien puede saltar un UnicodeDecodeError, para solucionarlo en la función _read_data debes devolver lo siguiente:

return pd.read_csv(filename, encoding = "latin-1")

adjunto link de libreria argparse:
https://docs.python.org/es/3.8/howto/argparse.html

Otra forma seria convertir el archivo de jupyter notebook en un archivo .py, ya que jupyter permite guardar como este tipo de archivo

Es necesario asignar a df el return de un método que ya de por sí modifica a df? Me refiero a que cuando un método recibe un objeto como argumento, lo que pasa es la referencia (no una copia local), por lo que teóricamente es innecesario, verdad?

(data_science) C:\Users\Us\Desktop\ds>py newspaper_receipe.py eluniversal_2020_05_10_articles.csv
Traceback (most recent call last):
File “newspaper_receipe.py”, line 3, in <module>
import pandas as pd
ModuleNotFoundError: No module named ‘pandas’

(data_science) C:\Users\Usuario\Desktop\ds_python\Scrapers Propios>

from urllib.parse import urlparse 😃

He trabajado mucho con pandas pero he presentado problemas para leer archivos superiores a 2 GB la pregunta es :

¿Es problema de pandas o problema de capacidad RAM de mi PC?
¿Cuanto es el tamaño limite de archivos .csv que han podido leer con pandas ?

Excelente curso falto compartir el dataset que estaba trabajando el docente debido a que el tenia presentaba unos problemas

Yo quise organizar los archivos en una carpeta por lo cual al darle el path de la carpeta el news_paper_uid tambien tenia ese path

solucion con ntpath
agregar el import

import ntpath

Nuevo metodo de extraccion que soporta path de archivos indiferente del sistema operativo

def _extract_newspaper_uid(filename):
  """ Se limpia el path dado y del nombre del archivo
  en base al formato seguido se obtiene el path"""
  logger.info('Extracting newspaper uid')

  cleaned_filename = ntpath.split(filename)[1]

  newspaper_uid = cleaned_filename.split('_')[0]

  logger.info('Newspaper uid detected: {}'.format(newspaper_uid))

  return newspaper_uid

Veo que en este punto la clase explica el codigo corrido sin detenerse mucho, es porque esto es un curso avanzando? tome los basicos de python, pero en ninguno habla de logger, parser, urllib, como aprender a usar eso y el porque? o me salte algun curso previo a este que si explica todo esto detenidamente, porque esta clase me atropello un poco. No entiendo de donde viene toda la logica para concluir que asi se deben armar las funciones./

EN LOS TRABAJOS NO HACEN TRABAJAN CON NOTICIAS

por alguna razon la validacion del extract_newspaper_uid(filename) me daba error,
le quite el .split(’
’) y funciono correctamente

Si tienes mas de un dataset y los quieres leer todos a la vez, puedes usar esta configuración

parser.add_argument(
        "--files",
        help="files with the dirty data",
        nargs="+",
        default=[],
        required=False
    )

Y luego usarla con las rutas que quieras o con el wildcard /* de esta forma

python newspaper_receipe.py --files output/*

quien me ayuda con este error.

File "pandas/_libs/hashtable_class_helper.pxi", line 1492, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1500, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 'url'

me paso con el código y también en notebook.
Gracias

Si quieren cargar o correr su código en jupyter notebook, lo que tienen que hacer es color en una celda:
Para cargar el código

%load path_del_codigo.py

Para correr el código

%run ath_del_codigo.py

Excelente, las aplicaciones para este ejercicio son muy amplias, Gracias profe Aroesti

Dejo mi Archivo con apuntes y funcional para que se guíen

import argparse
import logging
from urllib.parse import urlparse

import pandas as pd
logging.basicConfig(level=logging.INFO)

logger = logging.getLogger(__name__)

def main(filename):
    logger.info('Starting cleaning process')
    # Leer el DataFrame
    df = _read_data(filename)
    # Extraer el newspaper_uid del archivo por medio del nombre del mismo
    # Recordar que el nombre del csv empieza con el nombre del newspaper
    newspaper_uid = _extract_newspaper_uid(filename)
    # Agregar la columna newspaper_uid al DataFrame
    df = _add_newspaper_uid_column(df, newspaper_uid)
    # Extraer el host del DataFrame
    df = _extract_host(df)

    return df
    
def _extract_host(df):
    logger.info('Extrating host from urls')
    # Obtener el host de las urls mediande apply y la libreria urllib con el metodo netloc
    df['host'] = df['url'].apply(lambda url: urlparse(url).netloc)
    return df

def _add_newspaper_uid_column(df, newspaper_uid):
    logger.info('Filling newspaper_uid_column with {}'.format(newspaper_uid))
    df['newspaper_uid'] = newspaper_uid
    return df

# Leer El archivo csv y convertirlo en DataFrame
def _read_data(filename):
    logger.info('Reading file {}'.format(filename))
    return pd.read_csv(filename)

# Extraer el newspaper_uid del archivo por medio del nombre del mismo
def _extract_newspaper_uid(filename):
    logger.info('Extrating newspaper uid')
    # Seleccionar la primera parte del string que esté dividido por el caracter '_'
    newspaper_uid = filename.split('_')[0]
    logger.info('Newspaper uid detected {}'.format(newspaper_uid))
    return newspaper_uid

if __name__ == '__main__':
    # Preguntar al usuario que tipo de dato quiere
    parser = argparse.ArgumentParser()
    parser.add_argument('filename',help='The path to the dirty data', type=str)
    # Parsear Argumentos
    args = parser.parse_args()
    df = main(args.filename)
    print(df)





Lista la primera parte de la automatización.

Gracias profe…

Ya voy logrando grandes avances con mis propios periódicos…

el diario el pais usa solo su propio dominio para alojar las noticias.
curioso

alguien me puede explicar para que sirve lo del get logger? muchas gracias.

Excelente clase

¿Por que no se puede acceder a panda después de que lo instalas?, Leí que es porque se instala en una dirección diferente y no se puede acceder, todavía no lo puedo resolver, ¿algún consejo?

les comparto mi resultado

Logrado!

Muy interesante esta clase.-

interesante!

Excelente clase, vamos por mas

[154 rows x 5 columns]
INFO:__main__:Starting cleaning process
INFO:__main__:Reading file eluniversal_2020_04_04_articles.csv
INFO:__main__:Extracting newspaper uid
INFO:__main__:Newspaper uid detected: eluniversal
INFO:__main__:Filling newspaper_uid column with eluniversal
INFO:__main__:Extracting host from urls```

Todo bien por ahora:

C:\mintic\python2\web_scrapper>py receta.py eltiempo_2020_04_10_articulos.csv     INFO:__main__:Inicia limpiado                                                     INFO:__main__:Leyendo archivo eltiempo_2020_04_10_articulos.csv                   INFO:__main__:Extrayendo id sitio                                                 INFO:__main__:Hallada id sitio: eltiempo                                          INFO:__main__:Llenando uid_sitio con eltiempo                                     INFO:__main__:Extrayendo el host de urls                                                                                         cuerpo  ...              host      0   Por primera vez, monseñor Luis José Rueda Apar...  ...  www.eltiempo.com      1   Seis directivos del FC Barcelona, entre ellos ...  ...  www.eltiempo.com      2   Mil onzas de oro, avaluadas en más de 3 millon...  ...  www.eltiempo.com      3   Los tiempos de coronavirus traen otra vez pred...  ...  www.eltiempo.com      4   \r\n\r\n\r\n\r\n\r\n\r\nPasto\r\n\r\n11:22 a.m...  ...  www.eltiempo.com      ..                                                ...  ...               ...      79  \r\n\r\n\r\n\r\n\r\n\r\nSAE\r\n\r\n11:28 a.m. ...  ...  www.eltiempo.com      80  En el norte de Perú, en la provincia de Santa ...  ...  www.eltiempo.com      81  En Bogotá (Colombia), Manila (Filipinas), Jeru...  ...  www.eltiempo.com      82  \r\n\r\n\r\n\r\n\r\n\r\nMedellín\r\n\r\n11:09 ...  ...  www.eltiempo.com      83  \r\n\r\n\r\n\r\n\r\n\r\nSAE\r\n\r\n11:28 a.m. ...  ...  www.eltiempo.com                                                                                        [84 rows x 5 columns] 

Me da este error al ejecutarlo. ¿Alquien saber por qué?

INFO:__main__:Starting cleaning process
INFO:__main__:Reading file eluniversal_2019_01_26_articles.csv
Traceback (most recent call last):
  File "pandas\_libs\parsers.pyx", line 1134, in pandas._libs.parsers.TextReader._convert_tokens
  File "pandas\_libs\parsers.pyx", line 1240, in pandas._libs.parsers.TextReader._convert_with_dtype
  File "pandas\_libs\parsers.pyx", line 1256, in pandas._libs.parsers.TextReader._string_convert
  File "pandas\_libs\parsers.pyx", line 1494, in pandas._libs.parsers._string_box_utf8
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 8: invalid start byte

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "newspaper_receipe.py", line 57, in <module>
    df = main(args.filename)
  File "newspaper_receipe.py", line 13, in main
    df = _red_data(filename)
  File "newspaper_receipe.py", line 23, in _red_data
    return pd.read_csv(filename)
  File "C:\Users\MARIO-PORTATIL\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 678, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Users\MARIO-PORTATIL\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 446, in _read
    data = parser.read(nrows)
  File "C:\Users\MARIO-PORTATIL\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1036, in read
    ret = self._engine.read(nrows)
  File "C:\Users\MARIO-PORTATIL\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1848, in read
    data = self._reader.read(nrows)
  File "pandas\_libs\parsers.pyx", line 876, in pandas._libs.parsers.TextReader.read
  File "pandas\_libs\parsers.pyx", line 891, in pandas._libs.parsers.TextReader._read_low_memory
  File "pandas\_libs\parsers.pyx", line 968, in pandas._libs.parsers.TextReader._read_rows
  File "pandas\_libs\parsers.pyx", line 1094, in pandas._libs.parsers.TextReader._convert_column_data
  File "pandas\_libs\parsers.pyx", line 1141, in pandas._libs.parsers.TextReader._convert_tokens
  File "pandas\_libs\parsers.pyx", line 1240, in pandas._libs.parsers.TextReader._convert_with_dtype
  File "pandas\_libs\parsers.pyx", line 1256, in pandas._libs.parsers.TextReader._string_convert
  File "pandas\_libs\parsers.pyx", line 1494, in pandas._libs.parsers._string_box_utf8
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 8: invalid start byte

Muy interesante todo el tema de limpieza de datos y automatización

Se logro el resultado para ambos periodicos, solo recuerden que el script lo deben ejecutar dentro del ambiente virtual, en mi caso tambien fue necesario instalar pandas otra vez.

ME estaba dando este error y no supe porque 😕

Traceback (most recent call last):
  File "newspaper_receipe.py", line 53, in <module>
    df = main(args.filename)
  File "newspaper_receipe.py", line 16, in main
    df = _extract_host(df)
  File "newspaper_receipe.py", line 41, in _extract_host
    df['host']= df['url'].apply(lambda url: urlparse(url).netloc)
  File "C:\Users\wrope\anaconda3\lib\site-packages\pandas\core\series.py", line 3848, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)
  File "pandas\_libs\lib.pyx", line 2327, in pandas._libs.lib.map_infer
  File "newspaper_receipe.py", line 41, in <lambda>
    df['host']= df['url'].apply(lambda url: urlparse(url).netloc)```

Añadiendo función _add_newspaper_uid_column(df, newspaper_uid)

Al contrario de otras secciones del curso, la de Pandas se sigue muy bien!

Excelente!!

Para el error
SyntaxError: Non-UTF-8 code starting with ‘\xf1’ in file script.py on line 14, but no encoding declared;
Se agregó como primera linea de script el siguiente código:

<# -*- coding: latin-1 -*->

Si son como yo y les da pereza estar configurando el logger, pueden inicializarlo desde common.py:

import logging

__logger_dict = dict()

# Config code

def configure_logger(pyfilename):
    global __logger_dict

    if pyfilename not in __logger_dict:
        logging.basicConfig(level=logging.INFO)
        logger = logging.getLogger(pyfilename)
        __logger_dict[pyfilename] = logger
    
    return __logger_dict[pyfilename]

Y en donde lo llamen, borran los modulos logger y cachean el logger asi:

from common import configure_logger

logger = configure_logger(__name__)

A continuación comparto el código comentado:

import argparse
import logging
logging.basicConfig(level=logging.INFO)
from urllib.parse import urlparse

import pandas as pd

logger = logging.getLogger(__name__) #Obtener una referencia del logger asociado a nuestro nombre de archivo


def main(filename):
    logger.info('Starting cleaning process')
    
    df = _read_data(filename) #Leemos el archivo que tiene por nombre lo indicado por el usuario
    newspaper_uid = _extract_newspaper_uid(filename) #Para obtener el newspaper_uid nos aprovechamos que el archivo lo contiene al inicio del nombre
    df = _add_newspaper_uid_column(df, newspaper_uid) #Añadimos una nueva columna a nuestro dataser con el newspaper_uid
    df = _extract_host(df) #Extraermos el host de todos los links del dataset

    return df

def _read_data(filename):
    logger.info('Reading file {}'.format(filename))

    return pd.read_csv(filename)

def _extract_newspaper_uid(filename):
    logger.info('Extracting newspaper uid')
    newspaper_uid = filename.split('_')[0]
    logger.info('Newspaper uid detected: {}'.format(newspaper_uid))

    return newspaper_uid

def _add_newspaper_uid_column(df, newspaper_uid):
    logger.info('Filling newspaper_uid column with {}'.format(newspaper_uid))
    df['newspaper_uid'] = newspaper_uid

    return df

def _extract_host(df):
    logger.info('Extracting host')
    df['host'] = df['url'].apply(lambda url: urlparse(url).netloc) #Parseamos la URL

    return df

if __name__ == "__main__":
    parser = argparse.ArgumentParser() #Preguntarle al usuario el archivo con que deseas que el script trabaje
    parser.add_argument('filename',
                        help='The path to the dirty data',
                        type=str) #type nos indica que es lo que nos va a dar el usuario
    args = parser.parse_args() #El parser, parsea los argumentos

    df = main(args.filename)
    print(df)```

Hola,

Un sinónimo muy usado de dirty(sucio) es Raw(crudo). Por lo que es muy común encontrar algo como:

The raw data

Significando lo mismo que:

The dirty data

Se podría decir que el termino raw se refiere a los datos crudos , aún sin tratamiento alguno.

Saludos!

Saludos… aqui mi resultado

C:\Website-VisualCode\Ingenieria Datos\web_scrapper_curso_datya_eng>newspaper_receipe.py eluniversal_2020_05_10_articles.csv
INFO:main:Starting cleaning process
INFO:main:Reading file eluniversal_2020_05_10_articles.csv
INFO:main:Extracting newspaper uid
INFO:main:Newspaper uid detected: eluniversal
INFO:main:Filling newspaper_uid column with eluniversal
INFO:main:Extracting host from urls
body … host
0 0 % PULSO SOCIAL0 Mientras el número de conta… … de10.com.mx
1 \nLa pandemia de Covid-19 ya ha contagiado a m… … www.viveusa.mx
2 \nLa reciente fórmula que estableció ESPN para… … www.eluniversal.com.mx
3 \nChina elevó este domingo el nivel de riesgo … … www.eluniversal.com.mx
4 \nEl vicepresidente de Estados Unidos, Mike Pe… … www.eluniversal.com.mx
… … … …
97 \nAmaury Vergara, presidente del Guadalajara, … … www.eluniversal.com.mx
98 A unas horas del Día de las Madres, en lugar d… … www.elgrafico.mx
99 \nLa corista Mollie Gould presumió sus dotes d… … www.viveusa.mx
100 \nSalma Hayek publicó una selfie en redes soci… … www.viveusa.mx
101 \nNos hacen ver que algunos de los opositores … … www.eluniversal.com.mx

[102 rows x 5 columns]

Un poco largo el tema pero muy bueno.

Alguien mas tuvo este error?

<code>
 ** On entry to DGEBAL parameter number  3 had an illegal value
 ** On entry to DGEHRD  parameter number  2 had an illegal value
 ** On entry to DORGHR DORGQR parameter number  2 had an illegal value
 ** On entry to DHSEQR parameter number  4 had an illegal value
Traceback (most recent call last):
  File "newspaper_receipe.py", line 6, in <module>
    import pandas as pd
  File pandas\__init__.py", line 11, in <module>
    __import__(dependency)
  File "numpy\__init__.py", line 305, in <module>
    _win_os_check()
  File "numpy\__init__.py", line 302, in _win_os_check
    raise RuntimeError(msg.format(__file__)) from None
RuntimeError: The current Numpy installation (numpy\\__init__.py') fails to pass a sanity check due to a bug in the windows runtime. See this issue for more information:

Que bonito es lo bonito!

A quienes en WINDOWS les aparezca el error NO MODULE NAMED ‘PANDAS’ y tienen la versión PYTHON 3.8 en adelante aunque ya hayan instalado PANDAS y NUMPY pero no se los reconoce, desinstale la versión de python y los editores de texto como ANACONDA, SUBLIME TEXT, VS CODE y CMDER (para no generar conflictos al volver a instalar la versión de python) e instalé PYTHON 3.7.6 y volví a instalar todos los programas anteriores y me funcionó.

FALLA: NUMPY y PANDAS aún no actualizan sus librerías para python 3.8.3 en adelante

import argparse
import logging
import pandas as pd
from urllib.parse import urlparse

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def main(filename):
    logger.info('Starting cleaning process')

    df =  read_data(filename)
    newspaper_iud = _extract_newspaper_uid(filename)
    df = _add_newspaper_uid_column(df, newspaper_iud)
    df = _extract_host(df)
    print(df)

def read_data(filename):
    logger.info('Reading file {}'.format(filename))
    return pd.read_csv(filename, encoding = "ISO-8859-1")

def _extract_newspaper_uid(filename):
    logger.info('Extarcting newspiper uid')
    newspaper_uid = filename.split('_')[0]

    logger.info('Newspiper uid detected {}'.format(newspaper_uid))
    return newspaper_uid

def _add_newspaper_uid_column(df, newspaper_iud):
    logger.info('Filling newspaper_uid column with {}'.format(newspaper_iud))
    df['newspaper_uid'] = newspaper_iud
    
    return df

def _extract_host(df):
    logger.info('Extractiong host from urls')
    df['host'] = df['url'].apply(lambda url: urlparse(url).netloc)
    
    return df

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('filename',
                        help= 'The path to the dirty data.',
                        type= str)
    args = parser.parse_args()
    
    main(args.filename)```