Tuesday, May 31, 2022

Fork of ujson to deal with NumPy int64

Клонируем Ultra fast JSON decoder and encoder written in C with Python bindings and NumPy bindings

Вы cможете преобразовать данные Numpy int64 в данные JSON serializable Python ) , используя функцию ujson.dumps().

(.env) boris@boris-All-Series:~/CONVERTJS$ git clone https://github.com/caiyunapp/ultrajson

Cloning into 'ultrajson'...

remote: Enumerating objects: 1657, done.

remote: Total 1657 (delta 0), reused 0 (delta 0), pack-reused 1657

Receiving objects: 100% (1657/1657), 1.06 MiB | 1.97 MiB/s, done.

Resolving deltas: 100% (916/916), done.

(.env) boris@boris-All-Series:~/CONVERTJS$ ll

total 220

drwxrwxr-x  5 boris boris   4096 мая 31 19:55 ./

drwxr-xr-x 70 boris boris   4096 мая 31 19:50 ../

drwxrwxr-x  6 boris boris   4096 мая 31 19:51 .env/

drwxrwxr-x  6 boris boris   4096 мая 31 19:55 ultrajson/

drwxrwxr-x  5 boris boris   4096 мая 31 19:53 ultrajson-master/

-rw-rw-r--  1 boris boris 202126 мая 31 19:52 ultrajson-master.zip

(.env) boris@boris-All-Series:~/CONVERTJS$ cd ultrajson

(.env) boris@boris-All-Series:~/CONVERTJS/ultrajson$ pip install -e .

Obtaining file:///home/boris/CONVERTJS/ultrajson

Collecting numpy>=1.16.4

  Using cached numpy-1.22.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.9 MB)

Installing collected packages: numpy, nujson

  Running setup.py develop for nujson

Successfully installed nujson numpy-1.22.4


(.env) boris@boris-All-Series:~/CONVERTJS/ultrajson$ cat NpInt64ToJSON.py

import numpy as np

import nujson as ujson

dict_np = {"key1": np.int64(3452), "key2": np.int64(5679),\

"key3": np.int64(1256),"key4": np.int64(8256),"key5": np.int64(8256) }

print(ujson.dumps(dict_np))

(.env) boris@boris-All-Series:~/CONVERTJS/ultrajson$ python3 NpInt64ToJSON.py

{"key1":3452,"key2":5679,"key3":1256,"key4":8256,"key5":8256}

(.env) boris@boris-All-Series:~/CONVERTJS/ultrajson$ cat NpInt64ToJSON1.py

import numpy as np

import nujson as ujson

spisok  = [{1.0: np.int64(6851)}, {2.0: np.int64(8654)}, {3.0: np.int64(7694)}]

result  = ujson.dumps(spisok)

print(result)

(.env) boris@boris-All-Series:~/CONVERTJS/ultrajson$ python3 NpInt64ToJSON1.py

[{"1.0":6851},{"2.0":8654},{"3.0":7694}]
































Context Manager in Python

 Python предоставляет простой способ управления ресурсами: менеджеры контекста. Используется ключевое слово with. Когда он оценивается, он должен привести к объекту, который выполняет управление контекстом. Контекстные менеджеры могут быть написаны с использованием классов или функций (с декораторами).


(.env) boris@boris-All-Series:~/LREGRESSION$ cat lineNumpyArray1.py

import numpy as np

from contextlib import contextmanager

 @contextmanager

def print_array_on_one_line():

      oldoptions = np.get_printoptions()

      np.set_printoptions(linewidth=np.inf)

      yield

      np.set_printoptions(**oldoptions)

 print(np.random.random(10))

with print_array_on_one_line():

   print(np.random.random(10))

(.env) boris@boris-All-Series:~/LREGRESSION$ python lineNumpyArray1.py

[0.40843803 0.17263724 0.17532888 0.70237136 0.54544541 0.31371548

 0.89181184 0.69611483 0.84390578 0.69257437]

[0.02495796 0.41297836 0.39095978 0.47922539 0.90893901 0.44633349 0.70688346 0.07179664 0.63228969 0.7984136 ]































Scatterplot with regression line in Matplotlib

Линейная регрессия является основным и широко используемым типом прогнозного анализа. Общая идея регрессии состоит в том, чтобы исследовать две вещи: (1) хорошо ли набор предикторных переменных предсказывает результирующую (зависимую) переменную? (2) Какие переменные, в частности, являются значимыми предикторами переменной результата и каким образом они — на что указывают величина и знак оценок бета — влияют на переменную результата? Эти регрессионные оценки используются для объяснения взаимосвязи между одной зависимой переменной и одной или несколькими независимыми переменными. Простейшая форма уравнения регрессии с одной зависимой и одной независимой переменной определяется формулой y = c + b*x, где y = оценочная оценка зависимой переменной, c = константа, b = коэффициент регрессии и x = оценка на независимая переменная. 

Standard sample of plotting Linear Regression

(.env) boris@boris-All-Series:~/LREGRESSION$ cat sampleLREGR.py

import matplotlib.pyplot as plt

import numpy as np

rng = np.random.default_rng(1234)

# Generate data

x = rng.uniform(0, 10, size=100)

y = x + rng.normal(size=100)

# Initialize layout

fig, ax = plt.subplots(figsize = (9, 9))

# Add scatterplot

ax.scatter(x, y, s=60, alpha=0.7, edgecolors="k")

# Fit linear regression via least squares with numpy.polyfit

# It returns an slope (b) and intercept (a)

# deg=1 means linear fit (i.e. polynomial of degree 1)

b, a = np.polyfit(x, y, deg=1)


# Create sequence of 100 numbers from 0 to 100 

xseq = np.linspace(0, 10, num=100)

# Plot regression line

ax.plot(xseq, a + b * xseq, color="k", lw=2.5);

plt.show()


































Monday, May 30, 2022

IGRAPH R-code Sample on Ubuntu 20.04

 boris@boris-All-Series:~/IGRAPH$ cat RIgraph02.R

nodes <- read.csv("/home/boris/IGRAPH/Dataset1-Media-Example-NODES.csv", header=T, as.is=T)

links <- read.csv("/home/boris/IGRAPH/Dataset1-Media-Example-EDGES.csv", header=T, as.is=T)

library('igraph')

net <- graph_from_data_frame(d=links, vertices=nodes, directed=T)

E(net)       # The edges of the "net" object

V(net)       # The vertices of the "net" object

E(net)$type  # Edge attribute "type"

V(net)$media # Vertex attribute "media"


# Find nodes and edges by attribute:

# (that returns oblects of type vertex sequence/edge sequence)

V(net)[media=="BBC"]

E(net)[type=="mention"]

as_edgelist(net, names=T)

as_adjacency_matrix(net, attr="weight")


# Plot with curved edges (edge.curved=.1) and reduce arrow size:

# Note that using curved edges will allow you to see multiple links

# between two nodes (e.g. links going in either direction, or multiplex links)

plot(net, edge.arrow.size=.4, edge.curved=.1)


















sudo apt -y install r-cran-rjson

boris@boris-All-Series:~/IGRAPH$ cat CoutryGraph1.py

library(assertthat)

library(dplyr)

library(purrr)

library(igraph)

library(ggplot2)

library(ggraph)

library(ggmap)

country_coords_txt <- "

 1     3.00000  28.00000       Algeria

 2    54.00000  24.00000           UAE

 3   139.75309  35.68536         Japan

 4    45.00000  25.00000 'Saudi Arabia'

 5     9.00000  34.00000       Tunisia

 6     5.75000  52.50000   Netherlands

 7   103.80000   1.36667     Singapore

 8   124.10000  -8.36667         Korea

 9    -2.69531  54.75844            UK

10    34.91155  39.05901        Turkey

11  -113.64258  60.10867        Canada

12    77.00000  20.00000         India

13    25.00000  46.00000       Romania

14   135.00000 -25.00000     Australia

15    10.00000  62.00000        Norway"

# nodes come from the above table and contain geo-coordinates for some

# randomly picked countries

nodes <- read.delim(text = country_coords_txt, header = FALSE,

                    quote = "'", sep = "",

                    col.names = c('id', 'lon', 'lat', 'name'))

set.seed(123)  # set random generator state for the same output

N_EDGES_PER_NODE_MIN <- 1

N_EDGES_PER_NODE_MAX <- 4

N_CATEGORIES <- 4

# edges: create random connections between countries (nodes)

edges <- map_dfr(nodes$id, function(id) {

  n <- floor(runif(1, N_EDGES_PER_NODE_MIN, N_EDGES_PER_NODE_MAX+1))

  to <- sample(1:max(nodes$id), n, replace = FALSE)

  to <- to[to != id]

  categories <- sample(1:N_CATEGORIES, length(to), replace = TRUE)

  weights <- runif(length(to))

  data_frame(from = id, to = to, weight = weights, category = categories)

})

edges <- edges %>% mutate(category = as.factor(category))


g <- graph_from_data_frame(edges, directed = FALSE, vertices = nodes)


edges_for_plot <- edges %>%

  inner_join(nodes %>% select(id, lon, lat), by = c('from' = 'id')) %>%

  rename(x = lon, y = lat) %>%

  inner_join(nodes %>% select(id, lon, lat), by = c('to' = 'id')) %>%

  rename(xend = lon, yend = lat)

assert_that(nrow(edges_for_plot) == nrow(edges))

nodes$weight = degree(g)

maptheme <- theme(panel.grid = element_blank()) +

  theme(axis.text = element_blank()) +

  theme(axis.ticks = element_blank()) +

  theme(axis.title = element_blank()) +

  theme(legend.position = "bottom") +

  theme(panel.grid = element_blank()) +

  theme(panel.background = element_rect(fill = "#596673")) +

  theme(plot.margin = unit(c(0, 0, 0.5, 0), 'cm'))

country_shapes <- geom_polygon(aes(x = long, y = lat, group = group),

                               data = map_data('world'),

                               fill = "#CECECE", color = "#515151",

                               size = 0.15)

mapcoords <- coord_fixed(xlim = c(-150, 180), ylim = c(-55, 80))

ggplot(nodes) + country_shapes +

geom_curve(aes(x = x, y = y, xend = xend, yend = yend,  # draw edges as arcs

                 color = category, size = weight),

             data = edges_for_plot, curvature = 0.33,

             alpha = 0.5) +

scale_size_continuous(guide = FALSE, range = c(0.25, 2)) + # scale for edGe widths

geom_point(aes(x = lon, y = lat, size = weight),           # draw nodes

             shape = 21, fill = 'white',

             color = 'black', stroke = 0.5) +

scale_size_continuous(guide = FALSE, range = c(1, 6)) +    # scale for node size

geom_text(aes(x = lon, y = lat, label = name),             # draw text labels

            hjust = 0, nudge_x = 1, nudge_y = 4,

            size = 3, color = "white", fontface = "bold") +

  mapcoords + maptheme
















boris@boris-All-Series:~/IGRAPH$ cat CoutryGraph2.py

library(assertthat)

library(dplyr)

library(purrr)

library(igraph)

library(ggplot2)

library(ggraph)

library(ggmap)


country_coords_txt <- "

 1     3.00000  28.00000       Algeria

 2    54.00000  24.00000           UAE

 3   139.75309  35.68536         Japan

 4    45.00000  25.00000 'Saudi Arabia'

 5     9.00000  34.00000       Tunisia

 6     5.75000  52.50000   Netherlands

 7   103.80000   1.36667     Singapore

 8   124.10000  -8.36667         Korea

 9    -2.69531  54.75844            UK

10    34.91155  39.05901        Turkey

11  -113.64258  60.10867        Canada

12    77.00000  20.00000         India

13    25.00000  46.00000       Romania

14   135.00000 -25.00000     Australia

15    10.00000  62.00000        Norway"

# nodes come from the above table and contain geo-coordinates for some

# randomly picked countries

nodes <- read.delim(text = country_coords_txt, header = FALSE,

                    quote = "'", sep = "",

                    col.names = c('id', 'lon', 'lat', 'name'))

set.seed(123)  # set random generator state for the same output

N_EDGES_PER_NODE_MIN <- 1

N_EDGES_PER_NODE_MAX <- 4

N_CATEGORIES <- 4

# edges: create random connections between countries (nodes)

edges <- map_dfr(nodes$id, function(id) {

  n <- floor(runif(1, N_EDGES_PER_NODE_MIN, N_EDGES_PER_NODE_MAX+1))

  to <- sample(1:max(nodes$id), n, replace = FALSE)

  to <- to[to != id]

  categories <- sample(1:N_CATEGORIES, length(to), replace = TRUE)

  weights <- runif(length(to))

  data_frame(from = id, to = to, weight = weights, category = categories)

})

edges <- edges %>% mutate(category = as.factor(category))


g <- graph_from_data_frame(edges, directed = FALSE, vertices = nodes)


edges_for_plot <- edges %>%

  inner_join(nodes %>% select(id, lon, lat), by = c('from' = 'id')) %>%

  rename(x = lon, y = lat) %>%

  inner_join(nodes %>% select(id, lon, lat), by = c('to' = 'id')) %>%

  rename(xend = lon, yend = lat)

assert_that(nrow(edges_for_plot) == nrow(edges))

nodes$weight = degree(g)

maptheme <- theme(panel.grid = element_blank()) +

  theme(axis.text = element_blank()) +

  theme(axis.ticks = element_blank()) +

  theme(axis.title = element_blank()) +

  theme(legend.position = "bottom") +

  theme(panel.grid = element_blank()) +

  theme(panel.background = element_rect(fill = "#596673")) +

  theme(plot.margin = unit(c(0, 0, 0.5, 0), 'cm'))

country_shapes <- geom_polygon(aes(x = long, y = lat, group = group),

                               data = map_data('world'),

                               fill = "#CECECE", color = "#515151",

                               size = 0.15)

mapcoords <- coord_fixed(xlim = c(-150, 180), ylim = c(-55, 80))

ggplot(nodes) + country_shapes +

geom_curve(aes(x = x, y = y, xend = xend, yend = yend,  # draw edges as arcs

                 color = category, size = weight),

             data = edges_for_plot, curvature = 0.33,

             alpha = 0.5) +

scale_size_continuous(guide = FALSE, range = c(0.25, 2)) + # scale for edGe widths


geom_point(aes(x = lon, y = lat, size = weight),           # draw nodes

             shape = 21, fill = 'white',

             color = 'black', stroke = 0.5) +

scale_size_continuous(guide = FALSE, range = c(1, 6)) +    # scale for node size

geom_text(aes(x = lon, y = lat, label = name),             # draw text labels

            hjust = 0, nudge_x = 1, nudge_y = 4,

            size = 3, color = "white", fontface = "bold") +

  mapcoords + maptheme

theme_transp_overlay <- theme(

  panel.background = element_rect(fill = "transparent", color = NA),

  plot.background = element_rect(fill = "transparent", color = NA)

)

p_base <- ggplot() + country_shapes + mapcoords + maptheme

p_edges <- ggplot(edges_for_plot) +

geom_curve(aes(x = x, y = y, xend = xend, yend = yend,  # draw edges as arcs

                 color = category, size = weight),

             curvature = 0.33, alpha = 0.5) +

scale_size_continuous(guide = FALSE, range = c(0.5, 2)) +  

  mapcoords + maptheme + theme_transp_overlay +

  theme(legend.position = c(0.5, -0.1),

        legend.direction = "horizontal")

p_nodes <- ggplot(nodes) +

geom_point(aes(x = lon, y = lat, size = weight),

             shape = 21, fill = "white", color = "black",    # draw nodes

             stroke = 0.5) +

scale_size_continuous(guide = FALSE, range = c(1, 6)) +    # scale for node size

  geom_text(aes(x = lon, y = lat, label = name),             # draw text labels

            hjust = 0, nudge_x = 1, nudge_y = 4,

            size = 3, color = "white", fontface = "bold") +

mapcoords + maptheme + theme_transp_overlay

p <- p_base +

  annotation_custom(ggplotGrob(p_edges), ymin = -74) +

  annotation_custom(ggplotGrob(p_nodes), ymin = -74)

print(p)


































References

https://www.r-bloggers.com/2018/05/three-ways-of-visualizing-a-graph-on-a-map/





ggnet2: network visualization with ggplot2 via R-studio

Например, функция ggnet2 — это функция визуализации для построения сетевых объектов как объектов ggplot2. Он принимает любой объект, который можно привести к сетевому классу, включая матрицы смежности или инцидентности, списки ребер или однорежимные сетевые объекты igraph.

Хотя мне больше нравится

nodes <- read.csv("Data1-Media-Sample-NODES.csv", header=T, as.is=T) 

links <- read.csv("Data1-Media-Sample-EDGES.csv", header=T, as.is=T)

install.packages('igraph')  # build

library('igraph') 

net <- graph_from_data_frame(d=links, vertices=nodes, directed=T)


boris@boris-All-Series:~/RBASE$ cat rbaseNetwork.R

library(GGally)

library(network)

library(sna)

library(ggplot2)

# random graph

net = rgraph(10, mode = "graph", tprob = 0.5)

net = network(net, directed = FALSE)


# vertex names

network.vertex.names(net) = letters[1:10]

ggnet2(net)

ggnet2(net, node.size = 6, node.color = "black", edge.size = 1, edge.color = "grey")

ggnet2(net, mode = "circle")

ggnet2(net, mode = "kamadakawai")

ggnet2(net, mode = "fruchtermanreingold", layout.par = list(cell.jitter = 0.75))

ggnet2(net, mode = "target", layout.par = list(niter = 100))

net %v% "phono" = ifelse(letters[1:10] %in% c("a", "e", "i"), "vowel", "consonant")

ggnet2(net, color = "phono")














boris@boris-All-Series:~/RBASE$ cat rbaseNetwork1.R

library(GGally)
library(network)
library(sna)
library(ggplot2)
# random graph
net = rgraph(10, mode = "graph", tprob = 0.5)
net = network(net, directed = FALSE)

# vertex names
network.vertex.names(net) = letters[1:10]
ggnet2(net)
ggnet2(net, node.size = 6, node.color = "black", edge.size = 1, edge.color = "grey")
ggnet2(net, mode = "circle")
ggnet2(net, mode = "kamadakawai")
ggnet2(net, mode = "fruchtermanreingold", layout.par = list(cell.jitter = 0.75))
ggnet2(net, mode = "target", layout.par = list(niter = 100))
net %v% "phono" = ifelse(letters[1:10] %in% c("a", "e", "i"), "vowel", "consonant")

ggnet2(net, color = "phono")

ggnet2(net, alpha = "phono", alpha.legend = "Phonetics")
ggnet2(net, shape = "phono", shape.legend = "Phonetics")
ggnet2(net, color = "phono", color.legend = "Phonetics")
ggnet2(net, size = "degree", size.legend = "Centrality")

ggnet2(net, color = "phono", size = "degree") +
  guides(color = FALSE, size = FALSE)
# control the colors of the nodes
ggnet2(net, color = "phono") +
  scale_color_brewer("", palette = "Set1",
                     labels = c("consonant" = "C", "vowel" = "V"),
                     guide = guide_legend(override.aes = list(size = 6)))

# control the size of the nodes
ggnet2(net, size = "degree") +
  scale_size_discrete("", range = c(5, 10), breaks = seq(10, 2, -2))
ggnet2(net, color = "phono", legend.size = 12, legend.position = "bottom") +
  theme(panel.background = element_rect(color = "grey"))
































Embedding custom widgets from Qt Designer on Ubuntu 20.04.4 Python 3.8

Выполните установку

$ sudo apt install qttools5-dev-tools 

Работая в QT5 Designer, следуйте официальным директивам

1.Добавьте виджет в главное окно. Назовите виджет как "graphWidget"

2. Продвиньте виджет, указав имя класса как PlotWidget и файл заголовка как pyqtgraph.
















Сохраните mainwindow.ui в рабочий каталог с виртуальным окружением содержащим пакеты для всех импортов в коде Пайтон , приведенных ниже ( через `pip install` )

(.env) boris@boris-All-Series:~/PYQT5$ cat firstApp.py

from PyQt5 import QtWidgets, uic

from pyqtgraph import PlotWidget

import pyqtgraph as pg

import sys

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):

        super(MainWindow, self).__init__(*args, **kwargs)

        #Load the UI Page

        uic.loadUi('mainwindow.ui', self)

def main():

    app = QtWidgets.QApplication(sys.argv)

    main = MainWindow()

    main.show()

    sys.exit(app.exec_())

if __name__ == '__main__':

    main()

(.env) boris@boris-All-Series:~/PYQT5$ cat secondApp.py

from PyQt5 import QtWidgets, uic

from pyqtgraph import PlotWidget, plot

import pyqtgraph as pg

import sys  # We need sys so that we can pass argv to QApplication

import os

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):

        super(MainWindow, self).__init__(*args, **kwargs)

        #Load the UI Page

        uic.loadUi('mainwindow.ui', self)

        self.plot([1,2,3,4,5,6,7,8,9,10], [30,32,34,32,33,31,29,32,35,45])

    def plot(self, hour, temperature):

        self.graphWidget.plot(hour, temperature)

def main():

    app = QtWidgets.QApplication(sys.argv)

    main = MainWindow()

    main.show()

    sys.exit(app.exec_())

if __name__ == '__main__':

    main()






























(.env) boris@boris-All-Series:~/PYQT5$ cat parabolApp.py
from PyQt5 import QtWidgets, uic
from pyqtgraph import PlotWidget, plot
import pyqtgraph as pg
import numpy as np
import sys  # We need sys so that we can pass argv to QApplication
import os

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        #Load the UI Page
        uic.loadUi('mainwindow.ui', self)

        np.random.seed(19680801)
        # create random data
        xdata = np.random.random([2, 50])        
        # split the data into two parts
        xdata1 = xdata[0, :]
        xdata2 = xdata[1, :]

        # sort the data so it makes clean curves
        xdata1.sort()
        xdata2.sort()

        # create some y data points
        ydata1 = xdata1 ** 2 
        ydata2 = 1 - xdata2 ** 3

        # Graphs plotted 
        self.plot(xdata1, ydata1)
        self.plot(xdata2, ydata2)

    def plot(self, hour, temperature):
        self.graphWidget.plot(hour, temperature)

def main():
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
































(.env) boris@boris-All-Series:~/PYQT5$ cat sinCoslApp.py
from PyQt5 import QtWidgets, uic
from pyqtgraph import PlotWidget, plot
import pyqtgraph as pg
import sys  # We need sys so that we can pass argv to QApplication
import os
import numpy as np

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        #Load the UI Page
        uic.loadUi('mainwindow.ui', self)
        
        x = np.arange(0,9 * np.pi, 0.1) 
        y = np.cos(np.cos(np.cos(np.cos(x)))) -  np.sin(np.sin(np.sin(np.sin(x)))) 

        self.plot(x, y) # plot grah 

    def plot(self, hour, temperature):
        self.graphWidget.plot(hour, temperature)

def main():
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
































Saturday, May 28, 2022

Word Cloud Python sample on Fedora 35

Что такое облако слов?

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

Существуют отраслевые инструменты, которые позволяют вам кодировать такие открытые данные, чтобы пользователи могли понимать их количественно. Тем не менее, это не дешево. Облака слов предлагают экономичную, но мощную альтернативу.

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

Code Source

(.env) [boris@sever35fedora WORDCLOUD]$ cat world_cloud.py

from wordcloud import WordCloud, STOPWORDS

import matplotlib.pyplot as plt

import pandas as pd

 # Reads 'Youtube04-Eminem.csv' file

df = pd.read_csv(r"Youtube04-Eminem.csv", encoding ="latin-1")

comment_words = ''

stopwords = set(STOPWORDS)

 # iterate through the csv file

for val in df.CONTENT:

    # typecaste each val to string

    val = str(val)

    # split the value

    tokens = val.split()

     # Converts each token into lowercase

    for i in range(len(tokens)):

        tokens[i] = tokens[i].lower()

    comment_words += " ".join(tokens)+" "

wordcloud = WordCloud(width = 800, height = 800,

                background_color ='white',

                stopwords = stopwords,

                min_font_size = 10).generate(comment_words)

# plot the WordCloud image                      

plt.figure(figsize = (8, 8), facecolor = None)

plt.imshow(wordcloud)

plt.axis("off")

plt.tight_layout(pad = 0)

plt.show()


































Приведенное выше облако слов было создано с использованием файла Youtube04-Eminem.csv в наборе данных. Одной из интересных задач может быть создание облаков слов с использованием других CSV-файлов, доступных в наборе данных.

Преимущества облака слов:

Анализ отзывов клиентов и сотрудников.
Определение новых ключевых слов SEO для таргетинга.
Недостатки облаков слов:

Облака слов не идеальны для каждой ситуации.
Данные должны быть оптимизированы для контекста.

































Friday, May 27, 2022

Pandas – Filter DataFrame for multiple conditions

 Кадры данных Pandas допускают логическое индексирование, что является довольно эффективным способом фильтрации фрейма данных для нескольких условий. При логическом индексировании логические векторы, сгенерированные на основе условий, используются для фильтрации данных. Множественные условия с операторами | (для операции или), & (для операции и) и ~ (для операции не) могут быть сгруппированы с помощью круглых скобок ()

Используйте операторы &, |, ~ вместо и, или, соответственно нет

Pandas предоставляет операторы & (для и), | (для или) и ~ (для нет), чтобы применять логические операции к рядам и объединять несколько условий вместе при фильтрации кадра данных pandas. Если вместо этого вы используете логические операторы Python, это приведет к ошибке.

(.env) boris@boris-All-Series:~/PANDAS$ cat samplePandas1.py

import pandas as pd

data = {

    'Name': ['Microsoft Corporation', 'Google, LLC', 'Tesla, Inc.',\

             'Apple Inc.', 'Netflix, Inc.'],

    'Symbol': ['MSFT', 'GOOG', 'TSLA', 'AAPL', 'NFLX'],

    'Industry': ['Tech', 'Tech', 'Automotive', 'Tech', 'Entertainment'],

    'Shares': [100, 50, 150, 200, 80]

}

df = pd.DataFrame(data)

print(df)

print('\n')

df_filtered = df[(df['Industry']=='Tech')&(df['Shares']>=100)]

print(df_filtered)

print('\n')


df_filtered = df[(df['Shares']>=100) & (df['Shares']<=150)]

print(df_filtered)

(.env) boris@boris-All-Series:~/PANDAS$ python3 samplePandas1.py

                    Name Symbol       Industry  Shares

0  Microsoft Corporation   MSFT           Tech     100

1            Google, LLC   GOOG           Tech      50

2            Tesla, Inc.   TSLA     Automotive     150

3             Apple Inc.   AAPL           Tech     200

4          Netflix, Inc.   NFLX  Entertainment      80



                    Name Symbol Industry  Shares

0  Microsoft Corporation   MSFT     Tech     100

3             Apple Inc.   AAPL     Tech     200



                    Name Symbol    Industry  Shares

0  Microsoft Corporation   MSFT        Tech     100

2            Tesla, Inc.   TSLA  Automotive     150






























Выбор всех строк из данного фрейма данных, в которых «Возраст» равен 21, а «Поток» присутствует в списке параметров с использованием .loc[].

(.env) boris@boris-All-Series:~/PANDAS$ cat samplePandas2.py
import pandas as pd
  
record = {
  'Name': ['Ankit', 'Amit', 'Aishwarya', 'Priyanka', 'Priya', 'Shaurya' ],
  'Age': [21, 19, 20, 18, 17, 21],
  'Stream': ['Math', 'Commerce', 'Science', 'Math', 'Math', 'Science'],
  'Percentage': [88, 92, 95, 70, 65, 78]}
  
# create a dataframe
dataframe = pd.DataFrame(record, columns = ['Name', 'Age', 'Stream', 'Percentage'])
  
print("Given Dataframe :\n", dataframe) 
  
options = ['Math']
  
# selecting rows based on condition
rslt_df = dataframe.loc[(dataframe['Age'] == 21) &
              dataframe['Stream'].isin(options)]
  
print('\nResult dataframe :\n', rslt_df)

(.env) boris@boris-All-Series:~/PANDAS$ python3 samplePandas2.py
Given Dataframe :
         Name  Age    Stream  Percentage
0      Ankit   21      Math          88
1       Amit   19  Commerce          92
2  Aishwarya   20   Science          95
3   Priyanka   18      Math          70
4      Priya   17      Math          65
5    Shaurya   21   Science          78

Result dataframe :
       Name  Age   Stream  Percentage
0    Ankit   21     Math          88

Базовый подход

(.env) boris@boris-All-Series:~/PANDAS$ cat samplePandas3.py
import pandas as pd
  
record = {
  'Name': ['Ankit', 'Amit', 'Aishwarya', 'Priyanka', 'Priya', 'Shaurya' ],
  'Age': [21, 29, 20, 18, 27, 21],
  'Stream': ['Math', 'Commerce', 'Science', 'Math', 'Math', 'Science'],
  'Percentage': [88, 92, 95, 70, 65, 78]}
  
# create a dataframe
dataframe = pd.DataFrame(record, columns = ['Name', 'Age', 'Stream', 'Percentage'])
  
print("Given Dataframe :\n", dataframe) 
  
options = ['Math', 'Commerce']
  
# selecting rows based on condition
rslt_df = dataframe[(dataframe['Age'] > 21) &
          dataframe['Stream'].isin(options)]
  
print('\nResult dataframe :\n', rslt_df)

(.env) boris@boris-All-Series:~/PANDAS$ python3 samplePandas3.py
Given Dataframe :
         Name  Age    Stream  Percentage
0      Ankit   21      Math          88
1       Amit   29  Commerce          92
2  Aishwarya   20   Science          95
3   Priyanka   18      Math          70
4      Priya   27      Math          65
5    Shaurya   21   Science          78

Result dataframe :
     Name  Age    Stream  Percentage
1   Amit   29  Commerce          92
4  Priya   27      Math          65