我有以下pandas.DataFrame
:
City x-Coord City y-Coord coord
12860 59333.3333 18050.0000 (59333.3333+18050j)
12941 59350.0000 18050.0000 (59350+18050j)
13035 59366.6667 18050.0000 (59366.6667+18050j)
12940 59350.0000 18033.3333 (59350+18033.3333j)
13034 59366.6667 18016.6667 (59366.6667+18016.6667j)
13033 59366.6667 18000.0000 (59366.6667+18000j)
13132 59383.3333 18000.0000 (59383.3333+18000j)
13133 59383.3333 18016.6667 (59383.3333+18016.6667j)
13134 59383.3333 18033.3333 (59383.3333+18033.3333j)
13230 59400.0000 18033.3333 (59400+18033.3333j)
现在,要计算城市1(x),2(y)和3(z)之间的角度:
arccos(np.dot((x-y),(z-y))/(abs(x-y)*abs(z-y))
所以,我的计算方式是:
df['combined'] = list(zip(df['City x-Coord'], df['City y-Coord']))
df['combined'] = df['combined'].apply(np.array)
a = df['combined'] - df['combined'].shift(1)
b = df['combined'] - df['combined'].shift(-1)
df['angle'] = [np.degrees(np.arccos(np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y)))).round().astype(int) for
x, y in zip(a, b)]
但是,我的角度不正确。
df.head()
出[5]:
City x-Coord City y-Coord coord \
12860 59333.3333 18050.0000 (59333.3333+18050j)
12941 59350.0000 18050.0000 (59350+18050j)
13035 59366.6667 18050.0000 (59366.6667+18050j)
12940 59350.0000 18033.3333 (59350+18033.3333j)
13034 59366.6667 18016.6667 (59366.6667+18016.6667j)
combined angle
12860 [59333.3333, 18050.0] -2147483648
12941 [59350.0, 18050.0] 180
13035 [59366.6667, 18050.0] 45
12940 [59350.0, 18033.3333] 90
13034 [59366.6667, 18016.6667] 135
此外,由于NaN值,最后一个值也是错误的。
df.tail()
出[6]:
City x-Coord City y-Coord coord \
12677 59300.0000 18100.0000 (59300+18100j)
12761 59316.6667 18083.3333 (59316.6667+18083.3333j)
12863 59333.3333 18100.0000 (59333.3333+18100j)
12862 59333.3333 18083.3333 (59333.3333+18083.3333j)
12861 59333.3333 18066.6667 (59333.3333+18066.6667j)
combined angle
12677 [59300.0, 18100.0] 135
12761 [59316.6667, 18083.3333] 90
12863 [59333.3333, 18100.0] 45
12862 [59333.3333, 18083.3333] 180
12861 [59333.3333, 18066.6667] -2147483648
我能理解的第一个和最后一个条目是Nan值。我可以更改dict理解来解决此问题吗?另外,我的计算正确吗?不确定。有人可以再说一遍吗?
谢谢, Arnab