[MS-Access] & [Python] - problem z NaN

0

Witam, aktualnie jestem w trakcie nauki biblioteki pandas. Moim zadaniem jest pobranie tabeli ze strony internetowej, przekształcenie jej i przesłanie do bazy danych - w tym przypadku do ms-access. Dane pobieram do DataFrame.

Mój problem polega na tym, że wybrana tabela w jednej z kolumn (dotyczącej cen) posiada wartość '-'. Poszukując informacji jak sobie z tym poradzić znalazłem 3 główne możliwości:

  1. zamiana za pomocą 'replace' znaku '-' na 0. Jednak to rozwiązanie nie spełnia moich oczekiwań gdyż wartość '-' oznacza brak danej a nie jej wartość równą 0
  2. zamiana '-' na pusty string - to rozwiązanie nie przejdzie, ponieważ po zmianach kolumna posiada typ danych - float
  3. zamiana '-' na NaN za pomocą - .replace('-',np.nan) - Ta możliwość jest najbliżej rozwiązania mojego problemu, jednak po załadowaniu danych do accessa za pomocą biblioteki pyodbc zamienione rekordy posiadają wartość '1,#QNAN'. Obstawiam, że taki format przyjmuje Access dla typu NaN, jednak problem pojawia się gdy chciałbym wyciągnąć średnią z kolumny za pomocą SQL :
    sql SELECT AVG(nazwaKolumny) FROM nazwaTabeli
    zwraca komunikat 'Przepełnienie'.

Czy ktoś ma może pomysł co zrobić z wartościami '-'? Czy jest jakiś sposób by pole numeryczne po załadowaniu było po prostu puste?
Wydaje mi się, że bardziej to problem bazodanowy, dlatego temat umieściłem w tym dziale.

0

A nie wystarczy do tego sql select avg() dodac where nazwaKolumny not like NaN czy cos?

2

Zamień na Null

0

@Pixello: SELECT AVG(nazwaKolumny) FROM nazwaTabeli WHERE RIGHT(nazwaKolumny,3) NOT LIKE 'NAN' faktycznie zwraca dobry wynik, jednak zastanawiam się czy na dłuższą metę jest to dobre rozwiązanie? W przyszłości będę miał dużo więcej tego typu kolumn i zastanawiam się czy da się to obejść w inny sposób?
@Marcin.Miga udało się zamienić na None za pomocą df.replace({'-':None}) jednak w bazie tabela posiada typ float i przy przesyłaniu danych wyskakuje błąd odnośnie typu danych, a gdy zmienię już w ramce danych typ kolumny na float to automatycznie None zamienia się z powrotem na NaN i wracamy do samego początku

Dodatkowo zastanawiam się czy '1,#QNAN' to domyślnie ustawiany typ przez Accessa dla nieokreślonych wartości liczbowych? Jak sobie potem z nim poradzić np. podczas połączenia bazy z przykładowo excelem? (tam również ten typ przeszkadza w różnych obliczeniach)? Nie ma możliwości przesłania po prostu pustej komórki do kolumny o typie numerycznym? (gdy tak próbowałem pojawiał się błąd odnośnie braku możliwości przekonwertowania stringa na floata)

0

A czemu zamieniasz na None, zamiast na NULL?
Rozwiązanie @Pixello jest prawie dobre. Prawie, bo jest LIKE we WHERE,a to bardzo nieoptymalne, a poza tym, jak będziesz chciał jednocześnie sumować coś innego i tę kolumnę, to where może ci za dużo odrzucić. Musiałbyś dawać CASE do SUM/COUNT/AVG tej kolumny z NaN...

1

SELECT AVG(nazwaKolumny) FROM nazwaTabeli WHERE RIGHT(nazwaKolumny,3) NOT LIKE 'NAN'
to w zasadzie to samo, co
SELECT AVG(nazwaKolumny) FROM nazwaTabeli WHERE nazwaKolumny NOT LIKE '%NAN'
Mniej operacji, a więc ciut przejrzyściej. Do tego operator like bez wildcarda działa identycznie jak zwykłe porównanie.

Jeśli chodzi o wydajność, to bym się nie spinał; co prawda w każdej bazie danych (wiec zapewne i Access) byłby full table scan, czyli najwolniejsza możliwa operacja - to przez ten right lub like, ale jeśli istotna część rekordów zawiera liczby, to i tak do policzenia średniej byłoby niezbędne przejrzenie całej tablicy, więc i tak byłby full table scan. Więc luzik, chyba że optymalizator zrobi z tego dwa full scany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1