Wykres

0

Witam. Napisałam część programu, który wyświetla mi moje dane z csv file. Próbowałam już mnóstwo razy narysować wykres, gdzie oś x - data, oś y - close price, ale mi się nie udaje. Biblioteki potrzebne do tego mam. Może ktoś się zna na tym?

import pandas as pd
from datetime import datetime
import csv
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
headers = ['date','close','volume','open','high','low']

df = pd.read_csv('C:/Users\Beata\Desktop\Duomenys\FB_stock_prices_daily.csv',names=headers)
print (df)

Dane wyświetlone (csv file) wyglądają tak:
date close volume open high low
0 6/18/2018 198.310 16470990 194.800 199.5800 194.1300
1 6/19/2018 197.490 19968690 196.235 197.9600 193.7900
2 6/20/2018 202.000 28175590 199.100 203.5500 198.8050
..............................................................................................

0

Próbowałam już mnóstwo razy narysować wykres, gdzie oś x - data, oś y - close price, ale mi się nie udaje

Się zapytam - jak próbowałaś i jaki był tego efekt? Oraz jaki być powinien?

1

Jest w Pythonie taki magiczny cosik, którym można przeniuchać plik CSV żeby np. sprawdzić, czy na pewno jest Comma Separated a nie Space Separated albo Semicolon Separated: https://docs.python.org/3/library/csv.html#csv.Sniffer

0

Chcę otrzymać coś w tym rodzaju

0
Serechiel napisał(a):

Próbowałam już mnóstwo razy narysować wykres, gdzie oś x - data, oś y - close price, ale mi się nie udaje

Się zapytam - jak próbowałaś i jaki był tego efekt? Oraz jaki być powinien?

Chce otrzymać tak: (załącznik)

0
Beata Griškevič napisał(a):
Serechiel napisał(a):

Próbowałam już mnóstwo razy narysować wykres, gdzie oś x - data, oś y - close price, ale mi się nie udaje

Się zapytam - jak próbowałaś i jaki był tego efekt? Oraz jaki być powinien?

Chce otrzymać tak: (załącznik)

A jeszcze jedno, przekształciłaś kolumnę date do typu datetime?

df['date'] = pd.to_datetime(df['date'])

Na 99% pandas wczytał kolumnę date jako str, więc trochę średnio z użyciem jej jako osi czasu na wykresie.

0
Beata Griškevič napisał(a):

Chcę otrzymać coś w tym rodzaju

Dałaś kod, w którym wczytujesz CSV, ale nie podałaś kodu, którym chcesz wyświetlić wykres. Podaj ten kod, to będziemy mogli poszukać błędu.

0

oś x - data, oś y - close price

Na początek zobacz jak odczytane zostały kolumny:

print (df.columns)

powinno dać:

Index(['date', 'close', 'volume', 'open', 'high', 'low''],
      dtype='object')

Skoro zaczynasz, to zacznij od rzeczy najprostszych:

df.plot.line(x = df.columns[indeks(y)], y = df.columns[indeks(y)]) 

PS. Z indeksami kolumn obchodzi się jak z listą. 0 - pierwsza, 1 - druga itd. Można na osi umieścić kilka kolumn następujących po sobie.

0

Mam tak:

from matplotlib.finance import candlestick_ohlc
import matplotlib.dates as dates
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import timeit
from IPython.display import clear_output

df = pd.read_csv('C:\Users\Beata\Desktop\FB_stock_prices_daily.csv', chunksize=10000, low_memory=False, iterator=True, infer_datetime_format=True, parse_dates='Date', 'Time')
data_tik = pd.concat(df, ignore_index=True)

fig = plt.figure(figsize=(15,9))
fig.add_axes()
ax = fig.add_subplot(111)
ax.plot(data_tik['Date_Time'], data_tik['Close'], color='green', label="FB", linewidth=0.8)
ax.xaxis.set_minor_locator(dates.MinuteLocator(interval=360))
ax.xaxis.set_minor_formatter(dates.DateFormatter('%H:%M'))
plt.setp(ax.xaxis.get_minorticklabels(), rotation=90, fontsize=5)
ax.xaxis.grid(True, which="minor")
ax.xaxis.set_major_locator(dates.DayLocator(interval=2))
ax.xaxis.set_major_formatter(dates.DateFormatter('\n\n%Y/%m/%d'))
plt.title("FB")
ax.set(title='FB', ylabel='Price', xlabel='Date')
plt.legend(loc='upper left')
plt.grid()
plt.show()

1

Czy możesz zdefiniować problem poprawnie (co ma być konkretnie wyrysowane) oraz dodać niezbędny plik z danymi (może być wycinek), tak by można było Ci pomóc?

0
Pyxis napisał(a):

Czy możesz zdefiniować problem poprawnie (co ma być konkretnie wyrysowane) oraz dodać niezbędny plik z danymi (może być wycinek), tak by można było Ci pomóc?

Ma być narysowany wykres, na osi xsów - "date" (dzień, miesiąc, rok) - jest to słupek 1 w moich danych, oś yków stanowi close price, tzn. słupek "close".
Inne słupki nie są używane.

Dane zamieszczam w załączniku.

2
#!/usr/bin/env python3

import warnings
warnings.filterwarnings("ignore", message="numpy.dtype size changed")
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator

data = pd.read_csv("FB_stock_prices_daily.csv")

figure = plt.figure()
axis = figure.add_subplot(111)
axis.set_title("FB")
axis.set_xlabel("date", fontsize=1)
axis.set_ylabel("close")
axis.xaxis.set_major_locator(MaxNLocator(nbins=10))
figure.autofmt_xdate()
plt.plot(data['date'], data['close'])
plt.show()

Wykres

0

Mam jeszcze jedno pytanie. Dlaczego na wykresie mam datę od 2018.06.15 do 2018.09.15, chociaż same dane rozpoczynają się od 2018.06.18 - 2018.09.18? I jak to naprawić? Następne pytanie to - dlaczego oś xsów tak nieładnie wygląda? Zostawiam wykres w załączniku.

import matplotlib.pyplot as plt
import pandas as pd

data = pd.read_csv(r'C:\Users\Beata\Desktop\Data\FB_stock_prices_daily.csv')
data['date'] = pd.to_datetime(data['date'])
print(data)


figure = data.plot(x = 'date', y = 'close')
plt.legend(['Close price'])

plt.xlabel('date')
plt.ylabel('close price')
plt.title('Facebook stock price daily')
plt.show()

0

Na osi x nie masz oznaczonych faktycznych rekordów, tylko jakieś tam domyślne ticki - punkty w czasie jako daty. Wygląda na to, że major tick jest ustawiony na co 1, 15 i 29 dzień miesiąca, 1 i 29 są blisko i się nakładają. Podejrzewam, że załatwia to ta linijka kodu w odpowiedzi @Pyxis:

axis.xaxis.set_major_locator(MaxNLocator(nbins=10))

Jak chcesz żeby ticki były naniesione np. na każdy N-ty i M-ty dzień miesiąca (np. tylko 1 i 15) możesz użyć tego, a format daty ogarnąć odpowiednim formatterem, jeśli Ci nie odpowiada.

0

Wykres otrzymuje, wszystko ok, ale oś xsów - to tylko rok (w załączniku umieszczam wykres). Jak to naprawić? Ma być i miesiąc, dzień. Chcę rozpocząć od 2018.06.18 i skończyć 2018.09.18, ale też wybrać jakiś interval = 15 dni. Próbowałam zrobić to z axis.xaxis.set_major_locator(dates.DayLocator()), no i właściwie nie daję rady. Chyba mi czegoś nie wczytuje..

import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
import matplotlib.dates as dates
import pandas as pd


data = pd.read_csv(r'C:\Users\Beata\Desktop\Duomenys\FB_stock_prices_daily.csv')
data['date'] = pd.to_datetime(data['date'])

figure = plt.figure()
axis = figure.add_subplot(111)
axis.set_title("FB")
axis.set_xlabel("date")
axis.set_ylabel("close")
plt.setp(axis.xaxis.get_minorticklabels(), rotation=90, fontsize=5) 
axis.xaxis.grid(True, which="minor")
axis.xaxis.set_major_locator(dates.DayLocator())
axis.xaxis.set_major_locator(MaxNLocator(nbins=11)) 
axis.xaxis.set_minor_formatter(dates.DateFormatter('&d/$m/$Y'))

figure.autofmt_xdate() 
plt.plot(data['date'], data['close'])
plt.grid()
plt.show()



0
Beata Griškevič napisał(a):

Wykres otrzymuje, wszystko ok, ale oś xsów - to tylko rok (w załączniku umieszczam wykres). Jak to naprawić? Ma być i miesiąc, dzień. Chcę rozpocząć od 2018.06.18 i skończyć 2018.09.18, ale też wybrać jakiś interval = 15 dni. Próbowałam zrobić to z axis.xaxis.set_major_locator(dates.DayLocator()), no i właściwie nie daję rady. Chyba mi czegoś nie wczytuje..

axis.xaxis.set_major_locator(dates.DayLocator())
axis.xaxis.set_major_locator(MaxNLocator(nbins=11)) 

Ustawiasz locator jako DayLocator bez parametrów, a zaraz potem ustawiasz locator jako MaxNLocator. Jak to ma działać, skoro nie tylko nie wskazujesz DayLocator'owi, które dni Cię interesują, ale jeszcze chwilę później zastępujesz go innym locatorem??

Poza tym gdyby wygooglować DateFormatter w dokumentacji matplotliba, co trudne raczej nie jest, dostajemy informację, że pod spodem używany jest strftime z biblioteki standardowej Pythona, który ma już podane obsługiwane formaty. Z których wynika, że "&a-$b-#c" czy coś w tym stylu nie ma prawa zadziałać, powinno być np. "%d-%m-%Y" aby otrzymać 18-09-2018.

Ale już nawet szkoda mi otwierać LMGTFY.

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