0
単一の渡された値の代わりにpandasデータフレームを使用する複雑な関数を適用する際に問題があります。複数の列を使用したpandas apply()関数の問題
私が書かれており、以下の機能をテストしてみた:私は今までこの機能を適用しようとしています
tws, twd = calcTrueWind(247.3, 10.5 , 110.3, 21.6, 244.2)
print "trueWindSpeed: " + str(tws)
print "trueWindDirection: " + str(twd)
:私は次のようにサンプル値を渡すことによって、機能をテストしている
def calcTrueWind(cog, sog, appWindDir, appWindSpd, heading):
dtor = np.math.pi/180 # Degrees to radians conversion
# Convert appWindSpd from m/s to K
#appWindSpd = appWindSpd*1.94384
# Convert navigation coordinates to math angles
mathCourse = 90 - float(cog)
# Keep value between 0 and 360
if mathCourse <=0.0:
mathCourse = mathCourse +360
# Calculate apparant wind direction
appWindDir = float(heading) + float(appWindDir)
# Keep value between 0 and 360
if appWindDir >= 360:
appWindDir = appWindDir-360
# Convert metereological coordinates to math angles
mathDirection = 270 - appWindDir
# Ensure values are between 0 and 360
if mathDirection <= 0:
mathDirection = mathDirection + 360
elif mathDirection > 360:
mathDirection = mathDirection - 360
# Compute East-West vector
x = (float(appWindSpd) * np.math.cos(mathDirection * dtor)) + (float(sog) * np.math.cos(mathCourse * dtor))
# Compute North-South vector
y = (float(appWindSpd) * np.math.sin(mathDirection * dtor)) + (float(sog) * np.math.sin(mathCourse * dtor))
# Use the two vector components to calculate the true wind speed
trueWindSpeed = np.math.sqrt((x*x)+(y*y))
calm_flag = 1.0
# Determine true wind angle
if (abs(y) > 0.00001):
mathDirection = (np.math.atan2(y,x))/dtor
else:
if abs(y) > 0.00001:
mathDirection = 180 - (90*y)/abs(y)
else:
mathDirection = 270.0
calm_flag = 0.0
trueWindDirection = 270 - mathDirection
# 0 - 360 boundary check
if trueWindDirection < 0.0:
trueWindDirection = (trueWindDirection + 360)*calm_flag
if trueWindDirection > 360:
trueWindDirection = (trueWindDirection - 360)*calm_flag
# Round before returning values
trueWindSpeed = round(trueWindSpeed,1)
trueWindDirection = round(trueWindDirection,1)
return[trueWindSpeed, trueWindDirection]
をpandasデータフレーム。
データフレームのサンプルを以下に表示されます
date_time_stamp | fld_courseOverGround | fld_speedOverGround | fld_appWindDirection | fld_appWindSpeed | fld_heading | fld_trueWindSpeed | fld_trueWindDirection
-----------------------+----------------------+---------------------+----------------------+-------------------+-------------+-------------------+----------------------
0 |2017-04-05 07:35:09 | 308.05 | 0.00 | 358 | 1.9 |315.5 | |
1 |2017-04-05 07:35:12 | 333.06 | 0.00 | 359 | 1.9 |315.4 | |
2 |2017-04-05 07:35:17 | 254.68 | 0.01 | 000 | 1.8 |315.4 | |
最初の5列は、関数に渡されるべきであり、データフレームの最後の2列は、関数を適用使用して計算されるべきです。
これは私が試したものです:
次のエラーになりdf_truewindtmp['fld_trueWindSpeed'], df_truewindtmp['fld_trueWindSpeed'] = df_truewindtmp.apply(
lambda row: calcTrueWind(row['fld_courseOverGround'],
row['fld_speedOverGround'],
row['fld_appWindDirection'],
row['fld_appWindSpeed'],
row['fld_heading']
), axis=1)
: とValueErrorを:渡された値の形状がある(10、2)、インデックスは(10、8)を意味するものではあり
いずれのポインタも大歓迎です。