2015-06-09 24 views
1

我正在對幾個網絡博客進行文本內容分析,現在專注於發現新興趨勢。爲了給一個博客這樣做,我編寫了一個多步驟的過程:隨着時間的推移頻率:如何在Python/pandas/matplotlib繪製一張圖的+200圖?

  1. 遍歷所有的帖子,發現前5名的關鍵字,每個崗位
  2. 將它們添加到列表中,如果他們不已經在列表中
  3. 爲每個單個帖子計算列表中所有術語的詞頻
  4. 創建詞典列表,其中爲每個帖子保存帖子的日期以及每個單詞的tf
  5. 從這個詞典列表中創建一個數據框,並將其繪製成

這一切都很好,除了我在一個情節中得到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不能比較的錯誤。

回答

0

您的小數據集腳本基本正確,但存在一些小錯誤。

  • 您缺少if i=='date': continue一行。 (你的'不可比'錯誤的來源)。
  • 在您的文章中,您的else行是錯誤縮進的。
  • 可能(只有可能)您需要致電plt.hold(True)以防止創建新圖。

這是我修改後的腳本版本。我換db.pattern.datepd.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() 
+0

@Andreusthanks這麼多去強調低附加值產品的數據線!你的代碼工作得很好,並給出我想要的圖片。我試圖將相關的部分轉換爲我的原始代碼,但那並不奏效......我將代碼放在上面的代碼中。 – azora

+0

確定它現在也適用於大集合,我犯了一個愚蠢的錯誤。必須根據「分組」最大值對它們進行分類,而不是根據未分組的最大值進行分類。分類的工作,只是當所有的圖形都在分組之上時...非常感謝! – azora

相關問題