Здесь представляет интерес вопрос, какая династия правит в Индии наиболее длительный период времени.

Здесь я пытаюсь извлечь все правила династии со следующей страницы и попытаться определить длину их правил и построить график, чтобы найти самую длинную правящую династию https://en.wikipedia.org/wiki/List_of_Indian_monarchs

Мы получим данные из вики, применим некоторые методы Python и превратим их в визуализацию. Мы пытаемся применить и понять некоторые концепции Python во всем процессе.

Шаг 1. Получите контент со страницы вики

import pandas as pd
import requests
import wikipedia
import re
url = r'https://en.wikipedia.org/wiki/List_of_Indian_monarchs'
page = wikipedia.page('List_of_Indian_monarchs')
content = page.content

Если вы посмотрите на страницу, то увидите, что продолжительность каждой династии указывается в самом контенте. Мы постараемся извлечь эту информацию оттуда.

Шаг 2. Давайте посмотрим на наш контент и очистим его

content[:2000]
"The following list of Indian monarchs is one of several lists of incumbents.\nEarly later documented rulers and dynasties who are deemed to have ruled a portion of the Indian subcontinent are included in this list.\nIMPORTANT : BCE(Before Common Era)/BC(Before Christ) are same and CE(Common Era)/AD(Anno Domini) are same\n\n\n== Chronological list of Hindu empires and dynasties ==\n\n\n== Chandravanshi-Haiheya Dynasty ==\nChandradev\nBudh\nMaharaj Pururavas\nMaharaj Ayussu\nMaharaj Nahusha\nMaharaj Yayati\nMaharaj Yadu\nMaharaj Sahastratjit\nMaharaj Shatjit\nMaharaj Haiheya\nMaharaj Dharm\nMaharaj Dharmnetra\nMaharaj Kunti\nMaharaj Sahjit\nMaharaj Mahishman\nMaharaj Bhadrasen\nMaharaj Durdabh\nMaharaj Dhanak\nMaharaj Krutvirya\nRaj Rajeshwar Chakravarti Samrat Kaartavirya Sahasrarjun Maharaj\nMaharaj Veersen(Jaydhvaj)\nMaharaj Taljhangh\nMaharaj Vitihotra\nMaharaj Anant\nMaharaj Durjay AmitrakarshanLater they were divided among different sub-castes which include Kansaras, Kaseras, Tamrakars, Thatheras, Tambats.\n\n\n== Magadha dynasties ==\nThis list includes the legendary kings of Magadha.\n\nDharma\nSunita\nSatyajit\nBiswajit\nRipunjaya\n\n\n=== Pradyota dynasty (c. 541 BCE – 403 BCE) ===\n\nPradyota Mahasena\nPalaka\nVisakhayupa\nAjaka\nVarttivarddhana\n\n\n=== Haryanka dynasty (c. 544 BCE – 413 BCE) ===\n\nBimbisara (558–491 BCE), founder of the first Magadhan empire\nAjatashatru (491–461 BCE)\nUdayin\nAnirudha\nMunda\nDarshaka (from 461 BCE)\nNāgadāsaka (last ruler of the Haryanka dynasty)\n\n\n=== Shishunaga dynasty (c. 413 BCE – 345 BCE) ===\n\nShishunaga (412–395 BCE), king of Magadha\nKalashoka (Kakavarna)\nKshemadharman\nKshatraujas\nNandivardhana\nMahanandin (until 345 BCE), his empire was inherited by his illegitimate son Mahapadma Nanda\n\n\n=== Nanda dynasty (c. 345 BCE – 321 BCE) ===\n\nMahapadma Nanda (from 345 BCE), son of Mahanandin, founded the Nanda Empire after inheriting Mahanandin's empire\nPandhukananda\nPanghupatinanda\nBhutapalananda\nRashtrapalananada\nGovishanakananda\nDashasidkhakananda\nKaivartananda\nKarvinatha Nand (Ill"

Первый шаг в очистке нашего контента - отделить каждую запись от другой, и это делается путем разделения каждой строки.

dynasty_details_from_content = content.split("\n")
dynasty_details_from_content[:200]
['The following list of Indian monarchs is one of several lists of incumbents.',
 'Early later documented rulers and dynasties who are deemed to have ruled a portion of the Indian subcontinent are included in this list.',
 'IMPORTANT : BCE(Before Common Era)/BC(Before Christ) are same and CE(Common Era)/AD(Anno Domini) are same',
 '',
 '',
 '== Chronological list of Hindu empires and dynasties ==',
 '',
 '',
 '== Chandravanshi-Haiheya Dynasty ==',
 'Chandradev',
 'Budh',
 'Maharaj Pururavas',
 'Maharaj Ayussu',
 'Maharaj Nahusha',
 'Maharaj Yayati',
 'Maharaj Yadu',
 'Maharaj Sahastratjit',
 'Maharaj Shatjit',
 'Maharaj Haiheya',
 'Maharaj Dharm',
 'Maharaj Dharmnetra',
 'Maharaj Kunti',
 'Maharaj Sahjit',
 'Maharaj Mahishman',
 'Maharaj Bhadrasen',
 'Maharaj Durdabh',
 'Maharaj Dhanak',
 'Maharaj Krutvirya',
 'Raj Rajeshwar Chakravarti Samrat Kaartavirya Sahasrarjun Maharaj',
 'Maharaj Veersen(Jaydhvaj)',
 'Maharaj Taljhangh',
 'Maharaj Vitihotra',
 'Maharaj Anant',
 'Maharaj Durjay AmitrakarshanLater they were divided among different sub-castes which include Kansaras, Kaseras, Tamrakars, Thatheras, Tambats.',
 '',
 '',
 '== Magadha dynasties ==',
 'This list includes the legendary kings of Magadha.',
 '',
 'Dharma',
 'Sunita',
 'Satyajit',
 'Biswajit',
 'Ripunjaya',
 '',
 '',
 '=== Pradyota dynasty (c. 541 BCE – 403 BCE) ===',
 '',
 'Pradyota Mahasena',
 'Palaka',
 'Visakhayupa',
 'Ajaka',
 'Varttivarddhana',
 '',
 '',
 '=== Haryanka dynasty (c. 544 BCE – 413 BCE) ===',
 '',
 'Bimbisara (558–491 BCE), founder of the first Magadhan empire',
 'Ajatashatru (491–461 BCE)',
 'Udayin',
 'Anirudha',
 'Munda',
 'Darshaka (from 461 BCE)',
 'Nāgadāsaka (last ruler of the Haryanka dynasty)',
 '',
 '',
 '=== Shishunaga dynasty (c. 413 BCE – 345 BCE) ===',
 '',
 'Shishunaga (412–395 BCE), king of Magadha',
 'Kalashoka (Kakavarna)',
 'Kshemadharman',
 'Kshatraujas',
 'Nandivardhana',
 'Mahanandin (until 345 BCE), his empire was inherited by his illegitimate son Mahapadma Nanda',
 '',
 '',
 '=== Nanda dynasty (c. 345 BCE – 321 BCE) ===',
 '',
 "Mahapadma Nanda (from 345 BCE), son of Mahanandin, founded the Nanda Empire after inheriting Mahanandin's empire",
 'Pandhukananda',
 'Panghupatinanda',
 'Bhutapalananda',
 'Rashtrapalananada',
 'Govishanakananda',
 'Dashasidkhakananda',
 'Kaivartananda',
 'Karvinatha Nand (Illegitimate son of Mahapadma Nanda)',
 'Dhana Nanda (Agrammes, Xandrammes) (until 321 BCE), lost his empire to Chandragupta Maurya after being defeated by him.',
 '',
 '',
 '=== Maurya dynasty (c. 321 BCE – 185 BCE) ===',
 '',
 '',
 '=== Shunga dynasty (c. 185 BCE – 73 BCE) ===',
 '',
 'Pushyamitra Shunga (185–149 BCE), founded the dynasty after assassinating Brihadratha',
 'Agnimitra (149–141 BCE), son and successor of Pushyamitra',
 'Vasujyeshtha (141–131 BCE)',
 'Vasumitra (131–124 BCE)',
 'Andhraka (124–122 BCE)',
 'Pulindaka (122–119 BCE)',
 'Ghosha (119–116 BCE)',
 'Vajramitra (116–110 BCE)',
 'Bhagabhadra (c. 110 BCE), mentioned by the Puranas',
 'Devabhuti (83–73 BCE), the last Shunga king',
 '',
 '',
 '=== Kanva dynasty (c. 73 BCE – 26 BCE) ===',
 '',
 'Vasudeva (c. 75 BCE – 66 BCE)',
 'Bhumimitra (c. 66 – c. 52 BCE)',
 'Narayana (c. 52 – c. 40 BCE)',
 'Susarman (c. 40 – c. 26 BCE)',
 '',
 '',
 '=== Gupta dynasty (c. 240–605 CE) ===',
 '',
 '',
 '== Ancient southern dynasties ==',
 '',
 '',
 '=== Pandyan dynasty (c. 1500 BCE – 345 CE) ===',
 '',
 'Central Pandyas',
 '',
 'Kadungkon, (c. 550–450 BCE)',
 'Pandion (c. 50 BCE – 50 CE), known as Pandion to Greeks and RomansEarly Pandyas',
 '',
 'Nedunj Cheliyan I (Aariyap Padai Kadantha Nedunj Cheliyan)',
 'Pudappandiyan',
 'Mudukudumi Paruvaludhi',
 'Nedunj Cheliyan II (Pasumpun Pandiyan)',
 'Nan Maran',
 'Nedunj Cheliyan III (Talaiyaalanganathu Seruvendra Nedunj Cheliyan )',
 'Maran Valudi',
 'Musiri Mutriya Cheliyan',
 'Ukkirap PeruvaluthiFirst Empire',
 '',
 'Kadungon (c. 600–700 CE), revived the dynasty',
 'Maravarman Avani Culamani (590–620 CE)',
 'Cezhiyan Cendan (620–640 CE)',
 'Arikesari Maravarman Nindraseer Nedumaaran (640–674 CE)',
 'Kochadaiyan Ranadhiran (675–730 CE)',
 'Arikesari Parankusa Maravarman Rajasinga (730–765 CE)',
 'Parantaka Nedunjadaiyan (765–790 CE)',
 'Rasasingan II (790–800 CE)',
 'Varagunan I (800–830 CE)',
 'Sirmara Srivallabha (830–862 CE)',
 'Varaguna II (862–880 CE)',
 'Parantaka Viranarayana (862–905 CE)',
 'Rajasima Pandian II (905–920 CE)Pandyan Revival',
 '',
 'Jatavarman Sundara Pandyan (1251 CE–1268 CE), revived Pandyan glory, considered one of the greatest conquerors of Southern India',
 'Maravarman Sundara Pandyan',
 'Maravarman Kulasekaran I (1268 CE–1308 CE)',
 'Sundara Pandya (1308 CE–1311 CE), son of Maravarman Kulasekaran, fought with his brother Vira Pandya over the throne',
 'Vira Pandya (1308 CE–1311 CE), son of Maravarman Kulasekaran, fought with his brother of Sundara Pandya over the throne, Madurai was conquered by the Khalji dynastyPandalam Dynasty (c. 1200)',
 '',
 'Raja Rajasekhara (c. 1200 – 1500), descendant of the Pandya Dynasty, father of Ayyappan (often regarded as a Hindu deity)',
 '',
 '',
 '=== Chera dynasty (c. 300 BCE – 1124 CE) ===',
 '',
 'Note that years are still highly disputed among the scholars, and the given is only one version.',
 '',
 '',
 '==== Ancient Chera kings ====',
 '',
 '',
 '==== Kulashekhara dynasty (1020–1314 CE) ====',
 '',
 '',
 '=== Chola dynasty (c. 300 BCE – 1279 CE) ===',
 '',
 '',
 '==== Sangam Cholas ====',
 '',
 'Ilamcetcenni',
 'Karikala Chola',
 'Nedunkilli',
 'Nalankilli',
 'Killivalavan',
 'Perunarkilli',
 'Kocengannan',
 '',
 '',
 '==== Imperial Cholas (848–1279 CE) ====',
 '',
 '',
 '== Foreign invaders in north-western India ==',
 'These empires were vast, centered in Persia or the Mediterranean; their satrapies (provinces) in India were at their outskirts.',
 '',
 'The boundaries of the Achaemenid Empire reached the Indus River.',
 'Alexander the Great (326–323 BCE) of the Argead dynasty defeated Porus in the Battle of the Hydaspes River; his empire was quickly divided amongst the so-called diadochoi.',
 "Seleucus Nicator (323–321 BCE), diadochos general who founded the Seleucid Empire in the eastern part of the Macedonian empire after gaining control following Alexander's death",
 'The Hellenistic Euthydemid Dynasty also reached the north-western frontiers of India (c. 221–85 BCE)',
 'Muhammad bin Qasim (711–715), an Arab general of the Umayyad Caliphate, conquered Sindh, Balochistan and southern Punjab and ruled these lands on behalf of the Umayyad Caliph, Al-Walid ibn Abd al-Malik',
 '',
 '',
 '== Satavahana dynasty (c. 271 BCE – 220 CE) ==']

Некоторые эксперименты с регулярными выражениями

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

re.findall("\(.*\)", "=== Pradyota dynasty (c. 541 BCE – 403 BCE) ===")
['(c. 541 BCE – 403 BCE)']
re.findall("\d+", "(c. 541 BCE – 403 BCE)")
['541', '403']

Шаг 3. Отфильтруйте нерелевантный контент

Как видно из содержания, все строки не содержат актуальной информации для династий и монархов. Давайте попробуем разобрать каждую династию на самом низком уровне. если империя разделена на несколько династий, династия находится на более низком уровне. если это не династия, информация находится на верхнем уровне. Например, судья Великих Моголов больше не имеет династий, в то время как династия Паллавы разделена на несколько династий Паллавы, таких как ранняя середина и т. Д. Следующие две ячейки имеют некоторую логику для извлечения этой информации с обоих уровней. Для этого давайте представим функцию фильтра Python.

dynasties = filter (lambda dynasty : dynasty.startswith("==")  ,  dynasty_details_from_content )
list(dynasties)[:5]
['== Chronological list of Hindu empires and dynasties ==',
 '== Chandravanshi-Haiheya Dynasty ==',
 '== Magadha dynasties ==',
 '=== Pradyota dynasty (c. 541 BCE – 403 BCE) ===',
 '=== Haryanka dynasty (c. 544 BCE – 413 BCE) ===']

позволяет использовать составные части списков для получения дочерних династий и удаления других. Мы также воспользуемся циклом for, чтобы выбрать те династии, для которых нет суб-династий, и включить их в наш список всех династий.

subdynasties  = [dynasty[4:-4] for dynasty in dynasty_details_from_content if dynasty.startswith("=== ")]
all_dynasties = subdynasties

for idx , elem in  enumerate(dynasties):
    if idx < (len (dynasties)-1 ) and  elem.startswith("== ") and dynasties[idx+1].startswith("== ") :
        all_dynasties.append(elem[3:-3])
all_dynasties[:9]
['Pradyota dynasty (c. 541 BCE – 403 BCE)',
 'Haryanka dynasty (c. 544 BCE – 413 BCE)',
 'Shishunaga dynasty (c. 413 BCE – 345 BCE)',
 'Nanda dynasty (c. 345 BCE – 321 BCE)',
 'Maurya dynasty (c. 321 BCE – 185 BCE)',
 'Shunga dynasty (c. 185 BCE – 73 BCE)',
 'Kanva dynasty (c. 73 BCE – 26 BCE)',
 'Gupta dynasty (c. 240–605 CE)',
 'Pandyan dynasty (c. 1500 BCE – 345 CE)']

Шаг 4. Мы получили информацию, относящуюся к нашим династиям. Теперь давайте извлечем из них название династии, период и продолжительность правления.

dynasty_periods = [(dynasty.split("("))  for dynasty in all_dynasties ]
dynasty_periods[:8]
[['Pradyota dynasty ', 'c. 541 BCE – 403 BCE)'],
 ['Haryanka dynasty ', 'c. 544 BCE – 413 BCE)'],
 ['Shishunaga dynasty ', 'c. 413 BCE – 345 BCE)'],
 ['Nanda dynasty ', 'c. 345 BCE – 321 BCE)'],
 ['Maurya dynasty ', 'c. 321 BCE – 185 BCE)'],
 ['Shunga dynasty ', 'c. 185 BCE – 73 BCE)'],
 ['Kanva dynasty ', 'c. 73 BCE – 26 BCE)'],
 ['Gupta dynasty ', 'c. 240–605 CE)']]

Давайте очистим приведенные выше данные и создадим фрейм данных, в котором первый столбец - «название династии», второй столбец - «длина правила», а третий столбец - «период их правления».

dynasty_period_details = [(d[0].strip(), re.findall("\d+",d[1]), d[1][:-1]) for d in dynasty_periods if len(d)>1]
dynasty_period_details = [(d[0], abs(int(d[1][1])+ int(d[1][0])) if (len(re.findall("BCE", d[2])) +
                                                                     len(re.findall("CE", d[2])))==3
                           else abs(int(d[1][1])- int(d[1][0])),
                           d[2], len(re.findall("BCE", d[2])) +
                                                                     len(re.findall("CE", d[2]))) for d in dynasty_period_details if len(d[1])>1]

Шаг 5. Создайте фрейм данных и отсортируйте его по длине правила. Исправьте некоторые записи с необычными значениями

dynasty_df = pd.DataFrame(dynasty_period_details)
dynasty_df.at[63,2] = '950 - 1305'
dynasty_df.at[63,1] = abs(950 - 1305)
dynasty_df.loc[63]
0    Paramara dynasty of Malwa
1                          355
2                   950 - 1305
3                            0
Name: 63, dtype: object
dynasty_df= dynasty_df.reindex(range(len(dynasty_df)))
dynasty_df.sort_values(1, ascending = False, inplace= True)

Итак, наконец, у нас есть чистые данные о продолжительности и периоде правления каждой династии. Давайте рассмотрим их и составим график, чтобы увидеть, какая династия правит дольше всех:

dynasty_df.loc[33]
0           Wodeyar dynasty
1                       151
2    second rule, 1799–1950
3                         0
Name: 33, dtype: object
dynasty_df.head(10)

Шаг 6: Постройте наши результаты

Мы будем использовать matplotlib библиотеку, чтобы построить наш результат и сделать из него некоторые выводы:

num_recs = 40

fig = plt.gcf()
ax= plt.gca()
fig.set_size_inches(40.5, 40.5)
plt.barh(dynasty_df.head(num_recs)[0], dynasty_df.head(num_recs)[1])
plt.xticks(rotation=0, fontsize=40)
plt.yticks(rotation=0, fontsize=25)
#plt.title(page.url, fontdict={size:20})

for i, v in enumerate(dynasty_df.head(num_recs)[1]):
    ax.text(v + 1, i + 0, str(dynasty_df.head(num_recs).iloc[i,2]), color='black' ,fontsize = 20)
plt.show()

Вывод

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

Обратите внимание, что точность этой информации зависит от информации из Википедии, а также от возможного наличия ошибок в базовом коде. Информация здесь должна использоваться только в образовательных целях.