Построить индекс данных в формате pandas в формате Месяц-Год по оси x - PullRequest
0 голосов
/ 29 июня 2018

У меня есть фрейм данных, который я хочу, чтобы ось x отображалась как APR-2018, например. Строка ax.format_xdata не работает.

import datetime as dt
import pandas as pd
import time
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

data = {("IVOG",1493510400000):{"Adj_Close":119.2136,"MA(3)":119.2136,"EWMA(3)":119.2136},
        ("IVOG",1496188800000):{"Adj_Close":120.8236,"MA(3)":120.0186,"EWMA(3)":120.0454},
        ("IVOG",1498780800000):{"Adj_Close":120.2736,"MA(3)":120.1036,"EWMA(3)":120.1266},
        ("IVOG",1501459200000):{"Adj_Close":121.7836,"MA(3)":120.5236,"EWMA(3)":120.5832},
        ("IVOG",1504137600000):{"Adj_Close":120.3536,"MA(3)":120.4896,"EWMA(3)":120.5309},
        ("IVOG",1506729600000):{"Adj_Close":124.3336,"MA(3)":121.1303,"EWMA(3)":121.2749}}

df=pd.DataFrame.from_dict(data, orient = 'index')
print(df)
ax = plt.gca()      # get current axis
df.plot(kind='line',y='Adj_Close', ax=ax)
df.plot(kind='line',y='MA(3)',ax=ax)
df.plot(kind='line',y='EWMA(3)', color='green', ax=ax)
print(df.index[0][1])
ax.format_xdata = mdates.DateFormatter('%b-%Y')     # Trying to get APR-2018
plt.xlabel(df.index[0][0])     # Trying to Get the Ticker
_=plt.grid()
_=plt.xticks(rotation=90)
plt.show()

Второй индекс должен быть просто датой, а не временем, но он неверно графики, подобные этому: Неверный график

1 Ответ

0 голосов
/ 29 июня 2018

Это должно сработать. Конечно, есть более «симпатичные» способы, но я попытался сделать так, чтобы вы могли держать свои данные и исходный фрейм данных как можно ближе к исходному в вашем вопросе.

Отредактировано после комментариев : как на счет этого, просто создайте новый столбец с датой, которую вы форматируете в любой желаемой форме. Затем используйте set_xticklabels () , передавая этот столбец, чтобы установить галочки, как вы хотите. Также вам может потребоваться удалить файл plt.xlabel по умолчанию (в противном случае у вас будет под индексом название индексов).

import datetime as dt
import pandas as pd
import time
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# the first part of your code is the same
data = {("IVOG",1493510400000):{"Adj_Close":119.2136,"MA(3)":119.2136,"EWMA(3)":119.2136},
    ("IVOG",1496188800000):{"Adj_Close":120.8236,"MA(3)":120.0186,"EWMA(3)":120.0454},
    ("IVOG",1498780800000):{"Adj_Close":120.2736,"MA(3)":120.1036,"EWMA(3)":120.1266},
    ("IVOG",1501459200000):{"Adj_Close":121.7836,"MA(3)":120.5236,"EWMA(3)":120.5832},
    ("IVOG",1504137600000):{"Adj_Close":120.3536,"MA(3)":120.4896,"EWMA(3)":120.5309},
    ("IVOG",1506729600000):{"Adj_Close":124.3336,"MA(3)":121.1303,"EWMA(3)":121.2749}}

df=pd.DataFrame.from_dict(data, orient = 'index')

# first let's give a name to the indexes
df.index.names = ['ivog', 'timestamp']

# then create a new column with a datetime object
# (formatted to microseconds as your data seems to be)
df['date'] = pd.to_datetime(df.index.levels[1], 
unit='ms')

# now let's change the date to the format you want
df['date'] = df['date'].apply(lambda x: x.strftime("%Y %B"))


print(df)

# plot the data just like you were doing
ax = plt.gca()      # get current axis
df.plot(kind='line',y='Adj_Close', ax=ax)
df.plot(kind='line',y='MA(3)',ax=ax)
df.plot(kind='line',y='EWMA(3)', color='green', ax=ax)

# Now the x-axis label should be what you wished for
ax.set_xticklabels(df['date'])
plt.xlabel('Your x axis label') 
plt.ylabel('Your y axis label')
plt.title('My Awseome Plot')
plt.xticks(rotation=45)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...