【发布时间】:2018-10-22 13:18:17
【问题描述】:
我的具体问题是我似乎无法将我的数据转换为浮点数。我有数据,只是想用我的模型方程拟合一条稳健的曲线:
y = a * e^(-b*z)
这本食谱是我的参考:click
以下是我的尝试。我得到了这个:
TypeError: '数据类型不理解'
我认为这是因为我的列是字符串,所以我尝试了pd.Series.astype()。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import least_squares
for i in range(1):
def model(z, a, b):
y = a * np.exp(-b * z)
return y
data = pd.read_excel('{}.xlsx'.format(600+i), names = ['EdGnd','380','395','412','443','465','490','510','520','532','555','560','565','589','625','665','670','683','694','710','Temp','z','EdZTemp','Tilt','Roll','EdZVin'])
data.dropna(axis = 0, how = 'any')
data.astype('float')
np.dtype(data)
data.plot.scatter('z','380')
def fun(x, z, y):
return x[0] * np.exp(-x[1] * z) - y
x0 = np.ones(3)
rbst1 = least_squares(fun, x0, loss='soft_l1', f_scale=0.1, args=('z', 'ed380'))
y_robust = model('z', *rbst1.x)
plt.plot('z', y_robust, label='robust lsq')
plt.xlabel('$z$')
plt.ylabel('$Ed$')
plt.legend();
【问题讨论】:
-
args=('z', '380')应该做什么?z的值是否应该具有380的值?两者都是字符串,因此您不能将其用于乘法。你能提供一个用于调试目的的小数据集吗?! -
非常感谢您的回复! least_squares 中的参数是我想要适合的 x 和 y 值。不知道为什么,但看看食谱,作者似乎就是这么做的。 z是深度,380是光的波长。我将尝试将字符串放入数组中。
-
我的数据长度在不同文件之间变化到大约 100-200 行。它有 26 列宽。很遗憾,我无法上传文件。
-
嗯,我正在尝试使用 pd.Series.astype() 将我的数据作为浮点数。 np.dtype() 是说:数据类型不被理解。这是我第一次使用熊猫。
标签: python scipy least-squares non-linear-regression robust