web-dev-qa-db-ja.com

ValueError:序数は1以上でなければなりません

このコードは、Google Financeから直線の2つの座標を取り、3番目の点を同じ線上にある距離で配置します。

 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()

多くのトレースバックで次のエラーが発生します

dt = datetime.datetime.fromordinal(ix).replace(tzinfo = UTC)
ValueError:序数は> = 1でなければなりません

上記のコードは、datetimeとpandasを使用せずに数値をプロットするだけでうまく機能します。問題は日時またはmatplotlibにある可能性があると思います。

この質問は重複しているように見えるかもしれませんが、ここで自分の問題を他の解決策に関連付けることはできません。

4
BlueQuant

このエラーは、matplotlibがx軸に沿ったx軸値の位置を見つけることができないために発生します。

最初の2行のプロットには、x軸の数値がありますが、3行目は、同じ軸にdatetimeをプロットしようとしています。 3行目のplt.plot(Dates, Highs)をプロットしているときに、matplotlibは日付のx軸の位置を見つけようとし、エラーで失敗します。

1
Jughead

申し訳ありませんが、実際には最後から3行目が原因でエラーが発生しました。 plt.plot()Dates, Highs)を削除しました。すべてがチャームのように機能しました!

0
BlueQuant