# 2023年美赛C题Wordle预测问题二建模及Python代码详细讲解

## 1 数据分析与特征工程

（1）将2023-3-1的EERIR样本，加入到数据集中，和所有数据集一起预处理和做特征工程。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

data = df.drop(columns='Unnamed: 0')
data.loc[len(data)] = ['2023-3-1',np.nan,'eerie',np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]
data['Date'] = pd.to_datetime(data['Date'])
df =data.copy()
df['Words']  = df['Word'].apply(lambda x:str(list(x))[1:-1].replace("'","").replace(" ",""))
df['w1'], df['w2'],df['w3'], df['w4'],df['w5'] = df['Words'].str.split(',',n=4).str
df


small = [str(chr(i)) for i in range(ord('a'),ord('z')+1)]
letter_map = dict(zip(small,range(1,27)))
letter_map


{‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5, ‘f’: 6, ‘g’: 7, ‘h’: 8, ‘i’: 9, ‘j’: 10, ‘k’: 11, ‘l’: 12, ‘m’: 13, ‘n’: 14, ‘o’: 15, ‘p’: 16, ‘q’: 17, ‘r’: 18, ‘s’: 19, ‘t’: 20, ‘u’: 21, ‘v’: 22, ‘w’: 23, ‘x’: 24, ‘y’: 25, ‘z’: 26}

df['w1'] = df['w1'].map(letter_map)
df['w2'] = df['w2'].map(letter_map)
df['w3'] = df['w3'].map(letter_map)
df['w4'] = df['w4'].map(letter_map)
df['w5'] = df['w5'].map(letter_map)
df.set_index('Date',inplace=True)
df.sort_index(ascending=True,inplace=True)

df


（2）统计元音辅音频率

Vowel = ['a','e','i','o','u']
Consonant = list(set(small).difference(set(Vowel)))
def count_Vowel(s):
c = 0
for i in range(len(s)):
if s[i] in Vowel:
c+=1
return c
def count_Consonant(s):
c = 0
for i in range(len(s)):
if s[i] in Consonant:
c+=1
return c

df['Vowel_fre'] = df['Word'].apply(lambda x:count_Vowel(x))
df['Consonant_fre'] = df['Word'].apply(lambda x:count_Consonant(x))


（3）提取时间特征

df["year"] = df.index.year
df["qtr"] = df.index.quarter
df["mon"] = df.index.month
df["week"] = df.index.week
df["day"] = df.index.weekday
df["ix"] = range(0,len(data))
time_features = ['year','qtr','mon','week','day','ix']
df


（3）构造数据集

from sklearn.preprocessing import StandardScaler
features = ['w1','w2','w3','w4','w5','Vowel_fre','Consonant_fre']+time_features
label = ['1 try','6 tries','6 tries','6 tries','6 tries','6 tries','7 or more tries (X)']
Trian_all = df[features+label].copy().dropna()
X = Trian_all[features]

# 标准化
ss = StandardScaler()
X_1 = ss.fit_transform(X)
Y_1= Trian_all[label[0]]
Y_2= Trian_all[label[1]]
Y_3= Trian_all[label[2]]
Y_4= Trian_all[label[3]]
Y_5= Trian_all[label[4]]
Y_6= Trian_all[label[5]]
Y_7= Trian_all[label[6]]
Trian_all


## 2 模型预测与评估


from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

X_train, X_test, y_train, y_test = train_test_split(X_1,Y_1, test_size=0.1, random_state=0)

reg = LinearRegression().fit(X_train, y_train)
p_pred = reg.predict(X_test)
test_df =pd.DataFrame(y_test,columns=label)
test_df['pred_1'] = p_pred
# 计算误差
from sklearn.metrics import mean_squared_error
RMSE_1 = np.sqrt(mean_squared_error(test_df[label[0]],test_df['pred_1']))
print(f'第1个模型，RMSE误差是：{RMSE_1}')
# 预测结果可视化
test_df[[label[0],'pred_1']].plot()
plt.legend()
plt.savefig('img/3.png',dpi=300)
plt.show()


## 3 预测EERIE难度

# 训练所有模型

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
features = ['w1','w2','w3','w4','w5','Vowel_fre','Consonant_fre']+time_features
label = ['1 try','2 tries','3 tries','4 tries','5 tries','6 tries','7 or more tries (X)']
Trian_all = df[features+label].copy().dropna()
X = Trian_all[features]

# 标准化
ss = StandardScaler()
X_1 = ss.fit_transform(X)
Y_1= Trian_all[label[0]]
Y_2= Trian_all[label[1]]
Y_3= Trian_all[label[2]]
Y_4= Trian_all[label[3]]
Y_5= Trian_all[label[4]]
Y_6= Trian_all[label[5]]
Y_7= Trian_all[label[6]]

reg1 = LinearRegression().fit(X_1, Y_1)
reg2 = LinearRegression().fit(X_1, Y_2)
reg3 = LinearRegression().fit(X_1, Y_3)
reg4 = LinearRegression().fit(X_1, Y_4)
reg5 = LinearRegression().fit(X_1, Y_5)
reg6 = LinearRegression().fit(X_1, Y_6)
reg7 = LinearRegression().fit(X_1, Y_7)

X_pred = ss.fit_transform(np.array(df.loc['2023-3-1'][features]).reshape(1,-1))
p_pred1 = reg1.predict(X_pred)
p_pred2 = reg2.predict(X_pred)
p_pred3 = reg3.predict(X_pred)
p_pred4 = reg4.predict(X_pred)
p_pred5 = reg5.predict(X_pred)
p_pred6 = reg6.predict(X_pred)
p_pred7 = reg7.predict(X_pred)

print(p_pred1,p_pred2,p_pred3,p_pred4,p_pred5,p_pred6,p_pred7)


[0.46327684] [5.77683616] [22.67231638] [32.97457627] [23.68361582] [11.5819209] [2.81920904]

## 3 Code

Code获取，在浏览器中输入：betterbench.top/#/40/detail，或者Si我


|
3天前
|

Python中的装饰器：简化代码，提高可读性
【9月更文挑战第10天】在Python编程的世界中，装饰器是一种强大的工具，它允许开发者在不修改原函数代码的情况下增加额外的功能。本文将通过简单易懂的语言和生动的例子，带你了解装饰器的概念、使用方法及其在实际开发中的应用价值。我们将一起探索如何利用装饰器来简化代码结构，提升代码的可读性和可维护性，让你的编程之旅更加顺畅。
27 19
|
1天前
|

【9月更文挑战第12天】在软件开发中，数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES（高级加密标准）因其高效性和灵活性，已成为全球最广泛使用的对称加密算法之一。通过实战演练，我们将展示如何利用pycryptodome库实现AES加密，包括生成密钥、初始化向量（IV）、加密和解密文本数据等步骤。此外，还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习，你将掌握使用AES加密保护敏感数据的方法，为代码增添坚实的安全屏障。
15 8
|
9天前
|
Python

【9月更文挑战第3天】在Python的世界里，装饰器是那些静悄悄站在角落、却能大大改变游戏规则的神奇工具。它们就像是给你的函数穿上一件隐形的超级英雄斗篷，让函数拥有了超乎寻常的能力。本文将带领你一探究竟，看看如何通过几行简单的代码，就能让你的函数变得更加智能和强大。
28 17
|
3天前
|

Python中的装饰器：简化你的代码
【9月更文挑战第9天】本文将介绍Python中的一种强大工具——装饰器。我们将从基础概念开始，逐步深入到装饰器的实际应用，包括函数装饰器和类装饰器。我们将通过实例来展示如何利用装饰器简化代码，提高代码的可读性和可维护性。最后，我们将探讨装饰器的一些高级用法，以及如何避免在使用时可能遇到的问题。无论你是初学者还是有经验的开发者，这篇文章都将帮助你更好地理解和使用装饰器。
12 6
|
5天前
|
Python

【9月更文挑战第9天】在Python的世界里，一些简洁的代码行却蕴含着强大的功能，如列表推导式让列表生成仅需一行代码：squares = [x**2 for x in range(10)]。with语句则能自动管理文件和网络连接的关闭，如with open(&#39;example.txt&#39;, &#39;r&#39;) as file:。lambda函数和装饰器则允许快速定义函数和增强功能，而上下文管理器更是资源处理的利器。这些特性让Python代码更加优雅高效。
15 4
|
6天前
|

【9月更文挑战第6天】本文将深入探讨Python中一个强大而神秘的特性——装饰器。我们将通过实际例子揭示装饰器的工作原理，并展示如何利用它们来简化和增强你的代码。无论你是初学者还是有经验的开发者，这篇文章都将为你打开一扇门，让你的代码更加优雅和高效。
17 6
|
3天前
|

Python系统编程实战：文件系统操作与I/O管理，让你的代码更优雅
【9月更文挑战第10天】Python不仅在数据分析和Web开发中表现出色，在系统编程领域也展现出独特魅力。本文将带你深入探讨Python中的文件系统操作与I/O管理，涵盖os、shutil和pathlib等模块的基础使用方法，并通过示例代码展示如何优雅地实现这些功能。通过掌握缓冲、异步I/O等高级特性，你将能够编写更高效、安全且易于维护的Python代码。示例包括使用pathlib遍历目录、设置缓冲区提升文件写入性能以及使用aiofiles实现异步文件操作。掌握这些技能，让你在Python系统编程中更加得心应手。
10 2
|
9天前
|
Python
Python中的装饰器：简化你的代码
【9月更文挑战第3天】装饰器，这个听起来有些神秘的名词，实际上在Python中扮演着重要的角色。它们就像是你的代码的小助手，帮你自动完成一些重复性的工作，让你的代码更加简洁、易读。本文将通过一个简单的例子，带你走进装饰器的世界，看看它们是如何工作的。
16 7
|
9天前
|

Python中的装饰器：简化你的代码
【9月更文挑战第3天】装饰器在Python中是一个非常强大的工具，它可以让我们在不改变原有函数定义的情况下，对函数进行扩展，增加额外的功能。本文将通过一个简单的例子，介绍如何在Python中使用装饰器，以及如何使用装饰器来简化我们的代码。
15 6
|
8天前
|

【9月更文挑战第4天】在Python的世界里，装饰器是那些隐藏在幕后、默默发挥作用的英雄。它们以优雅的姿态简化我们的代码，提升程序的可读性和效率。本文将带你揭开装饰器的神秘面纱，通过实际案例展示其魅力所在，让你的编程之旅更加顺畅。
20 3