質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

902閲覧

python datetime型の要素を持つ列をlist型に変換するにはどうすればいいですか?

yuudai

総合スコア65

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/09/24 13:47

編集2020/09/24 15:15

datetime型の要素を持つ列をlist型に変換するにはどうすればいいですか?
.values.tolist()とすると全部NaNになってしまいます。

そもそものやりたいことは、もともとあるデータフレーム(時系列データ)から新しくデータを作って元のデータとつなげたいのですが、その作ったデータが元のデータと長さが少し異なっていてどこでずれているかわからないのでmerge()で結合する際に'Time'という列をキーにしてつなげたいのです。また'Time'をリストにしてfor文で一行ずつ取り出したいです。データフレームのまま扱おうとすると列を指定したときにIndexError: string index out of rangeこのようなエラーが出るのでリストにしたいです。

サンプルコード

うまい説明の仕方がわからないのでコード全部乗っけます。

時系列データのサンプルデータをどうやって用意すればいいかわかりませんがoandaapiでこのようなデータを用意します。
イメージ説明

#トレンドラインを計算する # 高値の始点/支点を取得 def get_highpoint(start, end): chart = df[start:end+1] while len(chart)>3: regression = linregress( x = chart['Time_ID'], y = chart['High'], ) chart = chart.loc[chart['High'] > regression[0] * chart['Time_ID'] + regression[1]] return chart # 安値の始点/支点を取得 def get_lowpoint(start, end): chart = df[start:end+1] while len(chart)>3: regression = linregress( x = chart['Time_ID'], y = chart['Low'], ) chart = chart.loc[chart['Low'] < regression[0] * chart['Time_ID'] + regression[1]] return chart def g_trendlines(span=240, min_interval=3): trendlines = [] slope = [] # 傾き,リスト型 time = [] # 高値の下降トレンドラインを生成 for i in df.index[::span//2]: highpoint = get_highpoint(i, i + span) # ポイントが2箇所未満だとエラーになるので回避する if len(highpoint) < 2: continue # 始点と支点が近過ぎたらトレンドラインとして引かない if abs(highpoint.index[0] - highpoint.index[1]) < min_interval: continue regression = linregress( x = highpoint['Time_ID'], y = highpoint['High'], ) print(regression[0] < 0.0, 'reg_high: ', regression[0], ', ', regression[1], ) # 下降してるときだけ if regression[0] < 0.0: trendlines.append(regression[0] * df['Time_ID'][i:i+span*2] + regression[1]) slope.append(regression[0] * df['Time_ID'][i:i+span*2]) time.append(df['Time'][i:i+span*2]) # 安値の上昇トレンドラインを生成 for i in df.index[::span//2]: lowpoint = get_lowpoint(i, i + span) # ポイントが2箇所未満だとエラーになるので回避する if len(lowpoint) < 2: continue # 始点と支点が近過ぎたらトレンドラインとして引かない if abs(lowpoint.index[0] - lowpoint.index[1]) < min_interval: continue regression = linregress( x = lowpoint['Time_ID'], y = lowpoint['Low'], ) print(regression[0] > 0.0, 'reg_low: ', regression[0], ', ', regression[1], ) # 上昇してるときだけ if regression[0] > 0.0: trendlines.append(regression[0] * df['Time_ID'][i:i+span*2] + regression[1]) slope.append(regression[0] * df['Time_ID'][i:i+span*2]) time.append(df['Time'][i:i+span*2]) return trendlines, slope, time

イメージ説明
along_time_dfの中身はこんな感じ

#トレンドラインを計算する関数を実行。 #トレンドラインは同じ時間に複数重なっていることがあるのでdf['Close']に一番近い値を採用する #along_time_dfをどうにかしてリストにできれば解決できそう。そのほかの方法はわからない zaa, slope, along_time = g_trendlines() df_intercept = pd.DataFrame(zaa) df_slope = pd.DataFrame(slope) along_time_df = pd.DataFrame(along_time) df_intercept = df_intercept.transpose() df_slope = df_slope.transpose() along_time_df = along_time_df.transpose() df_intercept = df_intercept.astype('float') df_slope = df_slope.astype('float') def getNearestValue(minimum, slope_dic): """ 概要: 辞書から0に最も近い値を返却する関数 @return 0に最も近い値とそれに伴う傾き """ calc_near_zero = min(minimum.items(), key=lambda x: x[1]) # 0に近い値を求める, the variable is tuple key = calc_near_zero[0] #タプルの一つ目の要素を取得 , calc_near_zero = (key, value) best_slope = slope_dic[key] # have just a value and トレンドラインの値と同じ列にある傾きを取得している best_time = time_dic[key] min_diff = calc_near_zero[1] # have just a value and calc_near_zero is tuple return min_diff, best_slope, best_time #トレードの判断をするときにトレンドラインが複数あると面倒なので一番近いトレンドラインと傾き(上昇or下降)を求めてdfに結合する #データフレームのvalueだけをリスト形式で取り出さないとfor文で回せないので変換する listdfi = df_intercept.values.tolist() listdfs = df_slope.values.tolist() listatd = along_time_df.values.tolist() #.values.tolist()これをやると全部NaNになってしまう list_df_close = df['Close'][360:].values.tolist() Near_trendline = [] slope_withTL = [] time_withtl = [] for i, dfi, dfs, atd in zip(list_df_close, listdfi, listdfs, along_time_df): minimum = {} slope_dic = {} time_dic = {} for c in range(35): if dfi[c]: diff = i - dfi[c] # 誤差を求める slope = dfs[c] #slopeの値 tim = atd[c] minimum[c] = abs(diff) slope_dic[c] = slope time_dic[c] = tim best_TL, best_slope, best_time = getNearestValue(minimum, slope_dic) Near_trendline.append(best_TL) #一番誤差が少ないdf_interceptの列を採用する slope_withTL.append(best_slope) time_withtl.append(best_time) #slopeは上昇トレンドか下降トレンドかだけを知りたいので1,-1に変換する slope_withTL = (1 if i >0 else -1 for i in slope_withTL) #Near_trendlineとslope_withTLをデータフレームに変換する df2 = pd.DataFrame({'Trend Line': Near_trendline, 'Up or Down': slope_withTL, 'Time': time_withtl }) df3 = pd.merge(df, df2, on='Time', how='left')

わかりにくくてすみません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/09/24 14:38 編集

検証可能なサンプルコードを提示してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問