2017-03-21 2 views
1

Ich versuche, die Ergebnisse der FFT-Berechnungen in einem Pandas Datenrahmen zu speichern:merkwürdiges Problem, wenn FFT Perioden in Pandas Datenrahmen zu speichern

ft = pd.DataFrame(index=range(90)) 
ft['y'] = ft.index.map(lambda x: np.sin(2*x)) 
ft['spectrum'] = np.fft.fft(ft['y']) 
ft['freq']  = np.fft.fftfreq(len(ft.index)).real 
ft['T']   = ft['freq'].apply(lambda f: 1/f if f != 0 else 0) 

Alles scheint bis zur letzten Zeile, adaequat zu sein: die Spalte T des soll Perioden speichern hat aus irgendeinem Grund alle Spalten des Rahmens, dh .:

In [499]: ft.T[0] 
Out[499]: 
y       0j 
spectrum (0.913756021471+0j) 
freq       0j 
T       0j 
Name: 0, dtype: complex128 

ich kann nicht herausfinden, warum das so ist. Es kommt auch vor, wenn ich nur den Realteil von Freq nehmen:

ft['freq'] = np.fft.fftfreq(len(ft.index)).real 

oder ich versuche, T-Werte unter Verwendung von alternativen Möglichkeiten, wie zu berechnen:

ft.T = ft.index.map(lambda i: 1/ft.freq[i] if ft.freq[i] else np.inf) 
ft.T = 1/ft.freq 

Alle anderen Spalten aussehen ordentlich, wenn ich head() laufen oder describe() auf sie, egal ob sie echte oder komplexe Werte enthalten. Die Freq-Spalte sieht wie eine normale 1D-Reihe aus, weil np.fft.fftfreq() ein 1D-Array komplexer Zahlen zurückgibt. Was könnte also der Grund sein, warum die Spalte T so durcheinander ist?

Ich verwende Pandas V. 1.19.2 und Numpy v. 1.12.0.

Antwort

1

Pandas DataFrame Objekte haben a property namens T, die "zum Transponieren von Index und Spalten" des DataFrame-Objekts verwendet wird. Wenn Sie einen anderen Spaltennamen als T verwenden, funktioniert alles wie erwartet.

+1

Ich wusste, dass es etwas albern von mir sein musste :) Danke für die schnelle Antwort. – mac13k