- Czy istnieje szybszy, bardziej pytonowy sposób robienia tego?
- Co to jest generowanie tego ostrzeżenia
UserWarning: Boolean Series key will be reindexed to match DataFrame index. "DataFrame index.", UserWarning
i czy powinienem się nim zajmować?
Mam plik csv z 3 kolumnami: org, month, person.W jaki sposób powinienem strukturyzować i uzyskać dostęp do tabeli danych, aby móc łatwo porównywać podzbiory w Pythonie 3.5?
| org | month | person |
| --- | ---------- | ------ |
| 1 | 2014-01-01 | 100 |
| 1 | 2014-01-01 | 200 |
| 1 | 2014-01-02 | 200 |
| 2 | 2014-01-01 | 300 |
które czytałem w pandas.core.frame.DataFrame
z:
data = pd.read_csv('data_base.csv', names=['month', 'org', 'person'], skiprows=1)
Ostatecznym celem jest porównanie przecięcie osób między 2 kolejnych okresach zbioru osób w pierwszym okresie.
org: 1, month: 2014-01-01, count(intersection((100, 200), 200))/len(set(100, 200)) == 0.5
Edit: Dostałem go do pracy z:
import pandas as pd
import sys
data = pd.read_csv('data_base.csv', names=['month', 'org', 'person'], skiprows=1)
data.sort_values(by=['org', 'month', 'person'])
results = {}
for _org in set(data.org):
results[_org] = {}
months = sorted(list(set(data[data.org == _org].month)))
for _m1, _m2 in zip(months, months[1:]):
_s1 = set(data[data.org == _org][data.month == _m1].person)
_s2 = set(data[data.org == _org][data.month == _m2].person)
results[_org][_m1] = float(len(_s1 & _s2)/len(_s1))
print(str(_org) + '\t' + str(_m1) + '\t' + str(_m2) + '\t' + str(round(results[_org][_m1], 2)))
sys.stdout.flush()
który wytwarza moc tak:
UserWarning: Boolean Series key will be reindexed to match DataFrame index. "DataFrame index.", UserWarning
5640 2014-01-01 2014-02-01 0.75
5640 2014-02-01 2014-03-01 0.36
5640 2014-03-01 2014-04-01 0.6
...
Ale to bardzo powolny i rodzaj brzydki ... w obecna stawka, którą obliczam z powrotem na kopercie, szacuje ją na około 22 godziny dla dwuletniej partii danych.
Pandy doskonale nadają się do pełnych operacji, a nie do krojenia.Czas dostępu do pojedynczego elementu jest rzędu 10-100 mikrosekund, co daje pełne 1000x, co można uzyskać za wyszukiwanie słownika (poniżej 50 ns). Kompromis to panda, która doskonale nadaje się do pełnowymiarowych lub kolumnowych obliczeń z dużymi danymi: długie czasy uruchomienia są ładnie wymieniane dzięki wyjątkowo szybkim, wektoryzowanym obliczeniom. Tutaj skutecznie wykonuje się kalkulacje element po elementach i konwersję z typów Pand, co oznacza, że Panda, mimo że znakomita, nie jest odpowiednią biblioteką do tego zadania. –