Viac

Používanie výberových sád v Pythone


Snažím sa zostaviť model, ktorý číta asi 30 rôznych bodových tried prvkov a pripája iba vybrané prvky k novej triede prvkov. Niektoré z tried funkcií nemajú žiadne vybrané záznamy, takže pridáva všetky záznamy z tejto triedy funkcií. Existuje spôsob, ako vylúčiť pridanie týchto funkcií? V minulosti sme na čítanie v každej triede funkcií používali makro VBA a pomocou výberových sád zisťujeme, či je vybraný niektorý zo záznamov, ale neviem prísť na to, ako pomocou Pythonu získať rovnakú funkcionalitu.


Ak používate python (ako naznačuje vaša značka) a ArcGIS (možno?), Môžete urobiť niečo také ... (upravené)

# Skontrolujte, či je vybratá aspoň jedna funkcia. ftrCountBefore = int (arcpy.GetCount_management (vrstva) .getOutput (0)) # Úlohy Vykonať výber # ftrCountAfter = int (arcpy.GetCount_management (vrstva) .getOutput (0)) if (not (ftrCountBefore == ftrCountAfter)): do

Príkaz na výber jazyka Python SQL

V tejto časti vám vysvetlíme, ako napísať príkaz SQL Select v programovacom jazyku Python. A ako extrahovať alebo vybrať záznamy z tabuľky servera SQL Server.

Predtým, ako sa dostaneme k príkladu príkazu Python SQL Select, dovoľte mi ukázať vám údaje, ktoré budeme používať.


2 odpovede 2

Súhlasím s @Reinderien, že by to nemala byť trieda. Dôkazy o tom môžete vidieť vo svojom konštruktore:

Konštruujete objekt (a voláte konštruktor) jednoducho tak, aby volal self .__ iter __ (). Nie je dôvod na vytvorenie objektu tu len na zoradenie zoznamu. Ak ste potrebovali zachovať určitý stav medzi druhmi alebo niečím (nie som si istý, prečo by ste to robili), tak to smieť byť vhodný.

Tiež upozorním, že sa pokúšate porušiť najmenej dve „zmluvy“ používaním značiek __init__ a __iter__:

__init __ () nesmie vrátiť hodnotu non-None, čo spôsobí, že TypeError bude za behu vyvolaný.

Teraz nie vlastne vraciate čokoľvek, ale váš tip naznačuje, že ste. Ak budete používať tipovanie na typy, mali by tieto tipy objasňovať, o aké typy ide, a nie nepravdivé tvrdenia.

Táto metóda by mala vrátiť nový iteračný objekt, ktorý môže iterovať nad všetkými objektmi v kontajneri

Problém je v tom, že vraciate zoznam a tento zoznam nie je iterátor, je to iterovateľný (to iterátor). Nejde len o teoretický problém. Všimnite si, ako vás to môže hrýzť:

Na napísanie čistého kódu môže byť užitočné použitie metód „dunder“, ale iba ak ich nezneužívate. Predtým, ako sa pokúsite použiť, prečítajte si dokumentáciu a pochopte účel a kontrakty metód.

A čo sa týka tipov na typy, môžete použiť TypeVar a umožniť tak kontrole typu vidieť konzistenciu medzi typmi prvkov vstupujúcich a odchádzajúcich z vašej funkcie triedenia. Po prepracovaní triedy na samostatnú funkciu máte v podstate:

Problém je v tom, že kontrolérovi nehovorí, aký je vzťah medzi typmi prvkov v input_list a v zozname, ktorý vráti selection_sort. To môže viesť k jemným problémom, pri ktorých vám nebude môcť pomôcť s typmi:

Môžete to napraviť zavedením TypeVar, ktorý informuje, že typ prvku zostáva konzistentný. Tiež prechádzam z používania zoznamu na zoznam, pretože zoznam ešte zrejme nepodporuje generiká:

Teraz je schopný odvodiť typ x a môže vám poskytnúť lepšie doplnenia a varovania pred typom.


Vykonávanie & ldquoSELECT & hellip KDE & hellip IN & hellip & rdquo pomocou MySQLdb

Mám problém s vykonaním časti SQL z prostredia Pythonu, napriek tomu, že podobné SQL fungujú dobre z príkazového riadku mysql.

Tabuľka vyzerá takto:

Nasledujúci dotaz SQL môžem vykonať z príkazového riadku mysql bez problémov:

Keď sa však pokúsim urobiť to isté z prostredia Pythonu, nedostanem žiadne riadky, zatiaľ čo som očakával 2 riadky:

Otázka teda znie: ako by sa mal upraviť kód pythonu, aby sa vybrali tie foidné objekty, kde sa nachádza bar („A“, „C“)?

Mimochodom, všimol som si, že keď prepnem úlohy bar a fooid, dostanem kód na výber tých barov, kde je fooid úspešne v (1,3). Nechápem, prečo jeden taký dotaz (dole) funguje, zatiaľ čo druhý (hore) nie.

A aby bolo úplne jasné, takto bol vytvorený foo stôl:

Upraviť: Keď povolím všeobecný protokol dotazov pomocou mysqld -l /tmp/myquery.log, vidím

Skutočne to vyzerá, že okolo A a C je umiestnených príliš veľa úvodzoviek.

Vďaka komentáru @ Amber lepšie chápem, čo sa deje. MySQLdb prevádza parametrizovaný argument ['A', 'C'] na ("'A'", "'C'").

Existuje spôsob, ako vytvoriť parametrizovaný dotaz pomocou syntaxe IN SQL? Alebo je potrebné vytvoriť reťazec SQL ručne?


Riešenie¶

Ak chcete zistiť počet ciest, ktoré každá domácnosť uskutoční, môžeme vytvoriť fiktívny stĺpec s hodnotou 1 a na výpočet celkového počtu ciest pre každú domácnosť použiť metódu .groupby (). Potom zlúčime tieto informácie s informáciami o domácnosti, aby sme získali konečný dátový rámec.

hh_id trip_count Bez názvu: 0 home_mgra príjem autá transpondér cdap_pattern jtf_choice autotech tncmemb
0 1690841 20 426629 7736 512000 2 1 MMMM0 0 0 0
1 1690851 12 426645 7736 68200 4 1 HNM0 0 0 0
2 1690853 8 426643 7736 127000 2 0 MMMH0 0 0 0
3 1690856 23 426642 7736 59500 4 1 MNMMMM0 0 0 0
4 1690858 5 426640 7736 200030 1 0 M0 0 0 0

Potom vytvoríme kontingenčnú tabuľku pomocou stĺpcov autos a trip_count v dátovom rámci ako index a stĺpcov metódou .pivot_table (). Na získanie počtu domácností v tejto dvojrozmernej tabuľke používame aggfunc = 'size'.

Nakoniec vytvoríme teplotnú mapu pomocou balíka Seaborn. Výšku a šírku teplotnej mapy môžeme upraviť pomocou funkcie plt.figure (figsize = (width, height)). Pred vytvorením teplotnej mapy nezabudnite určiť veľkosť obrázka.

Môžeme nastaviť annot = True v sns.heatmap (), aby sme dostali čísla viditeľné na grafe. Existuje aj niekoľko ďalších argumentov, ktoré môžeme určiť, aby sme získali teplotnú mapu v požadovanom formáte.

Z teplotnej mapy, ktorú sme práve vytvorili, môžeme ľahko nájsť odpovede pri pohľade na čísla a farebnú mapu.

Pre domácnosti s 2 automobilmi je 6 najbežnejším počtom ciest za deň, aj keď 4 cesty sú na druhom mieste.

Pre domácnosti, ktoré podniknú iba 2 cesty za deň, má drvivá väčšina z nich 1 automobil.


Obmedzte náklady na dopyt obmedzením počtu fakturovaných bajtov

Najlepší tréning: Na obmedzenie nákladov na dopyt použite nastavenie maximálnej fakturácie bajtov.

Počet bajtov fakturovaných za dopyt môžete obmedziť pomocou nastavenia maximálneho počtu bajtov účtovaných. Keď nastavíte maximálny počet fakturovaných bajtov, počet bajtov, ktoré dotaz prečíta, sa odhadne pred vykonaním dotazu. Ak počet odhadovaných bajtov presahuje limit, potom dopyt zlyhá bez poplatku.

V prípade klastrovaných tabuliek je odhad počtu bajtov fakturovaných za dotaz hornou hranicou a môže byť vyšší ako skutočný počet bajtov účtovaných po spustení dotazu. Takže v niektorých prípadoch, ak nastavíte maximálny počet fakturovaných bajtov, dotaz na zoskupenej tabuľke môže zlyhať, hoci skutočné fakturované bajty by neprekročili nastavenie maximálneho fakturovaného bajtu.

Ak dopyt zlyhá z dôvodu nastavenia fakturácie maximálneho počtu bajtov, vráti sa chyba ako táto:

Chyba: Dopyt prekročil limit pre fakturované bajty: 10 000 000. Vyžaduje sa 10485760 alebo vyššia.

Postup nastavenia maximálneho počtu fakturovaných bajtov:

Konzola

  1. V Editor dotazov, kliknite Viac, kliknite Nastavenia dopytova potom kliknite na ikonu Pokročilé nastavenia.
  2. V Maximálny počet zaúčtovaných bajtov do poľa zadajte celé číslo.
  3. Kliknite Uložiť.

Použite príkaz bq query s príznakom --maximum_bytes_billed.

Vlastnosť maximumBytesBilled nastavte v JobConfigurationQuery alebo QueryRequest.


Skoro hotové! Znova spustite tento textový editor a nechajte skriptovať nejaký Python. Najskôr musíme importovať modul ctypes. Potom, ak ste niečo ako ja, budete chcieť vložiť absolútnu cestu k súboru .so do svojej vlastnej premennej. Horná časť môjho pyfactorial.py teda vyzerá takto:

Ďalšia vec, ktorú chceme urobiť, je vytvoriť náš objekt cdll z nášho predtým vytvoreného súboru .so. Takže po priradení premennej so_file dajte:

Teraz, technicky, môžete v tomto bode začať hrať s volaním funkcie C v skripte Python spustením pythonu v príkazovom riadku, ale najskôr buďme trochu zodpovední. Skôr ako sa s tým pohráme, poďme zabaliť našu funkciu C do funkcie Python. Po vytvorení premennej cfactorial vytvorte nasledujúcu funkciu:

Uložte tento súbor ako pyfactorial.py. Celkovo by to malo vyzerať takto:

Všimnite si, že spôsob volania funkcií v importovanom súbore zdieľaných objektov C je vyslovením & ltCDLL Object & gt. & Ltfunction name z C code & gt (& ltparameter & gt). Ľahko!

Takže v podstate, kedykoľvek chceme použiť túto funkciu C v Pythone, zavoláme faktoriálnu funkciu, ktorá spustí funkciu C s parametrom odovzdaným používateľom a vyhodnotí výsledok. Ak funkcia C vráti -1 (nezabudnite, že sme to tam vložili), skript Pythonu vie, že nastal problém. V opačnom prípade vráti číslo. Vyskúšajme to! Spustite svoj terminál a spustite python

Ta-da !! To je základná myšlienka používania funkcií C v Pythone. Toto je určite nástroj, ktorý sa oplatí mať. Použite všetky svoje ďalšie znalosti programátora na vytváranie úžasných funkcií a funkcií a ak máte akékoľvek otázky, dajte mi vedieť.


/ dev / hlasovanie Polling Objects¶

Solaris a jeho deriváty majú / dev / poll. Zatiaľ čo select () je O (najvyšší deskriptor súborov) a poll () je O (počet deskriptorov súborov), / dev / poll je O (aktívne deskriptory súborov).

Chovanie / dev / poll je veľmi podobné štandardnému objektu poll ().

Zatvorte deskriptor súborov dopytovacieho objektu.

Pravda, ak je volebný objekt zatvorený.

Vráti číslo deskriptora súboru dopytovacieho objektu.

Zaregistrujte deskriptor súborov s objektom dopytovania. Budúce volania metódy poll () potom skontrolujú, či má deskriptor súboru nejaké čakajúce I / O udalosti. fd môže byť celé číslo alebo objekt s metódou fileno (), ktorý vráti celé číslo. Súborové objekty implementujú fileno (), takže ich možno použiť aj ako argument.

maska ​​udalosti je voliteľná bitová maska ​​popisujúca typ udalostí, ktoré chcete skontrolovať. Konštanty sú rovnaké ako v prípade objektu poll (). Predvolená hodnota je kombináciou konštánt POLLIN, POLLPRI a POLLOUT.

Registrácia deskriptora súboru, ktorý je už zaregistrovaný, nie je chybou, ale výsledok nie je definovaný. Vhodným opatrením je najskôr zrušiť registráciu alebo upraviť. To je dôležitý rozdiel v porovnaní s hlasovaním ().

Táto metóda vykoná unregister (), za ktorým nasleduje register (). Je (trochu) efektívnejšie robiť to isté výslovne.

Odstráňte deskriptor súboru, ktorý sleduje objekt dotazovania. Rovnako ako metóda register (), fd môže byť celé číslo alebo objekt s metódou fileno (), ktorá vracia celé číslo.

Pokus o odstránenie deskriptora súboru, ktorý nebol nikdy zaregistrovaný, je bezpečne ignorovaný.

Vyžiada si súbor registrovaných deskriptorov súborov a vráti prípadne prázdny zoznam obsahujúci (fd, event) 2 n-tice pre deskriptory, ktoré majú na hlásenie udalosti alebo chyby. fd je deskriptor súboru a udalosť je bitová maska ​​s bitmi nastavenými pre hlásené udalosti pre tento deskriptor - POLLIN pre vstup čakania, POLLOUT na označenie, že do deskriptora je možné zapisovať, atď. Prázdny zoznam naznačuje, že čas hovoru vypršal a žiadny deskriptor súboru nemal žiadne udalosti, ktoré by bolo potrebné nahlásiť. Ak čas vypršal je daná, určuje dobu v milisekundách, po ktorú bude systém čakať na udalosti pred návratom. Ak čas vypršal je vynechané, -1 alebo Žiadne, bude hovor blokovaný, kým pre tento objekt prieskumu dôjde k udalosti.

Zmenené vo verzii 3.5: Funkcia je teraz opakovaná s prepočítaným časovým limitom, keď je prerušená signálom, okrem prípadov, keď obslužný program signálu vyvolá výnimku (pozri PEP 475 z dôvodu), namiesto zvýšenia hodnoty InterruptedError.


1 odpoveď 1

Ako už bolo spomenuté v predchádzajúcej recenzii, výraz lambda v aplikácii lambda s: shell_sort (s, 5) už nie je potrebný, akonáhle má druhý parameter shell_sort predvolenú hodnotu, pretože funkciu je možné volať pomocou shell_sort (input_list) rovnako ako iné funkcie . Preto stačí použitie shell_sort.

Tento kód nie je správne napísaný.

Ako navrhli iní v predchádzajúcej recenzii, funkcie upravujú vstup na mieste. Preto je lepšie nevracať zoznam (príkazy na návrat jednoducho vynechať). A nazýva sa to takto:

V malých programoch môžu byť testovacie prípady lepšie usporiadané ako zoznam alebo n-tica a opakované počas testov, podobne ako testované funkcie. Uľahčuje pridávanie nových testovacích prípadov (buď ručne vytvorených, alebo automaticky generovaných). Pre väčšie projekty by boli potrebné ďalšie nástroje, napríklad pytest.

Všimnite si to tiež testovacie prípady musia byť navrhnuté tak, aby pokrývali rôzne druhy vstupov, ktoré prechádzajú rôznymi vetvami kódu, vrátane okrajových prípadov, ktoré môžu prípadne viesť k chybám. Tu by testy na plavákoch uspeli, pokiaľ by vyhovovali zodpovedajúce celočíselné testy. Nie je teda potrebné opakovať každý test pre celé číslo aj pre float. Inými slovami, pokiaľ sú operátory porovnania dobre definované, typ vstupov nie je vlastnosťou, ktorá môže viesť k odlišnému chovaniu testovaných funkcií. Namiesto toho musíte hľadať iné variácie, ako je uvedené v ukážke kódu vyššie.

Ako vedľajšia poznámka, vzorový kód tiež demonštruje generovanie náhodných čísel pomocou náhodného modulu, takže scipy už nie sú potrebné.


1 odpoveď 1

Tu je triviálny príklad, ktorý zachytáva podstatu genetických algoritmov zmysluplnejšie ako polynóm, ktorý ste poskytli. Polynóm, ktorý ste zadali, je riešiteľný pomocou stochastického gradientného klesania, čo je jednoduchšia minimalizačná technika. Z tohto dôvodu namiesto toho navrhujem tento vynikajúci článok a príklad Willa Larsona.

Definovanie problému na optimalizáciu Teraz dáme dohromady jednoduchý príklad použitia genetického algoritmu v Pythone. Budeme optimalizovať veľmi jednoduchý problém: pokúsiť sa vytvoriť zoznam N čísel, ktoré sa pri sčítaní rovnajú X.

Ak nastavíme N = 5 a X = 200, potom by to boli všetko vhodné riešenia.

Prezrite si celý článok, ale tu je kompletný kód:

Myslím, že by mohlo byť celkom pedagogicky užitočné vyriešiť pomocou tohto algoritmu aj svoj pôvodný problém a potom tiež skonštruovať riešenie pomocou stochastického vyhľadávania v mriežke alebo stochastického gradientného klesania a získate hlboké pochopenie vzájomného porovnania týchto troch algoritmov.