4.2. Análise dos dados de periódicos da Biblioteca Nacional Digital de Portugal#

Nesse notebook, vamos limpar e apresentar os dados disponibilizados pela BNP em seu sítio de dados abertos. Buscaremos compreender o escopo do acervo digitalizado e disponibilizado e ao mesmo tempo apresentar suas características gerais.

Atenção

Diferentemente do projeto BNDigital do Brasil, a BND-PT não possui uma interface específica para os periódicos. O acervo de periódicos está organizado em coleção que pode ser acessada por um filtro de pesquisa dentro do acervo geral. Nesse notebook e por toda pesquisa, analisaremos apenas a coleção de periódicos.

Dados Abertos da Biblioteca Nacional Digital#

A política de dados abertos da BNP disponibiliza dados de forma estruturada e completa, propiciando acesso, reutilização e análises dos mesmos de forma mais eficiente. Todas as informações sobre a política assim como os dados pode ser acessados no sítio OpenData BNPORTUGAL.PT. Em resumo:

A Biblioteca Nacional de Portugal (BNP) fornece, nestas páginas, informação e acesso aos conjuntos de dados que disponibiliza livre e gratuitamente: todo o catálogo bibliográfico da BNP, da Base Nacional de Dados Bibliográficos - PORBASE, a Bibliografia Nacional Portuguesa (desde 1931) e Biblioteca Nacional Digital, entre outros.

Os dados podem ser obtidos em diferentes esquemas (UNIMARC, Dublin Core, Mods) e formatos de codificação (ISO2709, MarcXchange, RDF, RDF Turtle, RIS) através de serviços de pesquisa e recuperação de registos ou serviços OAI-PMH para obtenção de conjuntos de dados.

Parte destes serviços de acesso aos dados dos sistemas de informação bibliográfica da BNP já existem desde 2003, em regime de acesso livre. A sua publicação neste site reforça a visibilidade e amplia a diversidade dos serviços disponíveis, no espírito da política de livre acesso aos dados preconizada pela Diretiva 2013/37/UE do Parlamento Europeu e do Conselho, de 26 de Junho de 2013, que altera a Diretiva 2003/98/CE Relativa à Reutilização de Informações do Setor Público, de 17 de novembro (PSI).

Neste sentido, os dados são disponibilizados sob uma licença CC0 (Creative Commons CC0 1.0 Universal Public Domain Dedication), pelo que podem ser utilizados, e reutilizados, sem quaisquer restrições, para quaiquer(sic) fins, comerciais ou não. Todos os serviços de acesso aos dados e conjunto de dados não requerem qualquer registo prévio ou autenticação.

Os serviços de dados abertos da BNP estão também disponíveis em Dados.gov e European Data Portal.

Coleta de dados#

Os dados referentes à Biblioteca Nacional Digital foram obtidos através dos serviços da OPENDATA BNPORTUGAL.PT, no link de ficheiros para download.

Os dados coletados em formato CSV foram os seguintes:

Apresentação dos dados#

A partir dos ficheiros coletados, possuímos dois conjuntos de dados: um com todas as obras digitalizadas pela BNP e outro com as obras digitalizadas que se encontram em domínio público. Farei uma apresentação geral dos dados e em seguida analisaremos apenas os periódicos que compõem o acervo.

Ambos serão analisados com a biblioteca pandas do Python e apresentados com a biblioteca plotly.

# importar bibliotecas
import pandas as pd
import plotly.express as px
import plotly.io as pio
import plotly.offline as py
pio.renderers.default = "notebook"

Dados gerais do acervo#

Vamos criar um dataframe com os dados gerais do acervo e apresentar algumas informações básicas.

# importar dataset e criar dataframe
file_encoding = 'utf8' # definir encoding do ficheiro
input_fd = open("../../../data/bndpt/bnd-pt.csv", encoding=file_encoding, errors = 'backslashreplace')
df = pd.read_csv(input_fd, sep=',', encoding='utf-8')

Sobre o código anterior e porque utilizei open, ver a resposta no StackOverflow

Visão geral dos dados#

As próximas três células apresentam dados comuns aos datasets de obras em geral e em domínio público.

Para termos uma ideia geral do dataframe, vamos ver as primeiras 10 linhas do dataframe:

df.head()
BNP record ID Material type ISBN Legal deposit number Language of Text Language of Original Work Title Subtitle Original title Edition ... Name of Publisher Date of Publication Extent of Item Dimensions Series Volume Universal Decimal Classification Authors Image Persistent URL
0 544 Book NaN NaN por NaN A Suma Oriental de Tomé Pires e o livro de Fra... NaN NaN NaN ... por Ordem da Universidade 1978 X, 503 p. 22 cm Acta Universitatis Conimbrigensis NaN 910.4(469+5)"15" ; 821.134.3-992"15" Pires, Tomé ; Rodrigues, Francisco ; Cortesão,... https://purl.pt/37597/service/media/cover/low http://id.bnportugal.gov.pt/bib/catbnp/544
1 619 Book NaN NaN por NaN Timor, do século XVI ao século XX [catálogo da exposição] no ano do IV Centenári... NaN NaN ... B. N. L. 1980 66, [1] p. 29 cm NaN NaN 011(594.75)"15/19" Portugal, Biblioteca Nacional de Lisboa https://purl.pt/206/service/media/cover/low http://id.bnportugal.gov.pt/bib/catbnp/619
2 879 Book NaN NaN eng NaN Francisco de Holanda a little known source for the history of forti... NaN NaN ... Fund. Calouste Gulbenkian 1979 p. 163-202 25 cm NaN NaN 74 Bury, John https://purl.pt/36983/service/media/cover/low http://id.bnportugal.gov.pt/bib/catbnp/879
3 1825 Book NaN NaN por NaN O problema da dupla revisão na Constituição Po... NaN NaN NaN ... CODECO 1978 38, [1] p. 21 cm NaN NaN 342 Canotilho, J. J. Gomes https://purl.pt/31079/service/media/cover/low http://id.bnportugal.gov.pt/bib/catbnp/1825
4 2534 Book NaN NaN por NaN Elisa de Sousa Pedroso NaN NaN NaN ... [s.n. 1976 4 p. 25 cm NaN NaN 92 NaN https://purl.pt/39062/service/media/cover/low http://id.bnportugal.gov.pt/bib/catbnp/2534

5 rows × 21 columns

O dataframe é composto pelas seguintes colunas:

# mostrar colunas em lista
df.columns.tolist()
['BNP record ID',
 'Material type',
 'ISBN',
 'Legal deposit number',
 'Language of Text',
 'Language of Original Work',
 'Title',
 'Subtitle',
 'Original title',
 'Edition',
 'Place of publicattion',
 'Name of Publisher',
 'Date of Publication',
 'Extent of Item',
 'Dimensions',
 'Series',
 'Volume',
 'Universal Decimal Classification',
 'Authors',
 'Image',
 'Persistent URL']

Tipos de Materiais#

Primeiro vamos analisar que tipos de materiais compõem o acervo digitalizado e disponibilizado pela BNP.

#listar tipos de materiais
df['Material type'].unique().tolist()
['Book',
 'Periodical',
 'Iconographic material',
 nan,
 'Notated music',
 'Cartographic material',
 'Manuscript',
 'Multimedia',
 'Electronic resource']

Encontramos oito tipos de materiais: Livro, Material Iconográfico, Periódico, Material Cartográfico, Partitura, Manuscrito, Fonte eletrônica, Multimeios.

A contagem dos tipos de materiais no conjunto de dados das obras em geral pode ser vista no dataframe e gráfico abaixo:

# criar dataframe com os tipos de materiais e a quantidade de cada um
df_material = df['Material type'].value_counts().rename_axis('Material type').reset_index(name='counts')
df_material
Material type counts
0 Iconographic material 19478
1 Book 10029
2 Manuscript 2793
3 Cartographic material 2445
4 Periodical 1819
5 Notated music 1029
6 Multimedia 54
7 Electronic resource 43
# criar gráfico de barras com os dados de tipos de materiais
fig1 = px.bar(df_material, x='Material type', y='counts', title='Tipos de materiais')
fig1.show()

Vamos analisar os tipos de materiais por ano de publicação.

# criar dataframe com os tipos de materiais e o ano de publicação e a quantidade de cada um
df_material_ano = df.groupby(['Material type', 'Date of Publication']).size().reset_index(name='counts')
df_material_ano
Material type Date of Publication counts
0 Book 3
1 Book 14 3
2 Book 1440 1
3 Book 1454 1
4 Book 1463 1
... ... ... ...
2352 Periodical 1987 1
2353 Periodical 1989 1
2354 Periodical 1990 1
2355 Periodical 1997 1
2356 Periodical 19_ 1

2357 rows × 3 columns

# criar gráfico de barras com os dados de tipos de materiais e ano de publicação
fig2 = px.bar(df_material_ano, x='Material type', y='counts', color='Date of Publication', title='Tipos de materiais e ano de publicação')
fig2.show()

Vamos analisar o volume de itens por ano de publicação, independentemente do tipo de material.

# Criar dataframe com a quantidade de publicações por ano
df_ano = df['Date of Publication'].value_counts().rename_axis('Date of Publication').reset_index(name='counts')
# sort dataframe by year
df_ano = df_ano.sort_values(by=['Date of Publication'])
df_ano
Date of Publication counts
548 6
658 1010 1
637 1075 1
541 1101 6
634 1111 1
... ... ...
275 2018 39
498 2019 13
500 2020 13
553 2021 6
686 2022 1

687 rows × 2 columns

# Criar scatter plot com os dados de datas de publicação com as datas de publicação no eixo Y
fig3 = px.scatter(df_ano, x='Date of Publication', y='counts', title='Quantidades de publicação por ano - Todos os materiais')
fig3.show()

Análise do acervo de Periódicos#

Vamos analisar com mais detalhes o acervo digitalizado de periódicos.

#criar df apenas com coluna "Periodical"
df_periodical = df[df['Material type'] == 'Periodical']

Idiomas#

Vamos contar os idiomas dos periódicos.

# criar dataframe com a contagem de idiomas
df_periodical_lang = df_periodical['Language of Text'].value_counts().rename_axis('Language of Text').reset_index(name='counts')
df_periodical_lang
Language of Text counts
0 por 1798
1 fre 7
2 eng 7
3 spa 3
4 por 1
5 mul 1
6 chi 1
7 ger 1
# criar gráfico de barras com os dados de idiomas dos periódicos
fig4 = px.bar(df_periodical_lang, x='Language of Text', y='counts', title='Idiomas dos periódicos')
fig4.show()

Praticamente a totalidade dos itens são em português, com uma quantidade estatisticamente insignificante de itens em outros idiomas.

Data de Publicação#

Vamos analisar a distribuição dos itens por ano de publicação e buscar compreender quais períodos históricos estão mais bem representados no acervo.

# criar dataframe com as datas de publicação e a quantidade de cada uma organizadas cronologicamente
df_date = df_periodical['Date of Publication'].value_counts().rename_axis('Date of Publication').reset_index(name='counts')
# organizar o o dataframe pelos valores na coluna "Date of Publication"
df_date = df_date.sort_values(by=['Date of Publication'])
df_date
Date of Publication counts
129 1641 1
153 1730 1
139 1743 1
149 1752 1
141 1779 1
... ... ...
158 1987 1
131 1989 1
145 1990 1
135 1997 1
170 19_ 1

179 rows × 2 columns

# Criar scatter plot com os dados de datas de publicação com as datas de publicação no eixo Y
fig5 = px.scatter(df_date, x='Date of Publication', y='counts', title='Quantidade de publicação dos periódicos por ano')
fig5.show()

Podemos perceber que o escopo temporal do acervo se estende desde meados do século XVII até o último quartel do século XX. A primeira publicação data de 1641 e a última de 1997.

Entretanto, os anos de publicação com mais de 10 itens se concentram entre 1872 e 1932.

# remove all special characters in column "Date of Publication"
df_periodical['Date of Publication'] = df_periodical['Date of Publication'].str.replace(r'\W', '')
df_periodical['Date of Publication'] = df_periodical['Date of Publication'].str.replace('_', '')
# transformar a coluna "Date of Publication" em inteiro
df_periodical['Date of Publication'] = df_periodical['Date of Publication'].astype(int)
# count unique values in column date of publication and sum them
df_periodical['Date of Publication'].nunique()
177
# count values in column date of publication and sum them
df_periodical['Date of Publication'].count()
1819
# count values between 1872 and 1920 and sum them
df_periodical[(df_periodical['Date of Publication'] >= 1872) & (df_periodical['Date of Publication'] <= 1932)]['Date of Publication'].value_counts().sum()
1475

Os dados das últimas 3 células mostram que, nos 60 anos entre 1872 e 1932, encontramos 1475 itens, o que dá uma média de 24,6 itens por anos e corresponde a 81,1% de todo o acervo. Nos 117 anos restantes, encontramos 344 itens, o que dá uma média de 3,2 itens por ano e corresponde a 18,9%.

Vamos olhar com mais calma esse período de 60 anos. Criando um dataframe apenas com os itens publicados entre 1872 e 1932 e comparando com o dataframe geral, podemos ver que:

# criar dataframe com os dados
df_periodical_1872_1932 = pd.DataFrame({'1872-1932': [1475], 'Demais Anos': [344]})
#criar gráfico de barras com os dados
fig6 = px.bar(df_periodical_1872_1932, title='Periódicos por ano de publicação')
fig6.show()

Podemos olhar para as datas com mais de dez publicações e ver quais são os periódicos mais representados no acervo.

# criar dataframe com as datas de publicação que contam apenas 10 ou mais publicações
df_date_10 = df_date[df_date['counts'] >= 10]
df_date_10
Date of Publication counts
55 1809 10
41 1826 20
53 1836 11
56 1839 10
58 1872 10
43 1875 18
51 1876 12
54 1877 11
39 1878 20
42 1879 19
22 1880 29
21 1881 29
16 1882 31
20 1883 29
30 1884 24
4 1885 39
24 1886 29
10 1887 34
8 1888 38
9 1889 37
23 1890 29
2 1891 40
26 1892 26
5 1893 39
1 1894 41
6 1895 38
0 1896 45
3 1897 40
17 1898 30
31 1899 24
44 1900 18
57 1902 10
46 1903 14
50 1905 13
49 1906 13
37 1907 22
35 1908 23
15 1909 32
7 1910 38
14 1911 32
12 1912 34
13 1913 33
11 1914 34
28 1915 25
25 1916 26
32 1917 24
45 1918 18
19 1919 30
38 1920 21
34 1921 24
27 1922 26
33 1923 24
36 1924 23
18 1925 30
29 1926 25
47 1927 14
40 1929 20
48 1930 14
52 1932 11
# transforme a coluna "Date of Publication" em inteiro usando .loc
df_date_10.loc[:, 'Date of Publication'] = df_date_10.loc[:, 'Date of Publication'].astype(int)
# criar gráfico de barras com os dados de datas de publicação que contam apenas 10 ou mais publicações, organizadas cronologicamente
fig7 = px.bar(df_date_10, x='Date of Publication', y='counts', title='Quantidade de publicação dos periódicos - 10 ou mais por ano')
fig7.show()

A maioria dos anos com mais de 10 publicações está concentrada entre as décadas de 1870 e 1930.

Editoras e editores#

Vamos contar, organizar e gerar visualizações sobre as editoras e editores dos periódicos.

Primeiramente, vamos limpar os dados, pois há erros de digitação e inconsistências.

# na coluna name of publisher, substituir os valores ""[s.n.]", "s.n.]" e "[s.n." por "Sem editora"
df_periodical['Name of Publisher'] = df_periodical['Name of Publisher'].replace(['[s.n.]', 's.n.]', '[s.n.', 's.n.'], 'Sem editora')
# unir os valores "na Impressão Regia" e "na Impressão Régia"
df_periodical['Name of Publisher'] = df_periodical['Name of Publisher'].replace(['na Impressão Regia', 'na Impressão Régia'], 'na Impressão Régia')
# unir os valores "Imprensa Nacional" e "na Imprensa Nacional"
df_periodical['Name of Publisher'] = df_periodical['Name of Publisher'].replace(['Imprensa Nacional', 'na Imprensa Nacional'], 'na Imprensa Nacional')

Vamos criar um dataframe com as editoras e editores e contar quantas vezes cada um aparece.

# criar dataframe com as editoras e a quantidade de cada uma
df_publisher = df_periodical['Name of Publisher'].value_counts().rename_axis('Name of Publisher').reset_index(name='counts')
df_publisher
Name of Publisher counts
0 Sem editora 190
1 Paulo da Fonseca 17
2 na Imprensa Nacional 16
3 J. Garcia de Lima 13
4 na Impressão Régia 12
... ... ...
1397 na Typ. do Panorama 1
1398 J. S. Vieira 1
1399 E.E.A. 1
1400 A. Birros 1
1401 Tip. Minerva Indiana 1

1402 rows × 2 columns

A visualização abaixo mostra as 50 editoras e editores com mais itens no acervo.

# criar um gráfico de barras com os 50 primeiros valores de editoras
fig8 = px.bar(df_publisher.head(50), x='Name of Publisher', y='counts', title='Editoras dos periódicos')
fig8.show()

Se desconsiderarmos os itens sem editora ou editor, o editor com mais itens no acervo é Paulo da Fonseca, seguido pela Imprensa Nacional e Impressão Régia.

# criar um gráfico de barras com as primeiras 20 editoras, excluindo a primeira.
fig9 = px.bar(df_publisher[1:31], x='Name of Publisher', y='counts', title='Editoras dos periódicos (sem itens "Sem editora")')
fig9.show()
Contar palavras nos títulos e subtítulos#

Apesar de não ser o foco da pesquisa nesse momento, é possível contar as palavras nos títulos e subtítulos dos periódicos.

# criar dataframe com a quantidade de títulos
df_title = df_periodical['Title'].value_counts().rename_axis('Title').reset_index(name='counts')
df_title
Title counts
0 A Verdade 12
1 O Futuro 11
2 O Academico 9
3 A Alvorada 7
4 O Liberal 6
... ... ...
1540 O Legitimista 1
1541 O Jornal do Operario 1
1542 O Contemporaneo 1
1543 Jornal dos Romances 1
1544 A Provincia 1

1545 rows × 2 columns

# ler a coluna título e contar palavras únicas e a quantidade de vezes que aparecem
#mostrar apenas palavras mais longas que 3 caracteres
# mostrar apenas as 100 palavras mais frequentes
df_unique_title = df_title['Title'].str.split(expand=True).stack().value_counts().loc[lambda x : x.index.str.len() > 3].head(100)
df_unique_title = df_unique_title.rename_axis('Title').reset_index(name='counts')
df_unique_title
Title counts
0 Jornal 52
1 Revista 42
2 Correio 35
3 Portugal 31
4 Gazeta 29
... ... ...
95 João 4
96 Echos 4
97 Brazil 4
98 Justiça 4
99 Exposição 4

100 rows × 2 columns

# gráfico de barras com as 50 palavras mais frequentes
fig10 = px.bar(df_unique_title.head(50), x='Title', y='counts', title='Palavras mais repetidas nos títulos dos periódicos (com mais de três caracteres)')
fig10.show()
# criar dataframe com a quantidade de títulos
df_subtitle = df_periodical['Subtitle'].value_counts().rename_axis('Subtitle').reset_index(name='counts')
df_subtitle
Subtitle counts
0 semanario independente 12
1 semanario republicano 11
2 folha semanal 11
3 semanário republicano 7
4 semanario humoristico 5
... ... ...
1028 folha imparcial 1
1029 número commemorativo offerecido por J. C. Viei... 1
1030 jornal d´annuncios illustrado 1
1031 quinzenario litterario e humoristico 1
1032 mensário de arte 1

1033 rows × 2 columns

# ler a coluna título e contar palavras únicas e a quantidade de vezes que aparecem
#mostrar apenas palavras mais longas que 3 caracteres
# mostrar apenas as 100 palavras mais frequentes
df_unique_subtitle = df_subtitle['Subtitle'].str.split(expand=True).stack().value_counts().loc[lambda x : x.index.str.len() > 3].head(100)
df_unique_subtitle = df_unique_subtitle.rename_axis('Subtitle').reset_index(name='counts')
df_unique_subtitle
Subtitle counts
0 semanario 136
1 jornal 118
2 revista 112
3 orgão 106
4 folha 81
... ... ...
95 popular 7
96 arte, 7
97 democratico 7
98 litteratura, 7
99 Sociedade 6

100 rows × 2 columns

# gráfico de barras com as 50 palavras mais frequentes
fig11 = px.bar(df_unique_subtitle.head(50), x='Subtitle', y='counts', title='Palavras mais repetidas nos subtítulos dos periódicos (com mais de três caracteres)')
fig11.show()

Considerações gerais#

Acervo de periódicos é sobretudo em português, e seu recorte temporal é vasto, desde o século XVII até o século XX. Contudo, ao analisarmos os dados percebemos que a maior parte dos itens se concentra entre as décadas de 1870 e 1930: atingindo mais de 75% de todos os itens digitalizados.

Dados de de acervo em domínio público#

Nessa segunda parte, repetiremos a análise anterior, mas considerando apenas os itens em domínio público.

# importar dataset e criar dataframe
file_encoding = 'utf8'        # set file_encoding to the file encoding (utf8, latin1, etc.)
input_fd = open("../../../data/bndpt/bnd-pt_livre.csv", encoding=file_encoding, errors = 'backslashreplace')
df_livre = pd.read_csv(input_fd, sep=',', encoding='utf-8')

Tipos de Material#

# criar dataframe com os tipos de materiais e a quantidade de cada um
df_material_livre = df_livre['Material type'].value_counts().rename_axis('Material type').reset_index(name='counts')
df_material_livre
Material type counts
0 Book 9008
1 Iconographic material 7953
2 Manuscript 2781
3 Cartographic material 2283
4 Periodical 1359
5 Notated music 948
6 Multimedia 52
7 Electronic resource 35
# criar gráfico de barras com os dados de tipos de materiais
fig12 = px.bar(df_material_livre, x='Material type', y='counts', title='Tipos de materiais em domínio público.')
fig12.show()
# criar dataframe com os tipos de materiais e o ano de publicação e a quantidade de cada um
df_material_ano_livre = df_livre.groupby(['Material type', 'Date of Publication']).size().reset_index(name='counts')
df_material_ano_livre
Material type Date of Publication counts
0 Book 3
1 Book 14 3
2 Book 1440 1
3 Book 1454 1
4 Book 1463 1
... ... ... ...
2226 Periodical 1964 1
2227 Periodical 1975 1
2228 Periodical 1987 1
2229 Periodical 1989 1
2230 Periodical 19_ 1

2231 rows × 3 columns

# criar gráfico de barras com os dados de tipos de materiais e ano de publicação
fig13 = px.bar(df_material_ano_livre, x='Material type', y='counts', color='Date of Publication', title='Tipos de materiais e ano de publicação em domínio público.')
fig13.show()

Quantidade de itens por ano de publicação#

# Criar dataframe com a quantidade de publicações por ano
df_ano_livre = df_livre['Date of Publication'].value_counts().rename_axis('Date of Publication').reset_index(name='counts')
# sort dataframe by year
df_ano_livre = df_ano_livre.sort_values(by=['Date of Publication'])
df_ano_livre
Date of Publication counts
547 5
659 1010 1
667 1075 1
526 1101 6
624 1111 1
... ... ...
357 2015 23
194 2016 43
144 2017 52
321 2018 27
537 2019 5

679 rows × 2 columns

# Criar scatter plot com os dados de datas de publicação com as datas de publicação no eixo Y
fig14 = px.scatter(df_ano_livre, x='Date of Publication', y='counts', title='Quantidade de publicação em domínio público por ano.')
fig14.show()

Periódicos#

#criar df apenas com coluna "Periodical"
df_periodical_livre = df_livre[df_livre['Material type'] == 'Periodical']
df_periodical_livre.head()
BNP record ID Material type ISBN Legal deposit number Language of Text Language of Original Work Title Subtitle Original title Edition ... Name of Publisher Date of Publication Extent of Item Dimensions Series Volume Universal Decimal Classification Authors Image Persistent URL
52 40112 Periodical NaN NaN por NaN Porbase Base Nacional de Dados Bibliográficos NaN NaN ... Biblioteca Nacional 1987 NaN 30 cm NaN NaN 002.6:681.3(469)(05) Portugal, Biblioteca Nacional https://purl.pt/23861/service/media/cover/low http://id.bnportugal.gov.pt/bib/catbnp/40112
147 57737 Periodical NaN NaN por NaN O Pinto Calçudo NaN NaN NaN ... Alunos da Escola Masculina de Vila Real de San... 1958 NaN 27 cm NaN NaN 372.22(469.601.26 VRSA)(05) Borges, José Maria S. Baptista ; Marques, Carl... https://purl.pt/36015/service/media/cover/low http://id.bnportugal.gov.pt/bib/catbnp/57737
159 63466 Periodical NaN NaN por NaN O João Ratão NaN NaN NaN ... Caixa Escolar Nossa Senhora de Fátima 1961 NaN 20 cm NaN NaN 372(469.601)(05) Caixa Escolar Nossa Senhora de Fátima ; Escola... https://purl.pt/36019/service/media/cover/low http://id.bnportugal.gov.pt/bib/catbnp/63466
230 90413 Periodical NaN NaN por NaN Alma Nacional NaN NaN NaN ... A. J. Almeida 1910 NaN 26 cm NaN NaN NaN Almeida, António José de https://purl.pt/16522/service/media/cover/low http://id.bnportugal.gov.pt/bib/catbnp/90413
231 90414 Periodical NaN NaN por NaN A Águia revista quinzenal ilustrada de literatura e cr... NaN NaN ... Tércio Miranda 1910 NaN 31 cm NaN NaN 070 Pinto, Álvaro ; Pascoais, Teixeira de ; Carnei... https://purl.pt/12152/service/media/cover/low http://id.bnportugal.gov.pt/bib/catbnp/90414

5 rows × 21 columns

Idiomas#

# criar dataframe com a contagem de idiomas
df_language_livre = df_periodical_livre['Language of Text'].value_counts().rename_axis('Language').reset_index(name='counts')
df_language_livre
Language counts
0 por 1343
1 eng 6
2 fre 5
3 spa 2
4 mul 1
5 chi 1
6 ger 1
fig15 = px.bar(df_language_livre, x='Language', y='counts', title='Idiomas dos periódicos em domínio público.')
fig15.show()

Datas de publicação#

# criar dataframe com as datas de publicação e a quantidade de cada uma organizadas cronologicamente
df_date_livre = df_periodical_livre['Date of Publication'].value_counts().rename_axis('Date of Publication').reset_index(name='counts')
# organizaro o dataframe pelos valores na coluna "Date of Publication"
df_date_livre = df_date_livre.sort_values(by=['Date of Publication'])
df_date_livre
Date of Publication counts
123 1641 1
132 1730 1
105 1743 1
127 1752 1
110 1779 1
... ... ...
116 1964 1
118 1975 1
121 1987 1
122 1989 1
141 19_ 1

154 rows × 2 columns

# Criar scatter plot com os dados de datas de publicação com as datas de publicação no eixo Y
fig16 = px.scatter(df_date_livre, x='Date of Publication', y='counts', title='Quantidade de publicação dos periódicos em domínio público por ano.')
fig16.show()
# criar gráfico de barras com os dados de datas de publicação
fig17 = px.bar(df_date_livre, x='Date of Publication', y='counts', title='Quantidade de publicação dos periódicos em domínio público por ano.')
fig17.show()

Limpar os dados e transformar a coluna ‘Date of Publication’ em inteiro.

# remove all special characters in column "Date of Publication"
df_periodical_livre['Date of Publication'] = df_periodical_livre['Date of Publication'].str.replace(r'\W', '')
df_periodical_livre['Date of Publication'] = df_periodical_livre['Date of Publication'].str.replace('_', '')
# transformar a coluna "Date of Publication" em inteiro
df_periodical_livre['Date of Publication'] = df_periodical_livre['Date of Publication'].astype(int)
# count unique values in column date of publication and sum them
df_periodical_livre['Date of Publication'].nunique()
152
# count values in column date of publication and sum them
df_periodical_livre['Date of Publication'].count()
1359
# count values between 1872 and 1920 and sum them
df_periodical_livre[(df_periodical_livre['Date of Publication'] >= 1872) & (df_periodical_livre['Date of Publication'] <= 1920)]['Date of Publication'].value_counts().sum()
1024
# criar dataframe com os dados
df_periodical_1872_1920 = pd.DataFrame({'1872-1920': [1024], 'Demais Anos': [335]})
#criar gráfico de barras com os dados
fig18 = px.bar(df_periodical_1872_1920, title='Periódicos em domínio público por ano de publicação.')
fig18.show()
# criar dataframe com as datas de publicação que contam apenas 10 ou mais publicações
df_date_10_livre = df_date_livre[df_date_livre['counts'] >= 10]
df_date_10_livre
Date of Publication counts
42 1809 10
22 1826 20
36 1836 11
41 1839 10
40 1872 10
27 1875 18
34 1876 12
38 1877 11
23 1878 20
26 1879 18
16 1880 28
11 1881 29
10 1882 31
14 1883 29
19 1884 24
4 1885 39
12 1886 29
9 1887 34
5 1888 38
8 1889 36
13 1890 29
2 1891 40
17 1892 26
6 1893 38
0 1894 41
7 1895 37
3 1896 40
1 1897 40
15 1898 28
21 1899 23
30 1900 14
37 1903 11
25 1907 18
29 1908 15
18 1909 26
20 1910 23
24 1911 19
35 1912 12
28 1913 17
32 1914 13
31 1917 14
39 1918 11
43 1919 10
33 1920 13
# transforme a coluna "Date of Publication" em inteiro usando .loc
df_date_10_livre.loc[:, 'Date of Publication'] = df_date_10_livre.loc[:, 'Date of Publication'].astype(int)
# criar gráfico de barras com os dados de datas de publicação que contam apenas 10 ou mais publicações, organizadas cronologicamente
fig19 = px.bar(df_date_10_livre, x='Date of Publication', y='counts', title='Quantidade de publicação dos periódicos em domínio público - 10 ou mais por ano')
fig19.show()

Editoras e editores#

# na coluna name of publisher, substituir os valores ""[s.n.]", "s.n.]" e "[s.n." por "Sem editora"
df_periodical_livre['Name of Publisher'] = df_periodical_livre['Name of Publisher'].replace(['[s.n.]', 's.n.]', '[s.n.', 's.n.'], 'Sem editora')
# unir os valores "na Impressão Regia" e "na Impressão Régia"
df_periodical_livre['Name of Publisher'] = df_periodical_livre['Name of Publisher'].replace(['na Impressão Regia', 'na Impressão Régia'], 'na Impressão Régia')
# unir os valores "Imprensa Nacional" e "na Imprensa Nacional"
df_periodical_livre['Name of Publisher'] = df_periodical_livre['Name of Publisher'].replace(['Imprensa Nacional', 'na Imprensa Nacional'], 'na Imprensa Nacional')
# criar dataframe com as editoras e a quantidade de cada uma
df_publisher_livre = df_periodical_livre['Name of Publisher'].value_counts().rename_axis('Name of Publisher').reset_index(name='counts')
df_publisher_livre
Name of Publisher counts
0 Sem editora 171
1 Paulo da Fonseca 17
2 na Imprensa Nacional 16
3 J. Garcia de Lima 13
4 na Impressão Régia 12
... ... ...
986 Tasso Lopes 1
987 Typographia do Lacobrigense 1
988 Typ. Franco-Portugueza 1
989 P. A. Marchal e Milcent 1
990 Tip. Minerva Indiana 1

991 rows × 2 columns

# criar um gráfico de barras com os 50 primeiros valores de editoras
fig20 = px.bar(df_publisher_livre.head(50), x='Name of Publisher', y='counts', title='Editoras dos periódicos em domínio público.')
fig20.show()
# criar um gráfico de barras com as primeiras 20 editoras, excluindo a primeira.
fig21 = px.bar(df_publisher_livre[1:31], x='Name of Publisher', y='counts', title='Editoras dos periódicos em domínio público (sem itens "Sem editora")')
fig21.show()
# criar dataframe com a quantidade de títulos
df_title_livre = df_periodical_livre['Title'].value_counts().rename_axis('Title').reset_index(name='counts')
df_title_livre
Title counts
0 O Academico 8
1 A Verdade 7
2 A Alvorada 6
3 A Liberdade 6
4 O Liberal 5
... ... ...
1189 O Japonez 1
1190 O Jornal 1
1191 Jornal da Bairrada 1
1192 Gazeta dos Telegraphos 1
1193 A Provincia 1

1194 rows × 2 columns

Contar palavras nos títulos e subtítulos#

# ler a coluna título e contar palavras únicas e a quantidade de vezes que aparecem
#mostrar apenas palavras mais longas que 3 caracteres
# mostrar apenas as 100 palavras mais frequentes
df_unique_title_livre = df_title_livre['Title'].str.split(expand=True).stack().value_counts().loc[lambda x : x.index.str.len() > 3].head(100)
df_unique_title_livre = df_unique_title_livre.rename_axis('Title').reset_index(name='counts')
df_unique_title_livre
Title counts
0 Jornal 45
1 Revista 34
2 Gazeta 26
3 Portugal 26
4 Correio 23
... ... ...
95 Novas 3
96 Federação 3
97 Seculo 3
98 Agricultura 3
99 Lucta 3

100 rows × 2 columns

# gráfico de barras com as 50 palavras mais frequentes
fig22 = px.bar(df_unique_title_livre.head(50), x='Title', y='counts', title='Palavras mais frequentes nos títulos dos periódicos em domínio público.')
fig22.show()
# criar dataframe com a quantidade de títulos
df_subtitle_livre = df_periodical_livre['Subtitle'].value_counts().rename_axis('Subtitle').reset_index(name='counts')
df_subtitle_livre
Subtitle counts
0 semanario independente 10
1 semanario republicano 10
2 folha semanal 8
3 semanario politico, litterario e noticioso 5
4 semanario humoristico 5
... ... ...
740 folha assim e assado ... 1
741 folha hebdomadaria 1
742 publicação semanal, illustrada 1
743 jornal illustrado, theatros musica e bellas-artes 1
744 [publicação mensal e patriotica] 1

745 rows × 2 columns

# ler a coluna título e contar palavras únicas e a quantidade de vezes que aparecem
#mostrar apenas palavras mais longas que 3 caracteres
# mostrar apenas as 100 palavras mais frequentes
df_unique_subtitle_livre = df_subtitle_livre['Subtitle'].str.split(expand=True).stack().value_counts().loc[lambda x : x.index.str.len() > 3].head(100)
df_unique_subtitle_livre = df_unique_subtitle_livre.rename_axis('Subtitle').reset_index(name='counts')
df_unique_subtitle_livre
Subtitle counts
0 semanario 107
1 jornal 101
2 revista 82
3 folha 73
4 litterario 66
... ... ...
95 portuense 4
96 noticiosa, 4
97 caricaturas 4
98 chronica 4
99 lettras 4

100 rows × 2 columns

# gráfico de barras com as 50 palavras mais frequentes
fig23 = px.bar(df_unique_subtitle_livre.head(50), x='Subtitle', y='counts', title='Palavras mais frequentes nos subtítulos dos periódicos em domínio público.')
fig23.show()

Comparação entre acervo geral e domínio público#

Vamos comparar os dois conjuntos de dados e verificar se há diferenças significativas entre eles. Nesse momento, vamos comparar apenas os gráficos.

Comparação entre os tipos de materiais#

# mostrar fig1 e fig12 
fig1.show()
fig12.show()

Tipos de materiais e ano de publicação#

# mostrar fig2 e fig13
fig2.show()
fig13.show()

Quantidades de publicação por ano - Todos os materiais#

# mostrar fig3 e fig14
fig3.show()
fig14.show()

Periódicos - Comparação entre acervo geral e domínio público#

Idiomas#

# mostrar fig4 e fig15
fig4.show()
fig15.show()

Quantidade de publicação dos periódicos por ano#

# mostrar fig5 e fig16
fig5.show()
fig16.show()

Período de concentração de publicações no acervo#

# mostrar fig6 e fig17
fig6.show()
fig18.show()

Quantidade de publicação dos periódicos - 10 ou mais por ano#

# mostrar fig7 e fig18
fig7.show()
fig19.show()

Editoras dos periódicos#

# mostrar fig8 e fig19
fig8.show()
fig20.show()
Editoras dos periódicos (sem itens “Sem editora”)#
# mostrar fig9 e fig20
fig9.show()
fig21.show()

Palavras mais repetidas nos títulos e subtítulos dos periódicos#

Títulos dos periódicos (com mais de três caracteres)#
# mostrar fig10 e fig21
fig10.show()
fig22.show()
Subtítulos dos periódicos (com mais de três caracteres)#
# mostrar fig11 e fig22
fig11.show()
fig23.show()