超过12个月的FFT薪资识别

时间:2019-09-17 08:10:59

标签: python pandas pattern-matching fft data-science

目标:使用python,我需要能够确定一个人的收入,因为该人的12个月的交易已将其帐户记入贷方。

问题:我需要采取什么步骤来拥有一个Python脚本来标识薪水,或者在某些情况下,一个人可以赚取稳定的副业,而获得多个薪水?如果每个月,每两周或少于1个月的频率明显有1笔以上的薪水支付。如果我的数据在过去12个月中每个月的每一天都有一个值(大约365个数据点),那么我也想不出将x轴频率设置为什么。

尝试的方法:经过大量研究,似乎快速傅立叶变换已广泛用于声音和其他频率数据集的模式识别。而且我设法获得了一个图表,该图表非常清楚地显示了所选用户的流入模式。但是我无法弄清楚如何让python脚本找出图中的峰值明显每25-30天重复一次。在我的示例中,用户有两个主要收入来源,每月约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])) 

这是原始数据框 Original data Clear pattern of income flow

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

1 个答案:

答案 0 :(得分:0)

您可以使用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

这段代码产生下图

enter image description here

您可以对数据进行同样的调整,以根据需要调整low_indhigh_ind。 尝试运行scipy.signal.find_peaks?,以检查您可以传递的所有其他参数:高度和宽度阈值,相对于峰高的比率等。