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:
Todas as obras: Conjunto total de registos bibliográficos das coleções digitalizadas da BNP. Atualizada em abril de 2023, tamanho de 2,96 MB.
Obras em domínio público: Conjunto de registos bibliográficos das obras digitalizadas em domínio público. Atualizada em abril de 2023, tamanho de 2,06 MB.
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()