Como crear una aplicacion Blazor


En este post vamos a ver la creación de una aplicación web de un chat  en tiempo real mediante SignalR con Blazor WebAssembly. 

Los pasos a seguir son los siguientes:

  • Crear un proyecto de aplicación Blazor WebAssembly hospedado
  • Adición de la biblioteca cliente de SignalR
  • Agregar un concentrador de SignalR
  • Agregar servicios de SignalR y un punto de conexión para el concentrador de SignalR
  • Agregar código de componente de Razor para chat

Al final de este post, tendrá una aplicación de chat funcional

 

Antes de comenzar este post, se recomienda instalar un editor.

https://dotnet.microsoft.com/download

 

https://dotnet.microsoft.com/download/dotnet/thank-you/sdk-5.0.100-windows-x64-installer 

 

 

 

 

Creación de un proyecto de aplicación Blazor WebAssembly hospedado

Siga las instrucciones para su elección de herramientas:

Se requiere Visual Studio 16.8 o posterior y el SDK de .NET Core 5.0.0 o posterior.

  1. Cree un nuevo proyecto.
  2. Seleccione Aplicación Blazor y luego Siguiente.
  3. Escriba BlazorSignalRApp en el campo Nombre del proyecto. Confirme que la entrada de Ubicación es correcta o proporcione una ubicación para el proyecto. Seleccione Crear.
  4. Elija la plantilla Aplicación de Blazor WebAssembly .
  5. En Avanzado, active la casilla ASP.NET Core hospedado.
  6. Seleccione Crear.

Adición de la biblioteca cliente de SignalR

  • En el Explorador de soluciones, haga clic con el botón derecho en el proyecto BlazorSignalRApp.Client y seleccione Administrar paquetes NuGet.
  • En el cuadro de diálogo Administrar paquetes NuGet, confirme que Origen del paquete se ha establecido en nuget.org.
  • Con Examinar seleccionado, escriba Microsoft.AspNetCore.SignalR.Client en el cuadro de búsqueda.
  • En los resultados de la búsqueda, seleccione el paquete Microsoft.AspNetCore.SignalR.Client y, después, seleccione Instalar.
  • Si aparece el cuadro de diálogo Vista previa de los cambios, seleccione Aceptar.
  • Si aparece el cuadro de diálogo Aceptación de la licencia, seleccione Acepto si está de acuerdo con los términos de la licencia.

Agregar un concentrador de SignalR

En el proyecto BlazorSignalRApp.Server, cree una carpeta Hubs (plural) y agregue la siguiente clase ChatHub (Hubs/ChatHub.cs):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;

namespace BlazorSignalRApp.Server.Hubs
{
    public class ChatHub : Hub
    {
        public async Task SendMessage(string user, string message)
        {
            await Clients.All.SendAsync("ReceiveMessage", user, message);
        }
    }
}

Adición de servicios y de un punto de conexión para el concentrador de SignalR

  1. En el proyecto BlazorSignalRApp.Server, abra el archivo Startup.cs.
  2. Agregue el espacio de nombres para la clase ChatHub en la parte superior del archivo:C#Copiarusing BlazorSignalRApp.Server.Hubs;
  3. Agregue servicios de middleware de compresión de respuesta y SignalR a Startup.ConfigureServices:

 

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR();
    services.AddControllersWithViews();
    services.AddRazorPages();
    services.AddResponseCompression(opts =>
    {
        opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
            new[] { "application/octet-stream" });
    });
}
  1. En Startup.Configure:
    • Use el middleware de compresión de respuesta de la parte superior de la configuración de la canalización de procesamiento.
    • Entre los puntos de conexión de los controladores y la reserva del lado cliente, agregue un punto de conexión para el concentrador.

 

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseResponseCompression();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseWebAssemblyDebugging();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseBlazorFrameworkFiles();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
        endpoints.MapControllers();
        endpoints.MapHub<ChatHub>("/chathub");
        endpoints.MapFallbackToFile("index.html");
    });
}

Agregar código de componente de Razor para chat

  1. En el proyecto BlazorSignalRApp.Client, abra el archivo Pages/Index.razor.
  2. Reemplace el marcado con el código siguiente:

 

@page "/"
@using Microsoft.AspNetCore.SignalR.Client
@inject NavigationManager NavigationManager
@implements IAsyncDisposable

<div class="form-group">
    <label>
        User:
        <input @bind="userInput" />
    </label>
</div>
<div class="form-group">
    <label>
        Message:
        <input @bind="messageInput" size="50" />
    </label>
</div>
<button @onclick="Send" disabled="@(!IsConnected)">Send</button>

<hr>

<ul id="messagesList">
    @foreach (var message in messages)
    {
        <li>@message</li>
    }
</ul>

@code {
    private HubConnection hubConnection;
    private List<string> messages = new List<string>();
    private string userInput;
    private string messageInput;

    protected override async Task OnInitializedAsync()
    {
        hubConnection = new HubConnectionBuilder()
            .WithUrl(NavigationManager.ToAbsoluteUri("/chathub"))
            .Build();

        hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
        {
            var encodedMsg = $"{user}: {message}";
            messages.Add(encodedMsg);
            StateHasChanged();
        });

        await hubConnection.StartAsync();
    }

    Task Send() =>
        hubConnection.SendAsync("SendMessage", userInput, messageInput);

    public bool IsConnected =>
        hubConnection.State == HubConnectionState.Connected;
        
    public async ValueTask DisposeAsync()
    {
        await hubConnection.DisposeAsync();
    }
}

Ejecutar la aplicación

  1. En el Explorador de soluciones, seleccione el proyecto BlazorSignalRApp.Server. Presione F5 para ejecutar la aplicación con depuración o Ctrl+F5 para ejecutarla sin depuración.
  2. Copie la dirección URL de la barra de direcciones, abra otra instancia o pestaña del explorador, y pegue la dirección URL en la barra de direcciones.
  3. Elija cualquier explorador, escriba un nombre y un mensaje, y haga clic en el botón para enviar el mensaje. El nombre y el mensaje se muestran en ambas páginas al instante:
Anuncio publicitario

Cómo seleccionar columnas con Pandas


Mientras trabaja en proyectos de ciencia de datos, generalmente obtiene una gran cantidad de datos. Pero es posible que deba trabajar solo con un subconjunto de columnas de los datos. Esta selección de datos necesarios se realiza para simplificar las tareas. Además, las velocidades de cálculo también se mejoran al trabajar con un conjunto de datos más pequeño. Hay varias maneras de seleccionar columnas de trama de datos, incluyendo locilocfilter, etc. Este post cubre todos los métodos con ejemplos.

Crear un conjunto de datos de muestra

Comience creando un marco de datos de pandas simple como se muestra a continuación. Tiene 6 columnas.

# Import packages
import pandas as pd

# Create a dataframe
df = pd.DataFrame(
                   data= [['HR', 'Orange', 'Wheat', 30, 165, 4.6],
                        ['DL', 'Purple', 'Flour', 2, 70, 8.3],
                        ['MH', 'Red', 'Mango', 12, 120, 9.0],
                        ['AS', 'Black', 'Apple', 4, 80, 3.3],
                        ['GJ', 'Blue', 'Milk', 32, 180, 1.8],
                        ['KL', 'Green', 'Melon', 33, 172, 9.5],
                        ['PB', 'Magenta', 'Beans', 69, 150, 2.2]],

                    columns=['State', 'Color', 'Food', 'Average Age', 'Average Height', 'Score']
                )
df

Crear marco de datos

1. Selección de columna básica

Una de las formas más básicas en pandas para seleccionar columnas del marco de datos es pasando la lista de columnas al operador de indexación del objeto del marco de datos.

# Selecting columns by passing a list of desired columns
df[['Color', 'Score']]

Columna de selección de pandas

2. Selección de columnas mediante la lista de columnas

El dataframe_name.columnsdevuelve la lista de todas las columnas de la trama de datos. Puede usar esto como una de las formas de acceder a múltiples columnas en pandas. Debe pasar la lista modificada de columnas en el operador de indexación del marco de datos. Este método se puede realizar de dos formas:

A. Pasando la lista de columnas divididas

Puede dividir los nombres de columna deseados de la lista de todas las columnas devueltas dataframe_name.columnspor indexación.

# slicing df.columns to access the last two columns of the dataframe

df[df.columns[-2:]]
Pandas Seleccionar columna usando la lista

B. Búsqueda de columnas deseadas usando isin()

La función se usa para verificar si un elemento está presente en la lista. Aquí, la función se puede usar para verificar si el nombre de una columna está presente en la lista, así como la lista de columnas deseadas. Esto ayuda a seleccionar varias columnas de la lista de todas las columnas. La función devuelve una matriz booleana, donde valor denota que el nombre de la columna estaba presente en ambas listas.isin(), the isin()df.columnsTrue

# Creating the boolean mask
booleanMask = df.columns.isin(['State', 'Food'])

# saving the selected columns 
selectedCols = df.columns[booleanMask]

# selecting the desired columns
df[selectedCols]

Pandas Seleccionar columna usando la función isin

3. Usar .loc y .iloc para seleccionar columnas por nombre o posición

Los pandas y los indexadores se pueden usar con el marco de datos de pandas para reducir un marco de datos grande en un marco de datos pequeño. Estos indexadores se pueden utilizar para la selección de filas y columnas..loc.iloc

A. Usando indexador.loc

The loctoma nombres de columnas o listas de columnas y devuelve una fila o un marco de datos. El indexador toma tanto filas como columnas. Por lo tanto, para seleccionar solo columnas del marco de datos, puede dejar la división de filas como :, lo que seleccionará todas las filas del marco de datos.

Para la división de columnas, puede pasar el nombre de la columna que se seleccionará.

# .loc single column selection 
df.loc[:, 'Food' ]

0    Wheat
1    Flour
2    Mango
3    Apple
4     Milk
5    Melon
6    Beans
Name: Food, dtype: object

Si desea seleccionar varias columnas, pase una lista de columnas.

# .loc multiple column selection
df.loc[:, ['State', 'Food'] ]
Pandas Seleccionar columna usando loc

B. Usando indexador.iloc

The ilocindexador es similar al indexador. La única diferencia es que toma índices de columnas o índices de listas de columnas y devuelve una fila o marco de datos..lociloc

Aquí también, puede dejar la división de filas :para seleccionar todas las filas y para la división de columnas, puede pasar los índices de la columna o una lista de índices de las columnas que se seleccionarán.

# .iloc single column selection 
df.iloc[:, 0]

0    HR
1    DL
2    MH
3    AS
4    GJ
5    KL
6    PB
Name: State, dtype: object

# .iloc single column selection 
df.iloc[:, [0, 2, 3] ]
Pandas Seleccionar columna usando iloc

4. Usar métodos de filtro para seleccionar columnas que contienen ciertas palabras.

Puede usar la función de filtro del marco de datos de pandas para seleccionar columnas que contengan una cadena específica en los nombres de las columnas.

El parámetro likede la función define esta cadena específica. Si el nombre de una columna contiene la cadena especificada, esa columna se seleccionará y se devolverá el marco de datos..filter

# selecting columns where column name contains 'Average' string
df.filter(like='Average')

5. Pandas Selecciona columnas según su tipo de datos.

El marco de datos de Pandas tiene la función select_dtypes, que tiene un includeparámetro. Especifique el tipo de datos de las columnas que desea seleccionar usando este parámetro. Esto puede resultarle útil si desea seleccionar solo columnas de tipos de datos específicos del marco de datos.

# selecting integer valued columns
df.select_dtypes(include=['int64'])
Selección basada en el tipo de datos

Consejos prácticos

  • También puede seleccionar columnas basadas en reglas de expresiones regulares. Utilice el regexparámetro en la función de filtro para obtener columnas donde los nombres de columna se evalúan como Verdadero en una expresión dada.
  • La selección de columnas según los tipos de datos puede resultar útil al realizar un análisis exploratorio de datos. Tendrá diferentes tipos de datos separados, lo que eliminará el proceso de crear manualmente la lista de columnas para diferentes tipos de datos.