質問: float(row[4]) if (colE >= 0) and (row[5] in Direction): sum += pow(colE,2) print(sum) f.close() ``` ---
回答: 風速(ベクトル)の基準方位成分値を積算する、と解釈すると、以下の範囲が積算対象になります。 ``` (基準方位-(1/2)π, 基準方位+(1/2)π) ``` 基準方位が「西」であれば「南南西」から「北北西」になります(それら以外の方位の場合、「西」方位成分の値は 0 以下になる)。 以下は pandas のデータフレームを利用して、各基準方位での積算値を計算しています。 ``` import pandas as pd from math import cos, pi Direction_16 = [ '北', '北北東', '北東', '東北東', '東', '東南東', '南東', '南南東', '南', '南南西', '南西', '西南西', '西', '西北西', '北西', '北北西' ] l = len(Direction_16) Cosine = [0.0 if i%8==4 else cos(i*2*pi/l) for i in range(l)] def load_csv(f): df = pd.read_csv( f, skipinitialspace=True, skiprows=4, names=['year', 'month', 'day', 'hour', 'velocity', 'direction'], converters={'direction': str.strip} ) return df.assign( sq_velocity = df.velocity**2, dir_idx = pd.Series(pd.Categorical( df.direction, categories=Direction_16)).cat.codes, ) def calc(df, src): ## Get region: (src-(1/2)π, src+(1/2)π) sidx = Direction_16.index(src) beg = ((sidx - 4) + l) % l end = (sidx + 4) % l op = 'and' if beg < end else 'or' return df.query(f'{beg} < dir_idx {op} dir_idx < {end}')\ .apply( lambda r: pd.Series(( r.sq_velocity, r.sq_velocity*Cosine[abs(r.dir_idx-sidx)])), axis=1)\ .sum() if __name__=='__main__': df = load_csv('test.csv') print(f'基準方位 二乗和 二乗射影和') for d in Direction_16: sq, proj = calc(df, d) pad = ' '*(4-len(d)) print(f'{pad+d+pad} {sq:7.2f} {proj:9.2f}') => 基準方位 二乗和 二乗射影和 北 480.61 313.21 北北東 420.28 267.43 北東 342.15 247.03 東北東 356.25 255.68 東 408.72 292.02 東南東 445.88 313.32 南東 353.72 293.03 南南東 382.88 280.69 南 285.73 231.44 南南西 478.79 263.83 南西 555.44 322.14 西南西 541.41 398.06 西 586.19 480.00 西北西 609.88 518.28 北西 580.72 483.78 北北西 673.67 428.17 ```