Mi reto 😃
Plantillas de proyectos para ciencia de datos
¿Qué son y por qué utilizar plantillas de proyectos?
Instalar Cookiecutter
Crear plantillas de proyecto personalizadas
Implementar hooks
Distribuir plantilla de proyecto
Manejo de archivos en Python
Manejo de rutas: problemática
Manejo de rutas del sistema: OS
Manejo de rutas del sistema: Pathlib
Manejo de rutas del sistema: PyFilesystem2
Crear referencias relativas de archivos
Caso práctico
Descarga de plantilla y configuración de ambiente virtual
Utilizar proyecto como un módulo de Python
Flujo de trabajo de los notebooks
Conclusiones
Aplica estas herramientas
Crea una cuenta o inicia sesión
¡Continúa aprendiendo sin ningún costo! Únete y comienza a potenciar tu carrera
No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Jesús Vélez Santiago
Dentro de la carpeta principal crea la carpeta que contendrá todo lo que necesitarás en tu proyecto con el nombre:
{{ coockiecutter.project.slug }}
En la carpeta recién creada agrega los siguientes archivos:
README.md
environment.yml
coockiecutter.json
También crea las carpetas que necesitará tu proyecto:
/data
/notebooks
Afuera de la carpeta, pero dentro de la carpeta principal, crea el siguiente archivo:
environment.yml
Hay dos archivos environment.yml, el de configuración de entorno (dentro de la carpeta que creaste) y el que configura las dependencias y paquetes (en la carpeta principal).
Adentro del archivo README.md agrega las siguientes líneas que lo harán un archivo dinámico:
# {{ coockiecutter.project_title }}
By: {{ coockiecutter.project_author_name }}
{{ coockiecutter.project_description }}
Estas líneas, hechas en Jinja, permitirán a tu archivo acceder a las variables que contienen la información del título, autor y descripción del proyecto.
# conda env create --file environment.yml
name: cookiecutter-personal-platzi
channels:
- anaconda
- conda-forge
- defaults
dependencies:
- cookiecutter
# conda env create --file environment.yml
name: {{ cookiecutter.project_slug }}
channels:
- anaconda
- conda-forge
- defaults
dependencies:
{% if cookiecutter.project_packages == "All" -%}
- fs
- jupyter
- jupyterlab
- pathlib
{% endif -%}
- pip
{% if cookiecutter.project_packages == "All" -%}
- pyprojroot
{% endif -%}
- python={{ cookiecutter.python_version }}
- pip:
{% if cookiecutter.project_packages == "All" -%}
- pyhere
{% endif -%}
Dentro de este archivo configurarás todos los valores de las variables que utilizas en los demás archivos:
{
"project_title": "Cookiecutter Personal",
"project_slug": "{{ coockiecutter.project_title.lower().replace(" ", "_").replace("-", "_") }}",
"project_description": "Tu primer proyecto con Cookiecutter.",
"project_author_name": "Tu nombre",
"project_packages": ["All, Minimal"],
"python_version": "3.7"
}
Contribución creada por: Néstor Arellano.
Aportes 35
Preguntas 9
Mi reto 😃
Crear la siguiente estructura de archivos:
También para practicar algo de mecanografía (touch typing) en la terminal:
❯ touch README.md cookiecutter.json environment.yml
❯ mkdir hooks
❯ cd hooks
❯ touch post_gen_proyect.py pre_gen_project.py
❯ cd ..
❯ cd \{\{\ cookiecutter.project_slug\ \}\}
❯ touch .gitignore README.md environment.yml
❯ mkdir data notebooks
❯ cd data
❯ mkdir processed raw
❯ cd processed
❯ touch .gitkeep
❯ cd ..
❯ cd raw
❯ touch .gitkeep
No copiar los códigos dejados en el recurso, es mejor escribirlos tal cual en el video, porque tienen muchos errores los que dejan en el recurso.
Escriben coockiecutter en vez de cookiecutter, el archivo {{ coockiecutter.project.slug }} tiene la c y adicional un .slug en vez de raya al piso _slug .
Pueden usar tree
. Para instalarlo en WSL pongan esto en su terminal:
sudo apt install tree
En Mac:
brew install tree
Luego van a la carpeta root de, en este caso cookiecutter-personal
y ponen tree
. Les devolverá lo siguiente:
.
├── README.md
├── cookiecutter.json
├── environment.yml
├── hooks
│ ├── post_gen_project.py
│ └── pre_gen_project.py
└── {{ cookiecutter.project_slug }}
├── README.md
├── data
│ ├── processed
│ └── raw
├── environment.yml
└── notebooks
└── 0.0-{{ cookiecutter.project_slug }}-introduction.ipynb
Creo que hubo un fallo en la última diapo de la clase ya que no se ve la estructura del reto que propone 😅.
Aprovechando que tenemos las slides, el reto es este:
Debido a que el codigo del video y el del texto de apoyo son diferentes podran encontrarse con estos errores como me ocurrio a mi:
A valid repository for “.” could not be found in the following locations:
-> se soluciona revisando que documento .JSON este dentro de la carpeta principal y no en la de nuestra planilla, y aun mas importante que el nombre sea cookiecutter.json NO coockiecutter.json como lo sugiere el texto.
Unable to create file README
Error message: ‘coockiecutter’ is undefined
-> se soluciona yendo a el documento README y verificando que no haya ningun coockiecutter, en que caso de haberlo cambiarlo por cookiecutter
Espero les sirva, esas incongruencias entre video y texto de apoyo me llevo mucho tiempo para identificarlo
el codigo que dejo el profesor abajo la mayoria esta mal escrito no lo copien por que nunca les va a correr sobre todo el archivo READ. md
Asi quedaria
By: {{ cookiecutter.project_author_name }}
{{ cookiecutter.project_description }}
soy ciego, no vi donde está el reto del final (:
Funcional y dejo script para crear las carpetas que me faltaban.
touch README.md
mkdir hooks && cd hooks && touch post_gen_proyect.py && touch pre_gen_project.py
cd ..
cd \{\{cookiecutter.project_slug\}\
touch .gitignore && cd data && mkdir processed raw && cd processed && touch .gitkeep && cd .. && cd raw && touch .gitkeep
cd ../../ && cd notebooks && touch 0.0-\{\{cookiecutter.project_slug\}\}-introduction.ipynb
A continuar con los retos:
plantilla personalizada para un entorno virtual de trabajo profesional en Python,
1️⃣ La plantilla se crea dentro de la carpeta {{ cookiecutter.project_slug }}
. En ella se agrega todos los archivos y carpetas necesarios de la plantilla: README .md, carpeta de datos, de notebook, etc, (depende del proyecto).
2️⃣ Para hacer la creación de archivos interactivo, se utiliza los bloques declarativos y bloques de expresión dentro de los archivos. Ejemplos:
🔹 Ejemplo README .md interactivo:
# {{ cookiecutter.project_title }}
By: {{ cookiecutter.project_author_name }}
{{ cookiecutter.project_description }}
🔹 Ejemplo environment.yml interactivo:
# conda env create --file environment.yml
name: {{ cookiecutter.project_slug }}
channels:
- anaconda
- conda-forge
- defaults
dependencies:
{% if cookiecutter.project_packages == "All" -%}
- fs
- jupyter
- jupyterlab
- pathlib
{% endif -%}
- pip
{% if cookiecutter.project_packages == "All" -%}
- pyprojroot
{% endif -%}
- python={{ cookiecutter.python_version }}
- pip:
{% if cookiecutter.project_packages == "All" -%}
- pyhere
{% endif -%}
coockiecutter.nombre_variable
3️⃣ Crear archivo de configuracion de variables cookiecutter.json
: en este archivo se declaran todas las variables por defecto y se ubica fuera de la carpeta de la plantilla.
{
"project_title": "Cookiecutter Personal",
"project_slug": "cookiecutter_personal",
"project_description": "Tu primer proyecto con Cookiecutter",
"project_author_name": "Tu nombre",
"project_packages": ["All, Minimal"],
"python_version": "3.10"
}
4️⃣ Crear plantilla en la terminal con cookiecutter [PATH]
, donde PATH
es la ruta donde se creara la plantilla.
La estructura del reto aparece al inicio del video en 00:10
.
Reto
.
├── .DS_Store
├── README.md
├── cookiecutter.json
├── environment.yml
├── hooks
│ ├── post_gen_project.py
│ └── pre_gen-project.py
└── {{ cookiecutter.project_slug }}
├── .DS_Store
├── .gitignore
├── README.md
├── data
│ ├── .DS_Store
│ ├── processed
│ │ └── .gitkeep
│ └── raw
│ └── .gitkeep
├── environment.yml
└── notebooks
└── 0.0-{{ cookiecutter.project_slug }}-introduction.ipynb
Ambos cursos de entorno han sido excelente, pero estas cosas es de esas que intentan automatizar u optimizar procesos y terminan haciendo lo contrario, hacerlo mas complejo, yo haria simplemente subiria un repo a github y cuando lo clone le borraria la carpeta .git
Hola. Les comparto el resultado de ejecutar el ejercicio planteado por el profesor desde la terminal WSL:
Y el reto:
He vuelto del curso de jupyter y terminal para no perderme en este curso, con todos los animos!
Reto
Al principio no entendí bien lo de las variables y claro era porque al copiar al profe había typo jajaja
Para que se puedan ver también los archivos .gitignore y .gitkeep en bash, se puede utilizar el comando
tree -a
Este nos va permitir archivos ocultos, quedando de la siguiente forma:
Confunde un poco que en la documentacion escriban “coockiecutter” con la “c” entre la “o” y la “k”.
Para los que les sale un error " Incorrect type. Expected “string”. yaml-schema: " al copiar el archivo environment.yml que esta dentro de la carpeta {{ cookiecutter.project_slug }}, Solo deben desinstalar la extensión YAML en vs code
tree -a
.
├── cookiecutter.json
├── enviroment.yml
├── hooks
│ ├── post_gen_project.py
│ └── pre_gen_project.py
└── {{cookiecutter.project.slug}}
├── .gitignore
├── README.md
├── cookiecutter.json
├── data
│ ├── processed
│ │ └── .gitkeep
│ └── raw
│ └── .gitkeep
├── enviroment.yml
└── notebooks
6 directories, 10 files
Me daba error y error y era porque en el JSON puse
"cookiecutter.project_title": " Hola",
no va cookiecutter,sino
"project_title" : " Hola",
Incluso si la variable fuera Titulo,solo hay que poner solo Titulo en el JSON y funciona. Al igual si se declaran variables en el JSON que no figuran en los archivos igual funciona,solo que al correr pedirá estas variables aunque no esten en el entorno .
touch 0.0\ \{\{\ cookiecutter.project_slug\ \}\}-introduction.ipynb
{
"project_title" : "Cookiecutter personal",
"project_slug" : "cookiecutter_personal",
"project_description" : "Something cool",
"enhorabuena" : "Lo has echo increíble\n Ahora puedes crear plantillas\n totalmente personalizadas.\n Disfruta todo lo creado!",
"project_author_name": "Your name",
"project_packages" : ["All", "Minimal"],
"python_version" : "3.7"
}
Dejo el desafío resuelto:
Así me quedó el reto 😁
Aún sigo con la intriga del propósito de los nuevos archivos 🤔
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?