sábado, 8 de junio de 2024

SAS: un lenguaje de programación para manipular datos

Ya hemos hablado de lenguajes quizás no muy conocidos como OpenEdge ABL. En esta ocasión hablaremos de SAS Programming.

SAS (Statistical Analysis Software) es una lataforma software y un lenguaje de programación opera principalmente sobre tablas de datos. Influido por PL/1, un lenguaje de programación de propósito general adecuado para programación comercial, científica, no científica y de sistemas.

Puede usar consultas SQL para la manipulación de los datos de las tablas.

Se usa para análisis avanzado, business intelligence, gestión de datos y analítica predictiva.

Existen dos intérpretes de dicho lenguaje: uno desarrollado por SAS Institute y otro por la empresa World Programming.

/**  Hola, mundo en SAS  **/
data HolaMundo;
   msg = "Hola,mundo !!";
run;

/**  Imprimir **/
proc print data = HolaMundo;
run;

Como se puede observar la sintaxis es similar a la de PL/1.

Los tipos de datos en SAS son:

  • CHAR o CHARACTER.
  • INT32.
  • INT64.
  • NUMERIC (DOUBLE).
  • VARBINARY.
  • VARCHAR.
  • etc.

Aplicaciones de SAS Programming:

  • Análisis Estadístico: Realización de análisis descriptivo e inferencial. 
  • Modelos Predictivos: Construcción de modelos de predicción usando regresión, árboles de decisión, y técnicas de machine learning. 
  • Business Intelligence: Generación de informes y dashboards para la toma de decisiones. 
  • Gestión de Datos: Limpieza, transformación y gestión de grandes volúmenes de datos.
  • Bioestadística: Aplicaciones en investigación clínica y farmacéutica.

Componentes de SAS Programming:

  1. Data Steps:

    • DATA Step: Se utiliza para crear y manipular datasets. Incluye declaraciones para leer datos de fuentes externas, combinar y transformar datos, y preparar datos para análisis.
    • PROC Step: Procedimientos para realizar análisis estadísticos, generar informes y gráficos, gestionar datos, y realizar muchas otras tareas. Ejemplos incluyen PROC MEANS para estadísticas descriptivas, PROC REG para regresión lineal, y PROC FREQ para análisis de tablas de contingencia.
  2. Macros:

    • SAS Macro Language permite la automatización de tareas repetitivas y la personalización de código SAS. Facilita la creación de programas más dinámicos y eficientes.
  3. SAS Functions:

    • Funciones integradas que realizan operaciones sobre datos, como manipulación de strings, cálculos matemáticos, y operaciones de fecha y hora.
  4. ODS (Output Delivery System):

    • Permite la exportación de resultados a varios formatos como HTML, PDF, Excel, y otros, facilitando la presentación y distribución de resultados.
  5. Libraries:

    • SAS Libraries son colecciones de datasets. Las bibliotecas pueden ser locales (almacenadas en el equipo) o remotas (almacenadas en un servidor).

Algunos ejemplos de código:

Exportar datos a HTML (ODS):

ODS HTML FILE='output.html';
PROC PRINT DATA=mydata;
RUN;
ODS HTML CLOSE;

Uso de MACROS:

%MACRO PrintData(ds);
    PROC PRINT DATA=&ds;
    RUN;
%MEND PrintData;

%PrintData(mydata);

Uso de PROC Step:

PROC MEANS DATA=mydata;
    VAR Age Height Weight;
RUN;

Uso de DATA Step:

DATA mydata;
    INPUT Name $ Age Height Weight;
    DATALINES;
    John 25 70 180
    Jane 30 65 150
    ;
RUN;

SAS es ampliamente utilizado en industrias como la salud, finanzas, marketing, y gobierno debido a su robustez, capacidad de manejar grandes datasets y su capacidad para realizar análisis complejos.

Ejemplo 1. Crear un programa que calcule los grados Celsius.

Debemos hacer lo siguiente:

  1. Crear un dataset con los valores en grados Fahrenheit.
  2. Convertir los valores a grados Celsius con la fórmula: C=9(F−32)×5
  3. Mostrar los resultados.
/* Paso 1: Crear un dataset con valores en Fahrenheit */
DATA temperature_fahrenheit;
    INPUT Fahrenheit;
    DATALINES;
    32
    68
    77
    104
    ;
RUN;

/* Paso 2: Convertir Fahrenheit a Celsius */
DATA temperature_celsius;
    SET temperature_fahrenheit;
    Celsius = (Fahrenheit - 32) * 5 / 9;
RUN;

/* Paso 3: Mostrar los resultados */
PROC PRINT DATA=temperature_celsius;
    TITLE "Conversión de Fahrenheit a Celsius";
RUN;

Ejemplo 2. Un programa que calcule el número de pulsaciones de una persona. Para este programa repetiremos el mismo procedimiento del anterior. Crearemos un dataset con valores que incluirán nombre, edad y peso de la persona; aplicaremos una fórmula ( Pulsaciones por minuto=210−(0.5×edad)−(0.11×peso en kg) ) y mostraremos el resultado.

/* Paso 1: Crear un dataset con la edad y el peso de las personas */
DATA personas;
    INPUT Nombre $ Edad Peso;
    DATALINES;
    Juan 25 70
    Maria 30 60
    Pedro 40 80
    Ana 35 55
    ;
RUN;

/* Paso 2: Calcular el número de pulsaciones por minuto */
DATA pulsaciones;
    SET personas;
    Pulsaciones = 210 - (0.5 * Edad) - (0.11 * Peso);
RUN;

/* Paso 3: Mostrar los resultados */
PROC PRINT DATA=pulsaciones;
    TITLE "Cálculo del Número de Pulsaciones por Minuto";
RUN;

El resultado de ambos programas se verá reflejado en una tabla. Y es que SAS trabaja como si todo fuera una tabla con datos procesados.

Es suficiente por el día de hoy. Se continuará en próximas entregas.

Enlaces:

https://www.sas.com/es_mx/home.html
https://altair.com/sas-language-capabilities?utm_source=worldprogramming.com&utm_medium=redirect
https://ms.mcmaster.ca/peter/s4p03/s4p03_0304/sasnotes.htm

sábado, 1 de junio de 2024

Programando en C# no. 6

En este blog hemos hablado de este lenguaje de programación similar, muy similar, al lenguaje Java. Sin embargo, deberíamos aclarar algunos puntos:

  • Aunque ha tenido influencia de diversos lenguajes de programación, su sintaxis está basada en C y C++, no en Java.
  • Fue ideado para ser superior a su predecesor: C++ (y no Java).
  • Actualmente es de "código abierto".
  • Si tienes experiencia en C++ o Java, su sintaxis se te hará muy familiar.
  • Al igual que Java, tiene sus propias peculiaridades. Repetimos, no es una copia de Java aunque lo parezca.

No importa que SO (Sistema Operativo) que uses, podrás instalarlo en cualquiera que te acomodes.




Algunas ventajas y desventajas de programar con C#

Ventajas:

  • El mercado laboral solicita muchos programadores que dominen C#.
  • Hay una gran comunidad y documentación sobre este lenguaje.
  • No es tan complicado como C o C++.

Desventajas:

  • Es un lenguaje propiedad de Microsoft. Tendrás que usar Visual Studio como IDE y demás aplicaciones Windows.
  • Aunque hay mucha documentación y fuentes para aprenderlo, eso puede atosigarnos. Al igual que Java, aprenderlo no es algo sencillo.
  • Siempre hay algo nuevo que aprender, cuando empiezas a dominar o aprender algo, siempre saldrá algo que lo sustituya.

Si usas Windows u otro SO, checa este link: https://dotnet.microsoft.com/en-us/download

Descargalo y sigue las instrucciones. No debería ser muy difícil.


¿Es forzoso instalar Visual Studio (IDE)?

No, no es necesario, pero si es recomendable tener un IDE y sobre todo si es el mejor para este lenguaje. Puedes optar por Visual Studio Code, pero la diferencia es que no es un IDE. Tendrás que instalar los complementos o plugins que un IDE ya trae instalados.

Si no deseas instalarlo, puedes optar por probar estos dos sitios:

Podrás escribir tus pimeros programas con la ayuda de esos dos sitios web. Además el sitio oficial del lenguaje provee lo necesario para poder iniciarte en el lenguaje: https://dotnet.microsoft.com/en-us/learn/dotnet/in-browser-tutorial/1

Para crear un proyecto basta abri una terminal y teclear:

dotnet new console

Program.cs

Console.WriteLine("Hola, mundo en C#!");

Compilamos y ejecutamos:

dotnet run

Salida:

Hola, mundo en C#!

Editamos el programa para poder mostrar algunos tipos de datos permitidos en C#.

Program.cs

using System;
using clases;
using interfaces;

/**
 * @author Codemonkey Junior
 * @date 2024/05/18
 *
 */
class Program
{

    
    

    public Program()
    {
        Console.WriteLine("Objeto 'Program' creado e inicializado.");
    }

    ~Program(){}

    public static void Main(string[] args)
    {
        #region Pruebas
        tiposDatos();
        #endregion
    }

    static void tiposDatos()
    {

        Console.WriteLine("\t [ Tipos de datos en C# ]");
        #region Tipos de datos
        int entero = 32_000_000;
        char c = 'Q';
        byte b = 1;
        short s = 3;
        long clave = 1213212L;
        string nombre = "Este es un nombre.";
        bool falso = false;
        float valor = 23.9f;
        Console.WriteLine("Integer: {0}, Char: {1}",entero,c);
        Console.WriteLine("Byte: {0}, Short: {1}",b,s);
        Console.WriteLine("Long: {0}, String: {1}",clave,nombre);
        Console.WriteLine("Bool: {0}, Float: {1}",falso,valor);
        #endregion

        #region Tipos anonimos
        var obj = new Object();
        var numeral = 213;
        var literal = "AXVC.";
        var verdadero = !false;
        var flotante = 2.32f;
        var carac = '@';
        Console.WriteLine("Object: {0}, Entero: {1}",obj,numeral);
        Console.WriteLine("String: {0}, Bool: {1}",literal,verdadero);
        Console.WriteLine("Float: {0}, Char: {1}",flotante,carac);
        #endregion

    }

}

Más ejemplos en próximas entregas.

Enlaces:

https://codemonkeyjunior.blogspot.com/search?q=csharp
https://codemonkeyjunior.blogspot.com/2015/02/programar-en-c-sin-necesidad-de.html
https://dotnet.microsoft.com/es-es/languages/csharp
https://www.mytaskpanel.com/introduccion-a-csharp/
https://codemonkeyjunior.blogspot.com/2019/06/instalar-paquetes-nuget-con-dotnet.html
https://www.monodevelop.com/
https://codemonkeyjunior.blogspot.com/2019/05/ingenieria-economica-con-c.html

lunes, 27 de mayo de 2024

GCP: Crear Stored Procedures y Funciones en BigQuery

En esta ocasión veremos cómo crear Stored Procedures y funciones en BigQuery. Un procedimiento almacenado es un conjunto de instrucciones que se pueden llamar desde otras consultas o desde otros procedimientos almacenados.

  • Puede tomar argumentos de entrada y mostrar valores como resultados.
  • Puede acceder a los datos o modificarlos en varios conjuntos de datos de varios usuarios.
  • También puede contener una consulta de varias instrucciones.

Ejemplo. Crear un Stored Procedure que mande un simple mensaje de "Hola, mundo". En este caso también le pasamos un párametro de nombre (name).

CREATE OR REPLACE PROCEDURE `myproject.mydataset.decirHola`(name STRING)
BEGIN
  SELECT FORMAT("Hola, %s",name);
END;

Para invocarlo:

CALL`myproject.mydataset.decirHola`('Thomas Muller');

Ejemplo. Teniendo esta sentencia SQL que nos devuelve la definición de un Stored Procedure en BigQuery:

-- Obtener la definición de un Stored Procedure en BigQuery
SELECT 
  routine_catalog, 
  routine_schema, 
  routine_name, 
  routine_type, 
  routine_definition
FROM your_dataset.INFORMATION_SCHEMA.ROUTINES    
WHERE routine_name = 'nombre_stored_procedure';

Crear un Stored Procedure que nos devuelva cada uno de los campos.

CREATE OR REPLACE PROCEDURE `myproject.mydataset.getDetallesStored`(nameStored STRING)
BEGIN
  -- Ejecutar la consulta y retornar los resultados
  DECLARE routine_catalog STRING;
  DECLARE routine_schema STRING;
  DECLARE routine_name STRING;
  DECLARE routine_type STRING;
  DECLARE routine_definition STRING;

  SELECT
    routine_catalog,
    routine_schema,
    routine_name,
    routine_type,
    routine_definition
  INTO 
    routine_catalog,
    routine_schema,
    routine_name,
    routine_type,
    routine_definition
  FROM
    myproject.mydataset.INFORMATION_SCHEMA.ROUTINES
  WHERE
    routine_name = nameStored;

  -- Seleccionar los resultados para retornarlos
  SELECT
    routine_catalog,
    routine_schema,
    routine_name,
    routine_type,
    routine_definition;
END;

Hacemos el llamado:

CALL `myproject.mydataset.getDetallesStored`('decirHola');

El resultado de este llamado nos arrojará los detalles del Stored Procedure indicado.


¿Y las funciones?

Una función es similar a un Stored Procedure (Procedimiento Almacenado), pero devolverá un valor. Además cambia la manera en la que lo invocamos. Mientras que un Stored Procedure es invocado con CALL, a una función la invocaremos con SELECT.

Ejemplo. Crear una función para dividir dos números.

CREATE OR REPLACE FUNCTION `myproject.mydataset.getDiv`(
  x FLOAT64, y FLOAT64) RETURNS FLOAT64
AS (
  SELECT DIV(X, Y) AS RESULT;
);

Para usar la función:

SELECT `myproject.mydataset.getDiv`(3.4,5.2);

Para quienes han usado PL/pgSQL (PostgreSQL) o PL/SQL (Oracle) la sintaxis es muy similar, por no decir idéntica. Salvo por algunas excepciones.

En próximas entregas continuaremos con este tema.

Enlaces:

https://cloud.google.com/bigquery/docs/procedures?hl=es-419

domingo, 19 de mayo de 2024

Instalando Scala & SBT

En este post veremos cómo instalar Scala y SBT. Para ello usaremos SDKMAN!

SBT es un gestor de proyectos similar a Gradle y Maven.

Como primera instrucción tenemos:

sdk install scala

Comprobamos su instalación:

scala --version

Ahora sbt:

sdk install sbt

Verificamos la instalación:

sbt --version

Comandos básicos de SBT

  • clean, para limpiar proyecto.
  • reload, recargar proyecto.
  • update, actualizar proyecto.
  • compile, compilar proyecto y
  • run, para ejecutar proyecto.

Creamos un proyecto Play Framework con SBT. Abrimos una terminal y tecleamos:

sbt new playframework/play-scala-seed.g8

Ejecutamos la aplicación web:

sbt run

Abrimos un navegador en la ruta http://localhost:9000

Listo, nuestro primer proyecto creado!!

Enlaces:

https://sdkman.io/
https://www.scala-sbt.org/
https://www.scala-lang.org/
https://codemonkeyjunior.wordpress.com/

domingo, 12 de mayo de 2024

Haxe

Haxe es un lenguaje de programación de código abierto de alto nivel de tipo estricto con un compilador cruzado de optimización rápida.

El sitio oficial de este lenguaje menciona que es usado para crear APIs, video juegos, aplicaciones web y de escritorio.

Instalación de Haxe en Linux (Ubuntu)

sudo add-apt-repository ppa:haxe/releases -y
sudo apt-get update
sudo apt-get install haxe -y
mkdir ~/haxelib && haxelib setup ~/haxelib

La extensión de un programa en Haxe es *.hx.

Main.hx

class Main{
   static public function main(): Void{
      trace("Hola mundo en Haxe!!!");
   }
}

Para compilar y ejecutar abrimos una terminal

haxe --main Main --interp

Tipos de datos:

var entero:Int=11;
var cadena:String="Helmut Gerrsand";
var falso:Bool= 45 > 21;
var flotante:Float=3.4;

Funciones:

class Main{
   static public function main(): Void{
   testA();
  }

   static public function testA(): Void{
    trace("Hola, mundo en Haxe!!");
   }

}

Enlaces:

https://haxe.org/

Aprender Oracle SQL con LiveSQL

Si deseas aprender SQL o mejorar tus habilidades existe un sitio para hacerlo: https://livesql.oracle.com/

LiveSql es un sitio con tutoriales, ejemplos y editor que nos permite ejecutar sentencias SQL como:

  • Crear tablas.
  • Crear vistas.
  • Consultar datos de las tablas.
  • Crear bloques PL/SQL.
  • Crear funciones y procedimientos PL/SQL.
  • etc.

¿Qué es SQL?

Son las siglas de Structured Query Language. Un lenguaje especializado para la creación y manipulación de la información contenida en tablas de información perteneciente a una base de datos.

El SQL se divide en:

  • DCL: Data Control Language (GRANT/REVOQUE).
  • TCL: Transaction Control Language (COMMIT/ROLLBACK/SAVEPOINT).
  • DDL: Data Definition Language(CREATE/ALTER/DROP/RENAME/TRUNCATE).
  • DML:Data Manipulation Language(INSERT/SELECT/UPDATE/DELETE).

DCL, nos permitirá otorgar y revocar permisos a tablas, funciones y procedimientos y otros objetos.

TCL, nos permitirá el control de las transacciones.

DDL, nos permitirá el control de la definición de los objetos.

DML, nos permitirá la manipulación de la información contenida.

LiveSql está enfocado tanto a principiantes como experimentados en el conocimiento de SQL. No permite crear o borrar bases de datos. No las necesitas, con que puedas crear tablas y manipularlas te bastará, ya que trabajarás con la BD que provee el sitio.

Oracle posee, al igual que otros SGBD (Sistema Gestor de Bases de Datos) su propios tipos de datos como lo pueden ser:

VARCHAR
CHAR
FLOAT
NUMBER
DATE
LONG
BINARY_FLOAT
BINARY_DOUBLE
TIMESTAMP
CLOB
BLOB
...

El editor nos permitirá ejecutar cualquier sentencia SQL válida:

select to_char(sysdate, 'HH:MI:SS') as hora from dual;
HORA
03:13:05

Podremos ejecutar bloques PL/SQL:

DECLARE
BEGIN
   dbms_output.put_line('Fecha: '||sysdate);
END;
/
Fecha: 12-MAY-24

Más ejemplos en próximos posts.

Enlaces:

https://livesql.oracle.com/

viernes, 3 de mayo de 2024

GCP: Creando y borrando tablas con BigQuery (Java, Python, etc.)

En un post pasado dimos un pequeño vistazo a GCP y BigQuery. Continuaremos con más ejemplos de Java y BigQuery.

Ejemplo 1. Crear una tabla con BigQuery.

CrearTableBigQuery.java

package com.codemonkey.main;

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.StandardTableDefinition;
import com.google.cloud.bigquery.TableDefinition;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableInfo;

public class CrearTableBigQuery {

   public static final String MY_DATASET_NAME = "midataset";
   public static final String MY_TABLE_NAME= "usuarios";

  public static void main(String[] args) {

    String datasetName = MY_DATASET_NAME;
    String tableName = MY_TABLE_NAME;
    Schema schema =
        Schema.of(
            Field.of("nombre", StandardSQLTypeName.STRING),
            Field.of("activo", StandardSQLTypeName.BOOL));
    createTable(datasetName, tableName, schema);
  }

  public static void createTable(String datasetName, String tableName, Schema schema) {
    try {
   
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);
      TableDefinition tableDefinition = StandardTableDefinition.of(schema);
      TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();

      bigquery.create(tableInfo);
      System.out.println("Tabla creada exitosamente!!");
    } catch (BigQueryException e) {
      System.err.println("Ha ocurrido un error al crear la tabla: \n" + e.getMessage());
    }
  }
}

Si todo funciona correctamente, entonces la tabla usuarios habrá sido creada correctamente.

En Python el código tan solo consta de unas breves líneas de código:

creartablabq.py

from google.cloud import bigquery

client = bigquery.Client()
table_id = "midataset.usuarios"
schema = [
    bigquery.SchemaField("nombre", "STRING", mode="REQUIRED"),
    bigquery.SchemaField("edad", "INTEGER", mode="REQUIRED"),
]
table = bigquery.Table(table_id, schema=schema)
table = client.create_table(table)  
print(
    "Se ha creado la tabla {}.{}.{}".format(table.project, table.dataset_id, table.table_id))

Ejemplo 2. Eliminar una tabla con BigQuery.

EliminarTabla.java

package com.codemonkey.main;

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

public class EliminarTabla {

  public static void main(String[] args) {
    String datasetName = "midataset";
    String tableName = "usuarios";
    borrarTabla(datasetName, tableName);
  }

  public static void borrarTabla(String datasetName, String tableName) {
    try {

      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
      boolean success = bigquery.delete(TableId.of(datasetName, tableName));
      if (success) {
        System.out.println("Tabla borrada exitosamente");
      } else {
        System.out.println("Tabla no encontrada");
      }
    } catch (BigQueryException e) {
      System.out.println("Ha ocurrido un error al borrar la tabla. \n" + e.getMessage());
    }
  }
}

Si funciona correctamente, la tabla será eliminada.

Ahora en Python:

eliminartablabq.py

from google.cloud import bigquery

client = bigquery.Client()

table_id = 'myproject.mydataset.usuarios'

client.delete_table(table_id, not_found_ok=True) 
print("Tabla eliminada: '{}'.".format(table_id))

¿Y qué con otros clientes cómo PHP, etc.?

Hay clientes para otros lenguajes además de Java y Python, también puede usar C#, PHP, y Go.

borrartablebq.php

use Google\Cloud\BigQuery\BigQueryClient;

/**
 * Borrar determinada tabla
 *
 * @param string $projectId El ID de tu proyecto.
 * @param string $datasetId El ID de tu dataset.
 * @param string $tableId El ID de tu tabla.
 */
function eliminarTabla(string $projectId, string $datasetId, string $tableId): void
{
    $bigQuery = new BigQueryClient([
      'projectId' => $projectId,
    ]);
    $dataset = $bigQuery->dataset($datasetId);
    $table = $dataset->table($tableId);
    $table->delete();
    printf('Tabla eliminada %s.%s' . PHP_EOL, $datasetId, $tableId);
}

Cómo se puede observar, es relativamente fácil emplear el client library de GCP para nuestros proyectos en la nube.

El código fue tomado de este enlace: https://cloud.google.com/bigquery/docs/samples/bigquery-delete-table

Enlaces:

https://codemonkeyjunior.blogspot.com/2024/04/gcp-google-cloud-bigquery.html
https://codemonkeyjunior.blogspot.com/2024/04/google-cloud-platform-gcp-en-un-vistazo.html
https://codemonkeyjunior.blogspot.com/2024/04/gcp-google-cloud-storage.html

Entendiendo el flujo MuleSoft

En la anterior entrega dijimos que MuleSoft es una plataforma de integración que te permite conectar aplicaciones, datos y APIs de mane...

Etiquetas

Archivo del blog