# -*- coding:utf-8 -*-
#預測功率和電流之間的關係,並畫圖展現
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
from pandas import DataFrame
import time
#設置字符集,防止中文亂碼
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False
path1='datas/household_power_consumption.txt'
df=pd.read_csv(path1,sep=';',low_memory=False)#沒有混合類型的時候能夠經過low_memory=F調用更多內存,加快效率)
#print(df.head(n=5))
#print(df.info())
# 異常數據處理(異常數據過濾)
new_df = df.replace('?',np.nan)#替換非法字符爲np.nan
datas = new_df.dropna(axis=0,how = 'any') #只要有一個數據爲空,就進行刪除操做
#print(datas.describe().T) #觀察數據的多種統計指標
#功率和電流之間的關係
X = datas.iloc[:200,2:4]
Y2 = datas.iloc[:200,5]
## 數據分割
X2_train,X2_test,Y2_train,Y2_test = train_test_split(X, Y2, test_size=0.2, random_state=0)
## 數據歸一化
scaler2 = StandardScaler()
X2_train = scaler2.fit_transform(X2_train) # 訓練並轉換
X2_test = scaler2.transform(X2_test) ## 直接使用在模型構建數據上進行一個數據標準化操做
## 模型訓練
lr2 = LinearRegression()
lr2.fit(X2_train, Y2_train) ## 訓練模型
## 結果預測
Y2_predict = lr2.predict(X2_test)
## 模型評估
print("電流預測準確率: ", lr2.score(X2_test,Y2_test))
print("電流參數:", lr2.coef_)
## 繪製圖表
#### 電流關係
t=np.arange(len(X2_test))
plt.figure(facecolor='w')
plt.plot(t, Y2_test, 'r-', linewidth=2, label=u'真實值')
plt.plot(t, Y2_predict, 'g-', linewidth=2, label=u'預測值')
plt.legend(loc = 'lower right')
plt.title(u"線性迴歸預測功率與電流之間的關係", fontsize=20)
plt.grid(b=True)
plt.show()
