前提・実現したいこと
以下のような繰り返し計算を行うプログラムを作成しました。基本的には、daysに31を入力し、31回繰り返し計算したNG_Totalをdaysで割ったNG_Total_Averageを出力していくという流れになっています。ここで実現したいのは、while j1<=j1Last:が最初の181回の繰り返しを終えて、初めてi1とj2に1が加えられるとき、answer.csvに出力する列を1列ずらすことです。つまり、181回ごとに改行(列)して同じcsvに出力したいということです。
該当のソースコード
python
1import pandas as pd 2 3days=int(input('何日分のNGの平均を求めますか:')) 4 5i1=0 6i2=0 7j1=0 8j2=0 9i1Last=121 10j1Last=181 11i2Last=181 12j2Last=121 13 14while i1<=i1Last: 15 while j1<=j1Last: 16 NG_Total=0 17 for i in range(1,days+1,1): 18 df_read_North=pd.read_csv("TokyoWanko_GateCrossingList_201803%02dNS_Sheet1.csv"%i,encoding="shift-jis") 19 df_read_South=pd.read_csv("TokyoWanko_GateCrossingList_201803%02dNS_Sheet1.csv"%i,encoding="shift-jis") 20 df_read_West=pd.read_csv("TokyoWanko_GateCrossingList_201803%02dWE_Sheet1.csv"%i,encoding="shift-jis") 21 df_read_East=pd.read_csv("TokyoWanko_GateCrossingList_201803%02dWE_Sheet1.csv"%i,encoding="shift-jis") 22 #csv読み取り 23 24 df_data_North=df_read_North[(df_read_North["i"]==i1) & (df_read_North["j"]==j1) & (df_read_North["SogKnot"]!=0)] 25 df_data_South=df_read_South[(df_read_South["i"]==i1+1) & (df_read_South["j"]==j1) & (df_read_South["SogKnot"]!=0)] 26 df_data_West=df_read_West[(df_read_West["i"]==i2) & (df_read_West["j"]==j2) & (df_read_West["SogKnot"]!=0)] 27 df_data_East=df_read_East[(df_read_East["i"]==i2+1) & (df_read_East["j"]==j2) & (df_read_East["SogKnot"]!=0)] 28 #データを抽出 29 30 df_data_NS=pd.merge(df_data_North,df_data_South,how="outer") 31 df_data_WE=pd.merge(df_data_West,df_data_East,how="outer") 32 df_data_merge=pd.merge(df_data_NS,df_data_WE,how="outer") 33 #データの結合 34 35 df_data_count=df_data_merge.groupby('Group').count() 36 #グループごとに何隻いるかカウント 37 38 df_N=df_data_count.iloc[:,1] 39 #1列だけ抽出 40 41 T=86400*days 42 df_Q=df_N/(2*T) 43 #Qの計算 44 45 df_Q=pd.DataFrame(data=df_Q) 46 df_Q=df_Q.rename(columns={'Sec':'Q'}) 47 #列名変更 48 49 import numpy as np 50 pi=np.pi 51 52 df_theta=df_data_merge.groupby('Group').mean()['θ'] 53 df_theta_rad=df_theta*(pi/180) 54 #列'θ'だけ抽出したデータフレームを作成し、ラシアンに変換 55 56 df_cos_theta=np.cos(df_theta_rad) 57 df_sin_theta=np.sin(df_theta_rad) 58 #f(z)の計算式中のsin(90-θ)とsinθを計算したデータフレームを作成 59 60 df_ocean_data=pd.read_csv("data.csv",encoding="shift-jis") 61 #海域のデータのcsv読み取り 62 63 df_Tokyowan=df_ocean_data['東京湾'] 64 df_Osakawan=df_ocean_data['大阪湾'] 65 df_Bingoseto=df_ocean_data['備讃瀬戸'] 66 df_Kanmonkaikyo=df_ocean_data['関門海峡'] 67 df_Kawashima=df_ocean_data['河島さん'] 68 #海域ごとにデータを分割 69 70 df_fz=1/np.abs((df_cos_theta*(df_Kawashima.iloc[7,]))+(df_sin_theta*(df_Kawashima.iloc[6,]))) 71 #f(z)の計算 72 73 df_fz=pd.DataFrame(data=df_fz) 74 df_fz=df_fz.rename(columns={'θ':'f(z)'}) 75 #列名変更 76 77 df_L_all=df_data_merge.loc[:,['ShipLength','Group']] 78 df_B_all=df_data_merge.loc[:,['ShipWidth','Group']] 79 df_V_knot_all=df_data_merge.loc[:,['SogKnot','Group']] 80 #全てのデータからL,B,Vの列をそれぞれグループ番号と共に抽出、Vはknotからm/sに直す 81 82 df_L=df_L_all.groupby('Group').mean() 83 df_B=df_B_all.groupby('Group').mean() 84 df_V_knot=df_V_knot_all.groupby('Group').mean() 85 df_V=df_V_knot*(1852/3600) 86 #平均L,B,V(Vはknotからm/sに直す 87 88 list_theta=np.meshgrid(df_theta,df_theta) 89 #1次元配列であるθの行データと列データを変数list_thetaに格納 90 91 NN=len(df_theta) 92 theta_ij=np.abs(list_theta[0]-list_theta[1]) 93 df_theta_ij=pd.DataFrame(theta_ij) 94 95 for a in range(NN): 96 for b in range(NN): 97 if df_theta_ij.iloc[a,b]>180: 98 df_theta_ij.iloc[a,b]=360-df_theta_ij.iloc[a,b] 99 #θijの計算 100 101 theta_ij_rad=theta_ij*(pi/180) 102 103 df_thetaij=pd.DataFrame(theta_ij_rad) 104 #結果はndarray型なのでエクセルに出力するためにデータフレームに変換 105 106 list_V=np.meshgrid(df_V,df_V) 107 #1次元配列であるVの行データと列データを変数list_Vに格納 108 109 Vij=np.sqrt(list_V[0]**2+list_V[1]**2-2*list_V[0]*list_V[1]*np.cos(theta_ij_rad)) 110 #Vijの計算 111 112 df_Vij=pd.DataFrame(Vij) 113 #結果はndarray型なのでエクセルに出力するためにデータフレームに変換 114 115 list_L=np.meshgrid(df_L,df_L) 116 list_B=np.meshgrid(df_B,df_B) 117 #1次元配列であるLとBの行データと列データを変数list_L,list_Bに格納 118 119 Dij=(((list_L[0]*list_V[1]+list_L[1]*list_V[0])/Vij)*np.sin(theta_ij_rad))+list_B[1]*np.sqrt(1-(np.sin(theta_ij_rad)*list_V[0]/Vij)**2)+list_B[0]*np.sqrt(1-(np.sin(theta_ij_rad)*list_V[1]/Vij)**2) 120 #Dijの計算 121 122 df_Dij=pd.DataFrame(Dij) 123 #結果はndarray型なのでエクセルに出力するためにデータフレームに変換 124 125 list_Q=np.meshgrid(df_Q,df_Q) 126 list_fz=np.meshgrid(df_fz,df_fz) 127 #1次元配列であるQとf(z)の行データと列データを変数list_Q,list_fzに格納 128 129 delta_t=86400*days 130 #対象期間(s) 131 132 NG=(list_Q[0]*list_Q[1]/(list_V[0]*list_V[1]))*list_fz[0]*list_fz[1]*Vij*Dij*df_Kawashima.iloc[10,]*delta_t 133 #NGの計算 134 135 List_Group_index=df_data_merge.groupby('Group2').mean()['Group'] 136 List_Group_columns=List_Group_index.T 137 #行名と列名の変更 138 139 df_NG=pd.DataFrame(NG,index=List_Group_index,columns=List_Group_columns) 140 #結果はndarray型なのでエクセルに出力するためにデータフレームに変換 141 142 df_NG_ColumnsTotal=df_NG.sum(skipna=True) 143 NG_Total=NG_Total+df_NG_ColumnsTotal.sum()/2 144 #1メッシュ分のNGの値 145 146 NG_Total_Average=NG_Total/days 147 148 with open('answer.csv','a',newline='',encoding='shift-jis') as file: 149 print(NG_Total_Average,file=file) 150 151 j1+=1 152 i2+=1 153 154 i1+=1 155 j2+=1 156 ji=0 157 i2=0
試したこと
writerowなど試しましたが、NG_Total_Averageがfloat型?のため、できませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/12 13:52
2019/12/12 13:53