首页 > 解决方案 > 超过 12 个月的 FFT 工资识别

问题描述

目标:使用 python,我需要能够识别个人的收入,因为他们 12 个月的交易价值已经记入了他们的账户。

问题:我需要采取哪些步骤来让 python 脚本识别薪水,或者在某些情况下多个薪水,因为一个人可以有一致的副业?如果每个月或每两周或少于 1 个月的任何频率明显有超过 1 笔工资支付。如果我拥有的数据在过去 12 个月中每个月的每一天都有一个值,那么我也无法弄清楚如何设置 x 轴频率,因此大约有 365 个数据点。

尝试的方法:经过大量研究后,似乎快速傅里叶变换被广泛用于声音和其他频率数据集之间的模式识别。我设法得到一个图表,它非常清楚地显示了所选用户的流入模式。但是,我不知道如何让 python 脚本找出图中每 25-30 天明显重复的峰值。在我的示例中,用户有 2 个收入来源,主要 @ 大约 1500 和第二 @ 每月 300。

这是我这次尝试的代码和一些结果图:

#Remove the obviuos outliers from the dataframe
df = df[(np.abs(stats.zscore(df)) < 5).all(axis=1)]
#Get the number of data points in the dataframe 
N = len(df.index.unique())
#frequency of signal (in days)
T = 1
#create x-axis for time length of signal
xf = np.linspace(0.0, 1.0/(2.0*T), N)
#create array that corresponds to values in signal
#perform FFT on signal
yf = fft(df)
plt.plot(xf, abs(yf[0:N])) 

这是原始数据框 原始数据 清晰的收入流向

这是我通过应用上述 FFT 代码得到的结果。我突出显示了人眼清楚地显示重复模式的部分:)

标签: pythonpandaspattern-matchingfftdata-science

解决方案


您可以使用scipy.signal.find_peaks在 fft 阵列的切片上查找峰值。由于您没有提供数据,因此我嘲笑了一个类似的案例:

1)我总结了30个随机频率的正弦波并进行FFT。

2)我选择一个 FFT 数据窗口并fin_peaks在其上运行

3)我绘制识别的峰

import numpy as np
from scipy.signal import find_peaks
import matplotlib.pyplot as plt

np.random.seed(11)
x = np.arange(0,1000,0.1)
data = np.array([np.sin(a*x) for a in list(100*np.random.randn(30))])
data_fft = np.fft.fft(np.sum(data, axis=1)) # 1) ends here
plt.plot(np.abs(data_fft))
low_ind, high_ind = 10,20
data_for_peaks = np.abs(data_fft)[low_ind:high_ind]
inds = find_peaks(data_for_peaks)[0] # 2) ends here
plt.plot(low_ind+inds, np.abs(data_fft)[low_ind+inds],'o')
plt.show() # 3) ends here

此代码产生下图

在此处输入图像描述

您可以对数据进行调整low_indhigh_ind满足您的需求。尝试运行scipy.signal.find_peaks?以检查您可以传递的所有额外参数:高度和宽度阈值、相对于 otehr 峰的比率等。


推荐阅读