def show_tag_count():
    """
    统计不同分类的电视剧数量
    :return:
    """
    # 设置图形大小
    plt.figure(figsize=(10, 8), dpi=80)
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    df = get_data_frame()
    # 去除暂时无分类的数据
    df = df[~df["tag"].isin(["未知"])]
    df_tag = df[["country", "rating_value", "tag"]]

    # 切割组成集合,tags是一个带集合的列表
    tags = [set(x.split(" ")) for x in df_tag["tag"]]
    # 把所有的tag组成一个集合
    tags = set.union(*tags)
    # 设置一个(len(df_tag), len(tags))的全是0元素的二维数组 (行, 列)
    dummies = pd.DataFrame(np.zeros((len(df_tag), len(tags))), columns=tags)

    for i, tag in enumerate(df_tag["tag"]):
        # 对应位置改为 1
        dummies.loc[i, tag.split(" ")] = 1
    # df_new = df_tag.join(dummies.add_prefix("tag_")) #添加join之后字段的前缀
    # # 清除后 更改index 利于合并
    # df_tag.index = pd.Series(np.arange(len(df_tag)))
    df_new = df_tag.join(dummies)
    # print(df_new.columns)
    tag_list = df_new.columns[4:]
    tag_count = []
    for tag in tag_list:
        tag_count.append([tag, df_new[tag].sum()])
    # 排序,让柱状图按照顺序显示
    tag_count.sort(key=lambda x: x[1], reverse=True)
    ax = plt.subplot()
    # 画竖着的直方图
    # ax.bar(range(len(tag_list)), count, width=0.5, align="center",)
    # plt.xticks(range(len(tag_list)), tag_list,rotation=90,fontproperties=myfont)
    # 画横着的直方图
    ax.barh(range(len(tag_count)), [i[1] for i in tag_count],
            align="center",
            color='#EE7600',
            ecolor='black')
    plt.yticks(range(len(tag_count)), [i[0] for i in tag_count])

    plt.ylabel("分类")
    # y轴值
    plt.xlabel("数量")
    # 图的标题
    plt.title("不同分类电视剧的数量统计")
    plt.savefig("不同分类电视剧的数量统计.jpg")
    plt.show()
Exemple #2
0
def _show_tv_date_distribute(rate):
    #获取数据,
    df = get_data_frame()
    # 为现存的每条数据作出统计,即让其数量为1,方便之后分组后的聚合
    count_df = pd.DataFrame(np.ones(shape=(len(df), 1)), columns=["count"])
    df = df.join(count_df)
    # 去除没有时间的电视剧
    new_df = df[pd.notnull(df["release_date"])]
    #选择大于7分的电视剧
    new_df = new_df[new_df["rating_value"] >= rate]
    #设置日期为索引
    new_df = new_df.set_index("release_date")
    #只选择据中的count列
    new_df = new_df["count"]
    #调整统计时间的范围,实现重新采样
    new_df = new_df.resample("5M").sum()
    return new_df
def show_tag_count():
    df = get_data_frame()
    df_tag = df[["country", "rating_value", "tag"]]

    # 切割组成集合,tags是一个带集合的列表
    tags = [set(x.split("_")) for x in df_tag["tag"]]
    # 把所有的tag组成一个集合
    tags = set.union(*tags)
    # 设置一个(len(df_tag),len(tags))的全是0元素的2维数组
    dummies = pd.DataFrame(np.zeros((len(df_tag), len(tags))), columns=tags)

    for i, tag in enumerate(df_tag["tag"]):
        dummies.ix[i, tag.split("_")] = 1
    # df_new = df_tag.join(dummies.add_prefix("tag_")) #添加join之后字段的前缀
    df_new = df_tag.join(dummies)
    # 删除空字符串的那一列
    df_new = df_new.drop("", axis=1)
    print(df_new.columns)
    tag_list = df_new.columns[4:]
    tag_count = []
    for tag in tag_list:
        tag_count.append([tag, df_new[tag].sum()])
    #排序,让柱状图按照顺序显示
    tag_count.sort(key=lambda x: x[1], reverse=True)
    figure = plt.figure(figsize=(10, 8))
    ax = plt.subplot()
    # 画竖着的直方图
    # ax.bar(range(len(tag_list)), count, width=0.5, align="center",)
    # plt.xticks(range(len(tag_list)), tag_list,rotation=90,fontproperties=myfont)
    # 画横着的直方图
    ax.barh(range(len(tag_count)), [i[1] for i in tag_count],
            align="center",
            color='#EE7600',
            ecolor='black')
    plt.yticks(range(len(tag_count)), [i[0] for i in tag_count],
               fontproperties=myfont)

    plt.ylabel("分类", fontproperties=myfont)
    # y轴值
    plt.xlabel("数量", fontproperties=myfont)
    # 图的标题
    plt.title("不同分类电视剧的数量统计", fontproperties=myfont)
    plt.savefig("不同分类电视剧的数量统计.jpg")
    plt.show()
def _show_tv_date_distribute(rate):
    """
    获取数据,设置时间索引,降采样
    :param rate: 最低分数
    :return: 筛选后的数据
    """
    # 获取数据
    df = get_data_frame()
    # 为现存的每条数据作出统计,即让其数量为1,方便之后分组后的聚合 创建全为1的DataFrame
    count_df = pd.DataFrame(np.ones(shape=(len(df), 1)), columns=["count"])
    df = df.join(count_df)
    # 去除没有时间的电视剧
    # new_df = df[pd.notnull(df["release_date"])]
    # 选择大于3分的电视剧
    new_df = df[df["rating_value"] >= rate]
    # 设置日期为索引
    new_df = new_df.set_index("release_date")
    # 只选择据中的count列
    new_df = new_df["count"]
    # 调整统计时间的范围,实现重新采样
    new_df = new_df.resample("5D").sum()
    return new_df
def show_tv_date_distribute(rate=3):
    """
    通过不同国家电视剧随时间的变化情况绘制折线图
    :param rate:
    :return:
    """
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    fig = plt.figure(figsize=(16, 8))
    ax = plt.subplot()
    # 获取数据
    df = get_data_frame()
    # 为现存的每条数据作出统计,即让其数量为1,方便之后分组后的聚合 构建全为1的Series
    count_df = pd.DataFrame(np.ones(shape=(len(df), 1)), columns=["count"])
    df = df.join(count_df)
    # 去除没有时间的电视剧
    # new_df = df[pd.notnull(df["release_date"])]
    # 选择2000年之后的电视剧
    # new_df = df[df["release_date"] > "19991231"]
    # 选择3分以上的上市局
    new_df = df[df["rating_value"] >= rate]
    # 不同国家的电视剧的数量和时间的对应关系并不相同,需要先统一统计的时间,没有的时间段填充0
    date_start = new_df["release_date"].min()
    date_end = new_df["release_date"].max()
    date_period = pd.DataFrame(pd.date_range(date_start, date_end, freq="D", ), columns=["release_date"])
    # 定义绘图的颜色
    colors = ['red', 'green', 'blue', "cyan", "orange"]
    country_list = new_df["country"].unique().tolist()
    # 分组
    for country, grouped in new_df.groupby(by=["country"]):
        # 对不同的国家添加统一的时间段,并设置为index
        temp_grouped = grouped.merge(date_period, how="outer", on="release_date")
        temp_grouped = temp_grouped[["release_date", "count"]].set_index("release_date")
        # 对空白的时间段填充0
        temp_grouped = temp_grouped.fillna(0)
        temp_grouped = temp_grouped.resample("3M").sum()
        # print(temp_grouped.index)
        _x = range(len(temp_grouped.index))
        _y = temp_grouped["count"]
        # 绘制散点图,但是效果不明显
        # ax.scatter(_x, _y,
        #            c=colors[country_list.index(country)],
        #            alpha=0.5,
        #            label=country
        #            )
        # 绘制折线图
        ax.plot(_x, _y,
                c=colors[country_list.index(country)],
                alpha=0.5,
                label=country
                )
    # 添加图例
    plt.legend()
    # 设置xticklable时间格式
    xticklables = [i.strftime('%Y-%m-%d') for i in temp_grouped.index]
    # 设置x轴刻度
    plt.xticks(range(len(temp_grouped.index)), xticklables, rotation=45)
    plt.xlabel("时间")
    plt.ylabel("时间段内的数量合计")
    plt.title("不同国家3分以上的电视剧随时间的变化情况")
    plt.savefig("不同国家3分以上的电视剧随时间的变化情况.png")
    plt.show()
def show_tv_date_distribute(rate=7):
    fig = plt.figure(figsize=(16, 8))
    ax = plt.subplot()
    #获取数据
    df = get_data_frame()
    #为现存的每条数据作出统计,即让其数量为1,方便之后分组后的聚合
    count_df = pd.DataFrame(np.ones(shape=(len(df), 1)), columns=["count"])
    df = df.join(count_df)
    #去除没有时间的电视剧
    new_df = df[pd.notnull(df["release_date"])]
    #选择2000年之后的电视剧
    new_df = new_df[new_df["release_date"] > "19991231"]
    #选择7分以上的上市局
    new_df = new_df[new_df["rating_value"] >= rate]
    #不同国家的电视剧的数量和时间的对应关系并不相同,需要先统一统计的时间,没有的时间段填充0
    date_start = new_df["release_date"].min()
    date_end = new_df["release_date"].max()
    date_period = pd.DataFrame(pd.date_range(
        date_start,
        date_end,
        freq="D",
    ),
                               columns=["release_date"])
    #定义绘图的颜色
    colors = ['red', 'green', 'blue', "cyan", "orange"]
    country_list = new_df["country"].unique().tolist()
    #分组
    for country, grouped in new_df.groupby(by=["country"]):
        #对不同的国家添加统一的时间段,并设置为index
        temp_grouped = grouped.merge(date_period,
                                     how="outer",
                                     on="release_date")
        temp_grouped = temp_grouped[["release_date",
                                     "count"]].set_index("release_date")
        #对空白的时间段填充0
        temp_grouped = temp_grouped.fillna(0)
        temp_grouped = temp_grouped.resample("3M").sum()
        # print(temp_grouped.index)
        _x = range(len(temp_grouped.index))
        _y = temp_grouped["count"]
        #绘制散点图,但是效果不明显
        # ax.scatter(_x, _y,
        #            c=colors[country_list.index(country)],
        #            alpha=0.5,
        #            label=country
        #            )
        #绘制折线图
        ax.plot(_x,
                _y,
                c=colors[country_list.index(country)],
                alpha=0.5,
                label=country)
    #添加图例
    plt.legend()
    # 解决xticklable时间带时分秒
    xticklables = [i.strftime('%Y-%m') for i in temp_grouped.index]
    # 解决xticklable刻度太密集
    plt.xticks(range(0, len(temp_grouped.index), 4),
               xticklables[::4],
               rotation=45)
    plt.xlabel("时间", fontproperties=myfont)
    plt.ylabel("时间段内的数量合计", fontproperties=myfont)
    plt.title("不同国家7分以上的电视剧随时间的变化情况", fontproperties=myfont)
    plt.savefig("不同国家7分以上的电视剧随时间的变化情况.png")
    plt.show()