본문 바로가기

Lang

[python]pandas, mongoDB, odo 간단한 테스트

우선 csv 파일 읽어서 mongoDB 에 insert 하는 것부터.

  • 기본(?) 방식
import pandas as pd
from pymongo import MongoClient

data = pd.read_csv('movie_data.csv')
data.reset_index(inplace=True)
data_dict = data.to_dict("records")

client = MongoClient()
db = client['testdb']
collection = db['movies']

collection.insert_many(data_dict)
  • odo 이용
from pymongo import MongoClient
from odo import odo
import pandas as pd

data = pd.read_csv('movie_data.csv')
client = MongoClient()
db = client['testdb']
odo(data, db.movies)

실행하니 odo 에서 몇가지 에러가 발생했다. 에러 해결 절차 아래 간단 요약.

1. tslib  문제

AttributeError: module 'pandas' has no attribute 'tslib'

찾아보니 pandas 버전업하면서 tslib 모듈 deprecated 된 것 때문인데 이로인해 문제 발생하는 라이브러리가 꽤 있는듯.

역시나  stack overflow 참고해서 site-packages\odo\backends\pandas.py 에서 아래 부분을 수정

변경 전 : @convert.register((pd.Timestamp, pd.Timedelta), (pd.tslib.NaTType, type(None)))
변경 후 : @convert.register((pd.Timestamp, pd.Timedelta), (type(pd.NaT), type(None)))

2. DiGraph 문제

tslib 에러는 발생하지 않지만 아래 에러가 새로 발생한다.

AttributeError: 'DiGraph' object has no attribute 'edge'

odo 가 NetworkX >=2.0 에서는 동작하지 않아서 NetworkX 다운그레이드로 해결했다는 답변들 있길래 시도해봤다.

pip uninstall networkx
pip install networkx==1.11

여기까지 하고 나니 에러 없이 정상 동작.

기본 방식이나 odo 이용한거나 수행 시간은 별 차이 없어보이는데 응용면에서 어떤게 나을지 좀 더 고민해보기로 하고, 다음 테스트로 mongoDB 에서 데이터 읽는거 시도.

  • pymongo 와 pandas 이용한 기본(?) 방식
import pandas as pd
from pymongo import MongoClient

db = MongoClient()
df = pd.DataFrame.from_records(db.testdb.movie.find())
  • pdmongo 이용
import pdmongo as pdm

df = pdm.read_mongo("movie", [], "mongodb://localhost:27017/testdb")
  • odo 이용
import pandas as pd
from odo import odo

data = odo('mongodb://localhost/testdb::movie', pd.DataFrame)

원래대로면 이것도 당연히 tslib 에러 나겠지만 앞에서 수정한 것 때문에 정상 작동.

테스트한 데이터가 대략 64M 에 5만건인데 실 적용해보려는 데이터셋은 이보다 훨씬 클거라 예상되는 상황이라 좀 더 나은 해법이 필요하지 않을까 싶어서 blaze 가 도움이 될까 시도해봤지만 ...

현재 설정 상태에서 blaze 이용하면 'psutil._psutil_windows' 관련 에러가 난다.

ModuleNotFoundError: No module named 'psutil._psutil_windows'

이 에러 관련해서는 구글링해봤지만 딱히 명확한 답이 보이지 않고 시도해볼 수 있는 방법은 당장은 blaze 의존성 있는 라이브러리의 버전을 다운그레이드하는거. 이렇게까지 해서 얻을 수 있는 효과가 의미가 있을까 고민 중.