Python. Wykres candlestick. Program z błędem.

0

Cześć. Jestem początkująca, no ale już mam za zadanie narysować wykres na podstawie danych z csv file (mniej więcej co mam otrzymać jest w załączniku). Z danych, które umieszczam też w załączniku, tworzę 4 dodatkowe słupki "open", "high", "low" i "close" (są one potrzebne). Póżniej próbuję za pomocą funkcji candlestick_ohlc to pokazać, ale otrzymuję błędy:

ValueError: Cannot convert -1 to a date. This often happens if non-datetime
values are passed to an axis that expects datetime objects.

import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
from mpl_finance import candlestick_ohlc
import matplotlib.dates as dates
data_pd = pd.read_csv('EURUSD-2016-11_TICK1.csv', names=['Symbol', 'Date_Time', 'Bid', 'Ask'])
data_pd.head()
format = '%Y%m%d %H:%M:%S'
data_pd['Date_Time'] = pd.to_datetime(data_pd['Date_Time'], format = format)
data_pd = data_pd.set_index(data_pd['Date_Time'])
data_pd = data_pd.drop(columns=['Symbol'])

data_ask = data_pd['Ask'].resample('10Min').ohlc()

data_ask = data_ask.reindex(columns= ['Date_Time', 'open', 'high', 'low', 'close'])

ohlc = data_ask[['Date_Time','open','high','low','close']]
f1, ax = plt.subplots(figsize = (10,5))

ax.xaxis.set_major_formatter(dates.DateFormatter('%Y-%m-%d %H:%M:%S'))
candlestick_ohlc(ax, ohlc.values, width=.6, colorup='green', colordown='red')

plt.show()

Czy może ktoś z tym pomóc? Bardzo byłabym wdzięczna. Dane w załączniku.

0

Spróuj dodać (do pd.read_csv) parse_dates=["Date_Time"].

0

OK, w którym momencie Ci się wysypuje?

0

Oto jak wygląda

0

Wklej stacktrace

0

Oto:

0

Ta linijka: data_ask = data_ask.reindex(columns= ['Date_Time', 'open', 'high', 'low', 'close']), dodała kolumnę Date_Time, którą pandas wypełniła NaN - ami.
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.reindex.html

0

Spróuj jej nie tworzyć i do tego dopasować wykres, albo zrobić tak, żeby w niej były daty.

0

Ty masz pełne dane, więc ja nic nie mogę zrobić. Spróbuj wypełnić tę nową kolumnę odpowiednimi datami. Pandas ma dobrą dokumntacje online.

1

Widać po kodzie, że nie zastanawiasz się, co tam jest, tylko skądś go kopiujesz. Kilka błędów:

  • Kompletnie źle wklejasz indeksy do nowej kolumny w DateFrame. Robi się to tak:
data['index_column'] = data.index

a nie za pomocą metody reindex().

  • Sprawdź sobie docstring funkcji candlestick_ohlc():
print(candlestick_ohlc.__doc__)

by przekonać się, że:

time must be in float days format - see date2num

  • Swoją drogą to jeśli używasz pojedynczych funkcji, to lepiej zaimportować je w ten sposób:
from matplotlib.dates import date2num, DateFormatter

niż tak

import matplotlib.dates as dates
  • To już moja rada, ale błędem to nie było. Nie nazywaj zmiennych tak, jak nazywa się parametry funkcji. Mam na myśli zmienną format. Zmieniłem ją na date_format.
    candlesticks.png
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.dates import date2num, DateFormatter
from mpl_finance import candlestick_ohlc

data_pd = pd.read_csv('dane.csv', names=['Symbol', 'Date_Time', 'Bid', 'Ask'])
date_format = '%Y%m%d %H:%M:%S'
data_pd['Date_Time'] = pd.to_datetime(data_pd['Date_Time'], format=date_format)
data_pd = data_pd.set_index(data_pd['Date_Time'])
data_pd = data_pd.drop(columns=['Symbol'])
data_ask = data_pd['Ask'].resample('60Min').ohlc()
data_ask['Date_Time'] = date2num(data_ask.index)
ohlc = data_ask.reindex(columns=['Date_Time', 'open', 'high', 'low', 'close'])

f1, ax = plt.subplots(figsize = (10,5))
ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))
candlestick_ohlc(ax, ohlc.values, width=.01, colorup='green', colordown='red')
plt.show()

1 użytkowników online, w tym zalogowanych: 0, gości: 1