Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 1
Регистрация: 25.02.2016
Сообщений: 134

Не показывать данные выходных дней на графике

04.01.2019, 17:38. Показов 4973. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал график на matplotlib. И тут возникла опять эта невероятная нелепость. При увеличении видно, что есть данные, которых нет в файле(выходные, праздники).
Неужели в matplotlib нет какого-нибудь переключателя, чтобы не помещать эти данные, которых нет?
Пробовал гуглить, нашел один пример там даты в nympy, а у меня они в формате pandas. Ничего не смог сделать.
Помню на C# было так же. Написал на форуме майкрософт, елозили ничего по делу. В итоге пару месяцев гуглил и нагуглил,
что можно вместо дат поставить индексы, а потом метки для оси даты вставить.
Но, на Python, никак не получается. Масса примеров с уже неработающими библиотеками.
Такое ощущение, что в Python сидят какие-то дилетанты. Молчат, как рыбы и пускают пузыри от важности.
Наделали кучу библиотек, которые пока поставишь кучу нервов потратишь, если еще поставишь и которые не поддерживаются должным образом не информационно ни технически.
Python
1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import pandas as pd
 
x = pd.read_csv('file.txt',index_col='Date',
                     parse_dates=True,
                     infer_datetime_format=True)
x['Close'].plot(grid=True)
 
plt.show()
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2019, 17:38
Ответы с готовыми решениями:

Задан одномерный массив целых чисел, где хранятся номера дней неделе. Подсчитать количество рабочих и выходных дней
Задан одномерный массив целых чисел, где хранятся номера дней неделе. Подсчитать количество рабочих и выходных дней. Массив ввести с...

Заполнение выходных дней
Добрый день, коллеги) Передо мной встала такая задача: Есть таблица некоторой отчётностью с датами. Есть все даты, кроме выходных...

Расчет выходных дней
Уважаемые форумчане, подскажите кто чем, как реализовать это в Access.Есть форма в ней 3 поля: поле1(начальная дата), поле2 (конечная...

16
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.01.2019, 17:54
Цитата Сообщение от quant77 Посмотреть сообщение
Наделали кучу библиотек, которые пока поставишь кучу нервов потратишь,
Ставятся с полпинка. (Два года с Python - ~700 поставленных библиотек).
Просто нужно один раз прочитать FAQ и запомнить как нужно делать правильно.

Цитата Сообщение от quant77 Посмотреть сообщение
которые не поддерживаются должным образом
Какие, например. Документацию есть к любой библиотеке, которая на данный момент является актуальной.
Цитата Сообщение от quant77 Посмотреть сообщение
Масса примеров с уже неработающими библиотеками.
А не нужно брать примеры 5-летней давности, написанные к тому же наверняка для Python2. Пользуйтесь актуальными примерами из документации. По matplotlib таких навалом. И все работают.

Цитата Сообщение от quant77 Посмотреть сообщение
При увеличении видно
Нам ничего не видно. (Важно пустил пузырь )
0
0 / 0 / 1
Регистрация: 25.02.2016
Сообщений: 134
04.01.2019, 18:07  [ТС]
К примеру поставил PyQt5, а модуль "QtWidgets" не находится. Делаю в PyCharm.

Спросил на гитере matplotlib про "from mpl_finance import candlestick_ohlc", почему так долго грузится свечной график.
Написали зачем много свечей загружать, поэтому и долго грузятся. Прямо "капитаны очевидности", мне как раз много и нужно. И может чего не правильно понял, сказали, что "mpl_finance" не поддерживается.

На счет увеличения вуаля: 6,7 число это суббота и воскресенье.
Миниатюры
Не показывать данные выходных дней на графике  
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.01.2019, 18:34
Цитата Сообщение от quant77 Посмотреть сообщение
К примеру поставил PyQt5, а модуль "QtWidgets" не находится
И так и эдак - а все равно находится. Странно?
Python
1
2
3
4
5
6
7
>>> from PyQt5.QtWidgets import QApplication, QWidget
>>> import PyQt5.QtWidgets as qwt
>>> from PyQt5.QtWidgets import QApplication, QWidget
>>> from PyQt5 import QtWidgets
>>> QtWidgets.QApplication
<class 'PyQt5.QtWidgets.QApplication'>
>>>
Цитата Сообщение от quant77 Посмотреть сообщение
сказали, что "mpl_finance" не поддерживается.
Возможно. Но пока работает. И дата последнего обновления - Jun 19, 2018.

Python
1
2
3
4
>>> import mpl_finance
 >>> mpl_finance.Rectangle
<class 'matplotlib.patches.Rectangle'>
>>>
По сабжу с matplotlib: пока вы не дадите исходные данные - разгадывать вам ребус никто не будет.
0
0 / 0 / 1
Регистрация: 25.02.2016
Сообщений: 134
04.01.2019, 20:53  [ТС]
Собственно меня, то что на картинке интересует. Остальное не так сильно важно.

Добавлено через 2 часа 10 минут
Ну, не знаете так и скажите. Чего тут от темы отходить в сторону. Что за привычка включать "сам дурак".
Какие нужны исходные данные файл, что ли? Да любой возьмите и увидите, что идет отрисовка всех календарных дней(выходных, праздников не рабочих дней, их нет в файле)
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.01.2019, 23:50
Лучший ответ Сообщение было отмечено quant77 как решение

Решение

Цитата Сообщение от quant77 Посмотреть сообщение
Какие нужны исходные данные файл, что ли?
Те, которые позволяют запустить код с минимальный усилиями для отвечающего.
Правило минимального самодостаточного воспроизводимого примера. .
Но поскольку я вижу, что вы далеки от понимания людей, которые здесь отвечают (попробуйте как-нибудь сами побыть в этой роли ради опыта), то пришлось потратить толику своего времени, чтобы сгенерировать данные.
Я долго не мог понять, что вам не нравится, пока не построил свой график.
И пришел к выводу, что вы вообще не понимаете как работает построение графиков.

Поэтому краткий ликбез: библиотека автоматически выполняет шкалирование ваших данных, если вы не сделали это явно, вручную. Соответственно, тики и метки берутся из диапазона ваших данных и - что взлезло, то влезло - фигура то не резиновая. Никакого точного соответствия им не будет - поскольку берется диапазон и линеарно (как задано в настройках - можно переопределить) шкалируется на порции.

Хотите, чтобы там отображалось то, что вам нужно - распишите все это библиотеке вручную. Методов для этого - вагон и маленькая тележка.
Пример ручного шкалирования:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
from pprint import pprint
import calendar
from locale import setlocale,LC_ALL
 
setlocale(LC_ALL, "") # включаем локализацию
# генеарция данных - диапазон дат от начала до конца года - 365 штук.
date_index  = pd.date_range(start='2018-01-01',  end='2018-12-31',freq='D')
df = pd.DataFrame({'Date':date_index})
 
x_data = df['Date'].values
y_data = range(0,len(df['Date'].values))
 
# Используем subplot, чтобы получить экземпляр класса AxesSubplot,
# из которого будем иметь доступ к осям
fig,ax = plt.subplots(figsize=(20,10)) # увеличим размер фигуры до 20 инчей по ширине
ax.set_ylabel("Days")  # метка для оси Y
ax.set_xlabel("Dates") # метка для оси X
 
# установим тики для осей - берем каждую 10-ую дату
#ax.xaxis.set_ticks(x_data[::10]) # сразу для двух осей
ax.set_xticks(x_data[::10])     #  тики отдельно для X оси
ax.set_yticks(range(0,365,30))  #  тики отдельно для Y оси - примерно по 30 дней, чтобы обозначить месяц
# сделаем метки тиков оси Y в виде названий месяцев из модуля calendar, 
# первый элемент объекта month_name пропускаем, так как он пустой 
ax.set_yticklabels(calendar.month_name[1:],rotation=45)
# метки для тиков оси X развернем вертикально
ax.set_xticklabels(x_data[::10],rotation='vertical')
# форматирование дат для оси X
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
 
plt.grid(True) 
plt.plot(x_data, y_data,label='График дат')
plt.title("Наш супер-пупер график")
plt.legend()
plt.show()


P.S. Дальнейших разъяснений по коду не последует.
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
05.01.2019, 00:20
Del
0
05.01.2019, 07:07

Не по теме:

Цитата Сообщение от Garry Galler Посмотреть сообщение
Ставятся с полпинка.
Скажите это cx_Oracle для 32-битного линукса. Три дня убил на установку.

0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
05.01.2019, 13:32
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Три дня убил на установку.
На винде никаких проблем. Поставил за минуту.
Ваша проблема - проблема вашей сборки линукса.
0
0 / 0 / 1
Регистрация: 25.02.2016
Сообщений: 134
05.01.2019, 13:58  [ТС]
Garry Galler,
Попробую изучить. Опыта мало. Да я совершенно не понимаю, как строится график.
Основные проблемы в применении примеров возникли, что там намешаны массивы, списки и пр. из pandas и nympy, а они строятся по разному. Буду дальше читать.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
05.01.2019, 15:55
Цитата Сообщение от quant77 Посмотреть сообщение
Попробую изучить
Электронная книга на русском по matplotlib от Павла Шабанова в виде блокнотов Jupyter (бывший IPython, поставляется с анакондой).
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
05.01.2019, 20:31
А вот, кстати, волшебная "переключалка" опций шкалирования для дат:
Python
1
2
locator = matplotlib.dates.WeekdayLocator(byweekday=(matplotlib.dates.FR,))
ax.xaxis.set_major_locator(locator) # локатор для оси X
По умолчанию используется класс matplotlib.dates.AutoDateLocator(),котор ый выполняет шкалирование автоматически в соответствии с таким словарем интервальных данных:

Python
1
2
3
4
5
6
7
8
self.intervald = {
  matplotlib.dates.YEARLY  : [1, 2, 4, 5, 10],
  matplotlib.dates.MONTHLY : [1, 2, 3, 4, 6],
  matplotlib.dates.DAILY   : [1, 2, 3, 7, 14],
  matplotlib.dates.HOURLY  : [1, 2, 3, 4, 6, 12],
  matplotlib.dates.MINUTELY: [1, 5, 10, 15, 30],
  matplotlib.dates.SECONDLY: [1, 5, 10, 15, 30]
  }
Каждый вариант означает какими порциями будет выводиться информацию на шкалу:
если библиотека решит, что она будет выводить года, то либо каждый 1-ый, либо каждый 2-ой, либо каждый четвертый, либо каждый 5-ый, либо каждый 10-ый год.
Если данные будут выводиться помесячно, то выбирается один из вариантов списка: или по одному месяцу, или по два, или по три, или по четыре, или по шесть. В общем, схема думаю понятна и для прочих временных данных.
Библиотекой выбирается один из наиболее подходящих вариантов для каждого типа интервала.
И это словарь можно изменять под свои нужды как угодно.
Python
1
2
3
4
5
6
7
# Изменим локатор, используемый по умолчанию
locator = matplotlib.dates.AutoDateLocator()
# Если локатор привяжет риски к месяцам, то риски должны идти с указанным нами интервалом 
locator.intervald[matplotlib.dates.MONTHLY] = [1]
# Если локатор привяжет риски к дням, то риски должны идти с указанным нами интервалом 
locator.intervald[matplotlib.dates.DAILY] = [5]
ax.xaxis.set_major_locator(locator)
Но также можно использовать специализированные классы локаторов. Например, matplotlib.dates.WeekdayLocator, который задает дни недели, которые должны выбираться из дат.
Я указал FR (в самом верхнем коде поста), то есть только пятницы - и получил:

Соответственно, в этом классе можно указать свой набор дней недели - и на шкалу будут выводиться только они.
API работы с датами в matplotlib
1
0 / 0 / 1
Регистрация: 25.02.2016
Сообщений: 134
05.01.2019, 21:19  [ТС]
Garry Galler,
Локаторы пробовал применять, даже вроде получалось.

Я все по той же теме, как убрать выходные.
Правильно ли понимаю "plt.plot(x, y);"
x-это даты, то есть время в моем случае
y-это само значение, которое нужно нарисовать
И в "x" можно поставить либо даты либо индексы? То есть к примеру массив стринг туда не получится поставить.

Вот этой штукой задается ось "x" ----ax.set_xticks, если нет для чего она нужна?

Распринтовал:
Python
1
2
3
4
5
6
7
8
9
10
11
print(x.iloc[:5,0:0])#Index: [1997-10-22 00:00:00, 1997-10-23 00:00:00, 1997-10-27 00:00:00, 1997-10-28 00:00:00, 1997-10-29 00:00:00]
 
print(x[:5])#распечатывает следующее
 
                OPEN      HIGH       LOW   ...     P   R   RINFO
DATE                                       ...                  
1997-10-22  105713.0  106500.0  103475.0   ...     0   0     0.0
1997-10-23  103325.0  103350.0   98538.0   ...     0   0     0.0
1997-10-27   97575.0   98500.0   96525.0   ...     0   0     0.0
1997-10-28   89375.0   93900.0   84000.0   ...     0   0     0.0
1997-10-29   95875.0   95875.0   93375.0   ...     0   0     0.0
Закачал на всякий случай файл, с которого читаю.
https://transfiles.ru/fwp1f
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
05.01.2019, 21:33
x и y это ваши данные для двух осей. Если вам нужны даты по горизонтали, то в x должны быть даты.
Что вы хотите отображать по оси Y (вертикальной) - я не в курсе. Я использовал просто годовой интервал дней.
ax.set_xticks создает тики\деления шкалы по оси X на основании данных, которые вы туда передадите.
Цитата Сообщение от quant77 Посмотреть сообщение
Я все по той же теме, как убрать выходные.
А чем локатор не подошел? Я его вполне успешно применил.
Другой вариант - просто явно передать все ваши данные в тики и метки (как я это делал в первом коде). Тогда в тиках и метках будут только ваши данные и никакой отсебятины.
0
0 / 0 / 1
Регистрация: 25.02.2016
Сообщений: 134
05.01.2019, 23:53  [ТС]
Garry Galler,
Проблема в том, что если использовать локаторы к примеру исключив субботу и воскресенье, то иногда они бывают рабочими днями и в эти дни будут данные или я чего-то не понял.

Добавлено через 1 час 11 минут
В примерах данные такого формата:
Python
1
2
3
4
5
6
7
[('2008-09-03', 468.73, 474.29, 459.58, 464.41,  4314600, 464.41)
 ('2008-09-04', 460.  , 463.24, 449.4 , 450.26,  4848500, 450.26)
 ('2008-09-05', 445.49, 452.46, 440.08, 444.25,  4534300, 444.25)
  ..............................................................
  ('2008-10-10', 313.16, 341.89, 310.3 , 332.  , 10597800, 332.  )
 ('2008-10-13', 355.79, 381.95, 345.75, 381.02,  8905500, 381.02)
 ('2008-10-14', 393.53, 394.5 , 357.  , 362.71,  7784800, 362.71)]
а у меня:
Python
1
2
3
4
5
6
1997-10-27   97575.0   98500.0   96525.0   ...         0       0     0.0
1997-10-28   89375.0   93900.0   84000.0   ...         0       0     0.0
1997-10-29   95875.0   95875.0   93375.0   ...         0       0     0.0
1997-10-30   93125.0   94338.0   91150.0   ...         0       0     0.0
1997-10-31   94975.0   96125.0   93625.0   ...         0       0     0.0
1997-11-05   95750.0   97300.0   95463.0   ...         0       0     0.0
как мне сделать данные, как в примерах.

Добавлено через 56 минут
Получается "ticker.FuncFormatter" для этой цели подойдет. https://matplotlib.org/3.0.2/g... rmatter-py

Только массивы, как в примере сделать не получается.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
06.01.2019, 02:08
На ваших данных - просто отмасштабировал тики на X на 1/10.
Так как тики заданы вручную - matplotlib использует исключительно ваши даты.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
from datetime import datetime,date
from pprint import pprint
 
 
def int2date(argdate: int): 
  
    year = int(argdate / 10000)
    month = int((argdate % 10000) / 100)
    day = int(argdate % 100) 
    return date(year, month, day)
 
 
df = pd.read_csv('file.csv',parse_dates=True,infer_datetime_format=True)
 
#print(df)
#  int2date преобразовывает целые числа вида 20180723  в datetime
# а затем datetime нужно преобразовать опять в числа - которые понимает matplotlib
x_data = mdates.date2num(df['DATE'].apply(int2date))
y_data = df['CLOSE'].values # здесь все понятно; values можно не использовать - это переход из pandas на уровень numpy массивов 
 
# Используем subplot, чтобы получить экземпляр класса AxesSubplot,
# из которого будем иметь доступ к осям
fig,ax = plt.subplots(figsize=(20,10)) # увеличим размер фигуры до 20 инчей по ширине
ylabel = ax.set_ylabel("Close",fontsize=10, color='r',rotation='horizontal')   # метка для оси Y
xabel = ax.set_xlabel("Dates", fontsize=10, color='g')   # метка для оси X
 
ax.set_xticks(x_data[::10])     # для X оси берем в качестве тиков 1/10 часть дат из нашего фрейма
#ax.set_yticks(y_data)          # для Y оси масштабировать ничего будем - пусть будет автоматическое
 
#  делаем тики на оси X вертикальными
xlabels = ax.xaxis.get_ticklabels()
for label in xlabels:
    # цвет подписи делений оси OX
    label.set_color('blue')
    # поворот подписей делений оси OX 
    label.set_rotation('vertical')
    # размер шрифта подписей делений оси OX 
    label.set_fontsize(10)
 
# форматирование дат для оси X  - 
# иначе вместо дат увидим просто чиселки (дни) григорианского календаря  с которыми matplotlib и работает внутри
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%Y-%m-%d'))
 
plt.grid(True) 
plt.plot(x_data, y_data,label='График дат',color='red')
plt.title("Наш супер-пупер график")
plt.legend()
plt.show()
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
06.01.2019, 02:15
Опять не успел пост отредактировать....
Хотел дописать вначало: Если я вообще правильно понял задачу, то это самое простое решение. Сколько хотите тиков - столько их и помещайте, масштабируя на свой вкус.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.01.2019, 02:15
Помогаю со студенческими работами здесь

Календарь с выделением выходных дней
Создать календарь. Выбранная дата на календаре должна отображаться в отдельной строке (число, месяц, год и день недели). Если выбранная...

Вычет выходных дней из DateTimePicker
Добрый день! На форме есть DateTimePicker и по умолчанию он выводит значение на день больше, чем сегодня this.dateTimePicker1.Value...

Определение выходных дней недели
Добрый день !!!! Нарисовать схему БД и написать запрос на языке T-SQL, выводящий расписание для междугородных автобусов на выходные...

Автоматическое проставление выходных дней
Мне нужно чтобы в БД SQL автоматически проставлялись выходные дни &quot;В&quot;, и если в месяце меньше 31 дня, то лишние дни отмечались...

Функция для вывода выходных дней
Приветствую! Существует ли функция в пхп для того чтобы получить все выходные дни в месяце? И если нет, какой алгоритм вычисления вы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru