2011-02-18 19 views
6

Tengo datos de stock diarios como un archivo HDF5 creado usando PyTables. Me gustaría obtener un grupo de filas, procesarlo como una matriz y luego escribirlo nuevamente en el disco (actualizar filas) usando PyTables. No pude encontrar una manera de hacer esto limpiamente. ¿Podrías decirme cuál será la mejor manera de lograr esto?PyTables lotes get y update

Mis datos:

Symbol, date, price, var1, var2 
abcd, 1, 2.5, 12, 12.5 
abcd, 2, 2.6, 11, 10.2 
abcd, 3, 2.45, 11, 10.3 
defg, 1,12.34, 19.1, 18.1 
defg, 2, 11.90, 19.5, 18.2 
defg, 3, 11.75, 21, 20.9 
defg, 4, 11.74, 22.2, 21.4 

Me gustaría leer las filas que corresponden a cada símbolo como una matriz, hacer algo de procesamiento y actualizar los campos VAR1 y var2. Conozco todos los símbolos de antemano para poder recorrerlos. He intentado algo como esto:

rows_array = [row.fetch_all_fields() for row in table.where('Symbol == "abcd"')] 

me gustaría transmitir rows_array a otra función que calcule los valores para var1 y var2 y actualizarlo para cada registro. Tenga en cuenta que var1, var2 son como promedios móviles, por lo que no podré calcularlos dentro de un iterador y, por lo tanto, la necesidad de que todo el conjunto de filas sea una matriz.

Después de calcular todo lo que necesito usando rows_array, no estoy seguro de cómo volver a escribirlo en los datos, es decir, actualizar las filas con los nuevos valores calculados. Al actualizar la tabla de toda , yo uso esto:

table.cols.var1[:] = calc_something(rows_array) 

Sin embargo, cuando quiero actualizar sólo una parte de la mesa, no soy la mejor manera de hacerlo. Creo que puedo volver a ejecutar la condición 'donde' y luego actualizar cada fila en función de mis calcs, pero eso parece una pérdida de tiempo al volver a explorar la tabla.

Sus sugerencias son apreciadas ...

Gracias, -e

Respuesta

10

Si entiendo bien, el siguiente debe hacer lo que quiera:

condition = 'Symbol == "abcd"' 
indices = table.getWhereList(condition) # get indices 
rows_array = table[indices] # get values 
new_rows = compute(rows_array) # compute new values 
table[indices] = new_rows # update the indices with new values 

Esperanza esto ayuda

+0

Gracias, Francesc. Eso funciona bien Supongo que el segundo WhereList escaneará la tabla de nuevo. Modifiqué el código para que solo obtuviera el índice primero y luego leí los valores de la tabla usando el índice y la actualicé usando el índice nuevamente. – Ecognium

+0

Oh, definitivamente. He editado mi respuesta anterior para seguir tu sugerencia. – FrancescAlted

+0

en lugar de pasar por row_arrays, quería obtener una columna directamente y probé esto: price = table.cols.price [indices]. Me sale este error: Archivo "/Library/Python/2.6/site-packages/tables/table.py", línea 3063, en __getitem__ "'% s' tipo de clave no es válido en este contexto"% key) TypeError : El tipo de clave '[0 1 2 3 4 5 6 7 8 9 10]' no es válido en este contexto ¿Alguna sugerencia sobre cómo extraer una columna completa de los índices? – Ecognium

Cuestiones relacionadas