gpt4 book ai didi

python - 计算 Series 或 DataFrame 的交叉(截距)点

转载 作者:太空狗 更新时间:2023-10-29 21:21:18 25 4
gpt4 key购买 nike

我有周期性数据,索引是一个 float ,如下所示:

time =    [0, 0.1, 0.21, 0.31, 0.40, 0.49, 0.51, 0.6, 0.71, 0.82, 0.93]
voltage = [1, -1, 1.1, -0.9, 1, -1, 0.9,-1.2, 0.95, -1.1, 1.11]
df = DataFrame(data=voltage, index=time, columns=['voltage'])
df.plot(marker='o')

我想创建一个 cross(df, y_val, direction='rise' | 'fall' | 'cross') 函数返回一个时间数组 (指数)与所有电压值等于 y_val 的插值点。对于'rise',仅返回斜率为正的值;对于'fall',仅返回具有负斜率的值;对于 'cross' 两者都被返回。因此,如果 y_val=0direction='cross' 则将返回一个包含 10 个值的数组以及交叉点的 X 值(第一个约为 0.025) .

我在想这可以用迭代器来完成,但想知道是否有更好的方法来做到这一点。

谢谢。我喜欢 Pandas 和 Pandas 社区。

最佳答案

为此,我最终得到了以下内容。它是一个矢量化版本,比使用循环的版本快 150 倍。

def cross(series, cross=0, direction='cross'):
"""
Given a Series returns all the index values where the data values equal
the 'cross' value.

Direction can be 'rising' (for rising edge), 'falling' (for only falling
edge), or 'cross' for both edges
"""
# Find if values are above or bellow yvalue crossing:
above=series.values > cross
below=np.logical_not(above)
left_shifted_above = above[1:]
left_shifted_below = below[1:]
x_crossings = []
# Find indexes on left side of crossing point
if direction == 'rising':
idxs = (left_shifted_above & below[0:-1]).nonzero()[0]
elif direction == 'falling':
idxs = (left_shifted_below & above[0:-1]).nonzero()[0]
else:
rising = left_shifted_above & below[0:-1]
falling = left_shifted_below & above[0:-1]
idxs = (rising | falling).nonzero()[0]

# Calculate x crossings with interpolation using formula for a line:
x1 = series.index.values[idxs]
x2 = series.index.values[idxs+1]
y1 = series.values[idxs]
y2 = series.values[idxs+1]
x_crossings = (cross-y1)*(x2-x1)/(y2-y1) + x1

return x_crossings

# Test it out:
time = [0, 0.1, 0.21, 0.31, 0.40, 0.49, 0.51, 0.6, 0.71, 0.82, 0.93]
voltage = [1, -1, 1.1, -0.9, 1, -1, 0.9,-1.2, 0.95, -1.1, 1.11]
df = DataFrame(data=voltage, index=time, columns=['voltage'])
x_crossings = cross(df['voltage'])
y_crossings = np.zeros(x_crossings.shape)
plt.plot(time, voltage, '-ob', x_crossings, y_crossings, 'or')
plt.grid(True)

当它起作用时,我感到非常满意。有什么可以改进的吗?

关于python - 计算 Series 或 DataFrame 的交叉(截距)点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10475488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com