経済指標グラフの日付問題
形式が
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 だと元まで変更となる