成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

pandas & matplotlib 直播數(shù)據(jù)分析

Cristalven / 479人閱讀

摘要:直播數(shù)據(jù)分析針對(duì)直播間這個(gè)時(shí)間段的數(shù)據(jù)分析基礎(chǔ)數(shù)據(jù)展示以上數(shù)據(jù)是從直播間的彈幕中提取的相關(guān)數(shù)據(jù)每個(gè)字段解釋為唯一標(biāo)識(shí)用戶名發(fā)送的信息用戶等級(jí)牌子牌子等級(jí)發(fā)言房間號(hào)依賴數(shù)據(jù)處理基礎(chǔ)準(zhǔn)備根據(jù)牌子名稱統(tǒng)計(jì)最大值最小值平均值計(jì)算牌子的最大值最小值

直播數(shù)據(jù)分析

針對(duì)douyu_60937 直播間 (2018/11/19 19:04:18 - 2018/11/20 7:56:42) 這個(gè)時(shí)間段的數(shù)據(jù)分析

基礎(chǔ)數(shù)據(jù)展示


以上數(shù)據(jù)是從直播間的彈幕中提取的相關(guān)數(shù)據(jù),每個(gè)字段解釋為

 {
    "id": "唯一標(biāo)識(shí)",
    "user": "用戶名",
    "cont": "發(fā)送的信息",
    "level": "用戶等級(jí)",
    "sign": "牌子",
    "sign_leve": "牌子等級(jí)",
    "rid": "發(fā)言房間號(hào)",
}
依賴
pandas==0.23.4
matplotlib==3.0.2
numpy==1.15.4
datetime
數(shù)據(jù)處理 基礎(chǔ)準(zhǔn)備
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import datetime

path = "douyu_60937.xlsx"
data = pd.read_excel(path)

根據(jù)牌子名稱統(tǒng)計(jì)最大值、最小值、平均值

計(jì)算牌子的最大值、最小值、平均值的時(shí)候需要根據(jù)user 將數(shù)據(jù)刪除重復(fù)項(xiàng) ,避免多次計(jì)算

需要做成圖我們返回值設(shè)置成dict()

t = data[["user", "sign", "sign_leve"]].drop_duplicates(subset=["user"])  # 刪除重復(fù)用戶
t = data.groupby("sign").sign_leve.agg(["mean", "min", "max"])
t.sort_values(["max"], ascending=False, inplace=True)
print(t)
print(t[:20].to_dict())

{"mean": {"小人參": 11.848837209302326, "196": 16.475254730713246, "女流": 11.418693982074263, "Amss": 10.0, "水煮肉": 26.0, "小僵尸": 9.93750495049505, "339": 18.941176470588236, "金發(fā)雅": 24.0, "猛男": 7.768361581920904, "小豆包": 12.676724137931034, "阿冷": 10.416666666666666, "寅子": 7.059241706161138, "小癢蟲": 10.718562874251496, "S1un": 22.0, "小緑帽": 9.938271604938272, "集團(tuán)軍": 7.909323116219668, "小烏賊": 8.377464788732395, "點(diǎn)子王": 5.686131386861314, "小肚皮": 7.034911587538053, "林Q": 21.0}, "min": {"小人參": 2, "196": 4, "女流": 3, "Amss": 4, "水煮肉": 26, "小僵尸": 1, "339": 12, "金發(fā)雅": 24, "猛男": 1, "小豆包": 3, "阿冷": 6, "寅子": 1, "小癢蟲": 2, "S1un": 22, "小緑帽": 1, "集團(tuán)軍": 1, "小烏賊": 1, "點(diǎn)子王": 3, "小肚皮": 1, "林Q": 21}, "max": {"小人參": 30, "196": 30, "女流": 30, "Amss": 27, "水煮肉": 26, "小僵尸": 25, "339": 25, "金發(fā)雅": 24, "猛男": 23, "小豆包": 23, "阿冷": 22, "寅子": 22, "小癢蟲": 22, "S1un": 22, "小緑帽": 22, "集團(tuán)軍": 22, "小烏賊": 22, "點(diǎn)子王": 22, "小肚皮": 21, "林Q": 21}}
根據(jù)牌子名稱統(tǒng)計(jì)數(shù)量

分類統(tǒng)計(jì)的時(shí)候我們要修改列名用rename(column={"老列名":"新列名"})

sign_max_count = data[["user", "sign", "sign_leve"]].drop_duplicates(subset=["user"])  # 刪除重復(fù)用戶
sign_max_count = data[["sign"]].groupby(["sign"]).agg({"sign": "count"}).rename(
    columns={"sign": "sign_count"})
sign_max_count.sort_values(["sign_count"], ascending=False, inplace=True)
print(sign_max_count)
print(sign_max_count[:20].to_dict())

{"sign_count": {"小肚皮": 15439, "小僵尸": 12625, "集團(tuán)軍": 1566, "196": 1374, "女流": 781, "影魔王": 640, "大馬猴": 429, "寅子": 422, "小緑帽": 405, "小8路": 397, "小烈驢": 370, "小烏賊": 355, "小贏僧": 355, "保安團(tuán)": 343, "豬芳芳": 243, "小豆包": 232, "王菠蘿": 187, "二帆": 184, "猛男": 177, "汽車人": 173}}
統(tǒng)計(jì)各個(gè)等級(jí)的用戶數(shù)量
now_data = data[["user", "level"]].drop_duplicates(subset=["user"])  # 刪除重復(fù)用戶
now_data = data[["level"]].groupby(["level"]).agg({"level": "count"}).rename(
    columns={"level": "level_count"})
now_data.sort_values(["level_count"], ascending=False, inplace=True)

{"level_count": {16: 3159, 19: 3122, 17: 3086, 21: 2984, 18: 2882, 15: 2832, 22: 2624, 23: 2564, 20: 2545, 13: 2379, 14: 2308, 24: 2274, 11: 2066, 12: 1894, 7: 1781, 9: 1753, 10: 1690, 8: 1678, 5: 1645, 25: 1554}}
每小時(shí)發(fā)言數(shù)量

根據(jù)時(shí)間統(tǒng)計(jì)需要構(gòu)造一個(gè)datetime 數(shù)據(jù)類型的列 , 利用 resample("時(shí)間標(biāo)識(shí)符") + count() 進(jìn)行統(tǒng)計(jì)

為了后續(xù)制圖方便我在這里直接把 轉(zhuǎn)換成python 內(nèi)置的 datetime 類 方法是 to_pydatetime

df = data
df = df.loc[:, ("cont", "uptime")]
df = df.set_index("uptime")
result = df.resample("H").count().rename(columns={"cont": "user_count"})
print(result)
result = result.to_dict()

s = {}
for k, v in result["user_count"].items():
    s[k.to_pydatetime()] = v
result["user_count"] = s

print(result)
return result

{"user_count": {datetime.datetime(2018, 11, 19, 19, 0): 12707, datetime.datetime(2018, 11, 19, 20, 0): 12374, datetime.datetime(2018, 11, 19, 21, 0): 19340, datetime.datetime(2018, 11, 19, 22, 0): 13530, datetime.datetime(2018, 11, 19, 23, 0): 8, datetime.datetime(2018, 11, 20, 0, 0): 2, datetime.datetime(2018, 11, 20, 1, 0): 1, datetime.datetime(2018, 11, 20, 2, 0): 0, datetime.datetime(2018, 11, 20, 3, 0): 0, datetime.datetime(2018, 11, 20, 4, 0): 5, datetime.datetime(2018, 11, 20, 5, 0): 1, datetime.datetime(2018, 11, 20, 6, 0): 11, datetime.datetime(2018, 11, 20, 7, 0): 23}}
每小時(shí)在線人數(shù)(發(fā)言人)
df = data.drop_duplicates(subset=["user"])
df = df.loc[:, ("user", "uptime")]
df = df.set_index("uptime")
result = df.resample("H").count().rename(columns={"user": "user_count"})
print(result)
result = result.to_dict()
s = {}
for k, v in result["user_count"].items():
    s[k.to_pydatetime()] = v
result["user_count"] = s
print(result)

{"user_count": {datetime.datetime(2018, 11, 19, 19, 0): 4223, datetime.datetime(2018, 11, 19, 20, 0): 2207, datetime.datetime(2018, 11, 19, 21, 0): 3843, datetime.datetime(2018, 11, 19, 22, 0): 1875, datetime.datetime(2018, 11, 19, 23, 0): 6, datetime.datetime(2018, 11, 20, 0, 0): 0, datetime.datetime(2018, 11, 20, 1, 0): 1, datetime.datetime(2018, 11, 20, 2, 0): 0, datetime.datetime(2018, 11, 20, 3, 0): 0, datetime.datetime(2018, 11, 20, 4, 0): 1, datetime.datetime(2018, 11, 20, 5, 0): 1, datetime.datetime(2018, 11, 20, 6, 0): 1, datetime.datetime(2018, 11, 20, 7, 0): 4}}
制作圖表 粉絲牌等級(jí)情況 柱狀圖
def autolabel(ax, rects, xpos="center"):
    xpos = xpos.lower()
    ha = {"center": "center", "right": "left", "left": "right"}
    offset = {"center": 0.5, "right": 0.57, "left": 0.43}

    for rect in rects:
        height = rect.get_height()
        ax.text(rect.get_x() + rect.get_width() * offset[xpos], 1.01 * height,
                "{}".format(height), ha=ha[xpos], va="bottom")


def sign_bar_wiht_leve(t1):
    """
    粉絲牌等級(jí)情況柱狀圖
    :return:
    """
    mean = [round(x, 1) for x in t1["mean"].values()]
    min = t1["min"].values()
    max = t1["max"].values()
    ind = np.arange(len(mean))
    width = 0.35
    fig, ax = plt.subplots()
    rects_2 = ax.bar(ind, min, width / 2, color="IndianRed", label="最低等級(jí)")
    rects_1 = ax.bar(ind + width / 2, mean, width / 2, color="SkyBlue", label="平均等級(jí)")
    rects_3 = ax.bar(ind + width, max, width / 2, color="Black", label="最高等級(jí)")
    ax.set_ylabel("等級(jí)")
    ax.set_title("粉絲牌等級(jí) (2018/11/19  19:04:18 - 2018/11/20  7:56:42)")
    ax.set_xticks(ind)
    ax.set_xticklabels(t1["mean"].keys())
    ax.legend()
    fig = plt.gcf()
    fig.set_size_inches(30, 10.5)
    autolabel(ax=ax, rects=rects_1, xpos="center")
    autolabel(ax=ax, rects=rects_2, xpos="center")
    autolabel(ax=ax, rects=rects_3, xpos="center")
    fig.savefig("粉絲牌等級(jí).jpg")
    fig.show()

粉絲牌占比 餅圖
def sign_pie_with_count(t2):
    """
    粉絲牌占比
    :param t2:
    :return:
    """
    sizes = list(t2["sign_count"].values())[:5]
    labels = list(t2["sign_count"].keys())[:5]
    plt.figure(figsize=(8, 4))  # 調(diào)節(jié)圖形大小
    explode = (0, 0, 0, 0)  # 將某一塊分割出來,值越大分割出的間隙越大
    patches, text1, text2 = plt.pie(sizes,
                                    labels=labels,
                                    autopct="%3.2f%%",  # 數(shù)值保留固定小數(shù)位
                                    shadow=False,  # 無陰影設(shè)置
                                    startangle=90,  # 逆時(shí)針起始角度設(shè)置
                                    pctdistance=0.8)  # 數(shù)值距圓心半徑倍數(shù)距離
    plt.axis("equal")
    plt.legend()
    plt.title("粉絲牌占比 
(2018/11/19  19:04:18 - 2018/11/20  7:56:42)")
    plt.savefig("粉絲牌占比.jpg")
    plt.show()

用戶等級(jí)分布 折線圖
def user_line_with_count(t4):
    """
    用戶等級(jí)分布折線圖
    :param t4:
    :return:
    """
    t4 = sorted(t4["level_count"].items(), key=lambda d: d[0])

    x = [i[0] for i in t4]
    y = [i[1] for i in t4]

    plt.figure(figsize=(8, 4))
    plt.plot(x, y, "b--", linewidth=1)

    # 設(shè)置數(shù)字標(biāo)簽
    for a, b in zip(x, y):
        plt.text(a, b, b, ha="center", va="bottom", fontsize=10)

    plt.xlabel("用戶等級(jí)")
    plt.ylabel("數(shù)量")
    plt.title("用戶等級(jí)情況
(2018/11/19  19:04:18 - 2018/11/20  7:56:42)")
    plt.savefig("用戶等級(jí)情況.jpg")
    plt.show()

每個(gè)時(shí)間段用戶以及彈幕量 折線圖
def show_label(x, y, plt):
    # 設(shè)置數(shù)字標(biāo)簽
    for a, b in zip(x, y):
        plt.text(a, b, b, ha="center", va="bottom", fontsize=10)


def user_time(t5, t6):
    """
    每個(gè)時(shí)間段用戶以及彈幕量
    :param t5:
    :param t6:
    :return:
    """
    t_5 = {k.strftime("%Y-%m-%d %H"): v for k, v in t5["user_count"].items()}
    t_6 = {k.strftime("%Y-%m-%d %H"): v for k, v in t6["user_count"].items()}

    x_1 = t_5.keys()
    y_1 = t_5.values()

    x_2 = t_6.keys()
    y_2 = t_6.values()

    plt.figure(figsize=(9, 5))
    plt.plot(x_1, y_1, "o-", linewidth=1, label="彈幕數(shù)量")
    plt.plot(x_2, y_2, "g--", linewidth=1, label="在線人數(shù)")
    show_label(x_1, y_1, plt)
    show_label(x_2, y_2, plt)
    plt.xticks(rotation=30)
    plt.legend()

    plt.xlabel("小時(shí)")
    plt.ylabel("人數(shù)")
    plt.title("每個(gè)時(shí)間段用戶以及彈幕量
(2018/11/19  19:04:18 - 2018/11/20  7:56:42)")
    plt.savefig("每個(gè)時(shí)間段用戶以及彈幕量.jpg")
    plt.show()

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42636.html

相關(guān)文章

  • Python如何利用pandas讀取csv數(shù)據(jù)并繪圖

      小編寫這篇文章的一個(gè)主要目的,主要是給大家去做一個(gè)解答,解答的內(nèi)容主要是Python相關(guān)知識(shí),比如說,會(huì)給大家講解怎么樣去利用Python pandas去做一個(gè)讀取,讀取的是csv數(shù)據(jù),然后將這些數(shù)據(jù)去做一個(gè)繪圖處理,具體內(nèi)容下面給大家詳細(xì)解答?! ∪绾卫胮andas讀取csv數(shù)據(jù)并繪圖  導(dǎo)包,常用的numpy和pandas,繪圖模塊matplotlib,  importmatplotli...

    89542767 評(píng)論0 收藏0
  • PandasMatplotlib保存圖型時(shí)縱坐標(biāo)標(biāo)識(shí)過長(zhǎng)造成顯示不全問題解決

      在使用matplotlib做圖得時(shí)候,有時(shí)候會(huì)碰到繪圖時(shí)顯示不全和圖片保存時(shí)不完美的難題,本文主要是為大家介紹了有關(guān)PandasMatplotlib保存圖型時(shí)縱坐標(biāo)標(biāo)識(shí)過長(zhǎng)造成顯示不全問題解決方式,需用的小伙伴可以參考一下。  序言  這篇blog主要是處理在使用pandas制作圖象并儲(chǔ)存時(shí),因?yàn)闃?biāo)識(shí)過長(zhǎng),造成縱坐標(biāo)上標(biāo)簽顯示不全問題。剛遇到困難的時(shí)候修改了一下下圖片尺寸,然而并沒有卵用,因此...

    89542767 評(píng)論0 收藏0
  • python數(shù)學(xué)建模Numpy應(yīng)用介紹與Pandas學(xué)習(xí)

      小編寫這篇文章的主要目的,主要是來給大家解答下關(guān)于python數(shù)學(xué)建模的一些相關(guān)的介紹,涉及到內(nèi)容涵蓋Numpy的一些相關(guān)的應(yīng)用具體的一些介紹。另外,還會(huì)涉及到相關(guān)的Pandas學(xué)習(xí)知識(shí),具體內(nèi)容下面給大家詳細(xì)解答下。  1 Numpy介紹與應(yīng)用  1-1Numpy是什么  NumPy是一個(gè)運(yùn)行速度非常快的數(shù)學(xué)庫(kù),一個(gè)開源的的python科學(xué)計(jì)算庫(kù),主要用于數(shù)組、矩陣計(jì)算,包含:  一個(gè)強(qiáng)大的...

    89542767 評(píng)論0 收藏0
  • Python繪制數(shù)據(jù)動(dòng)態(tài)圖的方法詳解

      小編寫這篇文章的一個(gè)主要目的,主要是給大家去做一個(gè)介紹,介紹的內(nèi)容是,利用Python這門語言,去繪制相關(guān)的數(shù)據(jù)動(dòng)態(tài)圖表,那么,具體的繪制方法是什么呢?下面小編就給大家詳細(xì)的解答?! ?shù)據(jù)動(dòng)態(tài)圖怎么做,效果圖,  多子圖聯(lián)動(dòng)競(jìng)賽圖  安裝  pipinstallpandas_alive   #或者   condainstallpandas_alive-cconda-forge   玩起來  支...

    89542767 評(píng)論0 收藏0
  • python數(shù)學(xué)建模之Numpy應(yīng)用介紹與Pandas學(xué)習(xí)

      小編寫這篇文章的一個(gè)主要目的,主要是來給大家去做一個(gè)介紹。介紹的內(nèi)容主要是關(guān)于建模知識(shí)的一些相關(guān)介紹,包括其Pandas的一些相關(guān)學(xué)習(xí),就具體的操作內(nèi)容,下面就給大家詳細(xì)解答下?! umpy學(xué)習(xí)  1 Numpy介紹與應(yīng)用  1-1Numpy是什么  NumPy是一個(gè)運(yùn)行速度非??斓臄?shù)學(xué)庫(kù),一個(gè)開源的的python科學(xué)計(jì)算庫(kù),主要用于數(shù)組、矩陣計(jì)算,包含:  一個(gè)強(qiáng)大的N維數(shù)組對(duì)象ndarr...

    89542767 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<