経済指標グラフの日付問題
形式が
dd/mm/yy
となっているので
altairで表示が月と間違えて表示される
月の表示を英語にすればいけるかもしれない
株価可視化複数アプリでそうしたので
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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に変換しました。
をみて
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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() |
のうち
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 は欠損値の置き換えらしい
とりあえず実験
1 2 3 4 | date2 = [] for i in ISM[ 'date' ]: new_date = datetime.datetime.strptime(i, "%d/%m/%Y" ).strftime( "%Y-%m-%d" ) date2.append(new_date) |
とすれば
date2 に
1 2 3 4 5 6 | [ '2021-01-08' , '2021-02-04' , '2021-03-04' , '2021-04-05' , '2021-05-05' , '2021-06-03' ] |
と格納される
あとは代入すればいけると思って
1 2 3 | ISM[ 'date' ] = ISM[ 'date' ]. str .replace( '/' , '-' ) ISM[ 'date' ] = date2 ISM.fillna( 0 ) |
としたら
1 2 3 4 5 6 7 8 9 10 11 12 | <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 |
と警告がでる
これで
1 | chart |
とすればいちおう望み通りのグラフにはなる
エラーを
1 2 3 | <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 だと元まで変更となる