python - 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/
非常感谢,祝好
解决方案
该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()
推荐阅读
- python-3.x - 两个相似的脚本创建不同的列表
- egl - EGL:EGL_SURFACE_TYPE 并渲染到纹理
- node.js - 在选择提示中修改选择验证 - Bot Framework
- python - 将来自不同数据框的聚合添加为列
- java - 当我尝试从不同的类调用方法时,空对象引用
- python - 如何解释 python 字节数组中的空格
- c# - JSON.NET 反序列化:类型不匹配时忽略属性
- pandas - 条件 If 语句:如果行中的值以字符串中的字母开头……设置具有相应值的另一列
- perl - Perl cpanm:无法安装 DB_File
- cordova-plugins - 如何将本地图像添加到 pdf 生成器文件 cordova-plugin-pdf?