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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

803閲覧

複数のファイルに対して同じ処理をして処理したファイルを使って新しいデータフレームを作りたい

yuudai

総合スコア65

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/03/28 10:07

編集2020/03/28 10:12

前提・実現したいこと

複数のcsvファイルに対して同じ処理をしたいのです。今はファイルの数が少ないから同じ処理を何回も書けば良いですが、ファイルの数が増えてくるとそういうわけにもいかないので。

globを使うことで少ないコードでファイルを処理することができると教えていただいたのですが、元々5つのファイルを手直しした後にそのファイルをfor文の中で並行的に処理をしようとしていたのでglobだとそれができなくて困っています。
globを使いつつ#make dataの処理を可能にする方法があるかもしれませんが私にはわかりません。
最終的には5つのファイルのデータを使って新しいデータフレームを作りたいです。その過程で同じ文章を何回も書くのは効率が悪いと思い質問しています。
importから#drop index0までの処理をfor文か何かで回して処理できそうだと考えていますがわかりません。根本的な考え方が間違っているかもしれません。
回答お待ちしております。
追記
自分のコードを見返してみると結局#make dataの部分で何度の同じ文章を書いているのでココの部分を改善しないと意味が無いと思いました。

該当のソースコード

#データを読み込む import pandas as pd nikkei_1 = pd.read_csv('C:/Users/Carnegie93/Documents/nikkeifuturesdata/NSM_200316.csv', encoding="shift-jis") nikkei_2 = pd.read_csv('C:/Users/Carnegie93/Documents/nikkeifuturesdata/NSM_200317.csv', encoding="shift-jis") nikkei_3 = pd.read_csv('C:/Users/Carnegie93/Documents/nikkeifuturesdata/NSM_200318.csv', encoding="shift-jis") nikkei_4 = pd.read_csv('C:/Users/Carnegie93/Documents/nikkeifuturesdata/NSM_200319.csv', encoding="shift-jis") nikkei_5 = pd.read_csv('C:/Users/Carnegie93/Documents/nikkeifuturesdata/NSM_200323.csv', encoding="shift-jis") #抽出 d_nikkei_1 = nikkei_1.iloc[0:23, 50:56] d_nikkei_2 = nikkei_2.iloc[0:23, 50:56] d_nikkei_3 = nikkei_3.iloc[0:23, 50:56] d_nikkei_4 = nikkei_4.iloc[0:23, 50:56] d_nikkei_5 = nikkei_5.iloc[0:23, 50:56] #rename rename_nikkei_1 = d_nikkei_1.rename(columns={'〔60分足〕': '1hour', 'Unnamed: 51': 'open','Unnamed: 52':'high','Unnamed: 53':'low','Unnamed: 54':'close','Unnamed: 55':'dekidaka'}) rename_nikkei_2 = d_nikkei_2.rename(columns={'〔60分足〕': '1hour', 'Unnamed: 51': 'open','Unnamed: 52':'high','Unnamed: 53':'low','Unnamed: 54':'close','Unnamed: 55':'dekidaka'}) rename_nikkei_3 = d_nikkei_3.rename(columns={'〔60分足〕': '1hour', 'Unnamed: 51': 'open','Unnamed: 52':'high','Unnamed: 53':'low','Unnamed: 54':'close','Unnamed: 55':'dekidaka'}) rename_nikkei_4 = d_nikkei_4.rename(columns={'〔60分足〕': '1hour', 'Unnamed: 51': 'open','Unnamed: 52':'high','Unnamed: 53':'low','Unnamed: 54':'close','Unnamed: 55':'dekidaka'}) rename_nikkei_5 = d_nikkei_5.rename(columns={'〔60分足〕': '1hour', 'Unnamed: 51': 'open','Unnamed: 52':'high','Unnamed: 53':'low','Unnamed: 54':'close','Unnamed: 55':'dekidaka'}) #drop index0 Nikkei_1 = rename_nikkei_1.drop(0) Nikkei_2 = rename_nikkei_2.drop(0) Nikkei_3 = rename_nikkei_3.drop(0) Nikkei_4 = rename_nikkei_4.drop(0) Nikkei_5 = rename_nikkei_5.drop(0) #最終結果用のデータフレームを作っておく nikkei_data = pd.DataFrame(index=[], columns=['time','rise_probability','movement_mean']) from statistics import mean #make data for i in range(1,22): rise = 0 #iには数字が入っていて、その数字を行番号としてNikkei_1~5を行と列指定してcandle=close-openして5個の平均値の列を作る for i in range(1,22): rise = 0 Nikkei_1_candle = int(Nikkei_1.iat[i,4]) - int(Nikkei_1.iat[i,1]) if Nikkei_1_candle > 0: rise += 1 Nikkei_2_candle = int(Nikkei_2.iat[i,4]) - int(Nikkei_2.iat[i,1]) if Nikkei_2_candle > 0: rise += 1 Nikkei_3_candle = int(Nikkei_3.iat[i,4]) - int(Nikkei_3.iat[i,1]) if Nikkei_3_candle > 0: rise += 1 Nikkei_4_candle = int(Nikkei_4.iat[i,4]) - int(Nikkei_4.iat[i,1]) if Nikkei_4_candle > 0: rise += 1 Nikkei_5_candle = int(Nikkei_5.iat[i,4]) - int(Nikkei_5.iat[i,1]) if Nikkei_5_candle > 0: rise += 1 rise_probability = rise / 5 heikin = [Nikkei_1_candle,Nikkei_2_candle,Nikkei_3_candle,Nikkei_4_candle,Nikkei_5_candle] nikkei_candle_mean = mean(heikin) time = Nikkei_1.iat[i,0] series = pd.Series([time, rise_probability, nikkei_candle_mean], index=nikkei_data.columns) nikkei_data = nikkei_data.append(series, ignore_index = True)

試したこと

前半の処理はこのようにすると良いと言われましたが、これだと後半の新しいデータフレームを作る処理へのつなげ方がわかりません。

for filepath in glob("C:/Users/Carnegie93/Documents/nikkeifuturesdata/*.csv"): # 各ファイルに対して同じ処理を行う nikkei = pd.read_csv(filepath, encoding="shift-jis") d_nikkei = nikkei.iloc[0:23, 50:56] rename_nikkei = d_nikkei.rename(columns={'〔60分足〕': '1hour', 'Unnamed: 51': 'open','Unnamed: 52':'high','Unnamed: 53':'low','Unnamed: 54':'close','Unnamed: 55':'dekidaka'})

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/03/28 10:41

インデントミスでエラーがでます。
yuudai

2020/03/28 11:48

ヒントありがとうございます。1日考えてみます。
guest

回答1

0

自己解決

無事解決しました。megさんありがとうございました。

python

1#何日から何日までのデータ 2#データを読み込む 3import pandas as pd 4from glob import glob 5 6data_list = [] 7 8for filepath in glob("C:/Users/Carnegie93/Documents/nikkeifuturesdata/*.csv"): 9 # 各ファイルに対して同じ処理を行う 10 nikkei = pd.read_csv(filepath, encoding="shift-jis") 11 d_nikkei = nikkei.iloc[0:23, 50:56] 12 rename_nikkei = d_nikkei.rename(columns={'〔60分足〕': '1hour', 'Unnamed: 51': 'open','Unnamed: 52':'high','Unnamed: 53':'low','Unnamed: 54':'close','Unnamed: 55':'dekidaka'}) 13 data_list.append(rename_nikkei) 14 15len(data_list) 16 17#最終結果用のデータフレームを作っておく 18nikkei_data = pd.DataFrame(index=[], columns=['time','rise_probability','movement_mean']) 19list_for_heikin = [] 20from statistics import mean 21 22#make data 23for i in range(1,23): 24 rise = 0 25 for d in data_list: 26 Nikkei_candle = int(d.iat[i,4]) - int(d.iat[i,1]) 27 list_for_heikin.append(Nikkei_candle) 28 if Nikkei_candle > 0: 29 rise += 1 30 31 rise_probability = rise / len(data_list) 32 nikkei_candle_mean = mean(list_for_heikin) 33 time = d.iat[i,0] 34 35 series = pd.Series([time, rise_probability, nikkei_candle_mean], index=nikkei_data.columns) 36 nikkei_data = nikkei_data.append(series, ignore_index = True) 37 38nikkei_data 39 40nikkei_data.to_csv("nikkei data from 9 to 26.csv", index=False)

投稿2020/03/28 15:47

yuudai

総合スコア65

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問