楼主: zwy_0309
1316 0

Python+pandas+历年音乐器材类商品评分简析(笔记) [推广有奖]

  • 1关注
  • 3粉丝

硕士生

36%

还不是VIP/贵宾

-

威望
0
论坛币
342 个
通用积分
128.8010
学术水平
11 点
热心指数
9 点
信用等级
7 点
经验
4173 点
帖子
69
精华
0
在线时间
150 小时
注册时间
2019-6-4
最后登录
2025-8-19

楼主
zwy_0309 在职认证  发表于 2020-9-22 17:03:31 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

[color=rgba(0, 0, 0, 0.75)]从题目来看,这节课应该是探究某一事物随着时间推移而发生的变化情况。所以核心内容应该是探究时间序列数据变化趋势。详细如下:

一、 取数据

[color=rgba(0, 0, 0, 0.75)]数据来源:http://jmcauley.ucsd.edu/data/amazon/links.html

亚马逊电子商务网站,提供了一些数据资源,上图页面上的数据为1996年5月至2014年7月,20余年的商品评论。Ratings only 数据的表头为“user,item,rating,timestamp”
我们下载“Musical Instruments”中的评论文件。(这个数据下载非常慢,几乎需要一天的时间),可以使用老师已下载的文件:https://www.njcie.com/python/2时间分析/

二、 处理数据1、读取数据

【脚本】

rnames = ['uid', 'pid', 'rating', 'timestamp']ratings = pd.read_csv('D:\\ratings_Musical_Instruments.csv', header=None, names=rnames)
2、处理时间戳

【脚本】

ratings['date'] = ratings['timestamp'].apply(datetime.fromtimestamp)ratings['year'] = ratings['date'].dt.year
ratings['month'] = ratings['date'].dt.month
ratings= ratings['date'].to_period(freq='M')
print(ratings)

【结果】
date uid pid rating timestamp year month
2014-03 A1YS9MDZP93857 0006428320 3.0 1394496000 2014 3
2013-06 A3TS466QBAWB9D 0014072149 5.0 1370476800 2013 6
【说明】

  • 时间戳是一个整数,是1970-01-01 00:00:00至统计时间的秒数。
  • datetime.fromtimestamp()将时间戳数据转为datetime数据
  • 注意datatime数据转换为时期数据时,需要指明索引列,同时需要将转换后的dataframe赋给一个DF变量。即:ratings= ratings[‘date’].to_period(freq=‘M’)
三、 分析数据1、 每个月评分的平均值

【脚本1】

pingFen = ratings['rating'].groupby('date').mean()
plt.plot(pingFen)
plt.show()

【脚本2】

pingFen = ratings['rating'].groupby('date').mean()

plt.plot(pingFen.to_timestamp())
plt.show()

【结果】
脚本1报错,提示:TypeError: float() argument must be a string or a number, not ‘Period’,意思是在画图时,period类型错误,需要字符或数值型。

脚本2的结果为:
[color=rgba(0, 0, 0, 0.749019607843137)]

【说明】
1) 这里没有指明对哪个商品的评分,只是对“乐器类”产品的整体评分。
2) 可以看出,乐器类商品的评分在2004年以后趋于平稳,1998年至2004年,评分为下降趋势。

2、 每个人月的参评人数

因为以上结果似乎忽略了一个因素,就是评分参与人的多少,极端情况下,参与人越少,评分越不稳定,代表性越差。我们看一下评分人数:
【脚本】

pingFenR = ratings['rating'].groupby('date').count()

plt.plot(pingFenR.to_timestamp())
plt.show()

【结果】
[color=rgba(0, 0, 0, 0.749019607843137)]

【说明】
由图我们看出,2010年之前,参评的人数很少,2010年以后,参评人快速增加,所以分析1中,2010年以后的评分均值更稳定,也可以说这个阶段的数据更有意义。

3、结合每个时段评分的有效数量,再观察评分

那么怎样将三个维度的数据展现在同一张图中,包含时间、参评人数、评分均值?
带大小的散点图!

[color=rgba(0, 0, 0, 0.749019607843137)]【脚本】

pingFen = ratings[['rating']].groupby('date').agg(['count', 'mean'])
plt.scatter(pingFen.index.to_timestamp(),pingFen['rating']['mean'], ingFen['rating']['count'])
plt.show()

[color=rgba(0, 0, 0, 0.75)]【结果】

【说明】
 对比plt.scatter()和plt.plot()中,将时期索引转为时间戳时,是不是有所不同?
plt.plot()中为:pingFen.to_timestamp()
plt.scatter()中为:pingFen.index.to_timestamp()
而且plt.scatter()中只能用加index的引用,而plt.plot()中加index不加都可以
这是为什么呢?== 关于这一点我不太明白,有知道的人可以留言哦~ ==

4、调整图像显示效果
1) 调大小(放大或缩小)

有时我们显示出散点的大小区别不明显,我们就可以通过将点的大小的参数乘或除一个数值的方法来调整;
如:我上面形成的图中,有的点太大,调小的方法如下:

plt.scatter(pingFen.index.to_timestamp(), pingFen['rating']['mean'], pingFen['rating']['count']/100)

结果如下图:
[color=rgba(0, 0, 0, 0.749019607843137)]

2) 调大小(规范化)

将所有数据映射到0~1之间,方法(n-min)/(max-min)。
我试用了以下脚本,结果报错了
(pingFen['count']-pingFen['count'].min())/(pingFen['count'].max())
提示:KeyError: ‘count’
原因应该是,这个评分表(pingFen)中不存在一个字段叫‘count’,count只是算法。
解决方法如下:

pingFen = ratings.groupby('date').agg(cnt=('rating', 'count'), avg =('rating', 'mean'))

pingFen['sl'] = (pingFen['cnt']-pingFen['cnt'].min())/(pingFen['cnt'].max())

这里我特别说一下agg()函数,理解该函数可真很费了我一翻工夫。
【关于pandas中的agg()的用法说明】

[color=rgba(0, 0, 0, 0.749019607843137)] 31.png

3) 调色彩

参数详细信息,可以参见https://www.jb51.net/article/127806.htm
我这里使用的脚本为:

[color=rgba(0, 0, 0, 0.75)]

ratings = ratings.to_period(freq='M')
pingFen = ratings.groupby('date').agg(cnt=('rating', 'count'), avg =('rating', 'mean'))
pingFen['sl'] = (pingFen['cnt']-pingFen['cnt'].min())/(pingFen['cnt'].max())
plt.scatter(pingFen.index.to_timestamp(), pingFen['avg'], s=pingFen['sl']*1500, c=pingFen['cnt']/pingFen['cnt'].mean(), alpha=0.3)

对scatter()的解读如下:
32.png

调整后效果如下图,这是我梦寐以求的靓图,虽然并不是最好的:
[color=rgba(0, 0, 0, 0.749019607843137)]

[color=rgba(0, 0, 0, 0.75)][LaTex]

[color=rgba(0, 0, 0, 0.75)]【说明】
 图中x轴为时间
 y轴为评分的平均分,从图中可以看出,2006年以后,评分的平均分集中在4.1分至4.5分之间
 点的大写为参与评分的人数,从图中可以看出2012年以后参与评分的人数远大与2004年以前的评分人数,因此其分值更有价值
 颜色表示的信息是可以配置的,因为本例中没有引入太多观察数据的维度,我这里仍使用评分人数来显示颜色,紫色表示人数少,黄色表示人数多,绿色居中。

[color=rgba(0, 0, 0, 0.75)]【完】

[color=rgba(0, 0, 0, 0.75)][/LaTex]






二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:pandas python panda Das Instruments

已有 2 人评分经验 收起 理由
yunnandlg + 60 精彩帖子
cheetahfly + 100 精彩帖子

总评分: 经验 + 160   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-28 14:17