Как преобразовать результаты для l oop в pandas фрейм данных? - PullRequest
0 голосов
/ 07 августа 2020

Используя формулу Хаверсинуса для вычисления расстояния по большому кругу, я использую следующий код для вычисления координат любой точки между известным начальным местоположением (с широтой 1 / долгота) и известным пунктом назначения (с широтой 2 / долгота 2):

Вот полный код:

from math import radians, sin, cos, acos, atan2, sqrt, pi

#enter the following numbers in the corresponding input fields:
#lat1 = starting latitude = 33.95 
#lon1 = starting longitude = -118.40
#lat2 = destination latitude = 40.6333 
#lon2= destination longitude = -73.7833
lat1 = radians(float(input("Starting latitude: ")))
lon1 = radians(float(input("Starting longitude: ")))
lat2 = radians(float(input("Destination latitude: ")))
lon2 = radians(float(input("Destination longitude: ")))

#Haversine formula to calculate the distance, in radians, between starting point and destination:
d = ((6371.01 * acos(sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(lon1 - lon2)))/1.852)/(180*60/pi)  

import numpy as np
x = np.arange(0, 1, 0.2)
for f in x:
    A=sin((1-f)*d)/sin(d)
    B=sin(f*d)/sin(d)
    x = A*cos(lat1)*cos(lon1) +  B*cos(lat2)*cos(lon2)
    y = A*cos(lat1)*sin(lon1) +  B*cos(lat2)*sin(lon2)
    z = A*sin(lat1)           +  B*sin(lat2)
    lat_rad=atan2(z,sqrt(x**2+y**2))
    lon_rad=atan2(y,x)
    lat_deg = lat_rad*180/pi
    lon_deg = lon_rad*180/pi
    print('%.2f' %f, '%.4f' %lat_deg, '%.4f' %lon_deg)

Я использую функцию np.arange() для дробной итерации f между 0 (начальная точка) и 1 (конечная точка).

Результат для l oop:

0.00 33.9500 -118.4000
0.20 36.6040 -110.2685
0.40 38.6695 -101.6259
0.60 40.0658 -92.5570
0.80 40.7311 -83.2103

Где первое число - это дробь (f); второе число - это широта (lat_deg), а третье число - долгота (lon_deg).

Мой вопрос: как мне преобразовать вывод моего кода в кадр данных pandas (3x6) с данные расположены в 3 столбца с заголовком Fraction (col1), Latitude (col2), Longitude (col3)?

Как только вывод находится в кадре данных pandas, я могу легко записать данные в CSV файл.

1 Ответ

1 голос
/ 07 августа 2020

Вы почти у цели. Со следующими изменениями вы сможете получить свой CSV:

  1. Добавьте свои значения в список вместо их печати. ​​
  2. Преобразуйте результат в фрейм данных

Ниже ваш код с необходимыми обновлениями. Я проверил это, и он работает вплоть до окончательного CSV.

import numpy as np
import pandas as pd
from math import radians, sin, cos, acos, atan2, sqrt, pi

# Numbers per your instructions
lat1 = radians(float(33.95))
lon1 = radians(float(-118.40))
lat2 = radians(float(40.6333))
lon2 = radians(float(-73.7833))

#Haversine formula to calculate the distance, in radians, between starting point and destination:
d = ((6371.01 * acos(sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(lon1 - lon2)))/1.852)/(180*60/pi)  

x = np.arange(0, 1, 0.2)

# An empty list into which we'll append each list of values
res = []

for f in x:
    A=sin((1-f)*d)/sin(d)
    B=sin(f*d)/sin(d)
    x = A*cos(lat1)*cos(lon1) +  B*cos(lat2)*cos(lon2)
    y = A*cos(lat1)*sin(lon1) +  B*cos(lat2)*sin(lon2)
    z = A*sin(lat1)           +  B*sin(lat2)
    lat_rad=atan2(z,sqrt(x**2+y**2))
    lon_rad=atan2(y,x)
    lat_deg = lat_rad*180/pi
    lon_deg = lon_rad*180/pi
    # Add the desired values, creating a list of lists
    res.append([f, lat_deg, lon_deg])

# Convert the result to a dataframe
res_df= pd.DataFrame(res, columns=['Fraction', 'Latitude', 'Longitude'])

# Voila! You can now save to CSV
res_df.to_csv('coordinates.csv', index=False)   


...