Изменена частота тиков на графике Pandas .bar, но испорчены реальные бары - PullRequest
0 голосов
/ 23 апреля 2020

Как твоя самоизоляция?

Шахты, когда я сверляю через визуализацию в Python. Недавно, однако, я столкнулся с проблемой.

Я понял, что .plot.bar() в Pandas имеет необычное форматирование оси x (что вроде подтверждает, что я читаю перед тем, как спросить). У меня были данные о ценах с ежемесячной периодичностью, поэтому я применил исправление, чтобы отображать только годовые тики на гистограмме:

fig, ax = plt.subplots()
ax.bar(btc_returns.index, btc_returns)

ax.xaxis.set_major_locator(mdates.YearLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))

Где btc_returns - объект Series с датой и временем в индексе.

Вывод, который я получил, был странным. Вот скриншоты того, что я ожидал от конечного результата.

What I wanted

What I got

I пытался найти решение этой проблемы, но не повезло. Ребята, не могли бы вы мне помочь? Спасибо! Критика приветствуется как всегда :) 1024 *

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

И мое решение выглядит следующим образом:

fig, ax = plt.subplots(figsize=(15,7))
ax.bar(btc_returns.index, btc_returns.returns.values, width = 1)

Где btc_returns - это DataFrame с возвратами BT C. Я полагал, что .values заставляет гистограмму правильно читать вводимые значения даты и времени. Для «отсутствующих» баров - их разрешение было слишком маленьким, поэтому я установил width в «1».

Вот результат:

enter image description here

0 голосов
/ 25 апреля 2020
  • Использование данных о стоимости акций от Yahoo Finance: Bitcoin USD
  • Технически, вы можете сделать pd.to_datetime(btc.Date).dt.date в начале, но resample не будет работа, поэтому btc_monthly.index.date выполняется как второй шаг.
  • resample может происходить в разные периоды (например, 2M = каждые два месяца)

Загрузка и преобразовать данные

import pandas as pd
import matplotlib.pyplot as plt

# load data
btc = pd.read_csv('data/BTC-USD.csv')

# Date to datetime
btc.Date = pd.to_datetime(btc.Date)

# calculate daily return %
btc['return'] = ((btc.Close - btc.Close.shift(1))/btc.Close.shift(1))*100

# resample to monthly and aggregate by sum
btc_monthly = btc.resample('M', on='Date').sum()

# set the index to be date only (no time)
btc_monthly.index = btc_monthly.index.date

График

btc_monthly.plot(y='return', kind='bar', figsize=(15, 8))
plt.show()

enter image description here

График Раз в два месяца

btc_monthly = btc.resample('2M', on='Date').sum()  # instead of 'M'
btc_monthly.index = btc_monthly.index.date

btc_monthly.plot(y='return', kind='bar', figsize=(15, 8), legend=False)
plt.title('Bitcoin USD: Bimonthly % Return')
plt.ylabel('% return')
plt.xlabel('Date')
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...