51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 368|回复: 0
打印 上一主题 下一主题

[python] 9万条数据如何使用Python分析?

[复制链接]
  • TA的每日心情
    擦汗
    前天 08:59
  • 签到天数: 962 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-6-27 13:25:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    作为一个写程序员的电影,我们怎么不能用数据来分析一下,喜欢漫威宇宙的观众对《复联 4》的评价呢?
      抓取数据
      业界朋友们,在电影分析中,使用猫眼的数据比较多。在本文中,笔者也使用了猫眼的接口来获取数据,方便处理,数据量也比较多。
      有关接口,大家可以自己去猫眼的网站上看,也可以使用如下地址:
      http://m.maoyan.com/mmdb/comment ... 19-04-24%2002:56:46

      在 Python 中,使用 Request 可以很方便地发送请求,拿到接口返回的 JSON 数据,来看代码:
      def getMoveinfo(url):
          session = requests.Session()
          headers = {
              "User-Agent": "Mozilla/5.0",
              "Accept": "text/html,application/xhtml+xml",
              "Cookie": "_lxsdk_cuid="
          }
          response = session.get(url, headers=headers)
          if response.status_code == 200:
              return response.text
          return None


      请求返回的是一个 JSON 数据,拿到我们想要的评论原始数据,并将数据存储在数据库中:
      def saveItem(dbName, moveId, id, originalData) :
          conn = sqlite3.connect(dbName)
          conn.text_factory=str
          cursor = conn.cursor()
          ins="INSERT OR REPLACE INTO comments values (?,?,?)"
          v = (id, originalData, moveId)
          cursor.execute(ins,v)
          cursor.close()
          conn.commit()
          conn.close()


      经过大概两个小时,终于从猫眼爬取了大约 9 万条数据。数据库文件已经超过了 100M 了。
      数据清洗
      因为在上面抓取下来的数据,直接进行了原数据的存储,没有进行数据的解析处理。接口中包含了很多数据,有用户信息、评论信息等。本次分析,只使用了部分数据,所以需要将用到的相关数据清洗出来:
      def convert(dbName):
          conn = sqlite3.connect(dbName)
          conn.text_factory = str
          cursor = conn.cursor()
          cursor.execute("select * from comments")
          data = cursor.fetchall()
          for item in data:
              commentItem = json.loads(item[1])
              movieId = item[2]
              insertItem(dbName, movieId, commentItem)
          cursor.close()
          conn.commit()
          conn.close()
      def insertItem(dbName, movieId,  item):
          conn = sqlite3.connect(dbName)
          conn.text_factory = str
          cursor = conn.cursor()
          sql = '''
          INSERT OR REPLACE INTO convertData values(?,?,?,?,?,?,?,?,?)
          '''
          values = (
              getValue(item, "id"),
              movieId,
              getValue(item, "userId"),
              getValue(item, "nickName"),
              getValue(item, "score"),
              getValue(item, "content"),
              getValue(item, "cityName"),
              getValue(item, "vipType"),
              getValue(item, "startTime"))
          cursor.execute(sql, values)
          cursor.close()
          conn.commit()
          conn.close()


      通过 JSON 库将原始数据解析出来,将我们需要的信息存储到新的数据表中。
      数据分析
      因为没有任何一个平台能够拿到用户的购票数据,我们只能从评论的数据中,以小见大,从这些数据中,分析出一些走势。 在评论数据中,我们能看到评论用户所在的城市。将数据所在的位置解析,划分到各对应的行政省,可以看到每个省评论数量,见下图(颜色越红,用户评论数量越多):

    城市

      从图中可以看到, 上海、广州、四川用户的数量显然要比其他城市的用户数量要多得多。再来看一下代码:
      data = pd.read_sql("select * from convertData", conn)
          city = data.groupby(['cityName'])
          city_com = city['score'].agg(['mean','count'])
          city_com.reset_index(inplace=True)
          fo = open("citys.json",'r')
          citys_info = fo.readlines()
          citysJson = json.loads(str(citys_info[0]))
          print city_com
          data_map_all = [(getRealName(city_com['cityName'], citysJson),city_com['count']) for i in range(0,city_com.shape[0])]
          data_map_list = {}
          for item in data_map_all:
              if data_map_list.has_key(item[0]):
                  value = data_map_list[item[0]]
                  value += item[1]
                  data_map_list[item[0]] = value
              else:
                  data_map_list[item[0]] = item[1]
          data_map = [(realKeys(key), data_map_list[key] ) for key in data_map_list.keys()]


      漫威电影一直深受中国朋友们喜欢的高分电影。豆瓣评分 8.7 分,那我们的评论用户中,又是一个什么样的趋势呢?见下图:

    评分数

      从图中可以看到,评 5 分的数量远高于其他评分,可见中国的观众朋友确实喜欢漫威的科幻电影。
      复联从 1 开始便是漫威宇宙各路超级英雄的集结,到现在的第 4 部,更是全英雄的汇聚。那么,在这之中,哪位英雄人物更受观众欢迎?先看代码:
      attr = ["灭霸","美国队长",
              "钢铁侠", "浩克", "奇异博士",  "蜘蛛侠", "索尔" ,"黑寡妇",
              "鹰眼", "惊奇队长", "幻视",
              "猩红女巫","蚁人", "古一法师"]
      alias = {
          "灭霸": ["灭霸", "Thanos"],
          "美国队长": ["美国队长", "美队"],
          "浩克": ["浩克", "绿巨人", "班纳", "HULK"],
          "奇异博士": ["奇异博士", "医生"],
          "钢铁侠": ["钢铁侠", "stark", "斯塔克", "托尼", "史塔克"],
          "蜘蛛侠": ["蜘蛛侠","蜘蛛","彼得", "荷兰弟"],
          "索尔":["索尔", "雷神"],
          "黑寡妇": ["黑寡妇", "寡姐"],
          "鹰眼":["鹰眼","克林顿","巴顿","克林特"],
          "惊奇队长":["惊奇队长","卡罗尔", "惊奇"],
          "星云":["星云"],
          "猩红女巫": ["猩红女巫", "绯红女巫", "旺达"],
          "蚁人":["蚁人", "蚁侠", "Ant", "AntMan"],
          "古一法师": ["古一", "古一法师", "法师"]
      }
      v1 = [getCommentCount(getAlias(alias, attr)) for i in range(0, len(attr))]
      bar = Bar("Hiro")
      bar.add("count",attr,v1,is_stack=True,xaxis_rotate=30,yaxix_min=4.2,
          xaxis_interval=0,is_splitline_show=True)
      bar.render("html/hiro_count.html")


      运行结果如下图,可以看到钢铁侠钢铁侠是实至名归的 C 位,不仅电影在电影中是,在评论区仍然也是实至名归的 C 位,甚至于远超美队、寡姐和雷神:

    英雄评论次数

      从以上观众分布和评分的数据可以看到,这一部剧,观众朋友还是非常地喜欢。前面,从猫眼拿到了观众的评论数据。现在,笔者将通过 Jieba 把评论进行分词,然后通过 Wordcloud 制作词云,来看看,观众朋友们对《复联》的整体评价:

    词云分析

      可以看到,灭霸和钢铁侠出现的词频比其他英雄要高很多。这是否表示,这部剧的主角就是他们两个呢?
      细心的朋友应该发现了,钢铁侠、灭霸的数量在词云和评论数量里面不一致。原因在于,评论数量就按评论条数来统计的,而词云中,使用的是词频,同一条评论中,多次出现会多次统计。所以,灭霸出现的次数居然高于了钢铁侠。
      最后,再来分析一下钢铁侠与灭霸的情感分析,先上代码:
      def emotionParser(name):
          conn = conn = sqlite3.connect("end.db")
          conn.text_factory = str
          cursor = conn.cursor()
          likeStr = "like \"%" + name + "%\""
          cursor.execute("select content from convertData where content " + likeStr)
          values = cursor.fetchall()
          sentimentslist = []
          for item in values:
              sentimentslist.append(SnowNLP(item[0].decode("utf-8")).sentiments)
          plt.hist(sentimentslist, bins=np.arange(0, 1, 0.01), facecolor="#4F8CD6")  
          plt.xlabel("Sentiments Probability")                                       
          plt.ylabel("Quantity")                                                     
          plt.title("Analysis of Sentiments for " + name)                                       
          plt.show()
          cursor.close()
          conn.close()


      此处,使用 SnowNLP 来进行情感分析。
      情感分析,又称为意见挖掘、倾向性分析等。简单而言,是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。

    灭霸


    钢铁侠

      从图中看到, 钢铁侠的正向情感要比灭霸的正向情感要高,反派角色就是容易被人抗拒。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏1
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-6-8 19:45 , Processed in 0.070735 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表