将CSV中的数据导入,并且指定自己想要的数据
import pandas as pd
df = pd.read_csv('E:\I-V数据\RRAM_forming.csv')
data = df.iloc[222:, 1:3]
直接将csv里的数据读入,得到的是str字符串类型,所以要将字符串转化为float
print(type(a[0]))#打印列表第一个元素的类型
print(a[0])
a=list(map(float,a))#把list内的元素变成float型
print(type(a[0]))#显示改变后元素的类型
print(a)
因为想要做拟合,所以要分别得到已知的x和y:对x和y的数据类型做处理
这里申明一下,因为我的数据是捏滞回线,所以就相当于一个x,在图形上看起来会对应两个y,所以就要把我的数据分段处理。(其实有一个想法,就是当x单调递增的时候,一个函数拟合,递减的时候一个函数。)先把当x大于0的数据,分为了0-最大值,另一半数据从下一个到最后。两组数据分别得到它的预测数据,然后将x,y,y预测值一起画图。
x = np.array(df.iloc[222:, 1]) #指定从222行开始的位置到最后一行,第二列的这一列数据为x
x = list(map(float, x)) #x是元素为字符串的list,将其转化成float类型
a = x.index(max(x)) #最大值的位置
x1 = (x[0:a+1]) #选择从0到最大值的数据
x1 = np.array(x1) #转为数组类型
x1 = x1.reshape(len(x1), 1) #将x拉成一列
x2 = (x[a+1:]) #从最大的一个值下一个值到数据结束
x2 = np.array(x2)
x2 = x2.reshape(len(x2), 1)
y = np.array(df.iloc[222:, 2])
y = list(map(float, y))
b = y.index(max(y))
y1 = (y[0:b+1])
y1 = np.array(y1)
y1 = y1.reshape(len(y1), 1)
y2 = (y[b+1:])
y2 = np.array(y2)
y2 = y2.reshape(len(y2), 1)
接下来就是做多项式拟合拟合
def n_ploy_fit_formula(self):
_x = self.x.reshape(self.m, 1)
_y = self.y.reshape(self.m, 1)
X = _x ** self.n
for i in range(self.n - 1):
X = np.hstack((X, _x ** (self.n - i - 1))) #构建多项式的方程
X = np.hstack((X, np.ones((self.m, 1)))) #加一个常数
#通过线性代数已知x和y来求解各个系数
self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(_y)
#用求解出来的方程和已知的x求解y的预测值
self.y_hat = X.dot(self.w)
return self.y_hat
#返回的是求得的预测值,因为要分别调用两次函数,所以要将预测值值拼接起来,最后将所有的值画图
判断拟合的结果如何(套用固定公式)
def stats_cal(self):
self.sst = ((self.y - self.y.mean()) ** 2).sum()
self.sse = ((self.y - self.y_hat) ** 2).sum()
self.ssr = ((self.y_hat - self.y.mean()) ** 2).sum()
self.r2 = self.ssr / self.sst
画图
def plot_PF(self, x, y, y_hat):
x = np.array(x)
x = x.reshape(len(x), 1)
y = np.array(y)
y = y.reshape(len(y), 1)
plt.figure(figsize=(8, 6))
plt.plot(x, y, '+', label='original data')
plt.plot(x, y_hat, 'r-', lw=2, label='Polynomial Curve Fitting')
plt.legend(fontsize=12)
plt.grid(alpha=0.5)
plt.show()
整个过程全部代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
class Ployfit:
def __init__(self, x_data, y_data, n, label_list=None):
if label_list is None:
label_list = ['x', 'y']
self.x = x_data
self.y = y_data
self.n = n # 多项式阶数
self.x_label = label_list[0] # 自变量名称
self.y_label = label_list[1] # 因变量名称
self.m = len(self.x) # 样本量
self.w = np.zeros((self.n, 1))
self.y_hat = np.zeros((self.m, 1))
self.sst = 0.0
self.sse = 0.0
self.ssr = 0.0
self.r2 = 0.0
def n_ploy_fit_formula(self):
_x = self.x.reshape(self.m, 1)
_y = self.y.reshape(self.m, 1)
X = _x ** self.n
for i in range(self.n - 1):
X = np.hstack((X, _x ** (self.n - i - 1))) #构建多项式的方程
X = np.hstack((X, np.ones((self.m, 1)))) #加一个常数
self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(_y) #通过线性代数已知x和y来求解各个系数
self.y_hat = X.dot(self.w) #用求解出来的方程和已知的x求解y的预测值
return self.y_hat
def stats_cal(self):
self.sst = ((self.y - self.y.mean()) ** 2).sum()
self.sse = ((self.y - self.y_hat) ** 2).sum()
self.ssr = ((self.y_hat - self.y.mean()) ** 2).sum()
self.r2 = self.ssr / self.sst
def plot_PF(self, x, y, y_hat):
x = np.array(x)
x = x.reshape(len(x), 1)
y = np.array(y)
y = y.reshape(len(y), 1)
plt.figure(figsize=(8, 6))
plt.plot(x, y, '+', label='original data')
plt.plot(x, y_hat, 'r-', lw=2, label='Polynomial Curve Fitting')
plt.legend(fontsize=12)
plt.grid(alpha=0.5)
plt.show()
if __name__ == '__main__':
df = pd.read_csv('E:\I-V数据\RRAM_forming.csv')
data = df.iloc[222:, 1:3]
x = np.array(df.iloc[222:, 1]) #指定从222行开始的位置到最后一行,第二列的这一列数据为
x = list(map(float, x)) #x是内部为字符串的列表,将其转化成float类型
a = x.index(max(x)) # 最大值的位置
x1 = (x[0:a+1])
x1 = np.array(x1) #转为数组类型
x1 = x1.reshape(len(x1), 1) #将x拉成一列
x2 = (x[a+1:])
x2 = np.array(x2) # 转为数组类型
x2 = x2.reshape(len(x2), 1)
y = np.array(df.iloc[222:, 2])
y = list(map(float, y))
b = y.index(max(y))
y1 = (y[0:b+1])
y1 = np.array(y1)
y1 = y1.reshape(len(y1), 1)
y2 = (y[b+1:])
y2 = np.array(y2)
y2 = y2.reshape(len(y2), 1)
PF1 = Ployfit(x1, y1, 10)
y1_hat = PF1.n_ploy_fit_formula()
PF1.stats_cal()
PF2 = Ployfit(x2, y2, 10)
PF2.n_ploy_fit_formula()
PF2.stats_cal()
y2_hat = PF2.n_ploy_fit_formula()
y_hat = np.append(y1_hat, y2_hat)
PF2.plot_PF(x, y, y_hat)