当前位置: 首页 > 面试题库 >

向量化pandas中的函数

东方华荣
2023-03-14
问题内容

我有一个包含经纬度坐标列表的数据框:

d = {'Provider ID': {0: '10001',
  1: '10005',
  2: '10006',
  3: '10007',
  4: '10008',
  5: '10011',
  6: '10012',
  7: '10016',
  8: '10018',
  9: '10019'},
 'latitude': {0: '31.215379379000467',
  1: '34.22133455500045',
  2: '34.795039606000444',
  3: '31.292159523000464',
  4: '31.69311635000048',
  5: '33.595265517000485',
  6: '34.44060759100046',
  7: '33.254429322000476',
  8: '33.50314015000049',
  9: '34.74643089500046'},
 'longitude': {0: ' -85.36146587999968',
  1: ' -86.15937514799964',
  2: ' -87.68507485299966',
  3: ' -86.25539902199966',
  4: ' -86.26549483099967',
  5: ' -86.66531866799966',
  6: ' -85.75726760699968',
  7: ' -86.81407933399964',
  8: ' -86.80242858299965',
  9: ' -87.69893502799965'}}
df = pd.DataFrame(d)

我的目标是使用Haversine函数找出KM中每个项目之间的距离:

from math import radians, cos, sin, asin, sqrt
def haversine(lon1, lat1, lon2, lat2):
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """

    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a))

    # 6367 km is the radius of the Earth
    km = 6367 * c
    return km

我的目标是得到一个看起来像result_df的数据框,其中的值是每个提供程序ID之间的距离:

 result_df = pd.DataFrame(columns = df['Provider ID'], index=df['Provider ID'])

我可以循环执行此操作,但是速度非常慢。我正在寻找一些帮助将其转换为向量化方法:

for first_hospital_coordinates in result_df.columns:
    for second_hospital_coordinates in result_df['Provider ID']:
        if first_hospital_coordinates == 'Provider ID':
            pass
        else:
            L1 = df[df['Provider ID'] == first_hospital_coordinates]['latitude'].astype('float64').values
            O1 = df[df['Provider ID'] == first_hospital_coordinates]['longitude'].astype('float64').values
            L2 = df[df['Provider ID'] == second_hospital_coordinates]['latitude'].astype('float64').values
            O2 = df[df['Provider ID'] == second_hospital_coordinates]['longitude'].astype('float64').values

            distance = haversine(O1, L1, O2, L2)

            crit = result_df['Provider ID'] == second_hospital_coordinates
            result_df.loc[crit, first_hospital_coordinates] = distance

问题答案:

为了矢量化此代码,您将需要对完整的数据框进行操作,而不要对单个经纬度进行操作。我对此做了尝试。我需要结果df和一个新函数h2,

import numpy as np
def h2(df, p):
    inrad = df.applymap(radians)
    dlon = inrad.longitude-inrad.longitude[p]
    dlat = inrad.latitude-inrad.latitude[p]
    lat1 = pd.Series(index = df.index, data = [df.latitude[p] for i in range(len(df.index))])
    a = np.sin(dlat/2)*np.sin(dlat/2) + np.cos(df.latitude) * np.cos(lat1) * np.sin(dlon/2)**2
    c = 2 * 1/np.sin(np.sqrt(a))
    km = 6367 * c
    return km

df = df.set_index('Provider ID')
df = df.astype(float)
df2 = pd.DataFrame(index = df.index, columns = df.index)
for c in df2.columns:
    df2[c] = h2(df, c)

print (df2)

这应该产生(我不确定我是否有正确答案……我的目标是对代码进行矢量化处理)

Provider ID         10001         10005         10006         10007  \
Provider ID                                                           
10001                 inf  5.021936e+05  5.270062e+05  1.649088e+06   
10005        5.021936e+05           inf  9.294868e+05  4.985233e+05   
10006        5.270062e+05  9.294868e+05           inf  4.548412e+05   
10007        1.649088e+06  4.985233e+05  4.548412e+05           inf   
10008        1.460299e+06  5.777248e+05  5.246954e+05  3.638231e+06   
10011        6.723581e+05  2.004199e+06  1.027439e+06  6.394402e+05   
10012        4.559090e+05  3.265536e+06  7.573411e+05  4.694125e+05   
10016        7.680036e+05  1.429573e+06  9.105474e+05  7.517467e+05   
10018        7.096548e+05  1.733554e+06  1.020976e+06  6.701920e+05   
10019        5.436342e+05  9.278739e+05  2.891822e+07  4.638858e+05

Provider ID         10008         10011         10012         10016  \
Provider ID                                                           
10001        1.460299e+06  6.723581e+05  4.559090e+05  7.680036e+05   
10005        5.777248e+05  2.004199e+06  3.265536e+06  1.429573e+06   
10006        5.246954e+05  1.027439e+06  7.573411e+05  9.105474e+05   
10007        3.638231e+06  6.394402e+05  4.694125e+05  7.517467e+05   
10008                 inf  7.766998e+05  5.401081e+05  9.496953e+05   
10011        7.766998e+05           inf  1.341775e+06  4.220911e+06   
10012        5.401081e+05  1.341775e+06           inf  1.119063e+06   
10016        9.496953e+05  4.220911e+06  1.119063e+06           inf   
10018        8.236437e+05  1.242451e+07  1.226941e+06  5.866259e+06   
10019        5.372119e+05  1.051748e+06  7.514774e+05  9.362341e+05

Provider ID         10018         10019  
Provider ID                              
10001        7.096548e+05  5.436342e+05  
10005        1.733554e+06  9.278739e+05  
10006        1.020976e+06  2.891822e+07  
10007        6.701920e+05  4.638858e+05  
10008        8.236437e+05  5.372119e+05  
10011        1.242451e+07  1.051748e+06  
10012        1.226941e+06  7.514774e+05  
10016        5.866259e+06  9.362341e+05  
10018                 inf  1.048895e+06  
10019        1.048895e+06           inf

[10 rows x 10 columns]


 类似资料:
  • 问题内容: 我有两个熊猫数据框,一个叫做“ orders”,另一个叫做“ daily_prices”。daily_prices如下: 订单如下: 两个数据帧的索引均为datetime.date。通过使用列表解析来遍历所有订单并在“ daily_prices”数据框中查找特定日期的特定报价,然后将该列表作为列添加到“订单”数据框中的“价格”列。 “订单”数据框。我想使用数组操作而不是循环执行此操作。

  • 问题内容: 如果我有一个带有列的数据框,并且想根据在伪代码中使用它的值来创建列: 我将如何实现?我认为这是最好的方法,但是不确定如何正确编码。 问题答案: 一种简单的方法是先分配默认值,然后执行两次调用: 如果您想使用,则可以使用嵌套: 因此,这里我们定义第一个条件为x小于-2,返回1,然后有另一个条件测试另一个条件,其中x大于2并返回-1,否则返回0 时机 因此,对于此样本数据集,该方法的速度是

  • 问题内容: 假设我们有以下pandas DataFrame: 如何以 向量化的方式计算 大熊猫的连续数量?我想要这样的结果: 类似于矢量化求和运算的操作,它会在特定条件下重置。 问题答案: 您可以执行以下操作(贷方:如何使用系列/数据框模拟itertools.groupby):

  • 要想MATLAB最高速地工作,重要的是在M-文件中把算法向量化。其他程序语言可能用for或DO循环,MATLAB则可用向量或矩阵运算。下例是创立一个算法表。 x = .01; for k = 1:1001 y(k) = log10(x); x = x + .01; end 同样代码地向量化翻译是 x = .01:.01:10; y = log10(x); 对于更复杂的代码,矩阵化选

  • 问题内容: 对于简单的神经网络,我想将一个函数应用于gonum的所有值。 Gonum有一个用于密集矩阵的方法,但没有用于向量的方法,因此我是手工完成的: 这似乎是并发执行的明显目标,所以我尝试了 这不起作用,也许不是意外的,因为它没有以结尾,因为return语句(完成所有工作)紧随其后。 我的问题是:如何使用并发将函数应用于gonum向量的每个元素? 问题答案: 首先请注意,这种并发计算的尝试假定

  • 问题内容: 半向量的公式为(Hv)=(Lv + Vv)/ | Lv + Vv |,其中Lv是光向量,Vv是视点向量。 我在Python代码中这样做正确吗? 问题答案: 这是错误的名称。您所写的是两个向量的简单向量加法,结果是归一化的单位向量。 这是我的处理方式: