Haversine 函数的 Python 数学库中的错误

Posted

技术标签:

【中文标题】Haversine 函数的 Python 数学库中的错误【英文标题】:Error in Python's Math library for Haversine function 【发布时间】:2019-08-05 19:15:01 【问题描述】:

我试图找出两个地理纬度和经度之间的距离

我用必要的公式创建了一个函数 hasrsine:

from math import radians,cos,sin,asin,sqrt
def haversine(lon1,lat1,lon2,lat2):
    #convert decimals to radians
    lon1,lat1,lon2,lat2=map(radians,[lon1,lat1,lon2,lat2])
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    r = 6371 # Radius of earth in kilometers. Use 3956 for miles
    return c * r

haversine(-97.481,-97.622,-74.1083,-74.106)

现在我想找出我的 df 中的点的距离,以及它们是否在泽西市的经纬度半径 50 公里范围内:

import pandas as pd

df = pd.DataFrame('Company':['WM','WS','WC','WW'],
                   'city':['Norman','OKC','NY','Bayonne'],
                   'latitude':[35.221,35.463,41.112,40.66],
                   'longtitude':[-97.481,-97.622,-74.1083,-74.106])

jersey_city_lat_lon=(40.94,-74.05)
df['distance']=df.apply(haversine,args=(jersey_city_lat_lon),axis=1)
df[df['distance']<=100]

但是当我运行上面的,我收到一个错误:

Traceback (most recent call last):

  File "<ipython-input-123-8d33df9e0fab>", line 7, in <module>
    df['distance']=df.apply(haversine,args=(jersey_city_lat_lon),axis=1)

  File "C:\Users\j\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\frame.py", line 6487, in apply
    return op.get_result()

  File "C:\Users\j\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\apply.py", line 151, in get_result
    return self.apply_standard()

  File "C:\Users\j\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\apply.py", line 257, in apply_standard
    self.apply_series_generator()

  File "C:\Users\j\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\apply.py", line 286, in apply_series_generator
    results[i] = self.f(v)

  File "C:\Users\j\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\apply.py", line 78, in f
    return func(x, *args, **kwds)

TypeError: ("haversine() missing 1 required positional argument: 'lat2'", 'occurred at index 0')

它应该可以向我显示一个位置在纽约,另一个在巴约讷,这在我们正在寻找的半径范围内,因为纽约和巴约讷都位于距离泽西城 50 公里的径向距离内。为什么会出现此错误?

【问题讨论】:

【参考方案1】:

df.apply 将行对象(或轴=0 的列)传递给目标函数。它不知道将行解压缩到您想要的字段中。您可以包装您的 hasrsign 函数以仅提取 lat 和 lon 列

jersey_city_long_lat=(-74.05,40.94)
def row_hsign(row):
    return haversine(*jersey_city_long_lat,row['longtitude'],row['latitude'])

df['distance']=df.apply(row_hsign,axis=1)

【讨论】:

我正在寻找与 df['distance'] 不同的输出。请参考这个链接,让我知道我应该改变什么kanoki.org/2019/02/14/… 哦,看起来是因为你颠倒了参数的顺序。 haversign 的签名是 (long1,lat1,long2,lat2) 但您通过 (lat,long) 指定了泽西城。只需切换一个或另一个的顺序以匹配。 仍然给出同样的错误。我重新排序了泽西城的经纬度 jersey_city_lat_lon=(-74.05,40.94)

以上是关于Haversine 函数的 Python 数学库中的错误的主要内容,如果未能解决你的问题,请参考以下文章

Haversine 函数 - Python [关闭]

Haversine 公式 - 数学略有偏差,不确定原因

Python学习笔记

numpy函数库中一些经常使用函数的记录

MySQL存储函数中的Haversine

数学库中的除法函数如何处理除法运算符无法做到的精度误差?