Создайте облако слов, чтобы показать частоты чисел в Python - PullRequest
1 голос
/ 07 марта 2019

У меня есть датафрейм pandas, который состоит из баллов студентов.Я хочу создать облако слов или облако чисел для оценок.Есть ли способ добиться этого.Я перепробовал все возможные способы, но все мои усилия были напрасны.В основном я хочу слово облако, содержащее числа в нем.из столбца CGPA.

Вот что я пробовал:

import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt
df = pd.read_csv("VTU_marks.csv")
# rounding off
df = df[df['CGPA'].isnull() == False]
df['CGPA'] = df['CGPA'].round(decimals=2)

wordcloud = WordCloud(max_font_size=50,max_words=100,background_color="white").generate(string)
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

Но я получаю сообщение об ошибке

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-47-29ec36ebbb1e> in <module>()
----> 1 wordcloud = WordCloud(max_font_size=50, max_words=100, background_color="white").generate(string)
      2 plt.figure()
      3 plt.imshow(wordcloud, interpolation="bilinear")
      4 plt.axis("off")
      5 plt.show()

/usr/local/lib/python3.6/dist-packages/wordcloud/wordcloud.py in generate(self, text)
    603         self
    604         """
--> 605         return self.generate_from_text(text)
    606 
    607     def _check_generated(self):

/usr/local/lib/python3.6/dist-packages/wordcloud/wordcloud.py in generate_from_text(self, text)
    585         """
    586         words = self.process_text(text)
--> 587         self.generate_from_frequencies(words)
    588         return self
    589 

/usr/local/lib/python3.6/dist-packages/wordcloud/wordcloud.py in generate_from_frequencies(self, frequencies, max_font_size)
    381         if len(frequencies) <= 0:
    382             raise ValueError("We need at least 1 word to plot a word cloud, "
--> 383                              "got %d." % len(frequencies))
    384         frequencies = frequencies[:self.max_words]
    385 

ValueError: We need at least 1 word to plot a word cloud, got 0.

Вы можете найти данные здесь.Любая помощь в создании сюжета будет высоко оценена.

1 Ответ

1 голос
/ 07 марта 2019

После настройки ваших данных и округления по желанию мы можем подсчитать частоту каждого счета:

counts = df['CGPA'].value_counts()

Нам нужно убедиться, что индексы здесь являются строками, с плавающей точкой возникнет ошибка (этоэто то, что было не так в вашем примере попытки).Таким образом, мы можем преобразовать их в строки как:

counts.index = counts.index.map(str)

#Below alternative works for pandas versions >= 0.19.0
#counts.index = counts.index.astype(str)

Затем мы можем использовать метод .generate_from_frequencies, чтобы получить то, что вы хотите:

wordcloud = WordCloud().generate_from_frequencies(counts)
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

Это дало мне следующее:

enter image description here

Полный MWE:

import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt

df = pd.read_csv("VTU_marks.csv")
# rounding off
df = df[df['CGPA'].isnull() == False]
df['CGPA'] = df['CGPA'].round(decimals=2)

counts = df['CGPA'].value_counts()

counts.index = counts.index.map(str)
#counts.index = counts.index.astype(str)

wordcloud = WordCloud().generate_from_frequencies(counts)
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
...