今天本来想用之前做过的一个作业的数据试一下线性回归的代码,结果因为用Python读取SQLite3中数据的格式问题耽误了很长时间。
大致问题是:用pd.read.sql读取后生成的DataFrame中的数据有几个表现:
1.都是object
2.有空值 但是原始数据里并不是直接为空 而是‘NDA’,实际上就是一个字符串,而不是NaN或者None
3.数据中的数字数据也都是str形式而不是float。
因为‘NDA’没法转float所以直接用dtype=np.float的方法失效了
折腾了一番搞出了一个有一些麻烦的办法,思路大致为:
1.pd.read.sql读取sqlite3中的table
2.选取目标列,此处为2列,组成了一个dataframe
3.将2列分别变成列表list1&2
4.用for循环同时嵌套try except语句对list中数值进行float转换,若为NDA则直接append,分别将值加入list3&4
5.将list3&4组成新的dataframe
6.利用df.replace语句将所有的NDA替换为np.nan
7.之后由于python认识的“空值”已设置好,同时数值也都转为float就可以进行所需要的数学统计操作了。
import sqlite3
from sklearn.linear_model import LinearRegression
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib as plt
conn=sqlite3.connect("xxxxxx.db")
cur = conn.cursor()
lm=LinearRegression()
df=pd.read_sql('SELECT * FROM xxxxxx',conn)
a=df[['Graduation_Rate','Teachers_Score']]
print(a)
list1=a['Graduation_Rate'].tolist()
list2=a['Teachers_Score'].tolist()
list3=list()
list4=list()
for ele1 in list1:
try:
list3.append(float(ele1))
except:
list3.append(ele1)
for ele2 in list2:
try:
list4.append(float(ele2))
except:
list4.append(ele2)
df=pd.DataFrame({'a':list3,"b":list4})
df.replace('NDA',np.nan,inplace = True)
mean1=df['a'].mean()
mean2=df['b'].mean()
print(mean1)
print(mean2)
df['a'].replace(np.nan,mean1,inplace = True)
df['b'].replace(np.nan,mean2,inplace = True)
print(df)
X=df[['a']]
Y=df[['b']]
lm.fit(X,Y)
sns.regplot(x='a',y='b',data=df)
print("Y=",float(lm.intercept_),"+",float(lm.coef_),"*X",sep="")
Ebooor
原创文章 1获赞 0访问量 126
关注
私信
展开阅读全文