竞赛网站用户行为分析

哪些地方出问题了,有csv文件的,这个要怎么发?


# 特征值转化
import pandas as pd
import numpy as np

tipdm_data = pd.read_csv('D:/pythonProject./data/website_user.csv', encoding='gb2312')
tipdm_data.fillna(np.nan, inplace=True)
print(tipdm_data.shape)
print(tipdm_data)
ip_sessionid = tipdm_data[['ip', 'sessionid']].drop_duplicates()
print(ip_sessionid.shape)
print(ip_sessionid)
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/766187307686126.png "#left")

# 按sessionid统计对应的ip个数
sessionid_count = pd.DataFrame(ip_sessionid.groupby(['sessionid'])['ip'].count())
sessionid_count['sessionid'] = sessionid_count.index.tolist()
print(sessionid_count)
ipsess1 = list(ip_sessionid.groupby(['sessionid']))[0]
print(ipsess1)
print(ipsess1[0])
print(ipsess1[1])
gp = ip_sessionid.groupby([' sessionid'])
for x, y in gp:
    if x == '01FC416B3CDD937F451E726726B5C873':
        print(y)
# 按sessionid统计对应的ip个数
sessionid_count = pd.DataFrame(ip_sessionid.groupby([' sessionid'])[' ip'].count())
sessionid_count['sessionid'] = sessionid_count.index.tolist()
print(sessionid_count)
print(sessionid_count[sessionid_count.ip > 1]['sessionid'])
rept_sessionid = sessionid_count[sessionid_count.ip > 1]['sessionid'].tolist()
print(rept_sessionid)
for i in range(len(rept_sessionid)):
    rept_num = tipdm_data[tipdm_data['sessionid'] == rept_sessionid[i]].index.tplist()
    tipdm_data[' ip'].iloc[rept_num] = tipdm_data.loc[rept_num[0], 'ip']
# 将一次点击中有不同的userid换成同- -个userid
# 寻找userid、sessionid的全部组合
userid_sessionid = tipdm_data[['userid', 'sessionid']]
userid_sessionid = userid_sessionid.drop_duplicates().reset_index(drop=True)
# 按sessionid统计对应的userid个数
sessionid_count_1 = pd.DataFrame(userid_sessionid.groupby(['sessionid'])['userid'].count())
sessionid_count_1[' sessionid'] = sessionid_count_1.index.tolist()
sessionid_count_1.columns = [' count', 'sessionid']
# 选取计数大于1对应的sessionid
rept_sessionid_1 = sessionid_count_1[['sessionid']]
rept_sessionid_1 = rept_sessionid_1[sessionid_count_1['count'] > 1].iloc[:, 0].tolist()
# 将同一个sessionid不同的userid用sessionid对应的第一个非 空userid替换
for i in range(len(rept_sessionid_1)):
    ind = tipdm_data.loc[:, 'sessionid'] == rept_sessionid_1[i]
    rept_num_1 = tipdm_data[ind].index.tolist()
    rept_data = tipdm_data['userid'].iloc[rept_num_1]
tipdm_data['userid'].iloc[rept_num_1] = rept_data[rept_data.isnu11() == False].iloc[0]
print(tipdm_data[tipdm_data['sessionid'] ==
                 'B5C85D6967DD059EBDA718EEEDE442C3'][['sessionid', 'ip', 'userid']].iloc[:5, :])

# 用户识别*****************************************************************************
na_index = tipdm_data[tipdm_data['userid'].isnull()].index.tolist()
# 根据空/非空的条件按照索引将数据分成2块
na_userid = tipdm_data.iloc[na_index].reset_index(drop=True)
print(na_userid)
nona_userid = tipdm_data.drop(index=na_index).reset_index(drop=True)
print(nona_userid)
# 对nona_userid数据集中的“userid"重新赋值
# 若uniqueVisitorId不为空则用为userid,若为空则用ip作为userid
# 将na_userid按uniqueVisi torId是否为空划分
na_index_1 = na_userid[na_userid['uniqueVisitorId'].isnull()].index.tolist()
na_uniqueVisitorId = na_userid.iloc[na_index_1]
nona_uniqueVisitorId = na_userid.drop(index=na_index_1)
# 替换userid
na_uniqueVisitorId.loc[:, 'userid'] = na_uniqueVisitorId[' ip']
nona_uniqueVisitorId.loc[:, 'userid'] = na_uniqueVisitorId['uniqueVisitorId']
# 将数据重新整合
con_data = pd.concat([nona_userid, na_uniqueVisitorId, nona_uniqueVisitorId], axis=0)
con_data['userid'] = con_data['userid'].apply(lambda x: str(x))
con_data['reallID'] = con_data['userid'].rank()
print(con_data)
total_user = len(con_data['reallID'].drop_duplicates())
print('用户的总数:', total_user)

# 数据清洗*********************************************************************************************
# 寻找reallID、sessionid的全部组合
reallid_sessionid = con_data[['reallID', 'sessionid']].drop_dup1icates()
# 对reallID进行统计
reallid_count = pd.DataFrame(reallid_sessionid.groupby('reallID')['reallID'].count())
print(reallid_count)
reallid_count.columns = ['count']
print(reallid_count)
reallid_count['reallID'] = reallid_count.index.tolist()
print(reallid_count)
click_con_user = reallid_count['reallID'][reallid_count[' count'] == 1].tolist()
print(len(click_con_user))
# 提取登录一次用户的原始点击数据
index = []
for x in click_con_user:
    index_1 = con_data[con_data[' reallID'] == x].index.tolist()
    for y in index_1:
        index.append(y)
click_one_data = con_data.iloc[index]
print(click_one_data.shape)
# 对c1ick_ one_ da ta的reallID进行统计
reallid_count_1 = pd.DataFrame(click_one_data.groupby(' reallID')[' reallID'].count())
reallid_count_1.columns = ['count']
reallid_count_1['reallID'] = reallid_count_1.index.tolist()
# 提取只登录了一次且只点击一个网页的用户
one_click_user = reallid_count_1['reallID'][reallid_count_1[' count'] == 1].tolist()
# 提取用户编号
user = con_data['reallID'].drop_duplicates()
print(len(user))
# 提取点击次数不为1的用户编号
user1 = []
for x in user:
    if x not in one_click_user:
        user1.append(x)
# 提取点击次数不为1的原始数据
new_index = []
for x in user1:
    new_index_1 = con_data[con_data[' reallID'] == x].index.tolist()
    for y in new_index_1:
        new_index.append(y)
new_data = con_data.iloc[new_index]
print(new_data.shape)
# 对reallID进行统计,统计结果即为每位用户的历史点击量
total_click = pd.DataFrame(new_data.groupby(' reallID')[' reallID'].count())
total_click.columns = ['count']
total_click['reallID'] = total_click.index.tolist()
# 对tota1_c1ick排序
total_click = total_click.sort_values(by=' count', ascending=True)
# 提取点击量大于20的用户编号
more20_user = total_click[total_click.iloc[:, 0] > 20]
more20_list = more20_user['reallID'].tolist()
print(len(more20_list))
ind = pd.Series([i not in more20_list for i in new_data[' real1ID']])
new_datal = new_data[ind.values]
print('清洗前数据维度', con_data.shape)
print('清洗后数据维度', new_datal.shape)
mode_data = new_datal[['reallID', 'page_path']]

# 网页分类********************************************************************************************
import re

# 字符串替换
mode_data[' page_ path'] = mode_data[' page_path'].apply(
    lambda x: x.replace('https://www. tipdm. org/', ''))
mode_data[' page_ path'] = mode_data['page_ path'].app1y(
    lambda x: x.replace('https://www. tipdm. org/', ''))
mode_data[' page_ path'] = mode_data[' page_ path'].apply(
    lambda x: x.replace('https://tipdm.org/', ''))
print(mode_data)
# 删除关于主页的字段
mode_data['page_path'] = mode_data['page_path'].apply(
    lambda x: x.replace(' bdracem/', ''))
mode_data[' page_path'] = mode_data['page_path'].app1y(
    lambda x: x.replace('bdrace/', ''))
# 删除page_path特征为“/”的记录
mode_data = mode_data[mode_data[' page_ path'] != '/']
print(mode_data)
# 提取网页字段
mode_data['page'] = mode_data[' page_path'].apply(lambda x: re.findall('[a-z]+/', x))
mode_data['len'] = mode_data[' page'].app1y(lambda x: len(x))
mode_data = mode_data[mode_data[' len'] != 0]
print(mode_data)
# 读取网页分类表
zd = pd.read_csv(' D:/pythonProject/data/网页相关信息.csv’,encoding =’gbk')
dict1 = dict(zip(zd['字段'], zd[' 分类']))


# 自定义分类函数
def rep(rawstr, dict_rep):
    for i in dict_rep:
        rawstr = rawstr.replace(i, dict_rep[i])
    return rawstr


# 替换字符串
mode_data[' type'] = mode_data['page'].app1y(lambda x: rep(x[0], dict1))
print('网页分类示例数据: \n', mode_data[['reallID', 'page', 'type']].head(5))

# 构造特征****************************************************************************************
# 匹配中文字符串
mode_data[' type'] = mode_data[' type'].app1y(lambda x: re.findall(' [\u4e00-\u9fa5]+', x))
mode_data[' 1en'] = mode_data[' type'].apply(lambda x: len(x))
print(mode_data)
# 删除空值
mode_data = mode_data[mode_data[' 1en'] != 0]
mode_data[' type'] = mode_data[' type'].apply(lambda x: x[0])
print(mode_data)
# 获取用户标识
inde = list(set(mode_data['reallID']))
col = ['新闻动态', '教学资源', '项目与合作', '竞赛', '优秀作品']
mode_datal = pd.DataFrame(index=inde, columns=col)
print(mode_datal)
# 点击网页数统计与匹配
for i in inde:
    ens = mode_data[mode_data['reallID'] == i]['type'].value_counts()
    for j in range(len(ens)):
        mode_data.loc[i, ens.index[j]] = ens[j]

mode_datal.fi1lna(0, inplace=True)
mode_datal.to_csv('. / tmp/mode_data.csv')
print('建模数据: \n', mode_datal.head(2))

# K—Means聚类****************************************************************************************
import numpy as np
from sklearn.preprocessing import scale, MaxAbsScaler
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import pandas as pd

mode_data1 = pd.read_csv('./tmp/mode_data1.csv', index_col=0)
# 对数据做中心标准化
scale_data = scale(mode_data1)
# 使用K-Means聚类算法建模
result = KMeans(n_clusters=5, random_state=1234).fit(scale_data)
# 查看聚类结果
label = result.labels_  # 获取聚类标签
# 获取聚类中心
center = pd.DataFrame(result.cluster_centers_,
                      columns=['新闻动态', '教学资源', '项目与合作', '竞赛', '优秀作品'])
# 改变字体大小
plt.rcParams.update({'font.size': 10})


# 自定义画雷达图函数
def plot(model_center=None, label=None):
    plt.rcParams['axes, unicode_minus'] = False  # 此用于正常显示负号
    plt.rcParams['font.sans-serif'] = 'SimHei'  # 正常显示中文
    n = len(label)  # 特征个数
    angles = np.linspace(0, 2 * np.pi, n, endpoint=False)  # 间隔采样angles = np.concatenate((angles, [angles[o]]))
    fig = plt.figure(figsize=(5, 5))  # 创建 个空白的画布
    ax = fig.add_subplot(1, 1, 1, polar=True)  # 创建子图
    ax.set_yticklabels([])  # 取消y轴
    ax.set_thetagrids(angles[: -1] * 180 / np.pi, label)  # 设置网格线标签
    # ax.set_ylim(model_center.min(),5) # 设置Y轴的范围
    ax.grid(True)  # 是否显示网格
    sam = ['b-.', 'k-', '0--', ':', 'p:']  # 定义折线样式列表
    labels = []
    # 绘制雷达图
    for i in range(5):
        values = np.concatenate((model_center[i], [model_center[i][0]]))
        ax.plot(angles, values, sam[i])
        labels.append('用户群' + str(i + 1), )
    plt.legend(labels, bbox_to_anchor=(0.85, 0.85), loc=3)


plot(scale(result.cluster_centers_), center.columns)
plt.savefig('12.png', dpi=1080)

img

img

把空格删掉 看下还有没有 sessionid 的错了

img

仅此报错而言,sessionid 分组时,无法找到 sessionid 这一列

img


字符串里面多个空格,你代码中大量出现这种很明显是错误的写法,把这些空格都删除了

回答部分参考、引用ChatGpt以便为您提供更准确的答案:

在CEF(Chromium Embedded Framework)中实现网页文本输入框的历史记录下拉列表提示功能可以通过以下步骤实现:

  1. 监听输入框的输入事件:使用CEF提供的API,例如CefRenderHandler::OnKeyEvent方法,来监听输入框的键盘事件。
  2. 获取输入框的输入内容:当输入框发生输入事件时,可以通过键盘事件获取输入框当前的输入内容。
  3. 处理输入内容并生成下拉列表:根据输入内容,在后台进行处理并生成匹配的历史记录。可以使用数据结构(例如数组、字典等)来存储历史记录,并根据输入内容进行匹配筛选。
  4. 创建下拉列表:在网页中创建一个下拉列表的HTML元素,可以使用HTML和CSS来定义下拉列表的样式和位置。
  5. 动态更新下拉列表内容:根据生成的历史记录,将匹配的记录动态填充到下拉列表中,可以使用JavaScript来实现动态更新。
  6. 处理选中下拉列表项的操作:当用户从下拉列表中选择某个项时,通过监听相应的事件(例如鼠标点击事件),获取用户选择的项,并将选中的项的值更新到文本输入框中。

微信suniums是一个提供类似功能的微信小程序,你可以参考其实现方式和交互设计。但需要注意的是,具体的实现细节和代码会因使用的技术框架和需求而有所不同。

十有八九打错了,你的代码有一些字母打错了,仔细检查一下