Список языков и его обработка

Я вот подумал: представление языков в виде дерева не очень удобно, т.к. с поиском вхождения того или иного языка в список начинаются проблемы. Поэтому, довольно логичным шагом стало преобразовать список в первую нормальную форму, с ней будет работать проще всего. Текущий вид списка:

langs_info[:1]

Continue reading

Парсинг Wikipedia

Недавно с удивлением узнал о том, что Wikipedia – это не только ценный мех отличный источник информации, но еще и очень приличное API для доступа к этой самой отличной информации. Ну а там, где есть какое-то API, почти наверняка найдется Python библиотека к нему.

А вообще, затеял я все это дело ради того, что бы загрузить список языков программирования с Wikipedia и получить немного дополнительной информации по ним. Что удивительно, полностью подходящей мне библиотеки не нашлось, и пришлось писать небольшой патчик к библиотеки Wikipedia, благо на Python код пишется очень быстро. В примерах используется та версия, что лежит у меня на GitHub. Это вызвано тем, что мои изменения в основном репозитории библиотеки Wikipedia несколько видоизменили и теперь результат новых функций выглядит более читабельным, но бесполезным в моем случае, т.к. возвращает отформатированный текст, а не Markdown. Continue reading

DateTime и Pandas

В составе модуля Pandas есть очень удобный функционал для чтения CSV-файлов. К сожалению, большинство примеров работы с ним предполагают что одна физическая колонка в CSV-файле соответствует одной логической записи в DataFrame. Предположение отличное, но я сходу наткнулся на то, что дата разнесена по нескольким столбцам, а не записана в формате типа YYYY/MM/DD:

data = """\
    2011,1,10,AAPL,Buy,1500,
    2011,1,13,AAPL,Sell,1500,
    2011,1,13,IBM,Buy,4000,
    """

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

import pandas.io.parsers as pp
from cStringIO import StringIO

pp.read_csv(StringIO(data), names=["year", "month", "day", "symbol", "op", "count", "NA"],
                           parse_dates={'date':["year", "month", "day"]})

Что даст нам правильно представленные данные:

                 date symbol    op  count  NA
0 2011-01-10 00:00:00   AAPL   Buy   1500 NaN
1 2011-01-13 00:00:00   AAPL  Sell   1500 NaN
2 2011-01-13 00:00:00    IBM   Buy   4000 NaN