问题描述
我有一个 csv 格式的数据集。字段之一是“elem_type”。基于这种类型,我需要创建不同类型的节点,并在使用 csv load 加载数据时根据“elem_type”为我的 csv 的“列”提供不同的名称,有什么办法吗?
我的 csv 没有标题,数据如下所示:
'''
from typing import Callable
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
import pandas as pd
import pyodbc
from notebook.utils import *
fun = Callable[[float],float]
data=pd.read_excel('rova_prof.xlsx')
print (data)
x = data.iloc[:,:-1].values
print(x)
z = data.iloc[:,-1].values
print(z)
def __prepare__(data,x,z,method="linear"): # No keywords in this case
return member_table()
x= np.linspace(x[0],x[-1])
z=np.linspace (z[0],z[-1])
plt.plot(x,clip_on = False)
plt.show ()
def solve_inplicit_gen(c: float,f: fun,g: fun,initial: fun,T: float,a: float,b: float,dt: float,dx: float,th:float = 0.5,gen=0):
ddx = dx * dx
lam = c * c * dt / ddx
print(lam)
J = ((b - a) // dx + 1)
N = (T // dt + 1)
zac=np.zeros(J)
for i in range (0,J):
zac[i]= initial(a + i * dx)
print (i)
U1 = zac
U2 = np.zeros(J)
'return U'
for n in range(1,N):
for i in range(1,J - 1):
U2[i] = lam * (U1[i - 1] - 2 * U1[i] + U1[i + 1]) + U1[i]
U2[0] = f(a)
U2[-1] = g(b)
if n % gen == 0:
yield U1
U1 = U2
U2 = np.zeros(J)
a = z[len(z) // 2]
b = z[-1]
print(a,b)
D = 20e-4
c = D ** 0.5
initial = z
f = lambda x: int(a)
g = lambda x: int(b)
dx = (b - a) / 100
dt = 1 / (2 * c * c) * dx * dx
#dt = 10
#ddt = 100
T = 100*dt
X = np.arange(a,b + dx,dx)
if x[-1] > b:
x = x[:-1]
Z = np.arange(0,T + dt,dt)
if z[-1] > T:
z = z[:-1]
plt.plot([X],[Z],label="Initial state")
gy = 1000
for year,value in enumerate(solve_inplicit_gen (c,f,g,initial,T,a,b,dt,dx,gen=gy)):
plt.plot(X,part,label=str(year*gy) + " years")
# plt.show()
# input()
leg = plt.legend(loc='lower left',shadow=True,fontsize='x-small')
leg.get_frame().set_facecolor('#00FFCC')
plt.title("Profile 1")
plt.show()
'''
'''
TypeError Traceback (most recent call last)
<ipython-input-6-3ee8690ef980> in <module>
24 plt.plot([X],label="Initial state")
25 gy = 1000
---> 26 for year,gen=gy)):
27 plt.plot(X,label=str(year*gy) + " years")
28 # plt.show()
<ipython-input-5-2f0af14af86b> in solve_inplicit_gen(c,th,gen)
18
19
---> 20 zac=np.zeros(J)
21 for i in range (0,J):
22 zac[i]= initial(a + i * dx)
TypeError: 'numpy.float64' object cannot be interpreted as an integer
'''
基于第一列是我的“elem_type”,我想加载数据并定义 3 种类型的节点(人、车、船),并基于 elem_type 定义不同的标题
解决方法
我强烈建议将 csv 文件预解析为每个标签的单独文件。这将使导入的密码变得更加容易。在下面,我通过将 CASE 命令包装在 FOREACH 中使用了一个小技巧:
load csv from "file:///test.csv" as line
foreach (i in case when line[0] = '0' then [1] else [] end |
merge (p:Person {id: line[1]}) set p.name = line[2] )
foreach (i in case when line[0] = '1' then [1] else [] end |
merge (c:Car {id: line[1]}) set c.name = line[2],c.color = line[4] )
foreach (i in case when line[0] = '2' then [1] else [] end |
merge (b:Boat {id: line[1]}) set b.name = line[2] )
另外,不要忘记为要合并的属性添加索引。