R Project for Statistical Computing + .net + BI

Que pasa cuando tenemos que agregar lógica matemática a nuestros proyectos? especialmente de BI? pues muchas veces vamos por ayuda a MatLab, pero cuando a veces nos damos cuenta del costo preferimos ir por algún software libre, como es el caso de R (http://www.r-project.org/), éste un potente motor que nos puede ayudar a hacer muchas operaciones matemáticas financieras, el objetivo de este post no es explicar las formulas matemáticas expuestas en R, sino ver como podemos colocarlo en nuestra solución.

Para empezar debes descargar la versión de R de la pagina oficial. Luego debemos descargar un conector R COM+ (RSrv250_pl1.exe –> http://sunsite.univie.ac.at/rcom/download/current/RSrv250_pl1.exe), que expone a R como un conjunto de objetos para poder programarlo (y acá va todo el floro de lo que es COM+ y como se puede utilizar en .net).

He tenido mucho pasado en .net y eso me ha ayudado a poder extender funcionalidades en Reporting Services, Integration Services y etcs…. y eso me ha ayudado a agregar R en el proyecto de BI.

Bueno ahora si a código!!!, si eres primerizo en esto primero debes entrar a este link –> http://www.codeproject.com/KB/cs/RtoCSharp.aspx, se puede ver como se utiliza R con un ejemplo sencillo en .net

Si ya estas en algo con todo esto debes entrar a ejemplos mas avanzado -> http://joachimvandenbogaert.wordpress.com/2009/03/26/r-and-c-on-windows/ ;http://joachimvandenbogaert.wordpress.com/2009/02/20/rcom-and-c-safearraytypemismatchexception/

Ya una vez que estas con ese nivel pues llegas a este párrafo :p jejejeje, la realidad te dice que no tienes tiempo de programar dos veces, una en R y otro en .net para que se acople, entonces la idea seria tener un generador que lee archivos en R sea cual fuera lo que hace y te devuelva un resultado y finalmente eso es lo que es:

public object EjecutarR(DataTable datos, string rutaR)
{
  object o1 = null;
  if (datos.Rows.Count > 1)
   {
    try
     {
      StatConnector sc1 = new StatConnectorClass();
       sc1.Init(“R”);

        StringBuilder valoresFilas;
        StringBuilder valoresColumnas = new StringBuilder();
        //Llenar Datos
        int i, j;
        for (i = 0; i < datos.Columns.Count; i++)
        {
         valoresFilas = new StringBuilder();

         for (j = 0; j < datos.Rows.Count; j++)
         {
          if (datos.Columns[i].DataType.Name == “String”)
           valoresFilas.Append(“””);
          if (datos.Rows[j][i].GetType() == Type.GetType(“System.DBNull”))
           valoresFilas.Append(“0”);
          else
           valoresFilas.Append(datos.Rows[j][i].ToString());
          if (datos.Columns[i].DataType.Name == “String”)
           valoresFilas.Append(“””);
           valoresFilas.Append(“,”);
          }

          sc1.EvaluateNoReturn(datos.Columns[i].ColumnName + ” <- c(” +
          valoresFilas.ToString().Substring(0, valoresFilas.ToString().Length – 1) + “)”);

          valoresColumnas.Append(datos.Columns[i].ColumnName);
          valoresColumnas.Append(“,”);
         }

         sc1.EvaluateNoReturn(“dat <- data.frame(” +
         valoresColumnas.ToString().Substring(0, valoresColumnas.ToString().Length – 1) + “)”);

         sc1.SetSymbol(“archivo”, rutaR);

         sc1.EvaluateNoReturn(“source(archivo)”);
         o1 = sc1.GetSymbol(“Resultados”);
         sc1.Close();
         Utilitarios.Funciones.NAR(sc1);
         GC.Collect();
         GC.WaitForPendingFinalizers();
         }
         catch (Exception ex)
         {
          if (ExceptionPolicy.HandleException(ex, ErrPolicy.Business))
           throw;
          }
         }

 

El código que se encuentra en otro color indica lo que utilizamos de R. Para explicarlo un poco, les cuento que este código me permite en base a un datatable meter cualquier valor a R, y que lo lea como una matriz (en realidad lleno vectores y creo un dataframe con esos), con ese input llamo a R y leo un archivo (que lo paso por parámetro) en ese archivo se tiene el algoritmo de R y dicho algoritmo debe asignar a la variable Resultado lo que necesito traer a .net

Este script me permite leer cualquier archivo de R sin necesidad de cambiar una línea de código, me permite meter cualquier valor de .net (siempre y cuando este en un datatable) y leerlo en R.

Otra solución seria llamar por ODBC a SQL desde R pero no esa opción desde el punto de vista de arquitectura no me agrada. Es mejor que pase por tu capa de datos (Entity Framework)

Este codigo lo colocamos en un servicio .net y lo podemos llamar desde Integration Services 2008 (que ya permite tener referencias web) y con esto podemos poblar cubos, o transformar datos.

Espero lo hayan entendido 🙂

Un comentario en “R Project for Statistical Computing + .net + BI”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *