利用Pycharm连接MySQL,利用Python代码通过提取数据库的内容,将其封装到本地,为训练模型提供了源数据支持,利用机器学习算法岭回归对数据进行线性回归,进而得到最终的预测结果。
(1)创建预测表
CREATE TABLE `ads_cscd_predict_profit_i_y` (
`fc_date` text COLLATE utf8mb4_unicode_ci,
`fc_net_profit` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
建立连接如下,更换为自己的IP:
engine = create_engine('mysql+pymysql://root:[email protected]:3306/cscd')
查询数据并封装到本地等待使用
sql = "SELECT a_date, profit_ratio FROM ads_cscd_date_profit_total_asset_i_y"
df = pd.read_sql(sql, engine)
X = df['a_date'].astype('category').cat.codes.values.reshape(-1, 1)
y = df['profit_ratio']
使用岭回归预测模型选择和训练
model = LinearRegression()
model.fit(X, y)
设置预测的自变量操作数据集
data_to_insert = {
'a_date': ['2023年', '2024年','2025年'],
'profit_ratio': ['0', '0', '0']
}
读取新数据
df_to_insert = pd.DataFrame(data_to_insert)
df_to_insert.to_sql('ads_cscd_predict_profit_ratio_i_y', con=engine, if_exists='replace', index=False)
sql_new = "SELECT a_date FROM ads_cscd_predict_profit_ratio_i_y"
df_new = pd.read_sql(sql_new, engine)
特征选择
X_new = df_new['a_date'].astype('category').cat.codes.values.reshape(-1, 1)
模型预测
y_new = model.predict(X_new)
预测结果写入数据库
df_new['profit_ratio'] = y_new
df_new['a_date'] = data_to_insert['a_date']
df_new.to_sql('ads_cscd_predict_profit_ratio_i_y', con=engine, if_exists='replace', index=False)
打印输出
print(df_new)
(2)PredictProfit代码
这段代码的作用是使用历史净利润数据建立一个线性回归模型,然后利用该模型对未来某几个时间点的净利润进行预测,并将预测结果插入到数据库表 中。具体步骤如下:
从数据库表ads_cscd_profit_asset_rate_i_y中读取历史净利润数据;
对历史净利润数据进行特征工程处理,将日期转换为数字编码;
建立线性回归模型并训练;
构造需要预测的新数据,并插入到数据库表ads_cscd_predict_profit_i_y中;
从数据库表ads_cscd_predict_profit_i_y中读取待预测的新数据;
对新数据进行特征处理,将日期转换为数字编码;
利用已经训练好的线性回归模型对新数据进行预测;
将预测结果插入到数据库表ads_cscd_predict_profit_i_y中。
# 建立连接
engine = create_engine('mysql+pymysql://root:[email protected]:3306/cscd')
# 读取历史数据
sql = "SELECT fc_date, fc_net_profit FROM ads_cscd_profit_asset_rate_i_y"
df = pd.read_sql(sql, engine)
# 特征工程
X = df['fc_date'].astype('category').cat.codes.values.reshape(-1, 1)
y = df['fc_net_profit']
# 模型选择和训练
model = LinearRegression()
model.fit(X, y)
data_to_insert = {
'fc_date': ['2023年下半年', '2024年上半年', '2024年下半年'],
'fc_net_profit': ['0', '0', '0']
}
# 将数据转换为DataFrame
df_to_insert = pd.DataFrame(data_to_insert)
# 插入数据到数据库表中
df_to_insert.to_sql('ads_cscd_predict_profit_i_y', con=engine, if_exists='replace', index=False)
# 读取新数据
sql_new = "SELECT fc_date FROM ads_cscd_predict_profit_i_y"
df_new = pd.read_sql(sql_new, engine)
# 对新数据进行特征处理
X_new = df_new['fc_date'].astype('category').cat.codes.values.reshape(-1, 1)
# 预测新数据
y_new = model.predict(X_new)
# 将预测结果插入数据库表中
df_new['fc_net_profit'] = y_new
df_new['fc_date'] = data_to_insert['fc_date'] # 将日期恢复为原始字符串类型
df_new.to_sql('ads_cscd_predict_profit_i_y', con=engine, if_exists='replace', index=False)
print(df_new)
(3)PredictProfitRatio代码
这段代码的作用和上一段代码类似,也是使用历史数据建立一个线性回归模型,并利用该模型对未来某几个时间点的数据进行预测。具体步骤如下:
从数据库表ads_cscd_date_profit_total_asset_i_y中读取历史收益率数据;
对历史收益率数据进行特征工程处理,将日期转换为数字编码;
建立线性回归模型并训练;
构造需要预测的新数据,并插入到数据库表ads_cscd_predict_profit_ratio_i_y 中;
从数据库表ads_cscd_predict_profit_ratio_i_y中读取待预测的新数据;
对新数据进行特征处理,将日期转换为数字编码;
利用已经训练好的线性回归模型对新数据进行预测;
将预测结果插入到数据库表ads_cscd_predict_profit_ratio_i_y中。
# 建立连接
engine = create_engine('mysql+pymysql://root:[email protected]:3306/cscd')
sql = "SELECT a_date, profit_ratio FROM ads_cscd_date_profit_total_asset_i_y"
df = pd.read_sql(sql, engine)
X = df['a_date'].astype('category').cat.codes.values.reshape(-1, 1)
y = df['profit_ratio']
# 模型选择和训练
model = LinearRegression()
model.fit(X, y)
data_to_insert = {
'a_date': ['2023年', '2024年','2025年'],
'profit_ratio': ['0', '0', '0']
}
df_to_insert = pd.DataFrame(data_to_insert)
df_to_insert.to_sql('ads_cscd_predict_profit_ratio_i_y', con=engine, if_exists='replace', index=False)
# 读取新数据
sql_new = "SELECT a_date FROM ads_cscd_predict_profit_ratio_i_y"
df_new = pd.read_sql(sql_new, engine
# 对新数据进行特征处理
X_new = df_new['a_date'].astype('category').cat.codes.values.reshape(-1, 1)
y_new = model.predict(X_new)
# 将预测结果插入数据库表中
df_new['profit_ratio'] = y_new
df_new['a_date'] = data_to_insert['a_date'] # 将日期恢复为原始字符串类型
df_new.to_sql('ads_cscd_predict_profit_ratio_i_y', con=engine, if_exists='replace', index=False)
print(df_new)
图1利润预测结果
图2 利润变化率预测结果