<div dir="ltr">Dne 5. března 2018 16:36 Petr Viktorin <span dir="ltr"><<a href="mailto:encukou@gmail.com" target="_blank">encukou@gmail.com</a>></span> napsal(a):<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Nebo s Pandas...<br>
<br>
import pandas<br>
pandas.Series(range(10)).map('<wbr>map mame {}'.format)<span class="gmail-"><br>
<br></span></blockquote><div><br></div><div>Ano, to je ono :) Díky za doplnění.</div><div><br></div><div>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:</div><div><br></div><div><font face="monospace, monospace">tady_mi.neco_vraci_data()</font></div><div><br></div><div>Teď si usmyslím, že to chci fitrovat, takže v (čistém) Pythonu musím udělat něco takového:</div><div><br></div><div><font face="monospace, monospace"><b>[x for x in </b>tady_mi.neco_vraci_data()<b> if x.něco()]</b></font></div><div>nebo</div><div><font face="monospace, monospace"><b>filter(lambda x: x.něco(), </b>tady_mi.neco_vraci_data()<b>)</b></font><br></div><div><br></div><div>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:</div><div><br></div><div><font face="monospace, monospace">[nějaká_transformace(x) for x in sorted(x for x in tady_mi.neco_vraci_data() if x.něco())]</font></div><div>nebo<br></div><div><font face="monospace, monospace">map(nějaká_transformace, sorted(filter(lambda x: x.něco(), tady_mi.neco_vraci_data())))</font></div><div><br></div><div>Uf, začíná to být nepřehledné :)</div><div><br></div><div>Jeden způsob, jak toto řešit, je API, kdy vrácený objekt (array nebo nějaký stream) má metody map, filter, sort apod.</div><div><br></div><div><span style="font-family:monospace,monospace">tady_mi.neco_vraci_data().filter(x => x.něco()).sort().map(nějaká_transformace)</span></div><div><span style="font-family:monospace,monospace"><br></span></div><div>Něco takového tedy zřejmě umí Pandas, nebo např. SQLAlchemy Query objekt.</div><div><br></div><div>Také si všimněte, že je zde přirozené pořadí operací: <font face="monospace, monospace">a.b.c.d</font> místo <font face="monospace, monospace">d(c(b(a())))</font></div><div><br></div><div>Druhý způsob je obohatit programovací jazyk o nějaký <b>pipe operátor</b>, jako to má např. F#, Elixir a určitě i další jazyky (následující ukázka je jen pseudokód):</div><div><br></div><div><span style="font-family:monospace,monospace">tady_mi.neco_vraci_data() |> filter(x => x.něco()) |> sort |> nějaká_transformace</span><br></div><div><br></div><div>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.</div><div><br></div><div>No a unixový shell funguje přesně stejně :) <font face="monospace, monospace">./dej_mi_data | grep něco | sort | sed ...</font></div><div><br></div><div>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.<br></div><div><br></div><div>Ani ten shell bych nepodceňoval - v mém minulém mailu jsem napsal o utilitě <font face="monospace, monospace">jq</font>. 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 :)</div><div><br></div><div>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.</div><div><br></div><div>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.</div><div><br></div><div>Petr Messner</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span class="gmail-">
<br>
On 03/05/18 16:23, starenka . wrote:<br>
</span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span class="gmail-">
In [2]: list(map(lambda x: 'map mame %s' % x, range(10)))<br>
Out[2]:<br>
['map mame 0',<br>
  'map mame 1',<br>
  'map mame 2',<br>
  'map mame 3',<br>
  'map mame 4',<br>
  'map mame 5',<br>
  'map mame 6',<br>
  'map mame 7',<br>
  'map mame 8',<br>
  'map mame 9']<br>
<br>
<br>
---<br>
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]<br>
<br></span>
2018-03-05 16:02 GMT+01:00 Petr Messner <<a href="mailto:petr.messner@gmail.com" target="_blank">petr.messner@gmail.com</a> <mailto:<a href="mailto:petr.messner@gmail.com" target="_blank">petr.messner@gmail.com</a><wbr>>>:<span class="gmail-"><br>
<br>
    No, je na to jeden takový super jazyk - Python :)<br>
<br>
    I když teda existuje jazyk, ve kterém se nějaké adhoc datové<br>
    transformační pipelines dělají ještě lépe - Javascript. Škoda, že<br>
    Python list nemá metodu map, musí se to dělat minimálně přes list<br>
    comprehensions, což je sice obecnější, ale o něco pomaleji se to píše.<br>
<br>
    Pro old-schoolery potom grep, sed a awk.<br>
<br>
<br>
    Dne 5. března 2018 14:31 Vláďa Macek <<a href="mailto:macek@sandbox.cz" target="_blank">macek@sandbox.cz</a><br></span>
    <mailto:<a href="mailto:macek@sandbox.cz" target="_blank">macek@sandbox.cz</a>>> napsal(a):<span class="gmail-"><br>
<br>
        Zdar,<br>
<br>
        mějme tabulková data načtená třeba z CSV nebo Google Tabulku. Víte o<br>
        elegantním nástroji (modulu) pro Python implementujícím jednoduchý<br>
        dotazovací jazyk?<br>
<br>
        Jako "dej mi všechny řádky, které mají ve sloupci B hodnotu V (příp.<br>
        regexp), ve sloupci C nemají hodnoty V1 ani V2" atd.<br>
<br>
        Jde mi o etablovanou věc. Ne něco spíchnutého pro vlastní<br>
        potřebu a hrdě<br>
        zveřejněného, aby si autor otestoval psaní setup.py. :-)<br>
<br>
        Díky,<br>
<br>
        V.<br>
<br>
<br>
        ______________________________<wbr>_________________<br>
        Python mailing list<br></span>
        <a href="mailto:python@py.cz" target="_blank">python@py.cz</a> <mailto:<a href="mailto:python@py.cz" target="_blank">python@py.cz</a>><br>
        <a href="http://www.py.cz/mailman/listinfo/python" rel="noreferrer" target="_blank">http://www.py.cz/mailman/listi<wbr>nfo/python</a><span class="gmail-"><br>
        <<a href="http://www.py.cz/mailman/listinfo/python" rel="noreferrer" target="_blank">http://www.py.cz/mailman/list<wbr>info/python</a>><br>
<br>
        Visit: <a href="http://www.py.cz" rel="noreferrer" target="_blank">http://www.py.cz</a><br>
<br>
<br>
<br>
    ______________________________<wbr>_________________<br>
    Python mailing list<br></span>
    <a href="mailto:python@py.cz" target="_blank">python@py.cz</a> <mailto:<a href="mailto:python@py.cz" target="_blank">python@py.cz</a>><br>
    <a href="http://www.py.cz/mailman/listinfo/python" rel="noreferrer" target="_blank">http://www.py.cz/mailman/listi<wbr>nfo/python</a><span class="gmail-"><br>
    <<a href="http://www.py.cz/mailman/listinfo/python" rel="noreferrer" target="_blank">http://www.py.cz/mailman/list<wbr>info/python</a>><br>
<br>
    Visit: <a href="http://www.py.cz" rel="noreferrer" target="_blank">http://www.py.cz</a><br>
<br>
<br>
<br>
<br>
______________________________<wbr>_________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz" target="_blank">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" rel="noreferrer" target="_blank">http://www.py.cz/mailman/listi<wbr>nfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" rel="noreferrer" target="_blank">http://www.py.cz</a><br>
<br>
</span></blockquote><div class="gmail-HOEnZb"><div class="gmail-h5">
______________________________<wbr>_________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz" target="_blank">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" rel="noreferrer" target="_blank">http://www.py.cz/mailman/listi<wbr>nfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" rel="noreferrer" target="_blank">http://www.py.cz</a><br>
</div></div></blockquote></div><br></div></div>