如何把Netflix数据集转换成Movielens格式?

简介: 如何把Netflix数据集转换成Movielens格式?

我们的目标是把Netflix数据集的格式转换成:用户id、物品id、评分、时间戳格式。在开始转换之前,先下载Netflix数据集:netflix-prize-data。点击“Download”,下载文件archive.zip并解压。


我们只选用combined_data的4个文件此时文件目录如下:

0a2653c851af460fa595bd959398a8f1.png

接下来开始转换:

1、先导入需要用到的包


from datetime import datetime
import pandas as pd
import numpy as np


2、读入combined_data_1-4的数据


df1 = pd.read_csv('./combined_data_1.txt', header = None, names = ['user_id', 'rating', 'timestamp'], usecols=[0,1,2])  # 读入combined_data_1
# df2 = pd.read_csv('./combined_data_2.txt', header = None, names = ['user_id', 'rating', 'timestamp'], usecols=[0,1,2])  # 读入combined_data_2
# df3 = pd.read_csv('./combined_data_3.txt', header = None, names = ['user_id', 'rating', 'timestamp'], usecols=[0,1,2])  # 读入combined_data_3
# df4 = pd.read_csv('./combined_data_4.txt', header = None, names = ['user_id', 'rating', 'timestamp'], usecols=[0,1,2])  # 读入combined_data_4
df1['rating'] = df1['rating'].astype(float)
# df2['rating'] = df2['rating'].astype(float)
# df3['rating'] = df3['rating'].astype(float)
# df4['rating'] = df4['rating'].astype(float)
print('Dataset 1 shape: {}'.format(df1.shape))
# print('Dataset 2 shape: {}'.format(df2.shape))
# print('Dataset 3 shape: {}'.format(df3.shape))
# print('Dataset 4 shape: {}'.format(df4.shape))
print('-Dataset examples-')
print(df1.iloc[::5000000, :])


输出:


Dataset 1 shape: (24058263, 3)
-Dataset examples-
          user_id  rating   timestamp
0              1:     NaN         NaN
5000000   2560324     4.0  2005-12-06
10000000  2271935     2.0  2005-04-11
15000000  1921803     2.0  2005-01-31
20000000  1933327     3.0  2004-11-10


3、合成4个数据集并重构索引


df = df1
# df.append(df2)
# df.append(df3)
# df.append(df4)
df.index = np.arange(0, len(df))
print('Full dataset shape: {}'.format(df.shape))
print('-Dataset examples-')
print(df.iloc[::5000000, :])


输出:


Full dataset shape: (24058263, 3)
-Dataset examples-
          user_id  rating   timestamp
0              1:     NaN         NaN
5000000   2560324     4.0  2005-12-06
10000000  2271935     2.0  2005-04-11
15000000  1921803     2.0  2005-01-31
20000000  1933327     3.0  2004-11-10


4、数据清洗,去除rating为0的数据行


df_nan = pd.DataFrame(pd.isnull(df.rating))
df_nan = df_nan[df_nan['rating'] == True]
df_nan = df_nan.reset_index()
item_np = []
item_id = 1
for i,j in zip(df_nan['index'][1:],df_nan['index'][:-1]):
    # 使用numpy
    temp = np.full((1,i-j-1), item_id)
    item_np = np.append(item_np, temp)
    item_id += 1
# 考虑最后一条记录和其长度
# 使用numpy
last_record = np.full((1,len(df) - df_nan.iloc[-1, 0] - 1),item_id)
item_np = np.append(item_np, last_record)
print('Item numpy: {}'.format(item_np))
print('Length: {}'.format(len(item_np)))


输出:


Item numpy: [1.000e+00 1.000e+00 1.000e+00 ... 4.499e+03 4.499e+03 4.499e+03]
Length: 24053764


5、将物品(电影)id加入dataframe


def time2stamp(cmnttime): # 时间转时间戳函数
    cmnttime = datetime.strptime(cmnttime,'%Y-%m-%d')
    stamp = int(datetime.timestamp(cmnttime))
    return stamp
df = df[pd.notnull(df['rating'])].copy()
df['item_id'] = item_np.astype(int)
df['user_id'] = df['user_id'].astype(int)
df = df.loc[:,['user_id', 'item_id', 'rating', 'timestamp']] # 交换两列位置
df['timestamp'] = df['timestamp'].astype(str).apply(time2stamp) # 时间转成时间戳
print('-Dataset examples-')
print(df.iloc[::5000000, :])


输出:


-Dataset examples-
          user_id  item_id  rating   timestamp
1         1488844        1     3.0  1125936000
5000996    501954      996     2.0  1093449600
10001962   404654     1962     5.0  1125244800
15002876   886608     2876     2.0  1127059200
20003825  1193835     3825     2.0  1060704000


6、保存dataframe


# df.sort_values(by=["user_id", "timestamp"], ascending=[True, True]) # 先按用户id排序,然后按时间戳排序
df.to_csv('./ratings.dat', sep=',', index=0, header=0)


完成


6de278e6d6694ce5bb08e7e842b7e74b.png


相关文章
|
传感器 Cloud Native 数据挖掘
开源技术在教育中的应用
开源技术在教育中的应用
467 0
|
9月前
|
存储 vr&ar 缓存
【02】AE特效开发制作特技-Adobe After Effects-本篇制作主角飞机,敌军飞机,敌军boss飞机,子弹特效,做成mp4以及导出png序列图-优雅草央千澈
【02】AE特效开发制作特技-Adobe After Effects-本篇制作主角飞机,敌军飞机,敌军boss飞机,子弹特效,做成mp4以及导出png序列图-优雅草央千澈
192 25
【02】AE特效开发制作特技-Adobe After Effects-本篇制作主角飞机,敌军飞机,敌军boss飞机,子弹特效,做成mp4以及导出png序列图-优雅草央千澈
|
传感器 网络协议
CCF推荐B类会议和期刊总结:(计算机网络领域)
中国计算机学会(CCF)推荐的B类会议和期刊在计算机网络领域具有较高水平。本文总结了所有B类会议和期刊的详细信息,包括全称、出版社、dblp文献网址及研究领域,涵盖传感器网络、移动网络、网络协议等多个方向,为学者提供重要学术交流平台。
CCF推荐B类会议和期刊总结:(计算机网络领域)
|
6月前
XMLHttpRequest对象的GET和POST请求使用方法
这两种方式已经足够让你操控数据交流的大厨房,像一个大厨一样熟练跃动。但记住一点,每一位大厨都会依据菜品属性和食客需求选择适合的烹饪方法,GET还是POST,就看您的选择了。
143 10
|
7月前
|
人工智能 架构师 前端开发
手把手体验通义灵码2.0:AI程序员如何让我从“调参侠”进阶“架构师”?
通义灵码2.0是一款强大的AI编程工具,帮助开发者从“调参侠”进阶为“架构师”。它通过跨语言开发支持、智能单元测试生成和图生代码等功能,大幅提升开发效率。例如,将Python数据处理函数一键转为React+ECharts组件,自动生成单元测试用例,甚至通过草图生成前端布局代码。此外,新增的QwQ模型具备“代码脑补”能力,可推荐性能优化策略。尽管功能强大,但仍需注意环境隔离与代码审查,避免过度依赖。通义灵码2.0不仅是工具,更是开发者的“外接大脑”。
247 8
|
12月前
|
Ubuntu Linux 网络安全
如何在Ubuntu 22.04或20.04 Linux上安装MobaXterm
虽然直接在Ubuntu 22.04或20.04上安装MobaXterm是不可能的任务,因为它是专为Windows设计的,但Ubuntu系统提供了丰富的原生工具和替代方案,足以满足远程管理、文件传输等需求。如果你对MobaXterm的特定功能有强烈需求,考虑采用Windows子系统或虚拟机方案作为折衷方案,不失为一种可行之道。在追求高效工作流的同时,不妨也探索和熟悉Linux原生工具,它们往往能提供更为无缝的集成体验。
3127 0
|
11月前
|
程序员 编译器 C语言
C语言中的预处理器指令,涵盖其基本概念、常见指令(如`#define`、`#include`、条件编译指令等)、使用技巧及注意事项
本文深入解析C语言中的预处理器指令,涵盖其基本概念、常见指令(如`#define`、`#include`、条件编译指令等)、使用技巧及注意事项,并通过实际案例分析,展示预处理器指令在代码编写与处理中的重要性和灵活性。
456 2
|
消息中间件 存储 Java
RocketMQ技术详解:从基础知识到内部设计原理
RocketMQ技术详解:从基础知识到内部设计原理
412 2
|
数据采集 人工智能 监控
数字孪生(Digital Twins)给我们带来了什么?
数字孪生,英文名叫Digital Twin(数字双胞胎),也被称为数字映射、数字镜像,通俗的讲,就是在一个物理设备或物理系统的基础上,创造一个数字版的“克隆体”。那么数字孪生中的关键技术是什么,又给我们人机交互带来了什么呢?
1005 0
数字孪生(Digital Twins)给我们带来了什么?
|
存储 SQL API
Flink之ProcessFunction
我们之前学习的转换算子是无法访问事件的时间戳信息和水位线信息的。而这在一些应 用场景下,极为重要。例如 MapFunction 这样的map 转换算子就无法访问时间戳或者当前事 件的事件时间。 基于此,DataStream API 提供了一系列的 Low-Level 转换算子。可以访问时间戳、 watermark 以及注册定时事件。还可以输出特定的一些事件,例如超时事件等。Process Function用来构建事件驱动的应用以及实现自定义的业务逻辑(使用之前的 window 函数和 转换算子无法实现)。例如,Flink SQL 就是使用Process Function 实现的。
Flink之ProcessFunction