外部ファイルの読み込み、改行の削除、配列への代入、2列の配列、日付の取得、書き出しを簡単にまとめ(テンプレート)
ここの詳細は、各々Googleで検索して頂ければ、分かりやすいページが無数に出てくるかと思います。ここでは、私が実際に作って動作が確認できているソースコードを掲載しておきます。色々調べても行き詰まっている人がいたら、何か少しでも参考になれば嬉しいと思います。
キーワードとしては、
・readlines()でtxtファイルを1行ずつ読み込んで、lines配列に保存。
lines = file_data.readlines()・開いたファイルは必ずすぐに閉めましょう。ファイルを開いてから閉じるまでの間にエラーが発生した場合、ファイルがずっと開いたままで、ファイル削除ができなくなります。
file_data.close()
・1行目(lines[0])の情報を変数aに保存しておいて、好きな時に使えるようにしておく方法と、1行目の情報を改行( " \ n " )に置き換える方法。
a = lines[0].rstrip('\n') lines[0] = "\n"
・三項演算子
・改行行以外の行をlines4配列に格納することで、改行(空白行)を削除する。#改行行の削除 lines4 = [a for a in lines3 if a != '\n']・csvファイルにするために、特定文字(タブ)をカンマ(,)に変換、及びタブ区切りコマンドs.split()(カンマ区切りの場合のみ、s.split()の()内はカラで良い)。
#"タブ"を含む要素の"タブ"文字を",”に置換する #lines4 = [s.replace("\t",",") for s in lines3] #タブ区切りを配列に変換 lines5 = [s.split() for s in lines4]・pandasのDataFrame
・DatetimeIndex
・数値が"object"型になっているので、float型に変換
・月毎の集計、年毎の集計(合計はsum、平均化はmean)pd.DataFrame(df_ym["調整後終値"].mean(level=["year","month"]))
・DataFrame(df_ym2配列)を加工するため、DataFrameのIndexをリセット(リセットすることで、インデックスを担っていた列も多次元配列に帰ってくる)df_ym2.reset_index(inplace = True)
・配列をDataFrameとしていれば、csvファイルへの出力がすごく簡単。(for文やfileopenが不必要)
df_ym3.to_csv(a+".csv", sep=",")
ファイルの読み書きのソースコード
以下ソースコードです。少しでも参考になれば幸いです。import pandas as pd import numpy as np #ファイルを開く, r:読み取りモード file_data = open("data/7203.txt", "r") zika = 10 #全ラインを行列に保存 lines = file_data.readlines() #ファイルを閉じる file_data.close() #銘柄名削除 a = lines[0].rstrip('\n') lines[0] = "\n" #"日付"を含む要素を丸ごと改行に置換。三項演算子という lines2 = ["\n" if "日付" in s else s for s in lines] #"分割"を含む要素を丸ごと改行に置換。三項演算子という lines3 = ["\n" if "分割" in s else s for s in lines2] #改行行の削除 lines4 = [a for a in lines3 if a != '\n'] #"タブ"を含む要素の"タブ"文字を",”に置換する #lines4 = [s.replace("\t",",") for s in lines3] #タブ区切りを配列に変換 lines5 = [s.split() for s in lines4] #リストをpandasのDataFrameに変換 df = pd.DataFrame(lines5,columns=["日付","始値","高値","安値","終値","出来高","調整後終値"]) #DataFrameの"日付"列をdatetime64[ns]型に変換し、DatetimeIndexとして指定する df["日付"] = pd.to_datetime(df["日付"]) df.set_index("日付", inplace=True) #タブ区切りの際に数値が"object"型になっているので、float型に変換する df["調整後終値"]=df["調整後終値"].astype(float) print(df["調整後終値"].dtype) #一応型が数値型に直っているか確認 #YearとMonthのインデックスを作成 df_ym = df.set_index([df.index.year, df.index.month, df.index]) df_ym.index.names = ['year','month', 'date'] df_ym.sort_index(inplace=True) #日付順に整列(昇順) #月毎の平均値を算出 df_ym2 = pd.DataFrame(df_ym["調整後終値"].mean(level=["year","month"])) print(df_ym2) #結合 df_ym2.reset_index(inplace = True) arr = np.empty((0,2), int) arr=np.append(arr, np.array([["",""]]), axis=0) for i in range(0,len(df_ym2)): s = str(df_ym2["year"][i])+"-"+str(df_ym2["month"][i]) arr=np.append(arr, np.array([[s,df_ym2["調整後終値"][i]*zika]]), axis=0) #csv出力 df_ym3 =pd.DataFrame(arr,columns=["",a]) df_ym3.set_index("", inplace=True) df_ym3.to_csv(a+".csv", sep=",")
みんながみんな、ローカルフォルダに眠っているファイルをネットで共有したら、ほんの少し良い世界に
個々の解説記事を読んでも、コーディングがうまくいかない時、ずーーーっとネット検索を繰り返しながら、よく悩んでいます。熟練者から見たら「その悩む経験が、自分の力になる」と言いますが、それでも、ネット検索で自分と近しいことをやっている人がいて、参考となる答えが掲載されてると助かります。私もそんな1人になれたらと思います。
コメント