In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
In [2]:
meetbrief = pd.read_excel('encounter_polar_2018.xlsx',sheet_name='Calculations')
In [3]:
meetbrief
Out[3]:
WindVelocity 6 8 10 12 14 16 20
0 BeatAngles 42.7 41.700000 42.100000 40.800000 39.800000 39.500000 38.200000
1 BeatVMG 4.03 4.770000 5.240000 5.530000 5.700000 5.800000 5.950000
2 BeatSpeed 5.48363 6.388637 7.062225 7.305200 7.419136 7.516609 7.571353
3 aws 10.6972 13.458628 15.958541 18.168267 20.264343 22.318141 26.369023
4 awa 22.357 23.292319 24.841231 25.567825 26.246363 27.129812 27.972100
5 52 6.12 7.200000 7.690000 8.000000 8.120000 8.190000 8.260000
6 60 6.45 7.530000 7.990000 8.220000 8.330000 8.400000 8.480000
7 75 6.73 7.740000 8.210000 8.420000 8.590000 8.710000 8.840000
8 90 6.68 7.740000 8.270000 8.510000 8.740000 8.950000 9.260000
9 110 6.34 7.660000 8.290000 8.630000 8.820000 9.000000 9.330000
10 120 6.21 7.520000 8.200000 8.620000 8.980000 9.270000 9.650000
11 135 5.67 6.900000 7.830000 8.360000 8.740000 9.130000 9.940000
12 150 4.83 5.940000 6.920000 7.840000 8.330000 8.680000 9.440000
13 aws 3.63786 4.173716 5.377921 6.063641 6.846327 7.940000 11.200000
14 awa 83.0195 102.654534 106.163684 122.582064 146.166339 180.000000 180.000000
15 RunSpeed 5.23393 5.971592 7.065552 7.592611 7.784099 8.060000 8.800000
16 RunVMG 4.18 5.140000 6.050000 6.870000 7.490000 8.060000 8.800000
17 GybeAngles 143 149.400000 148.900000 154.800000 164.200000 180.000000 180.000000
18 NaN NaN NaN NaN NaN NaN NaN NaN
19 year ORC 2018 NaN NaN NaN NaN NaN NaN
In [4]:
df = pd.read_excel('encounter_polar_2018.xlsx',sheet_name='pandas_polar')
In [5]:
df
Out[5]:
TWA TWS 6 kn 8 kn 10 kn 12 kn 14 kn 16 kn 20 kn
0 38.2 NaN NaN NaN NaN NaN NaN NaN 7.571353
1 39.5 NaN NaN NaN NaN NaN NaN 7.516609 NaN
2 39.8 NaN NaN NaN NaN NaN 7.419136 NaN NaN
3 40.8 NaN NaN NaN NaN 7.305200 NaN NaN NaN
4 42.1 NaN NaN NaN 7.062225 NaN NaN NaN NaN
5 41.7 NaN NaN 6.388637 NaN NaN NaN NaN NaN
6 42.7 NaN 5.483630 NaN NaN NaN NaN NaN NaN
7 52.0 NaN 6.120000 7.200000 7.690000 8.000000 8.120000 8.190000 8.260000
8 60.0 NaN 6.450000 7.530000 7.990000 8.220000 8.330000 8.400000 8.480000
9 75.0 NaN 6.730000 7.740000 8.210000 8.420000 8.590000 8.710000 8.840000
10 90.0 NaN 6.680000 7.740000 8.270000 8.510000 8.740000 8.950000 9.260000
11 110.0 NaN 6.340000 7.660000 8.290000 8.630000 8.820000 9.000000 9.330000
12 120.0 NaN 6.210000 7.520000 8.200000 8.620000 8.980000 9.270000 9.650000
13 135.0 NaN 5.670000 6.900000 7.830000 8.360000 8.740000 9.130000 9.940000
14 150.0 NaN 4.830000 5.940000 NaN 7.840000 8.330000 8.680000 9.440000
15 143.0 NaN 5.233927 NaN NaN NaN NaN NaN NaN
16 149.4 NaN NaN 5.971592 NaN NaN NaN NaN NaN
17 148.9 NaN NaN NaN 7.065552 NaN NaN NaN NaN
18 154.8 NaN NaN NaN NaN 7.592611 NaN NaN NaN
19 164.2 NaN NaN NaN NaN NaN 7.784099 NaN NaN
20 180.0 NaN NaN NaN NaN NaN NaN 8.060000 NaN
21 180.0 NaN NaN NaN NaN NaN NaN NaN 8.800000
22 NaN NaN NaN NaN NaN NaN NaN NaN NaN
23 35.0 NaN 4.000000 4.800000 5.600000 6.200000 6.600000 6.900000 7.100000
24 180.0 NaN 2.800000 3.900000 5.100000 6.200000 7.000000 NaN NaN
25 170.0 NaN NaN 4.350000 NaN NaN NaN NaN NaN
26 20.0 NaN 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
In [6]:
##df = df[:-4]
knots = [6,8,10,12,14,16,20]
In [7]:
def clean_kn_set(df, knot):
    columns_index = range(1,9)
    for index, item in enumerate(knots):
        if item == knot:
            column = columns_index[index + 1]
    result = df.iloc[:,[0,column]]
    result = result.dropna()
    result = result.sort_values('TWA')
    result['speed'] = result.iloc[:,1]
    result.drop(result.columns[[1]],axis=1,inplace=True)
    return result
In [8]:
clean_kn_set(df,6)
Out[8]:
TWA speed
26 20.0 0.000000
23 35.0 4.000000
6 42.7 5.483630
7 52.0 6.120000
8 60.0 6.450000
9 75.0 6.730000
10 90.0 6.680000
11 110.0 6.340000
12 120.0 6.210000
13 135.0 5.670000
15 143.0 5.233927
14 150.0 4.830000
24 180.0 2.800000
In [9]:
import matplotlib as mpl
mpl.rcParams['figure.figsize'] = (15,15)
In [10]:
import numpy as np
import matplotlib.pyplot as plt

ax = plt.subplot(111, projection='polar')
angles = {}
thetas = {}
speeds = {}
for knot in knots:
    angle = clean_kn_set(df, knot)['TWA']
    theta, speed = np.radians( clean_kn_set(df, knot)['TWA']),  clean_kn_set(df, knot)['speed'] 
    ax.plot(theta, speed)    
    # voor het volgende programma
    angles.update({knot:angle})
    thetas.update({knot:theta})
    speeds.update({knot:speed})
ax.set_title("Encounter Polar", va="bottom")
ax.set_theta_zero_location('N', offset=0)
ax.set_rlabel_position(-22.5)  # get radial labels away from plotted line
ax.grid(True)
ax.set_rmax(10)
plt.show()
In [11]:
for knot in knots:
    angle = angles[knot]
    speed = speeds[knot]
    plt.plot(angle, speed)
plt.show()
In [12]:
import scipy.interpolate as interpolate
In [13]:
angles_x = {}
thetas_x = {}
speeds_x = {}
for i, knot in enumerate(knots):
    angle, speed = angles[knot], speeds[knot]
    angle = np.array(angle)
    angle = angle.astype('float64')
    speed = np.array(speed)
    speed = speed.astype('float64')
    angle_x = np.linspace(angle.min(),angle.max(),(10 * (angle.max() - angle.min())).astype('int') + 1)
    theta_x = np.radians(angle_x)
    k_factor = [5,4,3,3,3,3,2]
    print('knot = ' + str(knot) + ' : k = ' + str(k_factor[i]) )
    t, c, k = interpolate.splrep(angle, speed, s=0, k=k_factor[i])
    spline = interpolate.BSpline(t, c, k, extrapolate=False)
    speed_x = spline(angle_x)
    plt.plot(angle_x, speed_x)
    plt.plot(angle, speed, 'bo')
    #plt.plot(angle, speed)
    # voor het volgende programma
    angles_x.update({knot:angle_x})
    thetas_x.update({knot:theta_x})
    speeds_x.update({knot:speed_x})
plt.show()
knot = 6 : k = 5
knot = 8 : k = 4
knot = 10 : k = 3
knot = 12 : k = 3
knot = 14 : k = 3
knot = 16 : k = 3
knot = 20 : k = 2
In [14]:
import numpy as np
import matplotlib.pyplot as plt

ax = plt.subplot(111, projection='polar')
for knot in knots:
    theta_x , speed_x = thetas_x[knot], speeds_x[knot]
    theta_x2 = []
    for x in theta_x:
        theta_x2.append(2*np.pi - x)
    theta_x2 = theta_x2[::-1]
    theta_x360 = np.append(theta_x, theta_x2)
    speed_x2 = speed_x[::-1]
    speed_x360 = np.append(speed_x, speed_x2)
    ax.plot(theta_x360, speed_x360)
    theta , speed = thetas[knot], speeds[knot]
    ax.plot(theta, speed, 'bo')
ax.set_title("Encounter Polar", va="bottom")
ax.set_theta_zero_location('N', offset=0)
ax.set_rlabel_position(-11.25) 
ax.grid(True)
ax.set_rmin(0)
ax.set_rmax(10)
plt.show()
In [15]:
step = 5
angles_csv = {}
speeds_csv = {}
csv = []
for knot in knots:
    angle_csv = []
    speed_csv = []
    for i in range(0,20,step):
        angle_csv.append(i)
        speed_csv.append(0.0)
    angle_x, speed_x = angles_x[knot], speeds_x[knot]    
    for i , angle in enumerate(angle_x):
        if angle % step == 0:
            angle_csv.append(int(round(angle_x[i],0)))
            speed_csv.append(int(round(100 * abs(speed_x[i])))/100)
    if knot == 6:
        tpl = ('TWA',angle_csv)
        csv.append(tpl)
    tpl = (str(knot) + " kn",speed_csv)    
    csv.append(tpl)
In [16]:
csvdf = pd.DataFrame.from_items(csv)
In [17]:
csvdf
Out[17]:
TWA 6 kn 8 kn 10 kn 12 kn 14 kn 16 kn 20 kn
0 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
1 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00
2 10 0.00 0.00 0.00 0.00 0.00 0.00 0.00
3 15 0.00 0.00 0.00 0.00 0.00 0.00 0.00
4 20 0.00 0.00 0.00 0.00 0.00 0.00 0.00
5 25 0.77 1.23 2.14 2.63 3.03 3.46 3.29
6 30 2.43 3.05 4.04 4.69 5.18 5.64 5.66
7 35 4.00 4.80 5.60 6.20 6.60 6.90 7.10
8 40 5.10 6.08 6.74 7.19 7.44 7.57 7.76
9 45 5.72 6.80 7.36 7.72 7.87 7.93 8.07
10 50 6.03 7.11 7.62 7.94 8.07 8.13 8.20
11 55 6.25 7.33 7.80 8.09 8.20 8.27 8.34
12 60 6.45 7.53 7.99 8.22 8.33 8.40 8.48
13 65 6.60 7.67 8.11 8.32 8.44 8.51 8.60
14 70 6.69 7.73 8.18 8.38 8.52 8.61 8.71
15 75 6.73 7.74 8.21 8.42 8.59 8.71 8.84
16 80 6.74 7.74 8.23 8.45 8.65 8.81 8.99
17 85 6.73 7.74 8.25 8.48 8.71 8.90 9.15
18 90 6.68 7.74 8.27 8.51 8.74 8.95 9.26
19 95 6.60 7.73 8.29 8.54 8.75 8.95 9.30
20 100 6.50 7.72 8.30 8.58 8.75 8.93 9.28
21 105 6.41 7.69 8.30 8.61 8.77 8.94 9.26
22 110 6.34 7.66 8.29 8.63 8.82 9.00 9.33
23 115 6.28 7.61 8.26 8.64 8.91 9.14 9.48
24 120 6.21 7.52 8.20 8.62 8.98 9.27 9.65
25 125 6.09 7.38 8.12 8.56 8.96 9.30 9.80
26 130 5.90 7.18 8.00 8.48 8.87 9.24 9.92
27 135 5.67 6.90 7.83 8.36 8.74 9.13 9.94
28 140 5.40 6.56 7.60 8.22 8.61 8.99 9.84
29 145 5.12 6.22 7.31 8.05 8.48 8.84 9.64
30 150 4.83 5.94 6.99 7.84 8.33 8.68 9.44
31 155 4.54 5.66 6.65 7.58 8.16 8.52 9.27
32 160 4.25 5.30 6.30 7.29 7.96 8.38 9.13
33 165 3.95 4.84 5.95 6.99 7.75 8.25 9.01
34 170 3.63 4.35 5.63 6.69 7.51 8.15 8.91
35 175 3.25 3.96 5.34 6.42 7.26 8.08 8.84
36 180 2.80 3.90 5.10 6.20 7.00 8.06 8.80
In [18]:
csvdf.to_csv('encounter_polar.csv', index=False)
In [ ]: