経済指標グラフの日付問題
形式が
dd/mm/yy
となっているので
altairで表示が月と間違えて表示される
月の表示を英語にすればいけるかもしれない
株価可視化複数アプリでそうしたので
import pandas as pd
import investpy
import altair as alt
economic_data = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=['japan', 'united states'], from_date='01/01/2021', to_date='11/06/2021')
economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=['japan', 'united states'], from_date='01/01/2021', to_date='31/01/2021')
ISM =economic_data[economic_data['event'].str.contains('ISM Non-Manufacturing PMI')]
chart =(
alt.Chart(ISM)
.mark_line(opacity=0.8,clip=True)
.encode(
x="date:T",
y=alt.Y("actual:Q",stack=None)
)
)
chart
これだと
dd/mm/yy
の mm 部分を日付と間違えるようだ
をみたところ
プロット
のところで
プロットに使用する列が正しいデータ型であり、日付が(YYYY-MM-DD)の形式であることを確認しました。そのために、高価格列と低価格列をdoubleデータ型に変換し、日付列を文字列形式に変換しました。続いて、日付列をDD / MM / YYYY形式からYYYY / MM / DDに変換し、最後にYYYY-MM-DDに変換しました。
をみて
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)
import plotly.plotly as py
import plotly
import pandas as pd
import datetime
df = pd.read_csv("TSLA.csv")
df['date'] = df['date'].astype('str')
df['high'] = df['high'].astype('double')
df['low'] = df['low'].astype('double')
date2 = []
for i in df['date']:
new_date = datetime.datetime.strptime(i, "%d/%m/%Y").strftime("%Y-%m-%d")
date2.append(new_date)
df['date'] = df['date'].str.replace('/', '-')
df['date'] = date2
df.fillna(0)
df.head()
のうち
df = pd.read_csv("TSLA.csv")
df['date'] = df['date'].astype('str')
df['high'] = df['high'].astype('double')
df['low'] = df['low'].astype('double')
date2 = []
for i in df['date']:
new_date = datetime.datetime.strptime(i, "%d/%m/%Y").strftime("%Y-%m-%d")
date2.append(new_date)
df['date'] = df['date'].str.replace('/', '-')
df['date'] = date2
df.fillna(0)
df.head()
をみたところ
date の部分をループさせて
date2 に格納
date の値を date2 に書き換えて
df.fillna で反映しているみたいだ
df.fillna は欠損値の置き換えらしい
とりあえず実験
date2 =[]
for i in ISM['date']:
new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")
date2.append(new_date)
とすれば
date2 に
['2021-01-08', '2021-02-04', '2021-03-04', '2021-04-05', '2021-05-05', '2021-06-03']
と格納される
あとは代入すればいけると思って
ISM['date']=ISM['date'].str.replace('/','-')
ISM['date'] = date2
ISM.fillna(0)
としたら
<ipython-input-15-e3cb61543e3a>:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
ISM['date']=ISM['date'].str.replace('/','-')
<ipython-input-15-e3cb61543e3a>:2: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
ISM['date'] = date2
と警告がでる
これで
chart
とすればいちおう望み通りのグラフにはなる
エラーを
<ipython-input-15-e3cb61543e3a>:2: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
で検索してみたら
pandas の SettingWithCopyWarning で苦労した話
にその原因っぽいのが乗っていた
元のデータの一部を抽出→そのうち一部へ代入した場合、「元のデータのその部分」を修正したかったのか、「一部を変更した新しいデータ」を作りたかったのかどっちかわからないよ、という感じ
らしい
PandasのSettingWithCopyWarningに対する対処方法
も参考にしてみた
view か copy かを明確にしないとダメで
copy なら元の DataFrane は変更されない
view だと元まで変更となる