Reputation: 345
This Code, Takes 2 co-ordinates for a straight line from google finance and places 3rd point on the same line at some distance.
import datetime as dt
from datetime import timedelta as td
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
import pandas_datareader.data as web
import numpy as np
start = dt.datetime(2017, 7, 1)
end = dt.datetime(2017, 3, 1)
# retrieving data from google
df = web.DataReader('TSLA', 'google', start, )
Dates = df.index
Highs = df['High'] # Getting only the values from the 'High' Column.
Highest_high = np.amax(Highs) # returns the Highest value
for i, h in enumerate(Highs):
if h == Highest_high :
Highests_index = i
#Highests_index = Highs.argmax() # returns the index of Highest value
Highest_high_2 = sorted(Highs)[-2]
for i, j in enumerate(Highs):
if j == Highest_high_2 :
Highests_index_2 = i
#================Problem Maybe starting from here========================
x = [Highests_index, Highests_index_2]
y = [Highest_high, Highest_high_2]
coefficients = np.polyfit(x, y, 1)
polynomial = np.poly1d(coefficients)
# the np.linspace lets you set number of data points, line length.
x_axis = np.linspace(3,Highests_index_2 + 1, 3)
y_axis = polynomial(x_axis)
plt.plot(x_axis, y_axis)
plt.plot(x[0], y[0], 'go')
plt.plot(x[1], y[1], 'go')
plt.plot(Dates, Highs)
plt.grid('on')
plt.show()
the following error occurs with lots of Traceback
dt = datetime.datetime.fromordinal(ix).replace(tzinfo=UTC)
ValueError: ordinal must be >= 1
The above code works well when I just plot the numeric values without using datetime and pandas. I think the issue might be in datetime or in matplotlib.
I know this question might look duplicate, but I cannot relate my problem to any other solutions here.
Upvotes: 5
Views: 19843
Reputation: 784
I'd just like to add to the answers here and possibly clarify why this may occur, for anyone visiting this in the future.
The ValueError: ordinal must be >= 1
error can occur when an axis is specified to display as a time or date, but matplotlib
cannot interpret the data for that axis as either type.
For example, if the following is plotted:
fig, ax = plt.subplots()
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
ax.xaxis_date()
ax.plot(x, y, '-k')
It will generate the aforementioned error, as the data input to the x axis is a list of integers, and the axis.xaxis_date()
function requires datetime objects.
To correct this the x-axis data must be datetime objects:
date_str = [datetime.datetime(2020, 10, 16, 1, 0, 2), datetime.datetime(2020 10, 15, 12,18,31),datetime.datetime(2020, 11, 21, 18, 3, 6) ...]
Upvotes: 1
Reputation: 887
The error is due to matplotlib's inability to find the location of x-axis value along the x-axis.
The plot from the first two lines has numeric values for x-axis, whereas the third line is trying to plot a datetime
on the same axis. While plotting the third line plt.plot(Dates, Highs)
, matplotlib tries to find the x-axis location for the date and fails with the error.
Upvotes: 2
Reputation: 345
Sorry, Actually the error occured due to the 3rd last line. i deleted the plt.plot()Dates, Highs)
And everything Worked like Charm!
Upvotes: -1