二次指数平滑算法Python实现

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import pymysql
# Read data from csv files
# df = pd.read_csv('E://CapacityData/test-data-set/MeishanRenshou.csv')
# Read data from mysql, including downstream_userplane_flux, max_rrc_connection_number.
conn = pymysql.connect(user='root', passwd='root123',
                       host='localhost', db='capacitypredict', charset='utf8')
cur = conn.cursor()
cur.execute("select concat(netelement,cellid)as id , max_rrc_connection_number from table"
            "where DATE_FORMAT(starttime, '%Y-%m-%d')>='2016-11-01' "
            "and DATE_FORMAT(starttime, '%Y-%m-%d')<='2016-12-07'"
            "order by id ")
sqlData = cur.fetchall()
cur.close()
conn.close()
print(sqlData)
originalId = sqlData[0][0]
data = []
SRMSE = []; SMAPE = []; SMSE = []; fPredictData = []; fOriginalData =[]
lead = 7  # Define predict steps
# Define alpha, which used to adjust weights
alpha = 0.3
for d in sqlData:
    print(d)
    if d[0] == originalId:
        data.append(float(d[1]))
    else:
        # Testing the data's length
        if len(data) == 37:
            # In this section, we calculate the one-ES
            S1 = []
            firstS1 = 0
            for t in range(0, len(data)):
                if t == 0:
                    for n in range(0, 3):
                        print(data)
                        firstS1 += float(data[n])
                    S1.append(firstS1/3)
                else:
                    S1_diff = alpha*data[t-1] + (1-alpha)*S1[t-1]
                    S1.append(S1_diff)
            print(S1)


            # In the next part, we compute the two—ES
            S2 = []
            firstS2 = 0
            for s in range(0, len(S1)):
                if s == 0:
                    for m in range(0, 3):
                        firstS2 += float(S1[m])
                    S2.append(firstS2/3)
                else:
                    S2_diff = alpha*S1[s-1] + (1-alpha)*S2[s-1]
                    S2.append(S2_diff)
            print(S2[1:10]) # Output several S2 data


            # Next, calculate the parameters slope & intercept
            slope = 0
            intercept = 0
            predictValues = []
            for i in range(0, len(data)):
                intercept = 2*S1[i] - S2[i]
                slope = (alpha/(1-alpha))*(S1[i]-S2[i])
                predict = intercept + slope*lead
                predictValues.append(abs(predict))


            # Define how many days or weeks, we want to predict: K_count
            K_count = 7
            # original data
            originalData = data[len(data)-K_count:len(data)]
            print(len(originalData))
            # predicted values. I discard the last value, because it is the predicted value for t+1
            predictData = predictValues[len(predictValues) - lead - K_count:len(predictValues) - lead]
            print(len(predictData))
            # Computing the indicators like RMSE, MAPE //(import math math.sqrt)
            MSE = sum((np.array(originalData)-predictData)**2)/K_count
            MAPE = sum(abs(np.array(originalData)-predictData)/(np.array(originalData)+0.001))/K_count
            print("the model's RMSE is: ", MSE)
            print("the model's MAPE is: ", MAPE)
            SMSE.append(MSE)
            SMAPE.append(MAPE)
            # Resetting the var: data
            data = []
            # Alter the originalId
            print(d)
            originalId = d[0]
            data.append(float(d[1]))
            # Storing the predicted data and
            fOriginalData.append(originalData)
            fPredictData.append(predictData)
        else:
            data = []
            originalId = d[0]
            data.append(float(d[1]))


# Print the final values of error indicators
meanMse = sum(SMSE) / len(SMSE)

print("This district's mean mse is: ", meanMse)







你可能感兴趣的:(机器学习)