2011-02-12 21 views
6

Si quiero hacer una serie de tiempo escriba en F # para mantener los precios de las acciones, ¿qué tipo de base debería usar? NecesitamosModelado de series de tiempo en f # - seq vs array vs vector vs list vs generic list

  1. seleccionar un subconjunto basado en índice de tiempo,
  2. calcular las estadísticas básicas para un subconjunto como media, enfermedades de transmisión sexual o por varios subconjuntos como correlaciones,
  3. elemento Anexar los nuevos datos y estadísticas de actualización rápidas o técnico indicadores,
  4. hacer una regresión lineal entre las series temporales, etc

he leído que array tiene un mejor rendimiento, seq tiene una memoria más pequeña nota al pie, list es mejor para agregar elementos y F # vector es más fácil para ciertos cálculos matemáticos. Para equilibrar todas las compensaciones, ¿cómo modelarías una serie temporal de precios de acciones en f #? Gracias.

Respuesta

10

Como representación concreta, puede elegir una matriz o lista o algún otro tipo de collección .NET. Una secuencia seq<'T> es un tipo abstracto y tanto la matriz como la lista también son automáticamente secuencias; esto significa que cuando se escribe algún código que funcione con secuencias, funcionará con cualquier tipo concreto de datos (matriz, lista o cualquier otra colección .NET).

Así, al escribir procesamiento de datos, puede utilizar Seq por defecto (ya que le da una gran flexibilidad - no importa lo que la representación concreta que se use) y luego optimizar algunas operaciones para utilizar la representación concreta (lo eso será) si necesitas algo para correr más rápido.

En cuanto a la concreta representación - Creo que la pregunta crucial es si desea agregar elementos sin cambiar la estructura de datos original (lista inmutable o matriz utilizado de una manera inmutable) o si desea mutar la estructura de datos (por ejemplo, use alguna colección mutable de .NET).

Si necesita agregar nuevos elementos a la vez, puede usar la lista inmutable (que admite agregar elementos al frente) o una colección mutable (la matriz no funciona ya que no se puede redimensionar).

  • Si está trabajando en un sistema más sofisticado, recomendaría echar un vistazo a ObservableCollection<T> (ver MSDN). Esta es una colección que le notifica automáticamente cuando se cambia. En respuesta a la notificación, puede actualizar sus estadísticas (también le dice qué elementos se agregaron, por lo que no necesita volver a calcular todo). Sin embargo, F # no tiene bibliotecas para trabajar con este tipo, por lo que tendrá que escribir muchas cosas usted mismo.

  • Si agrega datos solo raramente o los agrega en grupos más grandes, podría usar una matriz (y asignar nueva matriz cada vez que agregue elementos). Si solo tiene un número relativamente pequeño de elementos en la colección, podría usar listas (donde agregar elementos es fácil).

Para los cálculos numéricos, el F # PowerPack (y tipos como vector) ofrecen único conjunto bastante limitied de características, por lo que puede que tenga que mirar en algunas bibliotecas partido thrid. Extreme optimizations es una biblioteca comercial con algunos ejemplos F # y Math.NET es una alternativa de código abierto.

De lo contrario, es difícil dar un consejo concreto: ¿puede agregar más detalles sobre su sistema? (por ejemplo, qué tan grande es el conjunto de datos, cuántos elementos se deben agregar con qué frecuencia, etc.)

+1

No creo que la pregunta mutable frente a la inmutable sea "crucial". Las personas usan matrices de forma inmutable todo el tiempo, solo para obtener el rendimiento de las matrices (¡que .NET tuviera un tipo de matriz de solo lectura!), Así que creo que otras pragmáticas son una preocupación mayor que la mutabilidad. – Brian

+0

@Brian - sí, tienes toda la razón. De hecho, estaba considerando la matriz más como _immutable_ porque no puede agregar elementos (¡y estaba asumiendo que los datos históricos no cambian para que los elementos no se muten)! Aclaré la respuesta. –