如何绘制相对于零的时间序列?

How to plot time series relative to zero?

我有一个 time series,值范围从 -1 到 1。在图表上,它看起来像这样:

上图代码:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import datetime

df = pd.read_csv('TimeSeries.csv').set_index('date')
dt_index = pd.to_datetime(df.index)

fig, ax = plt.subplots()
ax.tick_params(
    axis='x',     
    which='both',     
    bottom=False,
    top=False,
    labelbottom=False)

ax.set_xlim([datetime.date(2022, 3, 1), datetime.date(2022, 4, 15)])
ax.plot(dt_index, df['long'], 'o')

我希望图表看起来像振荡器。喜欢this。 From zero to 1/-1 (现在是from 1/-1 to zero).

我认为点的坐标需要相对于零水平反映。但是我不知道该怎么做。

我的看法: 我不确定您希望 'oscillation' 看起来像什么,因为它目前看起来像一个。然而,我是这样处理的:

通过使用 np.convolve 迭代数据点,您可以创建一个函数来平滑它们。曲线拟合、数据平滑、n-degree 多项式,甚至 Lowess(最佳方法)都可能在函数中使用。这是一个很棒的 article 我发现您可以研究以创建您的函数。

对于这种情况,我采用了以下方式:

def smooth(y, data_points):
    plot_point = np.ones(data_points)/data_points
    y_smooth_points = np.convolve(y, plot_point, mode='same')
    return y_smooth_points

您可以调整参数来定义图表上的点。之后,我将数据点添加到新列并绘制它们:

下面是其中一种方法的完整代码:

import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go


def smooth(y, data_points):
    plot_point = np.ones(data_points)/data_points
    y_smooth = np.convolve(y, plot_point, mode='same')
    return y_smooth

df['smoothen_1']= smooth(df['long'],100)

fig = px.line(df, x='date', y=smooth(df['smoothen_1'],250))
fig.show()

结果:

也许这样的事情可以解决您的问题:

# extract values from the dataframe
y = df['long'].values
# select values > 0
idx = y > 0
# offset those values
y[idx] -= 1
# select all other values and apply an opposite offset
y[np.logical_not(idx)] += 1

然后将 ax.plot(dt_index, df['long'], 'o') 替换为 ax.plot(dt_index, y, 'o')

将 numpy 导入为 import numpy as np 后,只需将 ax.plot 行替换为

ax.plot(dt_index, df['long']-np.sign(df['long']), 'o') 

示例输出:

解释:np.sign() returns elementwise 数字的符号。因此,我们从正值中减去 1,并将负值加 1,使您的值以 0 为中心。