excel中读取数据拟合幂律分布
⾸先要做的是绘制CDF或者PDF,概率密度分布图和概率分布图,cdf其实就是pdf求导后的结果。有了概率分布图对x和y同时取对数,就知道是不是幂律分布了。
我的数据只有⼀列,⽤pandas读进来就⾏了,算每个x的概率就是Y,放df的两列中
#!/usr/bin/env python
# -*-coding:utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
from scipy.stats import norm
import pandas as pd
#数据处理,准备好要拟合幂律分布的x和y
def DataGenerate():
data =[]
data = pd.read_csv(r"C:\Users\Administrator\Desktop\概率密度图像绘制\26235.csv", header=None)
#检查有没有空值,返回ture就是有false就是没有
print(data.isnull().any())
denominator =len(data[0])# 分母数量
Data = pd.Series(data[0])# 将数据转换为Series利⽤分组频数计算
Fre = Data.value_counts()
Fre_sort = Fre.sort_index(axis=0, ascending=True)
Fre_df = set_index()# 将Series数据转换为DataFrame
Fre_df[0]= Fre_df[0]/ denominator # 转换成概率np.log()
lumns =['Rds','Fre']
X = Fre_df['Rds']
Y = Fre_df['Fre']
# plot raw data
Y=np.array(Y)
plt.title("Raw data")
plt.scatter(X, Y, color='black')
plt.show()
#对x和y取对数
X=np.log(X)# 对X,Y取双对数
Y=np.log(Y)
return X,Y
#拟合幂律分布
def DataFitAndVisualization(X,Y):
# 模型数据准备
X_parameter=[]
Y_parameter=[]
python怎么读取excel的数据for single_square_feet ,single_price_value in zip(X,Y):
X_parameter.append([float(single_square_feet)])
Y_parameter.append(float(single_price_value))
# if len(Y_parameter): #
# print('Y 为⾮空list') # 存在值即为True
# else:
# print('Y 为空list') # 不存在值即为FALSE
# 模型拟合
regr = linear_model.LinearRegression()
regr.fit(X_parameter, Y_parameter)
# 模型结果与得分
print('Coefficients: \n', f_,)
print("Intercept:\n",regr.intercept_)
# The mean square error
print("Residual sum of squares: %.8f"
% np.mean((regr.predict(X_parameter)- Y_parameter)**2))# 残差平⽅和
# 可视化
plt.title("Log Data")
plt.scatter(X_parameter, Y_parameter, color='black')
plt.plot(X_parameter, regr.predict(X_parameter), color='blue',linewidth=3)
# icks(())
# icks(())
plt.show()
if __name__=="__main__":
X,Y=DataGenerate()
DataFitAndVisualization(X,Y)
最后要注意的是数据中不能出现0值和空值,不然会报错
File "C:\Users\Administrator\PycharmProjects\untitled\venv\lib\site-packages\sklearn\utils\validation.py", line 100,in _assert_all_finite
msg_dtype if msg_dtype is not None else X.dtype)
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
Process finished with exit code 1
有空值肯定不⾏,可以⽤如下来检查输⼊有没有空值`
#检查有没有空值,返回ture就是有false就是没有
print(data.isnull().any())
如果没有空值还报错就是因为有0值,因为log0是⽆穷值,报错⾥都说了“a value too large for dtype(‘float64’)”。所以不能有0值。0值还会影响斜率,要么就直接删除掉0值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论