在 Pandas 数据帧中存储 FFT 周期时的奇怪问题
Strange issue when storing FFT periods in Pandas dataframe
我正在尝试将 FFT 计算的结果存储在 Pandas 数据框中:
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)
在最后一行之前一切似乎都工作正常:应该存储句点的列 T 由于某种原因具有框架的所有列,即:
In [499]: ft.T[0]
Out[499]:
y 0j
spectrum (0.913756021471+0j)
freq 0j
T 0j
Name: 0, dtype: complex128
我不明白为什么会这样。当我只取 freq:
的实部时也会发生这种情况
ft['freq'] = np.fft.fftfreq(len(ft.index)).real
或者我尝试使用替代方法计算 T 值,例如:
ft.T = ft.index.map(lambda i: 1/ft.freq[i] if ft.freq[i] else np.inf)
ft.T = 1/ft.freq
所有其他列在我 运行 head()
或 describe()
上看起来都很整洁,无论它们包含实数值还是复数值。 freq 列看起来像一个普通的一维系列,因为 np.fft.fftfreq()
returns 一维复数数组,那么列 T 如此混乱的原因可能是什么?
我正在使用 Pandas v. 1.19.2 和 Numpy v. 1.12.0.
PandasDataFrame
对象有a property叫T
,就是用"to transpose index and columns"的DataFrame对象。如果您使用不同的列名而不是 T
,一切都会按预期进行。
我正在尝试将 FFT 计算的结果存储在 Pandas 数据框中:
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)
在最后一行之前一切似乎都工作正常:应该存储句点的列 T 由于某种原因具有框架的所有列,即:
In [499]: ft.T[0]
Out[499]:
y 0j
spectrum (0.913756021471+0j)
freq 0j
T 0j
Name: 0, dtype: complex128
我不明白为什么会这样。当我只取 freq:
的实部时也会发生这种情况ft['freq'] = np.fft.fftfreq(len(ft.index)).real
或者我尝试使用替代方法计算 T 值,例如:
ft.T = ft.index.map(lambda i: 1/ft.freq[i] if ft.freq[i] else np.inf)
ft.T = 1/ft.freq
所有其他列在我 运行 head()
或 describe()
上看起来都很整洁,无论它们包含实数值还是复数值。 freq 列看起来像一个普通的一维系列,因为 np.fft.fftfreq()
returns 一维复数数组,那么列 T 如此混乱的原因可能是什么?
我正在使用 Pandas v. 1.19.2 和 Numpy v. 1.12.0.
PandasDataFrame
对象有a property叫T
,就是用"to transpose index and columns"的DataFrame对象。如果您使用不同的列名而不是 T
,一切都会按预期进行。