Существует ли эффективный / pythonic способ вычисления скользящего окна на основе расстояния по широте и долготе?

#python #pandas #jupyter-notebook

#python #pandas #jupyter-notebook

Вопрос:

В настоящее время я работаю над проблемой, которая включает в себя перемещение по большому набору данных, в котором я получаю измерения, распределенные по расстоянию (каждое измерение имеет заданную широту / lon). Я ищу более pythonic / эффективный способ решения этой проблемы, чем у меня есть в настоящее время, поскольку Jupyter Notebook не завершает компиляцию примерно после 40000 итераций (мне нужно около 300000).

В настоящее время моим текущим решением является следующий код, где размер окна равен 100m:

 for m in range(6):
    co_means = list(dfs[m]['co'])
    dates = list(pd.to_datetime(dfs[m]['gps_time']))
    dfs[m]['co'] = dfs[m]['co']*1000
    R = 6373.0
    for i in range (len(co_means)-3):
        print (len(co_means))
        print (i)
        current_list_co2 = []
        current_list_co = []
        k = i
        
        lat1 = radians(dfs[m]['lat'][i])
        lon1 = radians(dfs[m]['lon'][i])
        if (dates[k] != dates[-1]):
            distance = 0
            
            while(distance<100):
                lat2 = radians(dfs[m]['lat'][k])
                lon2 = radians(dfs[m]['lon'][k])

                dlon = lon2 - lon1
                dlat = lat2 - lat1

                a = sin(dlat / 2)**2   cos(lat1) * cos(lat2) * sin(dlon / 2)**2
                c = 2 * atan2(sqrt(a), sqrt(1 - a))
                print (distance)
                distance = R * c *1000
                if distance<100:
                    current_list_co2.append(dfs[m]['co2d'][k])
                    current_list_co.append(dfs[m]['co'][k])
                k =1
                if (dates[k] == dates[-1]):
                    break
        #only do calculations for those values that aren't in empty lists
        print (dates[k])
        if len(current_list_co2)!=0 and len(current_list_co) != 0:
            results.write("%s" % (dates[i]))

            #for ratio of co:co2
            a_fit, cov = curve_fit(linear_function, current_list_co2, current_list_co)
            y_int = a_fit[0]
            slope = a_fit[1]
            print (len(current_list_co2))
            err_yint = math.sqrt(cov[0][0])
            err_slope = math.sqrt(cov[1][1])
        
            #to find r2:
            z = stats.linregress(current_list_co2,current_list_co) 
            r2 = z[2]**2
            x_list = list(range(1,len(current_list_co2) 1))

            #for linregress parameters for co2 and co individually
            a_fit_co2, cov_co2 = curve_fit(linear_function, x_list, current_list_co2)
            a_fit_co, cov_co = curve_fit(linear_function, x_list, current_list_co) 
  

Любая помощь была бы с благодарностью принята!

Редактировать: Образец набора данных: dict

 {'co': {0: 425.07144266999995, 1: 425.06915346999995, 2: 425.06915346999995, 3: 433.21636567, 4: 433.21636567, 
        5: 433.21803501999995, 6: 433.21803501999995, 7: 411.10666247, 8: 411.10666247, 9: 411.38779539999996, 
        10: 411.38779539999996, 11: 420.62025938000005, 12: 420.62025938000005, 13: 421.1036325, 14: 421.1036325, 
        15: 413.96486982000005, 16: 413.96486982000005, 17: 413.44999135, 18: 413.44999135, 19: 408.73726959}, 
 'gps_time': {0: '2019-11-18 14:37:51.000000', 1: '2019-11-18 14:37:51.000000', 2: '2019-11-18 14:37:52.000000', 
              3: '2019-11-18 14:37:53.000000', 4: '2019-11-18 14:37:54.000000', 5: '2019-11-18 14:37:54.000000', 
              6: '2019-11-18 14:37:55.000000', 7: '2019-11-18 14:37:56.000000', 8: '2019-11-18 14:37:56.000000', 
              9: '2019-11-18 14:37:57.000000', 10: '2019-11-18 14:37:57.000000', 11: '2019-11-18 14:37:58.000000', 
              12: '2019-11-18 14:37:59.000000', 13: '2019-11-18 14:38:00.000000', 14: '2019-11-18 14:38:00.000000', 
              15: '2019-11-18 14:38:01.000000', 16: '2019-11-18 14:38:02.000000', 17: '2019-11-18 14:38:02.000000', 
              18: '2019-11-18 14:38:03.000000', 19: '2019-11-18 14:38:04.000000'}, 
 'lat': {0: 45.5052230462, 1: 45.5052230462, 2: 45.5052236012, 3: 45.5052241548, 4: 45.5052247083, 5: 45.5052247083, 
         6: 45.505224740900005, 7: 45.505224193000004, 8: 45.505224193000004, 9: 45.5052236451, 
         10: 45.5052236451, 11: 45.5052230897, 12: 45.5052225243, 13: 45.505221958999996, 14: 45.505221958999996, 
         15: 45.5052211427, 16: 45.505220058, 17: 45.505220058, 18: 45.505218973299996, 19: 45.5052183333}, 
 'lon': {0: -73.5761855743, 1: -73.5761855743, 2: -73.576185, 3: -73.576185, 4: -73.576185, 5: -73.576185, 
         6: -73.5761855183, 7: -73.5761866141, 8: -73.5761866141, 9: -73.5761877098, 10: -73.5761877098, 
         11: -73.576188577, 12: -73.5761891424, 13: -73.57618970770001, 14: -73.57618970770001, 
         15: -73.5761894761, 16: -73.57618839140001, 17: -73.57618839140001, 18: -73.5761873066, 19: -73.5761857775}, 
 'co2d': {0: 380.58647938, 1: 381.44674445, 2: 451.67041972, 3: 451.67041972, 4: 451.66555392, 5: 451.66555392, 
          6: 456.29788806, 7: 456.29788806, 8: 456.29412627, 9: 456.29412627, 10: 520.61774288, 11: 520.61774288, 
          12: 520.62904898, 13: 520.62904898, 14: 630.97037738, 15: 630.97037738, 16: 630.9919346, 17: 630.9919346, 
          18: 512.76133406, 19: 512.76133406}}
  

Комментарии:

1. @Ben. Я только что добавил его фотографию, я не смог придумать способ добавить таблицу в вопрос, есть ли лучший способ для меня поделиться данными?

2. Публикуйте данные в виде текста / кода, а не в виде изображений. Если ваши данные представляют собой фрейм данных pandas, используйте df.to_dict . Тем не менее, может быть, вы можете использовать RadiusNeighborsRegressor from sklearn ?

3. Хорошо, я это сделал, выглядит неаккуратно, это нормально?

4. @Ben. Я понял! Спасибо за совет!