首页 > 解决方案 > Ramer–Douglas–Peucker 算法 (RDP) Python 实现:如何绘制它并将其与数据帧一起使用?

问题描述

我只是想使用 Ramer–Douglas–Peucker 算法 (RDP) 及其 Python 实现来减少价格图表中的 jitternez。

所以我尝试了以下方法:

import yfinance as yf
import matplotlib.pyplot as plt
import numpy as np
from rdp import rdp


stock = 'AMZN'
start = '2020-11-01'

df = yf.download(stock , start=start)



nfx = []
nfy = []

for index, row in df.iterrows():
    
    x_data = nfx.append(index)
    y_data = nfy.append(row['Close'])
rdpp = [rdp(np.array([nfy]), epsilon=0.2)]


plt.plot(rdpp)
plt.show()

然而这不起作用。我收到错误消息或空白图。

我可以做/改进什么来完成这项工作?

这是文档,但它很小,我真的不知道如何在我的情况下应用它。--> https://pypi.org/project/rdp/

非常感谢,祝好

标签: pythonpandasalgorithmmatplotlib

解决方案


rdp函数需要一个N × 2 数组作为输入,其中 N 是点数,2 是维度(也可以是 3D)。

构建此二维数组的一种方法是使用numpy 的 column_stack函数。此外,index必须将其转换为数值,例如转换为秒数。

import numpy as np
import matplotlib.pyplot as plt

import yfinance as yf
from rdp import rdp

stock = "AMZN"
start = "2020-11-01"

dataframe = yf.download(stock, start=start)

nfx, nfy = [], []
for index, row in dataframe.iterrows():
    nfx.append(index.timestamp())
    nfy.append(row["Close"])

# print(nfx)
points = np.column_stack([nfx, nfy])
print("points.shape:", points.shape)
points_after_rdp = rdp(points, epsilon=80)

# Graph
plt.plot(points_after_rdp[:, 0], points_after_rdp[:, 1], color="red", label="after RDP")
plt.plot(
    points[:, 0], points[:, 1], color="black", label="before", alpha=0.7, linewidth=1
)
plt.xlabel("time (s)")
plt.ylabel("Close")
plt.legend()
plt.show()

图表如下所示:
结果图


推荐阅读