我需要通过从正弦波图中提取一个完整的循环来进行一些数据分析。
我有一些CSV文件包含100K电流和电压值。从这个CSV文件,通常我会绘制它并手动提取一个完整的周期。现在我想用python
来做import pandas as pd
file_path = "/Users/Fang/workspace_wind/test_cycle/the_data/"
## read csv file, selecting the first column only that is I(current)
df = pd.read_csv(file_path+"current1.csv", usecols=[0])
## find the maximum value, for the index use idxmax()
max_val = df['I'].idxmax()
## find the minimum value, for the index use idxmin()
min_val = df['I'].min()
print max_val
我开始使用此代码。到目前为止,我设法了解如何在半个周期内获得最高值和最低值。首先,我想将它从一个完整周期的第一个最高值切换到第二个最高值(峰值到峰值),但由于幅度并不总是相同,因此我的这种方法不起作用。
这是CSV文件的示例 - > sample
我到目前为止最接近的是这个问题here,但我并不是真的理解它。
感谢您的帮助和建议。
答案 0 :(得分:2)
我会在NumPy / SciPy中通过获得两个信号之一的最大值来实现,例如: I或V,因为(周期性)函数的周期可以定义为两个连续最大值之间的间隔。
下面是一些用于计算I(ii_arr
)上的句号的示例代码:
import numpy as np
import scipy as sp
import scipy.signal
# load the data and define the working arrays
# note the `.transpose()` at the end
ii_arr, vv_arr = np.loadtxt(
'./Downloads/current1.csv', delimiter=',', skiprows=1).transpose()
# since a period is, for example, defined from maximum to maximum
# get maxima indexes of `ii_arr`, the same will work for `vv_arr`.
# (you may want to tweak with the second arguments, see the docs for that)
ii_max_val = scipy.signal.find_peaks_cwt(
ii_arr, np.arange(10000, 20000, 2000))
# just use normal slicing for the first two peaks
ii_period_arr = ii_arr[ii_max_val[0]:ii_max_val[1]]
# ... or for more averaged result
index_diff = int(np.mean(np.diff(ii_max_val)))
# `index_start` can be just about any other valid value
index_start = ii_max_val[0]
ii_period_arr = ii_arr[index_start:index_start + index_diff]
# optionally plot the results
import matplotlib.pyplot as plt
plt.plot(ii_period_arr)
plt.show()
物理学家注意:如果它们是I(t)
而V(t)
是来自同一设备的信号,这意味着您可以假设两者中的t
相同,所以我会使用噪声较小的信号来检测周期,它们的指数差必须相同。
在您的情况下,我会使用vv_arr
代替ii_arr
。
我刚刚测试ii_arr
以确保代码在最坏的情况下工作。