⚙️ Automatización
Optimizador de Flujos de Trabajo
Analice flujos de trabajo existentes y cree scripts de automatización optimizados
★★★ Avanzado 40 min 13 de enero de 2025
Caso de Uso
Los flujos de trabajo repetitivos desperdician tiempo e introducen errores. Cowork puede analizar sus procesos documentados y crear scripts automatizados que optimicen las operaciones.
Ejemplo de Prompt
Tengo un flujo de trabajo documentado en ~/Workflows/daily_report.md que describe mi proceso de generación de informes diarios. Actualmente incluye:
1. Exportar datos de 3 Google Sheets
2. Descargar logs del servidor
3. Procesar CSVs para extraer KPIs
4. Generar gráficos
5. Compilar en documento Word
6. Enviar por correo a las partes interesadas
Por favor:
1. Analice este flujo de trabajo para oportunidades de automatización
2. Cree un script único que automatice todo lo posible
3. Identifique los pasos que aún requieren intervención manual
4. Estime el ahorro de tiempo
5. Cree la automatización en ~/Scripts/daily_report/
Qué Hace Cowork
- Análisis de Procesos: Lee y analiza la documentación del flujo de trabajo
- Evaluación de Automatización: Identifica pasos automatizables
- Generación de Scripts: Crea automatización integral
- Configuración de Integración: Conecta con los servicios requeridos
- Documentación: Proporciona instrucciones de uso y limitaciones
Salida de Ejemplo
# Análisis de Flujo de Trabajo: Generación de Informe Diario
## Proceso Actual (Manual)
| Paso | Descripción | Tiempo | Automatizable |
|------|-------------|--------|---------------|
| 1 | Exportar Google Sheets | 10 min | Sí |
| 2 | Descargar logs del servidor | 5 min | Sí |
| 3 | Procesar CSVs | 20 min | Sí |
| 4 | Generar gráficos | 15 min | Sí |
| 5 | Compilar documento | 20 min | Sí |
| 6 | Enviar correo a interesados | 5 min | Sí |
**Tiempo Manual Total**: 75 minutos/día
**Tiempo Automatizado Estimado**: 5 minutos (tiempo de ejecución del script)
**Ahorro de Tiempo**: 70 minutos/día (~93%)
## Limitaciones de la Automatización
- Google Sheets requiere credenciales de API
- El correo puede necesitar revisión manual antes de enviar
- Los gráficos pueden necesitar verificación visual
#!/usr/bin/env python3
# daily_report.py - Generación Automatizada de Informe Diario
import os
import sys
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
from pathlib import Path
import subprocess
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import encoders
# Configuración
CONFIG = {
'output_dir': Path.home() / 'Reports',
'sheets_ids': [
'1ABC...', '1DEF...', '1GHI...'
],
'server': 'logs.example.com',
'recipients': ['team@example.com', 'manager@example.com'],
}
def export_sheets():
"""Exportar datos de Google Sheets"""
print("Exportando Google Sheets...")
dfs = []
for sheet_id in CONFIG['sheets_ids']:
url = f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv"
df = pd.read_csv(url)
dfs.append(df)
return dfs
def download_logs():
"""Descargar logs del servidor"""
print("Descargando logs del servidor...")
today = datetime.now().strftime('%Y-%m-%d')
log_path = CONFIG['output_dir'] / f'logs_{today}.txt'
subprocess.run([
'scp', f"{CONFIG['server']}:/var/log/app/app.log", str(log_path)
], check=True)
return log_path
def process_data(dfs, log_path):
"""Procesar datos y extraer KPIs"""
print("Procesando datos...")
# Combinar dataframes
combined = pd.concat(dfs, ignore_index=True)
# Calcular KPIs
kpis = {
'total_users': combined['user_id'].nunique(),
'total_revenue': combined['revenue'].sum(),
'avg_order_value': combined['revenue'].mean(),
'conversion_rate': combined['converted'].mean() * 100,
}
# Procesar logs
with open(log_path) as f:
logs = f.read()
kpis['error_count'] = logs.count('ERROR')
kpis['warning_count'] = logs.count('WARNING')
return combined, kpis
def generate_charts(df, kpis):
"""Generar gráficos de visualización"""
print("Generando gráficos...")
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# Tendencia de ingresos
df.groupby('date')['revenue'].sum().plot(ax=axes[0,0], title='Ingresos Diarios')
# Distribución de usuarios
df['segment'].value_counts().plot.pie(ax=axes[0,1], title='Segmentos de Usuario')
# Resumen de KPIs
kpi_df = pd.DataFrame([kpis])
kpi_df[['total_revenue', 'avg_order_value']].plot.bar(ax=axes[1,0])
axes[1,0].set_title('Métricas de Ingresos')
# Embudo de conversión
axes[1,1].bar(['Visitas', 'Registros', 'Compras'],
[10000, 2500, 500])
axes[1,1].set_title('Embudo de Conversión')
plt.tight_layout()
chart_path = CONFIG['output_dir'] / f'charts_{datetime.now():%Y%m%d}.png'
plt.savefig(chart_path, dpi=150)
plt.close()
return chart_path
def compile_report(kpis, chart_path):
"""Compilar informe final"""
print("Compilando informe...")
report = f"""# Informe Diario
Generado: {datetime.now():%Y-%m-%d %H:%M}
## Indicadores Clave de Rendimiento
| Métrica | Valor |
|---------|-------|
| Total Usuarios | {kpis['total_users']:,} |
| Ingresos Totales | ${kpis['total_revenue']:,.2f} |
| Valor Medio de Pedido | ${kpis['avg_order_value']:,.2f} |
| Tasa de Conversión | {kpis['conversion_rate']:.1f}% |
## Estado del Sistema
- Errores: {kpis['error_count']}
- Advertencias: {kpis['warning_count']}
## Gráficos
Consulte la visualización adjunta.
"""
report_path = CONFIG['output_dir'] / f'report_{datetime.now():%Y%m%d}.md'
report_path.write_text(report)
return report_path
def send_email(report_path, chart_path):
"""Enviar informe por correo"""
print("Enviando informe...")
# Lógica de envío de correo aquí
print(f"Informe enviado a {len(CONFIG['recipients'])} destinatarios")
def main():
print("Iniciando Generación de Informe Diario")
print("=" * 50)
try:
dfs = export_sheets()
log_path = download_logs()
df, kpis = process_data(dfs, log_path)
chart_path = generate_charts(df, kpis)
report_path = compile_report(kpis, chart_path)
# Solicitar revisión antes de enviar
print(f"\nInforme listo: {report_path}")
if input("¿Enviar correo? (y/n): ").lower() == 'y':
send_email(report_path, chart_path)
print("\n¡Informe diario completado!")
except Exception as e:
print(f"Error: {e}")
sys.exit(1)
if __name__ == '__main__':
main()
Consejos
- Comience documentando el proceso actual
- Identifique primero los cuellos de botella y pasos manuales
- Pruebe la automatización con datos de muestra antes de producción
- Mantenga la supervisión humana para decisiones críticas
- Agregue registro de logs para solución de problemas