[python] table querying

Petr Messner petr.messner na gmail.com
Úterý Březen 6 12:05:41 CET 2018


Dne 5. března 2018 16:36 Petr Viktorin <encukou na gmail.com> napsal(a):

> Nebo s Pandas...
>
> import pandas
> pandas.Series(range(10)).map('map mame {}'.format)
>
>
Ano, to je ono :) Díky za doplnění.

Na takovémhle API se mi líbí, že když k tomu chci něco přidat, tak to
prostě přidám na konec, nemusím pak ještě lézt na začátek řádky a doplnit
tam závorku nebo nějakou omáčku. Příklad:

tady_mi.neco_vraci_data()

Teď si usmyslím, že to chci fitrovat, takže v (čistém) Pythonu musím udělat
něco takového:

*[x for x in *tady_mi.neco_vraci_data()* if x.něco()]*
nebo
*filter(lambda x: x.něco(), *tady_mi.neco_vraci_data()*)*

A když si rozmyslím, že s tím chci dělat ještě něco dalšího, třeba sesortit
a pak nějakou transformaci:

[nějaká_transformace(x) for x in sorted(x for x in
tady_mi.neco_vraci_data() if x.něco())]
nebo
map(nějaká_transformace, sorted(filter(lambda x: x.něco(),
tady_mi.neco_vraci_data())))

Uf, začíná to být nepřehledné :)

Jeden způsob, jak toto řešit, je API, kdy vrácený objekt (array nebo nějaký
stream) má metody map, filter, sort apod.

tady_mi.neco_vraci_data().filter(x =>
x.něco()).sort().map(nějaká_transformace)

Něco takového tedy zřejmě umí Pandas, nebo např. SQLAlchemy Query objekt.

Také si všimněte, že je zde přirozené pořadí operací: a.b.c.d místo
d(c(b(a())))

Druhý způsob je obohatit programovací jazyk o nějaký *pipe operátor*, jako
to má např. F#, Elixir a určitě i další jazyky (následující ukázka je jen
pseudokód):

tady_mi.neco_vraci_data() |> filter(x => x.něco()) |> sort |>
nějaká_transformace

Tenhle přístup je podle mě čitelnější a pokud si ho rozepíšete na více
řádků, tak při vývoji a ladění toho kódu můžete jednotlivé kroky snadno
přeskočit zakomentováním celého řádku - nemusíte lítat po složitém výrazu
sem tam a ubírat/přidávat závorky nebo list comprehension omáčku.

No a unixový shell funguje přesně stejně :) ./dej_mi_data | grep něco |
sort | sed ...

Pipe operátor teda v Pythonu není, a ani nevím, jestli by mělo smysl ho tam
přidávat z důvodu, aby Python nebyl zbytečně zesložiťován. Ale chtěl jsem
tu ukázat i jiný přistup.

Ani ten shell bych nepodceňoval - v mém minulém mailu jsem napsal o utilitě
jq. Díky přístupu, když si zpracování dat udělám pomocí příkazů v shellu,
pak můžu použít nástroje parallel, sort, gzip, ssh, sed, awk apod. a data
pak můžu zpracovávat v gigabajtech za sekundu, což by v samotném Pythonu
bylo velmi náročné (existuje modul multiprocess, ale už to pak zdaleka
nebude oneliner). Zase není potřeba kvůli všemu pouštět Hadoop :)

Tohle je oproti původnímu dotazu už docela offtopic, pro nějaké občasné
zpracování CSV z google spreadsheetu to je overkill, ale zase jsem se chtěl
rozepsat, jak nad tím přemýšlím a jaké jsou možnosti. Klidně na to nějak
reagujte. Napadlo mě třeba, že by se dala napsat nějaká Python funkce,
která by přijímala data a transformace v parametrech a vytvořila by právě
tu pipe mezi nimi.

Taky je možná problém s tím, že jsem si všiml, že pro lidi je funkce, která
přijímá nebo vrací funkci, aspoň ze začátku ne úplně stravitelná, natož
ještě s generátory, iterátory... Možná by toto mohlo být více probíráno v
kurzech Pythonu.

Petr Messner


>
> On 03/05/18 16:23, starenka . wrote:
>
>> In [2]: list(map(lambda x: 'map mame %s' % x, range(10)))
>> Out[2]:
>> ['map mame 0',
>>   'map mame 1',
>>   'map mame 2',
>>   'map mame 3',
>>   'map mame 4',
>>   'map mame 5',
>>   'map mame 6',
>>   'map mame 7',
>>   'map mame 8',
>>   'map mame 9']
>>
>>
>> ---
>> In Perl you shoot yourself in the foot, but nobody can understand how you
>> did it. Six months later, neither can you. | print 'aknerats'[::-1]
>>
>> 2018-03-05 16:02 GMT+01:00 Petr Messner <petr.messner na gmail.com <mailto:
>> petr.messner na gmail.com>>:
>>
>>     No, je na to jeden takový super jazyk - Python :)
>>
>>     I když teda existuje jazyk, ve kterém se nějaké adhoc datové
>>     transformační pipelines dělají ještě lépe - Javascript. Škoda, že
>>     Python list nemá metodu map, musí se to dělat minimálně přes list
>>     comprehensions, což je sice obecnější, ale o něco pomaleji se to píše.
>>
>>     Pro old-schoolery potom grep, sed a awk.
>>
>>
>>     Dne 5. března 2018 14:31 Vláďa Macek <macek na sandbox.cz
>>     <mailto:macek na sandbox.cz>> napsal(a):
>>
>>         Zdar,
>>
>>         mějme tabulková data načtená třeba z CSV nebo Google Tabulku.
>> Víte o
>>         elegantním nástroji (modulu) pro Python implementujícím jednoduchý
>>         dotazovací jazyk?
>>
>>         Jako "dej mi všechny řádky, které mají ve sloupci B hodnotu V
>> (příp.
>>         regexp), ve sloupci C nemají hodnoty V1 ani V2" atd.
>>
>>         Jde mi o etablovanou věc. Ne něco spíchnutého pro vlastní
>>         potřebu a hrdě
>>         zveřejněného, aby si autor otestoval psaní setup.py. :-)
>>
>>         Díky,
>>
>>         V.
>>
>>
>>         _______________________________________________
>>         Python mailing list
>>         python na py.cz <mailto:python na py.cz>
>>         http://www.py.cz/mailman/listinfo/python
>>         <http://www.py.cz/mailman/listinfo/python>
>>
>>         Visit: http://www.py.cz
>>
>>
>>
>>     _______________________________________________
>>     Python mailing list
>>     python na py.cz <mailto:python na py.cz>
>>     http://www.py.cz/mailman/listinfo/python
>>     <http://www.py.cz/mailman/listinfo/python>
>>
>>     Visit: http://www.py.cz
>>
>>
>>
>>
>> _______________________________________________
>> Python mailing list
>> python na py.cz
>> http://www.py.cz/mailman/listinfo/python
>>
>> Visit: http://www.py.cz
>>
>> _______________________________________________
> Python mailing list
> python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
> Visit: http://www.py.cz
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20180306/93c47c77/attachment.html>


Další informace o konferenci Python