4月からPythonを習い初めて、STA24スキー滑走計測データのデータ処理をPython でやってきて、ようやく一段落したので、この3か月で使ってきたコマンドをメモしておきます。
DF関係1:膨大なスキー滑走データをターン1個ずつの連番付きのcsvファイルに分割して保存してある
DF関係2:分割したファイル群をひとまとめに同じ処理ができるように連番順に読み込んで処理できる
この記事途中で途切れてますが、思いついたときに追記していきます。
●pandas DF関係
分類とimport | 命令 | |
CSVファイル関連
import pandas as pd
|
df = pd.read_csv(filename, low_memory=True)
|
csvファイルをdfに読み込む |
df.to_csv(r’C:/RTK_Log/_’ + basename)
|
dfをcsvファイルに書き込む | |
ファイル名指定 ファイル名抽出 連番ファイル抽出連番ファイルソート import tkinter
import tkinter.filedialog as FileDialog
import os
from os.path import dirname, basename
from os.path import join
|
iDir = r’C:/RTK_Log/’
fTyp = [(*.csv;*.xlsx;*.xls”), (“すべてのファイル”, “*.*”)]
filename = FileDialog.askopenfilename(parent=root, initialdir=iDir, filetypes=fTyp)
|
idirで場所指定 fTypで種類指定 FileDialogが開いて filenameが戻る |
指定したファイル名からパス名抽出
pathn = dirname(filename)
指定したファイル名からファイル名のみ抽出 basename = os.path.basename(filename)
|
||
①ファイル名から日付を抽出 ”_Month-Day-Hour-minute”
datestr=re.findall(r’_\d+-\d+-\d+-\d+’, fname) ②ファイル名から連番を抽出 “_No_”
serstr=re.findall(r’_\d+_’, fname)
③抽出した連番のファイル名を前後2分割
names=fname.split(serstr[0])
|
正規表現を使ってファイル名から欲しい内容を抽出するとファイルの自動操作が自在にできます | |
④ディレクトリ内の連番がついた同じシリーズファイル名抽出 #パス名取得pathn pathn = dirname(fn)
#Dir内のファイルリスト抽出 files
files = os.listdir(pathn)
#連番”_No_”がついた連番を抽出
serstr=re.findall(r’_\d+_’, fname)
#fnameをserstr[0]で分割して連番の前後names[0] とnames[1]抽出
names=fname.split(serstr[0])
#連番付きのファイル名を抽出
datelist = [s for s in files if names[0] in s and names[1] in s]
|
||
#連番ファイルのソートでファイル順をそろえたファイルリスト作成
result=[]
for i in range(0,len(datelist)):
No_str=re.findall(r’_\d+_’, datelist[i])
print(i,”:No_str=”,No_str)
#No_val.append(re.findall(r’\d+’, No_str[0]))
if len(No_str)>0:
valint=int( re.sub(r”\D”, “”, No_str[0]))
result.append( valint)
#print(“result=”,result)
#print(i,”:No_val=”,No_val)
print(“result=”,result)
result_sorted=sorted(result)
|
||
キー入力 ENTERで進む |
v= input(” keyin =>ENTER”)
if v==’r’:
|
キー入力で文字をいれて、ENTERを押すとvに代入される。 1文字だけでENTER無しは、バグになりやすいから使わない |
カラム内行計算 | ①現在行と1つ上の行で掛け算
df[“colmult”]=df[‘col’] * df[‘col’].shift(1)
②現在行と一つ上の行で引き算してcoldiff列に代入 df[“coldiff”]=df[“col”].diff()
③現在行と1つ上の行で移動平均10個 df[“colave10”]=df[“col”].rolling(10).mean()
|
上下で掛け算して、正負判別すると極値が判る。 上下で引き算して差分を得る上下複数行で移動平均を得る |
カラム間計算 | ①カラム同士で、引き算掛け算
df[“colResult”]=df[“col_1”]+df[“col_2”]*0.25
df[“rolldiff”]=df[“roll”].diff()*10
|
|
1行で計算判別 |
①360度以上なら360度引く、以外はそのまま
df[“colResult”] = np.where(df[“col”] > 360, df[“col”] – 360, df[“col”])
②数値以外のデータを含む行を抽出 nonNum= df.apply(lambda x: not pd.to_numeric(x,errors=’coerce’).notnull().all(), axis=1)
③簡単な計算
df[‘Vector’] = df.apply(lambda row:math.sqrt(row[‘ax’]**2+row[‘ay’]**2), axis=1)
|
|
ListからDF作成 |
①listで個々のデータを収集してからdf作成
while i <len(No)
list=[i,・,・,・]
list_All.append(list)
i+=1
df=pd.DataFrame(list_All)
|
|
DFからList作成 | ①列のLIST :全行
list=[] listcol=df.loc[:,”col”]#列名を使っているのでlocを使う ②行のList :全列 listrow=[] listrow=df.iloc[rowNo,:]#列名を使っていないので、ilocを使う |
loc,ilocに注意 |
●matplot 関係
分類とimport | ||
相関付 ペアプロット import seaborn as sns
|
pairplot(df_pplot,supname)#相関付きペアプロット
def pairplot(df,basenam):
g = sns.PairGrid(df, height=1.6, dropna=False)
g.map_diag(draw_hist)
g.map_upper(sns.regplot, scatter_kws={“s”: 8}, line_kws={“color”: “r”})
g.map_lower(corr_func)
g.figure.suptitle(“2D_”+basenam,y=0.995,size=12, weight=2, color=”red”)
g.savefig(‘C:/RTK_Log/hokan/ITPreg’+basenam+’.png’)
|
QIITAに掲載されていたものです、作者の感謝 https://tinyurl.com/2pqfvnam |