Recorrer múltiples archivos CSV

Estoy trabajando con tres conjuntos de datos pequeños y por razones de reproducibilidad, estoy compartiendo los datos aquí .

Desde la columna 2, quería leer la fila actual y compararla con el valor de la fila anterior. Si es mayor, sigo comparando. Si el valor actual es más pequeño que el valor de la fila anterior, quiero dividir el valor actual (más pequeño) por el valor anterior (más grande). En consecuencia, el siguiente código:

import numpy as np import matplotlib.pyplot as plt protocols = {} types = {"data_c": "data_c.csv", "data_r": "data_r.csv", "data_v": "data_v.csv"} for protname, fname in types.items(): col_time,col_window = np.loadtxt(fname,delimiter=',').T trailing_window = col_window[:-1] # "past" values at a given index leading_window = col_window[1:] # "current values at a given index decreasing_inds = np.where(leading_window < trailing_window)[0] quotient = leading_window[decreasing_inds]/trailing_window[decreasing_inds] quotient_times = col_time[decreasing_inds] protocols[protname] = { "col_time": col_time, "col_window": col_window, "quotient_times": quotient_times, "quotient": quotient, } 

data_c es un numpy.array que tiene solo un valor de quotient único 0.7 , al igual que data_r con un valor de quotient único de 0.5 . Sin embargo, data_v tiene dos valores de quotient únicos ( 0.5 o 0.8 ).

Quería recorrer los valores de quotient de estos archivos CSV y categorizarlos usando una simple sentencia if-else (por ejemplo, como if quotient==0.7: print("data_c") ) pero recibo este error:

 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Actualización: Descubrí que este error se puede resolver utilizando la función .all() como se .all() continuación.

 if (quotient==0.7).all(): print("data_c") elif (quotient>=0.5).all() and (quotient <=0.8).all(): print("data_v") elif (quotient==0.5).all(): print("data_r") 

Sin embargo, esto imprime data_c, data_v, data_v . ¿Cómo podemos solucionar este problema?

Si entiendo correctamente, está solicitando utilizar los valores únicos de su matriz de quotient para clasificar sus datos. Si este es el caso, entonces puede aprovechar fácilmente numpy.unique para ayudar:

 import numpy as np unique_quotient = np.unique(quotient) # For data_c this is just a single value 

Si coloca esa matriz unique_quotient en su protocol_dictionary entonces le da algo para comparar ( usando numpy.array_equal por ejemplo):

 unique_data_c_quotient = np.r_[ 0.7 ] if np.array_equal( unique_quotient, unique_data_c_quotient ): print('data_c') ... 

Estoy intentando replicar el proceso hasta el momento en que obtienes los cocientes. Aquí trabajo con un solo archivo

 import pandas as pd import numpy as np # read csv df = pd.read_csv("/home/baobob/Downloads/data_v.csv", header=None) # shift down element in column 1 df[2] = df[1].shift() # this is doing in a vectorial way the comparative with a element # with is previous (which is now on the same row but in column 2) df["quotient"] = np.where(df[1]