Sind in Python schnelle Candlestick-Charts möglich?Python

Python-Programme
Guest
 Sind in Python schnelle Candlestick-Charts möglich?

Post by Guest »

Ich habe versucht, ein paar tausend Kerzen in Matplotlib zu zeichnen.
Beim Scrollen wird das Diagramm langsamer (hängt).

Eyllanesc hat mir geholfen, das Candlestick-Diagramm zu realisieren in pyqt.
Das Diagramm ist schön und funktioniert schneller als matplotlib.

Trotzdem wird das Diagramm beim Scrollen langsamer. Ich habe den Code ein wenig geändert. Die Dateidaten sind hier verfügbar.

Sind in Python relativ schnelle Candlestick-Charts mit einer großen Datenmenge möglich?

Die Tatsache, dass ich ein Projekt in C# habe, das Zehntausende von Kerzen enthält und es viel schneller scrollen lässt.

Die Daten, um mich offline zu zeichnen. Und ich brauche wirklich viele Kerzen.
Vielleicht gibt es eine Funktion, um die Grafik schneller zu erstellen?
(Ich kritisiere niemanden, ich möchte das nur klären.)
So funktioniert das C#-Diagramm mit über 40.000 Kerzen. Ich füge eine GIF-Animation bei.

C#

Python

Code: Select all

from PyQt5 import QtCore, QtGui, QtWidgets, QtChart
import math
import numpy as np
import pandas as pd

df = pd.read_csv('file.txt',
index_col='DATE',
parse_dates=True,
infer_datetime_format=True)

o = df.iloc[:, 0].values
h = df.iloc[:, 1].values
l = df.iloc[:, 2].values
z = df.iloc[:, 3].values

class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)

self.step = 0.1
self._chart_view = QtChart.QChartView()
self.scrollbar = QtWidgets.QScrollBar(
QtCore.Qt.Horizontal,
sliderMoved=self.onAxisSliderMoved,
pageStep=self.step * 100,
)
self.slider = QtWidgets.QSlider(
QtCore.Qt.Horizontal, sliderMoved=self.onZoomSliderMoved
)

central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)

lay = QtWidgets.QVBoxLayout(central_widget)
for w in (self._chart_view, self.scrollbar, self.slider):
lay.addWidget(w)

self.resize(640, 480)

self._chart = QtChart.QChart()

self._candlestick_serie = QtChart.QCandlestickSeries()

tm = []

for i in range(0, len(z)):
o_ = o[i]
h_ = h[i]
l_ = l[i]
c_ = z[i]
self._candlestick_serie.append(QtChart.QCandlestickSet(o_, h_, l_, c_))
tm.append(str(i))
min_x, max_x = 0, i

self._chart.addSeries(self._candlestick_serie)
self._chart.createDefaultAxes()
self._chart.legend().hide()
# self._chart.setAnimationOptions(QtChart.QChart.SeriesAnimations)

self._chart.axisX(self._candlestick_serie).setCategories(tm)
self._chart.axisX(self._candlestick_serie).setVisible(False)

self._chart_view.setChart(self._chart)
self.adjust_axes(100, 200)
self.lims = np.array([min_x, max_x])

self.onAxisSliderMoved(self.scrollbar.value())

def adjust_axes(self, value_min, value_max):
self._chart.axisX(self._candlestick_serie).setRange(
str(value_min), str(value_max)
)

if value_min > 0 and value_max > 0 and value_max < 10000:
ymin = np.amin(l[int(value_min): int(value_max)])
ymax = np.amax(h[int(value_min): int(value_max)])
self._chart.axisY(self._candlestick_serie).setRange(ymin, ymax)

@QtCore.pyqtSlot(int)
def onAxisSliderMoved(self, value):
r = value / ((1 + self.step) * 100)
l1 = self.lims[0] + r * np.diff(self.lims)
l2 = l1 + np.diff(self.lims) * self.step
self.adjust_axes(math.floor(l1), math.ceil(l2))

@QtCore.pyqtSlot(int)
def onZoomSliderMoved(self, value):
self.step=value/100
self.onAxisSliderMoved(self.scrollbar.value())
print(value)

if __name__ == "__main__":
import sys

app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post