我绘制了df['Data']
的最小点
Timestamp = pd.date_range('2020-02-06 08:23:04', periods=1000, freq='s')
df = pd.DataFrame({'Timestamp': Timestamp,
'Data': 30+15*np.cos(np.linspace(0,10,Timestamp.size))})
df['timediff'] = (df['Timestamp'].shift(-1) - df['Timestamp']).dt.total_seconds()
df['datadiff'] = df['Data'].shift(-1) - df['Data']
df['gradient'] = df['datadiff'] / df['timediff']
min_pt = np.min(df['Data'])
# filter_pt = df.loc(df['gradient'] >= -0.1) # & df.loc[i, 'gradient'] <=0.1
mask = np.array(df['Data']) == min_pt
color = np.where(mask, 'blue', 'yellow')
fig,ax = plt.subplots(figsize=(20,10))
# plt.plot_date(df['Timestamp'], df['Data'], '-' )
ax.scatter(df['Timestamp'], df['Data'], color=color, s=10)
plt.ticklabel_format
plt.show()
我想使用df['gradient']列扩展条件:
gradient
位于0.1和-0.1之间(包括0.1和-0.1)的点,该怎么办李>试图添加:
df1 = df[df.gradient <= 0.1 & df.gradient >= -0.1]
plt.plot(df1.Timestamp,df1.Data, label="filter")
基于返回错误的this answer在mask
之前:
TypeError: Cannot perform 'rand_' with a dtyped [float64] array and scalar of type [bool]
我觉得我做的不是很有效率。如何更有效地做到这一点
更新:
带代码
Timestamp = pd.date_range('2020-02-06 08:23:04', periods=1000, freq='s')
df = pd.DataFrame({'Timestamp': Timestamp,
'Data': 30+15*np.cos(np.linspace(0,10,Timestamp.size))})
df['timediff'] = (df['Timestamp'].shift(-1) - df['Timestamp']).dt.total_seconds()
df['datadiff'] = df['Data'].shift(-1) - df['Data']
df['gradient'] = df['datadiff'] / df['timediff']
fig,ax = plt.subplots(figsize=(20,10))
df1 = df[(df.gradient <= 0.1) & (df.gradient >= -0.1)]
plt.plot(df1.Timestamp,df1.Data, label="filter")
plt.show()
将范围更改为
df1 = df[(df.gradient <= 0.01) & (df.gradient >= -0.01)]
为什么?
在每个条件上添加括号,这样就可以逐行执行逻辑和
并考虑使用一些散布,否则,梯度绝对值大于0.1的最新点将被连接。
这将是最终图像:
编辑
如果只需要渐变位于范围内的第一个点,请创建组,然后使用groupby
相关问题 更多 >
编程相关推荐