如何绘制相对于零的时间序列?
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 为中心。
我有一个 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 为中心。