术语频率随着时间的推移:如何使用Python / pandas / matplotlib在一个图中绘制+200个图形?

时间:2015-06-09 17:51:02

标签: python matplotlib plot nlp

我正在对几个网络博客进行文本内容分析,现在专注于发现新兴趋势。为了对一个博客这样做,我编写了一个多步骤的过程:

  1. 循环播放所有帖子,在每篇帖子中找到前5个关键字
  2. 将它们添加到列表中(如果它们不在列表中)
  3. 计算每个帖子的列表中所有字词的字词频率
  4. 创建一个词典列表,每个帖子我保存帖子的日期,每个单词的tf
  5. 从此词典列表中创建一个数据框,并将其绘制成
  6. 这很好,除了我在一个图中得到1000个图表,而我只关心那些达到某个阈值的峰值。 这意味着它们应该具有不同的颜色集或者可以通过其他方式轻松识别,并且它们应该出现在图例中 - 其余部分不会出现。 任何想法如何做到这一点?

    这是我现在使用的代码,它产生了一个不可读的情节:

    from pattern.db import Database
    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    
    def plot_trends(keywords_and_date_list):
    d1 = pd.DataFrame(keywords_and_date_list)
    d1.sort(inplace=True)
    
    grouped = d1.groupby(pd.Grouper(freq='1M', key="date")).mean()
    
    plt.style.use("ggplot")
    
    fig = plt.figure(figsize=(25,6))
    
    for i in d1.columns:
        if i == 'date':
            continue
        plt.plot(grouped.index, grouped[i], lw=2, label="monthly average " + i)        
    
    plt.ylim(0,0.015)
    plt.legend(prop={'size':7})
    plt.title("Occurence of various words in blogs")
    plt.xlabel("Post publication date")
    plt.ylabel("Term Frequency")
    plt.show()
    

    你们是否有任何关于如何可行地区分高峰图表的想法,比如0.004,并为它们分配不同的颜色集和标签?

    为了用熊猫的最大功能来实现这个目的,我玩了一个小数据集,但是我没有让它起作用。

    import pandas as pd
    import numpy as np
    from pattern.db import date
    import matplotlib.pyplot as plt
    
    l = [dict(date=date('2015-01-02'), one=0.1, two=0.2)]
    l.append(dict(date=date('2014-01-01'), one=0.2, two=0.5))
    l.append(dict(date=date('2014-02-01'), one=0.5, two=0.6))
    l.append(dict(date=date('2014-03-01'), one=0.1, two=0.7))
    
    d1 = pd.DataFrame(l)
    
    d2 = d1.set_index('date')
    
    plt.style.use("ggplot")
    
    fig = plt.figure(figsize=(10,6))
    
    for i in d1.columns:
        if d1.max() >= 0.6:
            plt.plot(d1.index, d1[i], lw=2, label="monthly average " + i)
    else:
        plt.plot(d1.index, d1[i], lw=2)
    
    plt.ylim(0,1)
    plt.legend(prop={'size':10})
    plt.title("Occurence of various words in Naoki's blog")
    plt.xlabel("Post publication date")
    plt.ylabel("Term Frequency")
    plt.show()
    

    我希望看到的结果是一张带有标签的图表,一张没有标签的图表。我使用不同的语法,但要么是我得到两个标记的图形,要么是值错误,或者是datetype和float无法比较的错误。

1 个答案:

答案 0 :(得分:0)

您的小型数据集脚本基本上是正确的,但有一些小错误。

  • 您错过了if i=='date': continue行。 (您的'不具有可比性'错误的来源)。
  • 在您的帖子中,您的else行错误缩进。
  • 可能(仅可能)您需要致电plt.hold(True)以阻止创建新图表。

这是我修改过的脚本版本。我为db.pattern.date换了pd.to_datetime,添加了更多随机列,并使用alphalinewidth

去除了低值数据行
import pandas as pd
import numpy as np
# from pattern.db import date
import matplotlib.pyplot as plt

l = [dict(date=pd.to_datetime('2015-01-02'), one=0.1, two=0.2)]
l.append(dict(date=pd.to_datetime('2014-01-01'), one=0.2, two=0.5))
l.append(dict(date=pd.to_datetime('2014-02-01'), one=0.5, two=0.6))
l.append(dict(date=pd.to_datetime('2014-03-01'), one=0.1, two=0.7))


d1 = pd.DataFrame(l)
for i in range(100):
    d1['s%i'%i] = np.random.uniform(0,.5,4)
for i in range(10):
    d1['s%i'%i] = np.random.uniform(0,.7,4)

d2 = d1.set_index('date')

plt.style.use("ggplot")

fig = plt.figure(figsize=(10,6))

for i in d1.columns:
    if i=='date':
        continue
    if d1[i].max() >= 0.6:
        plt.plot(d1.index, d1[i], lw=2, label="monthly average " + i)
        plt.hold(True)
    else:
        plt.plot(d1.index, d1[i], lw=2, alpha=0.7, linewidth=0.3)
        plt.hold(True)

plt.ylim(0,1)
plt.legend(prop={'size':10})
plt.title("Occurence of various words in Naoki's blog")
plt.xlabel("Post publication date")
plt.ylabel("Term Frequency")
plt.show()