有几天我想不出解决这个问题的办法。
我生成了x和y坐标的"coordinates.csv“文件,如下所示:
xcoord,ycoord
112000,556000
112000,555500
112000,555000
112000,554500
112000,554000
112000,553500
我有一个特定的代码,它在一个x和z坐标上进行计算。这是一个简化的例子:
#example code stack
x = 2000
y = 3000
new_value = x + y + 10
print(x)
print(y)
我想使用.csv文件中的x,y坐标,而不是(2000,3000)。因此,代码将对.csv文件中的所有坐标进行计算。在那之后,我想用第三列中的计算来做一个新的数据。这个看起来是这样的:
xcoord,ycoord,new_value
112000,556000,668010
112000,555500,667510
112000,555000,667010
112000,554500,666510
112000,554000,666010
112000,553500,665510
我想我需要一个for循环,但我真的想不出怎么做。很多时候,我被for循环困住了,所以我希望有人能帮我解决问题。
谢谢你的阅读和亲切的问候,
西蒙
这是我的代码,这是被要求的。这说明了为什么我认为我需要一个for循环来完成这个任务。我试图实现ThomasO建议的方法,但这似乎行不通,因为P将变成一个坐标列表,而不是一个坐标列表,但也许我错了。我仍然对一个解决办法感到好奇:
import geopandas as gpd
import itertools
import math
from pyproj import Transformer
import numpy as np
from math import sqrt
import os
import pandas as pd
from pathlib import Path
from matplotlib import pyplot as plt
## data
land = gpd.read_file('land2.shp')
land = land.to_crs("EPSG:28992")
os.chdir('C:\\Users\\###\\sensoren\\data')
os.getcwd()
wind = pd.read_csv('data_totaal_2.csv', usecols= [ 0, 1,2 , 5],skiprows = 33, names = ['STN','DT','HH','FF'])
## closest point
def min_distance(x, y, iterable):
list_of_distances = list(map(lambda t: sqrt(pow(t[0]-x,2)+pow(t[1]-y,2)),iterable))
min_res = min(list_of_distances)
index_of_min = list_of_distances.index(min_res)
return iterable[index_of_min]
## check if point is inside triangle
def area(x1, y1, x2, y2, x3, y3):
return abs((x1 * (y2 - y3) +
x2 * (y3 - y1) +
x3 * (y1 - y2)) / 2.0)
def is_inside(x1, y1, x2, y2, x3, y3, x, y):
A = area(x1, y1, x2, y2, x3, y3)
A1 = area(x, y, x2, y2, x3, y3)
A2 = area(x1, y1, x, y, x3, y3)
A3 = area(x1, y1, x2, y2, x, y)
return A == A1 + A2 + A3
## calculate perimeter
def perimeter(points):
x1, y1, x2, y2, x3, y3 = *points[0], *points[1], *points[2]
return (math.hypot(x1-x2, y1-y2) +
math.hypot(x2-x3, y2-y3) +
math.hypot(x3-x1, y3-y1))
## barycentric interpolation
def bary_interpol (inter_cor_x1, inter_cor_x2, inter_cor_x3, inter_cor_y1,
inter_cor_y2, inter_cor_y3, inter_cor_px, inteR_cor_py,
inter_wind_v1, inter_wind_v2, inter_wind_v3):
W_v1 = ((inter_cor_y2-inter_cor_y3)*(inter_cor_px-inter_cor_x3)+
(inter_cor_x3-inter_cor_x2)*(inter_cor_py-inter_cor_y3))/((inter_cor_y2-inter_cor_y3)*(inter_cor_x1-inter_cor_x3)+
(inter_cor_x3-inter_cor_x2)*(inter_cor_y1-inter_cor_y3))
W_v2 = ((inter_cor_y3-inter_cor_y1)*(inter_cor_px-inter_cor_x3)+
(inter_cor_x1-inter_cor_x3)*(inter_cor_py-inter_cor_y3))/((inter_cor_y2-inter_cor_y3)*(inter_cor_x1-inter_cor_x3)+
(inter_cor_x3-inter_cor_x2)*(inter_cor_y1-inter_cor_y3))
W_v3 = 1 - W_v1 - W_v2
inter_wind_pv = (W_v1 * inter_wind_v1) + (W_v2 * inter_wind_v2) + (W_v3 * inter_wind_v3)
return inter_wind_pv
## datum shift
transformer = Transformer.from_crs("epsg:4326", "epsg:28992")
RD_229 = transformer.transform(53.04309, 4.81969) #texelhors_229
RD_235 = transformer.transform(52.91382, 4.79498) #de_kooy_235
RD_242 = transformer.transform(53.25337, 4.94041) #vlieland_242
RD_251 = transformer.transform(53.39335, 5.34623) #terschelling_251
RD_267 = transformer.transform(52.89709, 5.38331) #stavoren_267
RD_277 = transformer.transform(53.40848, 6.19614) #lauwersoog_277
df = pd.read_csv(r"C:\Users\###\OneDrive - NIOZ\NIOZ\Pyth\coordinates.csv")
P = ( df['xcoord'], df['ycoord'])
STN_229_x = RD_229[0]
STN_235_x = RD_235[0]
STN_242_x = RD_242[0]
STN_251_x = RD_251[0]
STN_267_x = RD_267[0]
STN_277_x = RD_277[0]
points = [(RD_229[0],RD_229[1]),(RD_235[0],RD_235[1]),(RD_242[0],RD_242[1]),(RD_251[0],RD_251[1]),(RD_267[0],RD_267[1]),(RD_277[0],RD_277[1])]
## find best triangle or point
triangle_fit = []
for triangle in itertools.combinations(points, 3):
p1, p2, p3 = triangle
if is_inside(*p1, *p2, *p3, *P):
triangle_fit.append(triangle)
triangle_fit.sort(key=perimeter)
# Sort by perimeter.
triangle_fit.append(triangle)
triangle_fit.sort(key=perimeter)
inter_cor = triangle_fit[0]
inter_cor_x1 = inter_cor[0][0]
inter_cor_x2 = inter_cor[1][0]
inter_cor_x3 = inter_cor[2][0]
inter_cor_y1 = inter_cor[0][1]
inter_cor_y2 = inter_cor[1][1]
inter_cor_y3 = inter_cor[2][1]
inter_cor_px = P[0]
inter_cor_py = P[1]
print(inter_cor_x1)
print(inter_cor_x2)
print(inter_cor_x3)
print(inter_cor_y1)
print(inter_cor_y2)
print(inter_cor_y3)
if inter_cor_x1 == STN_229_x:
STN_v1 = 229
elif inter_cor_x1 == STN_235_x:
STN_v1 = 235
elif inter_cor_x1 == STN_242_x:
STN_v1 = 242
elif inter_cor_x1 == STN_251_x:
STN_v1 = 251
elif inter_cor_x1 == STN_267_x:
STN_v1 = 267
elif inter_cor_x1 == STN_277_x:
STN_v1 = 277
else:
print("no matching stations in v1")
if inter_cor_x2 == STN_229_x:
STN_v2 = 229
elif inter_cor_x2 == STN_235_x:
STN_v2 = 235
elif inter_cor_x2 == STN_242_x:
STN_v2 = 242
elif inter_cor_x2 == STN_251_x:
STN_v2 = 251
elif inter_cor_x2 == STN_267_x:
STN_v2 = 267
elif inter_cor_x2 == STN_277_x:
STN_v2 = 277
else:
print("no matching stations in v2")
if inter_cor_x3 == STN_229_x:
STN_v3 = 229
elif inter_cor_x3 == STN_235_x:
STN_v3 = 235
elif inter_cor_x3 == STN_242_x:
STN_v3 = 242
elif inter_cor_x3 == STN_251_x:
STN_v3 = 251
elif inter_cor_x3 == STN_267_x:
STN_v3 = 267
elif inter_cor_x3 == STN_277_x:
STN_v3 = 277
else:
print("no matching stations in v1")
inter_wind_v1 = wind[wind['STN'] == STN_v1]
inter_wind_v2 = wind[wind['STN'] == STN_v2]
inter_wind_v3 = wind[wind['STN'] == STN_v3]
df_add = inter_wind_v1.FF.add(inter_wind_v1.FF, fill_value=0)
inter_wind_v1 = wind[wind['STN'] == STN_v1].reset_index()
# =============================================================================
# print(f"inter_wind_v1:\n{inter_wind_v1}")
# =============================================================================
inter_wind_v2 = wind[wind['STN'] == STN_v2].reset_index()
# =============================================================================
# print(f"inter_wind_v2:\n{inter_wind_v2}")
# =============================================================================
inter_wind_v3 = wind[wind['STN'] == STN_v3].reset_index()
# =============================================================================
# print(f"inter_wind_v3:\n{inter_wind_v3}")
# =============================================================================
interp = pd.DataFrame(inter_wind_v1['FF']).rename(columns = {'FF':'inter_wind_v1'})
interp['inter_wind_v2'] = inter_wind_v2['FF']
interp['inter_wind_v3'] = inter_wind_v3['FF']
# =============================================================================
# print(interp)
# =============================================================================
def doInterp(inter_wind_v1, inter_wind_v2, inter_wind_v3):
return bary_interpol (inter_cor_x1, inter_cor_x2, inter_cor_x3, inter_cor_y1,
inter_cor_y2, inter_cor_y3, inter_cor_px, inter_cor_py,
inter_wind_v1, inter_wind_v2, inter_wind_v3)
interp['inter_wind_pv'] = interp.apply(lambda x: doInterp(x['inter_wind_v1'], x['inter_wind_v2'], x['inter_wind_v3']), axis=1)
print(interp.inter_wind_pv)
wind_time = pd.date_range(start = '1/1/2021 00:01:00', end = '3/13/2022', freq = 'H')
wind_time = pd.DataFrame(wind_time)
print(wind_time)
result = pd.concat([wind_time, interp.inter_wind_pv], axis=1)
print(result)
filepath = Path('C:/Users/###/sensoren/data/out.csv')
filepath.parent.mkdir(parents=True, exist_ok=True)
result.to_csv(filepath)
os.makedirs('C:/Users/###/sensoren/data/', exist_ok=True)
data_s = np.array([
[RD_229],
[RD_235],
[RD_242],
[RD_251],
[RD_267],
[RD_277]
])
data_p = np.array([
[P]
])
data_i = np.array([
[ inter_cor_x1, inter_cor_y1],
[ inter_cor_x2, inter_cor_y2],
[ inter_cor_x3, inter_cor_y3]
])
x_s, y_s = data_s.T
x_p, y_p = data_p. T
x_i, y_i = data_i. T
ax = land.plot()
plt.scatter( x_p, y_p, c="red")
plt.scatter( x_s, y_s, c="yellow")
plt.scatter( x_i, y_i, c="green")
plt.show()
发布于 2022-05-03 11:40:38
您不需要'for‘循环,因为您提到您想要一个dataframe。将来,您应该提供所创建的代码,但无法开始工作。
import pandas as pd
df = pd.read_csv("numbers.csv")
df['new_value'] = df['xcoord'] + df['ycoord'] + 10
print(df)
输出:
xcoord ycoord new_value
0 112000 556000 668010
1 112000 555500 667510
2 112000 555000 667010
3 112000 554500 666510
4 112000 554000 666010
5 112000 553500 665510
https://stackoverflow.com/questions/72098727
复制相似问题