Я попробовал нарисовать несколько тысяч свечей в matplotlib.
При прокрутке график тормозит(зависает).
Eyllanesc помог мне реализовать свечной график в pyqt.
График красивый и работает быстрее, чем matplotlib.
Но, все равно график подтормаживает при прокрутке. Я немного изменил код. Данные файла доступны здесь.
Возможны ли в Python относительно быстрые свечные графики с большим объемом данных?
Дело в том, что у меня проект на C#, в нем десятки тысяч свечей и прокручивается он гораздо быстрее.
Данные для отрисовки у меня в оффлайне. А мне действительно нужно много свечей.
Может быть есть функция, позволяющая быстрее построить график?
(Я никого не критикую, просто хочу разобраться.)
Вот как работает график C# с более чем 40 000 свечей. Прикрепляю GIF-анимацию.
C#
Python
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
h_ = h
l_ = l
c_ = z
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_())
Подробнее здесь: https://stackoverflow.com/questions/576 ... -in-python
Возможны ли быстрые свечные графики в Python ⇐ Python
Программы на Python
-
Anonymous
1736215986
Anonymous
Я попробовал нарисовать несколько тысяч свечей в matplotlib.
При прокрутке график тормозит(зависает).
Eyllanesc помог мне реализовать свечной график в pyqt.
График красивый и работает быстрее, чем matplotlib.
Но, все равно график подтормаживает при прокрутке. Я немного изменил код. Данные файла доступны здесь.
Возможны ли в Python относительно быстрые свечные графики с большим объемом данных?
Дело в том, что у меня проект на C#, в нем десятки тысяч свечей и прокручивается он гораздо быстрее.
Данные для отрисовки у меня в оффлайне. А мне действительно нужно много свечей.
Может быть есть функция, позволяющая быстрее построить график?
(Я никого не критикую, просто хочу разобраться.)
Вот как работает график C# с более чем 40 000 свечей. Прикрепляю GIF-анимацию.
C#
Python
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_())
Подробнее здесь: [url]https://stackoverflow.com/questions/57699422/are-fast-candlestick-charts-possible-in-python[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия