Plotly:从csv绘制用户输入的字频率

时间:2017-03-17 12:51:05

标签: python python-3.x plotly

我想绘制用户输入中单词的使用时间。例如。用户输入“begab,social,demokrat”。这些术语存储在变量u_input中。我想使用startswith()方法在使用“社交”等词语时加入“社交,社会主义,社会改革”等词语。

作为准备,我将历史普鲁士报纸语料库的2300 xml文件合并为csv文件,其中包含“年,字,计数”的信息:

year| word        | count
----|-------------|----
1864|befürchtete  |1
1864|befürchtungen|1
1864|begab        |1
1864|begab        |2
1864|begab        |3
1864|begab        |5
1864|begaben      |1
1864|begaben      |3
1865|begab        |2
1865|begab        |2

然后我使用Pandas对数据进行分组,以便每年可以获得一个单词的总计数,并将数据保存为新的csv文件“pandas_dict.csv”:

year| word        | count
----|-------------|----
1864|befürchtete  |1
1864|befürchtungen|1
1864|begab        |11
1864|begaben      |4
1865|begab        |4

我现在想用plotly(离线)绘制一个图形,显示样本术语“social,conserv,kommuni”的单词用法图。 (理由:在这个例子中,我想比较社会党,保守派和共产党人的报纸报道,更具体地说是与党派相关的词语的一般突出性,因此一切都是“社会”或“k [c] ommunist”。 )

不幸的是,我阅读的所有示例中的代码都不起作用,因为我找不到的任何代码都包含任何类型的机制,只显示u_input中的术语图。

import plotly as py
import plotly.graph_objs as go
import pandas as pd

# Create DataFrame from prepared csv
df = pd.read_csv(self.dir + self.dict_dir + 'pandas_dict.csv', header=None, names=['year', 'word', 'count'])
# define data for plotting - how do I incorporate u_input?
trace1 = go.Scatter(x=df['year'], y=df['count'], mode='lines', name='test')

layout = go.Layout(title='Word usage over time', plot_bgcolor='rgb(230, 230,230)')
fig = go.Figure(data=[trace1], layout=layout)

# Plot data
py.offline.plot(fig)

这是我用NLTK创建的一个较旧的例子,它大致显示了我想用的情节: word usage over time in american inaugural speeches

1 个答案:

答案 0 :(得分:1)

  • 您可以先通过df[df['word'].str.contains(word)]
  • 过滤每个单词的数据框(contains
  • 通过groupby
  • 按年度对所有内容进行分组
  • 最后只报告'count'并将其加总(['count'].aggregate(sum)
  • 为了绘制它,在u_input中迭代你的单词并为每个单词添加一个跟踪,
import pandas as pd
import plotly
import io

txt="""year|word|count
1864|befürchtete|1
1864|befürchtungen|1
1864|begab|11
1864|begaben|4
1865|begab|4
1864|kommuni|3
1864|social|2
1864|conserv|5
1865|kommuni|6
1865|social|3
1865|conserv|4
1866|kommuni|8
1866|social|2
1866|conserv|6
1867|conservativ|4
1867|conservative|1
1867|socialist|1
1867|socialisti|2
1867|nonsense|99
1867|kommunist|4
1867|kommuni|2
"""

u_input = ['kommuni', 'social', 'conserv']

df = pd.read_csv(io.StringIO(txt), sep='|')

#filter the dataframe according to u_input
df = df[df['word'].str.contains('|'.join(u_input))]

traces = [plotly.graph_objs.Scatter(x=df['year'][df['word'].str.contains(word)],
                                    y=df[df['word'].str.contains(word)].groupby(['year'])['count'].aggregate(sum),
                                    name=word, mode='lines') for word in u_input]

layout = plotly.graph_objs.Layout(xaxis=dict(tickvals=df['year'].unique()))
fig = plotly.graph_objs.Figure(data=traces, layout=layout)
plotly.offline.plot(fig)