Mam bardzo prostą konfigurację: dane rynkowe (kleszcze) w Pandy dataframe df tak:przyspieszyć niestandardowe funkcje agregujące
index period ask bid
00:00:00.126 42125 112.118 112.117
00:00:00.228 42125 112.120 112.117
00:00:00.329 42125 112.121 112.120
00:00:00.380 42125 112.123 112.120
00:00:00.432 42125 112.124 112.121
00:00:00.535 41126 112.124 112.121
00:00:00.586 41126 112.122 112.121
00:00:00.687 41126 112.124 112.121
00:00:01.198 41126 112.124 112.120
00:00:01.737 41126 112.124 112.121
00:00:02.243 41126 112.123 112.121
Teraz używam pandas.groupy okresów kruszywa
g=df.groupby('period')
Łatwo jest uzyskać ceny minimalne i maksymalne według okresu, np
import numpy as np
res=g.agg({'ask': [np.amax, np.amin]})
Jest to również stosunkowo szybki. Teraz chcę również pierwszą i ostatnią cenę za okres. Tu zaczyna się kłopot. Oczywiście, że mogę:
res=g.agg({'ask': lambda x: x[0]})
i to działa, ale jest strasznie powolne dla dużych zbiorów danych. Zasadniczo, obciążenie połączenia dla wywołania funkcji w Pythonie jest po prostu ogromne.
Czy ktoś wie o funkcji numpy analogicznej do np.amax, która zwróci pierwszy lub ostatni element grupy? Nie mogłem go znaleźć. iloc [0] nie rozwiązuje problemu, ponieważ jest metodą obiektu, a zatem nie mogę go przekazać jako funkcji g.agg, ponieważ nie mam obiektu na tym etapie (to jest to, lambda jest potrzebna).
Teraz nie jestem leniwy, a ja próbowałem zrobić to za siebie, używając cythonu.
import numpy as np
cimport numpy as np
cpdef double first(np.ndarray array_series):
return array_series[0]
Ale pandy nie zaakceptuje to jako funkcję agregacji, ponieważ przechodzi pd.core.series-Object raczej niż np.ndarray. (Nieważne, jedno pochodzi od drugiego, kompilator tego nie rozpoznaje).
Czy ktoś wie, jak napisać funkcję cythonową, która akceptuje serię pand bez kosztu rozmowy Pythona?
Czy próbowałeś 'df.groupby ('Okres') w pierwszej kolejności.() 'i' df.groupby ('okres'). last() '? – EdChum
Dzięki, to dobra wskazówka. Działa, ale nie mogę przekazać funkcji first() do g.agg (...), czy mogę? Chciałbym to lepiej, ponieważ chciałbym zastosować wiele różnych funkcji agregacji naraz (amin, amax, first, ...). Będzie to obejście, aby go użyć, a następnie ręcznie zestawić mój ostateczny zestaw danych, jak sądzę. – user5507059
Tak, możesz, zobacz moją odpowiedź – EdChum