CoderCastrov logo
CoderCastrov
Пандас

Парсинг данных с помощью Pandas в Python

Парсинг данных с помощью Pandas в Python
просмотров
2 мин чтение
#Пандас

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

Наш вопрос: Сколько томов Dragon Ball было продано?

Благодаря функции read_html в Pandas мы можем довольно быстро ответить на этот вопрос. Функция read_html в Pandas проста в использовании: она загружает заданный HTML-файл или URL и ищет в нем теги таблицы. Затем она возвращает найденные таблицы в виде массива объектов DataFrame.

Википедия полна хорошо структурированных таблиц, которые мы можем использовать. Мы просто ищем "Dragon Ball" на Википедии и получаем эту страницу: https://en.wikipedia.org/wiki/Dragon_Ball

Если мы прокрутим страницу немного вниз, мы, наконец, найдем то, что нам нужно.

Страница Dragon Ball на Википедии, объем продаж по всему миру

Итак, приступим к кодированию. Сначала нам нужно собрать данные.

import pandas
found_data = pandas.read_html("[https://en.wikipedia.org/wiki/Dragon_Ball](https://en.wikipedia.org/wiki/Dragon_Ball)")
print("Количество найденных таблиц: " + str(len(found_data)))

Здесь мы находим общее количество 12 таблиц. Просмотрев их с помощью функции print, мы видим, что нам нужна таблица с индексом 1, но данные не очищены. Теперь нам нужно немного очистить данные, чтобы сделать их пригодными и уместными.

Сначала мы удалим строки "Overseas" и "Worldwide", так как не хотим учитывать их в общем количестве. Затем мы создадим простую функцию для преобразования текста в целое число.

import re
# Вот функция, которую мы собираемся использовать для очистки наших чисел.
def formatNumberFromString(search_string):
    output = 0
    found_string = re.findall(r'[0-9,\,]+', search_string)
    if len(found_string) > 0:
        output = int("".join(found_string[0].split(",")))
    return output# Получаем только два необходимых столбца.
db_sales = found_data[1][["Market(s)", "Volume sales/circulation"]]# Очищаем данные
db_sales.drop([1,18], inplace=True)
db_sales.loc[:,"Volume sales/circulation"] = db_sales["Volume sales/circulation"].apply(lambda x: formatNumberFromString(x))

Теперь, когда мы очистили наши данные, осталось начать анализ, чтобы ответить на поставленный вопрос.

total_of_volume_sold = db_sales["Volume sales/circulation"].sum()
average_volume_sold_by_region = db_sales["Volume sales/circulation"].mean()
count_of_regions = len(db_sales.index))print("Манга Dragon Ball была продана {} раз. В среднем по региону продается {} экземпляров, в {} регионах.".format(total_of_volume_sold, average_volume_sold_by_region, count_of_regions)

В результате мы получаем (обновлено на 14 июня 2022 года):

Манга Dragon Ball была продана 289667054 раз. В среднем по региону продается 17039238.470588237 экземпляров в 17 регионах.

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


Если вам понравилась статья или она оказалась полезной, буду благодарен, если вы подпишетесь на меня здесь (Jonathan Mondaut). Скоро появятся новые статьи!


Ниже приведен полный код программы:

import pandas
import redef formatNumberFromString(search_string):
    output = 0
    found_string = re.findall(r'[0-9,\,]+', search_string)
    if len(found_string) > 0:
        output = int("".join(found_string[0].split(",")))
    return outputfound_data = pandas.read_html("[https://en.wikipedia.org/wiki/Dragon_Ball](https://en.wikipedia.org/wiki/Dragon_Ball)")
print("Количество найденных таблиц: " + str(len(found_data)))db_sales = found_data[1][["Market(s)", "Volume sales/circulation"]]db_sales.drop([1,18], inplace=True)
db_sales.loc[:,"Volume sales/circulation"] = db_sales["Volume sales/circulation"].apply(lambda x: formatNumberFromString(x))total_of_volume_sold = db_sales["Volume sales/circulation"].sum()
average_volume_sold_by_region = db_sales["Volume sales/circulation"].mean()
count_of_regions = len(db_sales.index)print("Манга Dragon Ball была продана {} раз. В среднем по региону продается {} экземпляров, в {} регионах.".format(total_of_volume_sold, average_volume_sold_by_region, count_of_regions))