在嵌套循环中附加数据帧
append dataframe in nested loop
我有以下代码根据 2 个变量(bh 和频率)在函数中进行一些计算。当我 运行 没有循环的代码和固定值 bh 时,我得到一个正确的输出和保存在 .csv 文件中的数据框。:
bh frequency Re Im
0 1e-05 1 5.86848609615851 -0.999374346845734
1 1e-05 11 4.34298196390882 -0.994875549720418
2 1e-05 21 3.93236459069042 -0.99112086235206
3 1e-05 31 3.68545733552675 -0.987695572513367
4 1e-05 41 3.50849758486341 -0.984487932588323
但是,当我在 bh 上循环编码时,我想在 bh 值和频率列表上循环,我得到与以前相同的输出,这意味着它不循环。谁有解决方案来修改数据帧或将 eaxh bh 循环输出保存在新的 .csv 中以便稍后绘制数据。
from mpmath import *
import numpy as np
import cmath
import math
import pandas as pd
mp.dps = 15; mp.pretty = True
a = mpf(0.25)
b = mpf(0.25)
z = mpf(0.75)
frequency = np.arange(1, 50, 10) # frequency range
bh = np.arange(10e-6, 30e-6, 10e-6) #10e-6 # width
print(bh)
D = 1e-6 #7.8e-4 # diffusivity
gamma = 0.5772 # Euler constant
v = []
w =[]
i = []
def q(frequency):
for i in bh:
# for f in frequency:
omega = (((i ** 2) * 2 * math.pi * frequency) / D) # depends on bh and frequency
u = ((-j/(math.pi * omega))*meijerg([[1, 3/2], []], [[1, 1], [0.5, 0]], j*omega))
v = np.real(u)
w = np.imag(u)
return i, frequency, v, w
#transpose arrays
T = np.vectorize(q)
print(T(frequency))
df = np.array(T(frequency)).T
print(df)
# create DataFrame
df1 = pd.DataFrame(data=df, columns=['bh', 'frequency','Re', 'Im'])
print(df1)
#save in .csv
df1.to_csv('C:\Users\calculations\T.csv')
我不完全确定我是否理解你的问题域,但你似乎 return 循环的第一次迭代。通过在循环中使用 return ,您实际上提前终止了 for 循环。这应该在循环之外。此外,您不会将值保存在数组 v、w 和 i 中。您正在覆盖变量。
我做了一些修改(根据您的问题域可能不正确),但它应该可以完成您想要完成的工作。
from mpmath import *
import numpy as np
import cmath
import math
import pandas as pd
mp.dps = 15; mp.pretty = True
a = mpf(0.25)
b = mpf(0.25)
z = mpf(0.75)
frequencies = np.arange(1, 50, 10) # frequency range
bh = np.arange(10e-6, 30e-6, 10e-6) #10e-6 # width
print(bh)
D = 1e-6 #7.8e-4 # diffusivity
gamma = 0.5772 # Euler constant
v = []
w = []
i = []
bhs = []
freqs = []
def q(frequencies):
for frequency in frequencies:
for i in bh:
# for f in frequency:
omega = (((i ** 2) * 2 * math.pi * frequency) / D) # depends on bh and frequency
u = ((-j/(math.pi * omega))*meijerg([[1, 3/2], []], [[1, 1], [0.5, 0]], j*omega))
v.append(np.real(u))
w.append(np.imag(u))
bhs.append(i)
freqs.append(frequency)
return bhs, freqs, v, w
data = np.array(q(frequencies)).T
# create DataFrame
df1 = pd.DataFrame(data=data, columns=['bh', 'frequency','Re', 'Im'])
df1
输出:
bh frequency Re Im
0 1e-05 1 5.86848609615851 -0.999374346845734
1 2e-05 1 4.98625732244539 -0.99786698700645
2 1e-05 11 4.34298196390882 -0.994875549720418
3 2e-05 11 3.46384911041305 -0.983559190454865
4 1e-05 21 3.93236459069042 -0.99112086235206
5 2e-05 21 3.05626898509369 -0.972212391507732
6 1e-05 31 3.68545733552675 -0.987695572513367
7 2e-05 31 2.81234917403506 -0.962167989599812
8 1e-05 41 3.50849758486341 -0.984487932588323
9 2e-05 41 2.63833200578647 -0.952979213441469
10 1e-05 1 5.86848609615851 -0.999374346845734
11 2e-05 1 4.98625732244539 -0.99786698700645
12 1e-05 11 4.34298196390882 -0.994875549720418
13 2e-05 11 3.46384911041305 -0.983559190454865
14 1e-05 21 3.93236459069042 -0.99112086235206
15 2e-05 21 3.05626898509369 -0.972212391507732
16 1e-05 31 3.68545733552675 -0.987695572513367
17 2e-05 31 2.81234917403506 -0.962167989599812
18 1e-05 41 3.50849758486341 -0.984487932588323
19 2e-05 41 2.63833200578647 -0.952979213441469
20 1e-05 1 5.86848609615851 -0.999374346845734
21 2e-05 1 4.98625732244539 -0.99786698700645
22 1e-05 11 4.34298196390882 -0.994875549720418
23 2e-05 11 3.46384911041305 -0.983559190454865
24 1e-05 21 3.93236459069042 -0.99112086235206
25 2e-05 21 3.05626898509369 -0.972212391507732
26 1e-05 31 3.68545733552675 -0.987695572513367
27 2e-05 31 2.81234917403506 -0.962167989599812
28 1e-05 41 3.50849758486341 -0.984487932588323
29 2e-05 41 2.63833200578647 -0.952979213441469
我建议 (1) 提前生成 bh
和 frequency
的笛卡尔积,并且 (2) 仅矢量化您真正需要的部分,因为 np.vectorization 已知是成本高(即 meijerg()
不是矢量化函数)。笛卡尔积可以通过pd.MultiIndex.from_product
来完成(参见this answer)。
# run your code until gamma = 0.5772
# Cartesian product of input variables
idx = pd.MultiIndex.from_product([bh, frequency], names=["bh", "frequency"])
df = pd.DataFrame(index=idx).reset_index()
# Omega is vectorized naturally.
omega = (df["bh"].values**2 * df["frequency"].values) * (2 * math.pi / D)
# vectorize meijerg() only, so other operations won't interrupt with this
def f_u(omega_elem):
return (-j/(math.pi * omega_elem)) * meijerg([[1, 3/2], []], [[1, 1], [0.5, 0]], j*omega_elem)
f_u_vec = np.vectorize(f_u, otypes=[np.complex128]) # output complex
u = f_u_vec(omega) # np.complex128
df["Re"] = np.real(u)
df["Im"] = np.imag(u)
# output (please make sure your arange was set correctly)
df
Out[35]:
bh frequency Re Im
0 0.00001 1 5.868486 -0.999374
1 0.00001 11 4.342982 -0.994876
2 0.00001 21 3.932365 -0.991121
3 0.00001 31 3.685457 -0.987696
4 0.00001 41 3.508498 -0.984488
5 0.00002 1 4.986257 -0.997867
6 0.00002 11 3.463849 -0.983559
7 0.00002 21 3.056269 -0.972212
8 0.00002 31 2.812349 -0.962168
9 0.00002 41 2.638332 -0.952979
如果你想保存单独的 csv 文件,你可以这样做:
for bh_elem in bh:
fname = f"bh={bh_elem:.4e}.csv"
df_save = df[(df["bh"]==bh_elem)]
df_save.to_csv(fname)
N.B。在 pandas 1.1.3 和 python 3.7、debian 10 64 位
上测试
我有以下代码根据 2 个变量(bh 和频率)在函数中进行一些计算。当我 运行 没有循环的代码和固定值 bh 时,我得到一个正确的输出和保存在 .csv 文件中的数据框。:
bh frequency Re Im
0 1e-05 1 5.86848609615851 -0.999374346845734
1 1e-05 11 4.34298196390882 -0.994875549720418
2 1e-05 21 3.93236459069042 -0.99112086235206
3 1e-05 31 3.68545733552675 -0.987695572513367
4 1e-05 41 3.50849758486341 -0.984487932588323
但是,当我在 bh 上循环编码时,我想在 bh 值和频率列表上循环,我得到与以前相同的输出,这意味着它不循环。谁有解决方案来修改数据帧或将 eaxh bh 循环输出保存在新的 .csv 中以便稍后绘制数据。
from mpmath import *
import numpy as np
import cmath
import math
import pandas as pd
mp.dps = 15; mp.pretty = True
a = mpf(0.25)
b = mpf(0.25)
z = mpf(0.75)
frequency = np.arange(1, 50, 10) # frequency range
bh = np.arange(10e-6, 30e-6, 10e-6) #10e-6 # width
print(bh)
D = 1e-6 #7.8e-4 # diffusivity
gamma = 0.5772 # Euler constant
v = []
w =[]
i = []
def q(frequency):
for i in bh:
# for f in frequency:
omega = (((i ** 2) * 2 * math.pi * frequency) / D) # depends on bh and frequency
u = ((-j/(math.pi * omega))*meijerg([[1, 3/2], []], [[1, 1], [0.5, 0]], j*omega))
v = np.real(u)
w = np.imag(u)
return i, frequency, v, w
#transpose arrays
T = np.vectorize(q)
print(T(frequency))
df = np.array(T(frequency)).T
print(df)
# create DataFrame
df1 = pd.DataFrame(data=df, columns=['bh', 'frequency','Re', 'Im'])
print(df1)
#save in .csv
df1.to_csv('C:\Users\calculations\T.csv')
我不完全确定我是否理解你的问题域,但你似乎 return 循环的第一次迭代。通过在循环中使用 return ,您实际上提前终止了 for 循环。这应该在循环之外。此外,您不会将值保存在数组 v、w 和 i 中。您正在覆盖变量。
我做了一些修改(根据您的问题域可能不正确),但它应该可以完成您想要完成的工作。
from mpmath import *
import numpy as np
import cmath
import math
import pandas as pd
mp.dps = 15; mp.pretty = True
a = mpf(0.25)
b = mpf(0.25)
z = mpf(0.75)
frequencies = np.arange(1, 50, 10) # frequency range
bh = np.arange(10e-6, 30e-6, 10e-6) #10e-6 # width
print(bh)
D = 1e-6 #7.8e-4 # diffusivity
gamma = 0.5772 # Euler constant
v = []
w = []
i = []
bhs = []
freqs = []
def q(frequencies):
for frequency in frequencies:
for i in bh:
# for f in frequency:
omega = (((i ** 2) * 2 * math.pi * frequency) / D) # depends on bh and frequency
u = ((-j/(math.pi * omega))*meijerg([[1, 3/2], []], [[1, 1], [0.5, 0]], j*omega))
v.append(np.real(u))
w.append(np.imag(u))
bhs.append(i)
freqs.append(frequency)
return bhs, freqs, v, w
data = np.array(q(frequencies)).T
# create DataFrame
df1 = pd.DataFrame(data=data, columns=['bh', 'frequency','Re', 'Im'])
df1
输出:
bh frequency Re Im
0 1e-05 1 5.86848609615851 -0.999374346845734
1 2e-05 1 4.98625732244539 -0.99786698700645
2 1e-05 11 4.34298196390882 -0.994875549720418
3 2e-05 11 3.46384911041305 -0.983559190454865
4 1e-05 21 3.93236459069042 -0.99112086235206
5 2e-05 21 3.05626898509369 -0.972212391507732
6 1e-05 31 3.68545733552675 -0.987695572513367
7 2e-05 31 2.81234917403506 -0.962167989599812
8 1e-05 41 3.50849758486341 -0.984487932588323
9 2e-05 41 2.63833200578647 -0.952979213441469
10 1e-05 1 5.86848609615851 -0.999374346845734
11 2e-05 1 4.98625732244539 -0.99786698700645
12 1e-05 11 4.34298196390882 -0.994875549720418
13 2e-05 11 3.46384911041305 -0.983559190454865
14 1e-05 21 3.93236459069042 -0.99112086235206
15 2e-05 21 3.05626898509369 -0.972212391507732
16 1e-05 31 3.68545733552675 -0.987695572513367
17 2e-05 31 2.81234917403506 -0.962167989599812
18 1e-05 41 3.50849758486341 -0.984487932588323
19 2e-05 41 2.63833200578647 -0.952979213441469
20 1e-05 1 5.86848609615851 -0.999374346845734
21 2e-05 1 4.98625732244539 -0.99786698700645
22 1e-05 11 4.34298196390882 -0.994875549720418
23 2e-05 11 3.46384911041305 -0.983559190454865
24 1e-05 21 3.93236459069042 -0.99112086235206
25 2e-05 21 3.05626898509369 -0.972212391507732
26 1e-05 31 3.68545733552675 -0.987695572513367
27 2e-05 31 2.81234917403506 -0.962167989599812
28 1e-05 41 3.50849758486341 -0.984487932588323
29 2e-05 41 2.63833200578647 -0.952979213441469
我建议 (1) 提前生成 bh
和 frequency
的笛卡尔积,并且 (2) 仅矢量化您真正需要的部分,因为 np.vectorization 已知是成本高(即 meijerg()
不是矢量化函数)。笛卡尔积可以通过pd.MultiIndex.from_product
来完成(参见this answer)。
# run your code until gamma = 0.5772
# Cartesian product of input variables
idx = pd.MultiIndex.from_product([bh, frequency], names=["bh", "frequency"])
df = pd.DataFrame(index=idx).reset_index()
# Omega is vectorized naturally.
omega = (df["bh"].values**2 * df["frequency"].values) * (2 * math.pi / D)
# vectorize meijerg() only, so other operations won't interrupt with this
def f_u(omega_elem):
return (-j/(math.pi * omega_elem)) * meijerg([[1, 3/2], []], [[1, 1], [0.5, 0]], j*omega_elem)
f_u_vec = np.vectorize(f_u, otypes=[np.complex128]) # output complex
u = f_u_vec(omega) # np.complex128
df["Re"] = np.real(u)
df["Im"] = np.imag(u)
# output (please make sure your arange was set correctly)
df
Out[35]:
bh frequency Re Im
0 0.00001 1 5.868486 -0.999374
1 0.00001 11 4.342982 -0.994876
2 0.00001 21 3.932365 -0.991121
3 0.00001 31 3.685457 -0.987696
4 0.00001 41 3.508498 -0.984488
5 0.00002 1 4.986257 -0.997867
6 0.00002 11 3.463849 -0.983559
7 0.00002 21 3.056269 -0.972212
8 0.00002 31 2.812349 -0.962168
9 0.00002 41 2.638332 -0.952979
如果你想保存单独的 csv 文件,你可以这样做:
for bh_elem in bh:
fname = f"bh={bh_elem:.4e}.csv"
df_save = df[(df["bh"]==bh_elem)]
df_save.to_csv(fname)
N.B。在 pandas 1.1.3 和 python 3.7、debian 10 64 位
上测试