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

Odpowiedz Nowy wątek
2018-09-25 21:25
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.

edytowany 1x, ostatnio: Beata Griškevič, 2018-09-25 21:25

Pozostało 580 znaków

2018-09-25 22:55
0

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


Niestety, nie działa - Beata Griškevič 2018-09-26 15:19

Pozostało 580 znaków

2018-09-26 17:06
0

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


Kiedy tak piszę, to pierwszy print daje dobre dane. Ale drugi print dodaje mi słupek z elementami "NaN". data_ask = data_pd['Ask'].resample('10Min').ohlc() print (data_ask) data_ask = data_ask.reindex(columns= ['Date_Time', 'open', 'high', 'low', 'close]) print(data_ask) W załączniku umieszczę jak to wygląda. - Beata Griškevič 2018-09-26 17:15
Załącznik niżej - Beata Griškevič 2018-09-26 17:17

Pozostało 580 znaków

2018-09-26 17:16
0

Oto jak wygląda

Pokaż pozostałe 2 komentarze
Sorry, tak, mam csv file, ale tu jako że mam max 20 MB załączyć, to skopiowałam dane z csc i chciałam ponownie wkleić w xlsx, zachować jako csv. No ale zapomniałam i tu włożyła xlsx - Beata Griškevič 2018-09-26 17:33
Tu są pełne moje dane, ale nie daje mi tak dużego file załączyć. 2016 rok, 11 miesiąc, EURUSD - Beata Griškevič 2018-09-26 17:38
@Pyxis: nie ma problemu jest pd.read_exel - lion137 2018-09-26 17:48
@lion137: problem w tym, że Beata mogła coś namieszać przy zapisie. - Pyxis 2018-09-26 17:51

Pozostało 580 znaków

2018-09-26 17:43
0

Wklej stacktrace


Pozostało 580 znaków

2018-09-26 18:08
Smutny Samiec
0

Oto:

  • 333.png (0,14 MB) - ściągnięć: 17
  • 222.png (0,14 MB) - ściągnięć: 14
  • 111.png (0,08 MB) - ściągnięć: 12

Pozostało 580 znaków

2018-09-26 18:12
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/pan[...]pandas.DataFrame.reindex.html


Zetarć ją? Czy coś mam dodać? - Beata Griškevič 2018-09-26 18:13

Pozostało 580 znaków

2018-09-26 18:22
0

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


Czy mógłbyś pomóc z tym? Tylko rozpoczynam programować, trudno to wyobrazić - Beata Griškevič 2018-09-26 18:22
Skończ poganiać ludzi, bo tylko zniechęcasz. - Pyxis 2018-09-26 18:24
Bo bez tego wersu pisze "Date_Time" is not in index - Beata Griškevič 2018-09-26 18:25
Słowem bez niej słupki są ok, ale wtedy Date_Time is not in index - Beata Griškevič 2018-09-26 18:26

Pozostało 580 znaków

2018-09-26 18:47
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.


Pozostało 580 znaków

2018-09-26 19:55

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()
edytowany 1x, ostatnio: Pyxis, 2018-09-26 19:57

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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