Python interpola desde un archivo csv

Python interpola desde un archivo csv

Estoy tratando de interpolar datos de un archivo csv. Las 2 primeras columnas son del mismo tamaño. Tuve éxito con los mismos datos en archivos txt antes, este es mi primer intento con un archivo csv. Cualquier ayuda sería apreciada. Ejemplo de archivo csv

wave,transmittance
406.06,0.384
420.06,0.398
440.85,0.416
....,.....
import numpy as np
import csv
from scipy import interpolate

# column 0  wavelength
# column 1  transmittance
# .....

with open('CCD.csv','r') as csv_file:
    next(csv_file)
    data = list(csv.reader(csv_file))

x=[column[0] for column in data]
y=[column[1] for column in data]

I = interpolate.InterpolatedUnivariateSpline(x, y)


print(x)
Output:
UFuncTypeError                 
<ipython-input-9-fa767336938e> in <module>
     12 y=[column[1] for column in data]
     13 
---> 14 I = interpolate.InterpolatedUnivariateSpline(x, y)

UFuncTypeError: ufunc 'subtract' did not contain a loop with signature matching types (dtype('<U11'), dtype('<U11')) -> dtype('<U11')

EDITADO:

with open('CCD.csv','r') as csv_file:
    reader = csv.reader(csv_file)
    next(csv_file)  # discard header
    data = list(reader)
x1=[column[0] for column in data]
y1=[column[1] for column in data]

I2 = interpolate.InterpolatedUnivariateSpline(x1, y1)
z2 = I2(550)
print(z2)
UFuncTypeError                            Traceback (most recent call last)
<ipython-input-4-a8127aad6fce> in <module>
      6 y1=[column[1] for column in data]
      7 
----> 8 I2 = interpolate.InterpolatedUnivariateSpline(x1, y1)
      9 z2 = I2(550)
     10 print(z2)

UFuncTypeError: ufunc 'subtract' did not contain a loop with signature matching types (dtype('<U11'), dtype('<U11')) -> dtype('<U11')
Mostrar la mejor respuesta

Por favor, edite su pregunta y publique un ejemplo de su archivo CSV, como texto formateado, no como una imagen.

Publiqué un ejemplo del archivo CSV. Gracias

Estás cerca. Debe crear el objeto lector cuando abre el archivo por primera vez, luego use el lector para iterar sus filas:

import csv

data = None
with open('CCD.csv', newline='') as csv_file:
    reader = csv.reader(csv_file)
    next(csv_file)  # discard header
    data = list(reader)

x1 = [float(row[0]) for row in data]
y1 = [float(row[1]) for row in data]

print(x1)
print(y1)

y obtengo:

[406.06, 420.06, 440.85]
[0.384, 0.398, 0.416]

Sin embargo, puedo ver cómo obtuviste eso, solo viniendo de iterar archivos de texto línea por línea. ¡Buen intento! :)

Además, no necesita especificar el modo de lectura 'r', ese es el valor predeterminado; pero para los archivos CSV, se recomienda que, en la mayoría de los casos, desee newline='' para que Python deje todos los caracteres de nueva línea (NL, LF, CRLF) tal como están para que los trate el lector de CSV, de acuerdo con la especificación de CSV.

Como alternativa, puede compilar x y y mientras lee el CSV:

x, y = [], []
with open('CCD.csv', newline='') as csv_file:
    reader = csv.reader(csv_file)
    next(csv_file)  # discard header
    
    for row in reader:
        x.append(float(row[0]))
        y.append(float(row[1]))

print(x)
print(y)

Los mismos resultados de las impresiones de arriba.

Gracias, lo he probado así pero sigue sin funcionar.

Acabo de ejecutar eso en su pequeño CSV de muestra, y data me parece correcto. ¿Qué estas viendo?

Oh, me he centrado en hacer que el lector de CSV funcione para ti, y lo hace. Ahora, debe convertir todos los valores de cadena en data a float cuando está iterando sus x e y.

Si, funciona. ¡Tuve que convertir a flotar! Dios, no pensé que los datos tuvieran formato de cadena en csv. Muchas gracias. Aprenda algo nuevo cada día

Bueno, siempre es una cadena en un archivo CSV (que es solo un archivo de texto con convención). Sí, Pandas hace mucho por ti. :) Por favor, dale un voto a favor si lo encuentras valioso. ¡Gracias!

Así es como lo logré con pandas, pero todavía tengo curiosidad sobre la forma alternativa, sin pandas

import pandas as pd

df = pd.read_csv('CCD.csv')

x = df['KAF16200wave'].to_numpy()
y = df['KAF16200transmitence'].to_numpy()

I = interpolate.InterpolatedUnivariateSpline(x, y)

z = I(550)
print("QE:",z)
QE: 0.589681398010309

¿De dónde viene KAF16200, en los nombres de las columnas? ¿Es esa una sintaxis especial de Pandas?

Sí, nombre de columna