python 데이터 분석 학습 노트 8

제8 장 응용 데이터베이스
1 sqlite 3 기반 경량급 접근
가 벼 운 관계 형 데이터베이스
예제 코드 는 다음 과 같다.

import sqlite3

#        
with sqlite3.connect(":memory:") as con:
    #     
    c = con.cursor()
    #       
    c.execute('''
        CREATE TABLE sensors(
                            data text,
                            city text,
                            code text,
                            sensor_id real,
                            temperature real)
    ''')

#       
for table in c.execute("SELECT name FROM sqlite_master WHERE type='table'"):
    print('Table', table)

#     
c.execute("INSERT INTO sensors VALUES('2016-02-27','uTRECHT','Red',42,15.14)")
#       
c.execute("SELECT * FROM sensors")
print(c.fetchone())
#    
con.execute("DROP TABLE sensors")
#       
print("#of table", c.execute("SELECT COUNT (*) FROM sqlite_master WHERE type='table'").fetchone()[0])
#     
con.close()

 
실행 결 과 는 다음 과 같 습 니 다.
Table ('sensors',)
('2016-02-27', 'uTRECHT', 'Red', 42.0,15.14)
#of table 0
2. pandas 를 통 해 데이터 베 이 스 를 방문 합 니 다.
예제 코드 는 다음 과 같다.

import statsmodels.api as sm
from pandas.io.sql import read_sql
import sqlite3

#        
with sqlite3.connect(":memory:") as con:
    #     
    c = con.cursor()

    #     
    data_loader = sm.datasets.sunspots.load_pandas()
    df = data_loader.data
    #       
    rows = [tuple(x) for x in df.values]
    #                
    con.execute("CREATE TABLE sunspots (year,sunactivity)")
    #       
    con.executemany("INSERT INTO sunspots(year,sunactivity) VALUES (?,?)", rows)
    #       
    c.execute("SELECT COUNT(*) FROM sunspots")
    print(c.fetchone())
    #       ,        
    print("Deleted", con.execute("DELETE FROM sunspots where sunactivity >20").rowcount, "row")

    #   read_sql       dataFrame  
    print(read_sql("SELECT * FROM sunspots where year <1732", con))
    #      
    con.execute("DROP TABLE sunspots")
    c.close()

 
실행 결 과 는 다음 과 같 습 니 다.
(309,)
Deleted 217 row
     year  sunactivity
0  1700.0          5.0
1  1701.0         11.0
2  1702.0         16.0
3  1707.0         20.0
4  1708.0         10.0
5  1709.0          8.0
6  1710.0          3.0
7  1711.0          0.0
8  1712.0          0.0
9  1713.0          2.0
10 1714.0         11.0
11 1723.0         11.0
 
3 SQLAlchemy
python 의 클래스 를 데이터베이스 에 표시 할 수 있 습 니 다. 클래스 는 자바 의 hibenate 입 니 다.
예제 코드 는 다음 과 같다.
Alchemy_entities.py

from sqlalchemy import Column, ForeignKey, Integer, Float, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine
from sqlalchemy import UniqueConstraint

#   
Base = declarative_base()

#     
class Station(Base):
    __tablename__ = 'station'  #   
    id = Column(Integer, primary_key=True# id
    name = Column(String(14), nullable=False, unique=True#      

    def __repr__(self):
        return "Id=%d name=%s" % (self.id, self.name)


#     
class Sensor(Base):
    __tablename__ = 'sensor'  #   
    id = Column(Integer, primary_key=True# id
    last = Column(Integer)
    multiplier = Column(Float)
    station_id = Column(Integer, ForeignKey('station.id'))  #   
    station = relationship(Station)

    def __repr__(self):
        return "Id=%d last=%d multiplier=%.1f station_id=%d" % (self.id, self.last, self.multiplier, self.station_id)


if __name__ == "__main__":
    print("This script is used by another script. Run python alchemy_query.py")

 
 
Populate_db.py

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from .alchemy_entities import Base, Sensor, Station


def populate(engine):
    #   DBSession  
    Base.metadata.bind = engine
    DBSession = sessionmaker(bind=engine)
    session = DBSession()

    #        
    de_bilt = Station(name='De Bilt')
    session.add(de_bilt)

    session.add(Station(name='Utrecht'))
    session.commit()
    print('Station', de_bilt)

    #        
    temp_sesor = Sensor(last=20, multiplier=.1, station=de_bilt)
    session.add(temp_sesor)
    session.commit()
    print("Sensor", temp_sesor)


if __name__ == "__main__":
    print("This script is used by another script. Run python alchemy_query.py")

 
 
Alchemy_query.py

from Eight.alchemy_entities import Base, Station, Sensor
from Eight.populate_db import populate
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import os
from pandas.io.sql import read_sql

#     
engine = create_engine('sqlite:///demo.db')
#      
Base.metadata.drop_all(engine)
#      
Base.metadata.create_all(engine)
populate(engine)
Base.metadata.bind = engine
DBSession = sessionmaker()
DBSession.bind = engine
session = DBSession()

#   station        
station = session.query(Station).first()

#     station
print('all station', session.query(Station).all())
#     sensor
print('all sensor', session.query(Sensor).all())
#      station    sensor
print('query sensor by station', session.query(Sensor).filter(Sensor.station == station).one())
#   pandas read_sql  
print('read_sql all station', read_sql("SELECT * FROM station", engine.raw_connection()))

#      ,    
try:
    os.remove('demo.db')
    print('Delete demo.db')
except OSError as e:
    # [WinError 32]             ,      。: 'demo.db'
    print(e)
    pass

 
실행 결 과 는 다음 과 같 습 니 다.
Station Id=1 name=De Bilt
Sensor Id=1 last=20 multiplier=0.1station_id=1
all station [Id=1 name=De Bilt, Id=2name=Utrecht]
all sensor [Id=1 last=20 multiplier=0.1station_id=1]
query sensor by station Id=1 last=20multiplier=0.1 station_id=1
read_sql all station    id    name
0  1  De Bilt
1  2  Utrecht
[WinError 32] 다른 프로그램 이 이 파일 을 사용 하고 있 습 니 다. 프로 세 스에 접근 할 수 없습니다.:demo.db'
 
4 Pony ORM
파 이 썬 이 쓴 orm 패키지.

from pony.orm import Database, db_session
from pandas.io.sql import to_sql
import statsmodels.api as sm

#   sqlite   
db = Database('sqlite', ':memory:')

#           
with db_session:
    data_loader = sm.datasets.sunspots.load_pandas()
    df = data_loader.data
    to_sql(df, "sunspots", db.get_connection())
    print(db.select("count(*) FROM sunspots"))

 
실행 결 과 는 다음 과 같 습 니 다.
[309]
 
5 Dataset 게으름뱅이 데이터베이스
sqlalchemy 의 포장 기 입 니 다.

import dataset
from pandas.io.sql import read_sql
from pandas.io.sql import to_sql
import statsmodels.api as sm

#        
db = dataset.connect('sqlite:///:memory:')
#   books 
table = db["books"]
#     ,   insert         
table.insert(dict(title="Numpy Beginner's guide", author='Ivan Idris'))
table.insert(dict(title="Numpy Cookbook", author='Ivan Idris'))
table.insert(dict(title="Learning Numpy", author='Ivan Idris'))
#   pandas read_sql    
print(read_sql('SELECT * FROM books', db.executable.raw_connection()))

#     
data_loader = sm.datasets.sunspots.load_pandas()
df = data_loader.data
to_sql(df, "sunspots", db.executable.raw_connection())
table = db['sunspots']

#    5   
for row in table.find(_limit=5):
    print(row)
print("Table", db.tables)

실행 결 과 는 다음 과 같 습 니 다.
id      author                   title
0  1  Ivan Idris  Numpy Beginner's guide
1  2  Ivan Idris          Numpy Cookbook
2  3  Ivan Idris          Learning Numpy
OrderedDict([('index', 0), ('YEAR',1700.0), ('SUNACTIVITY', 5.0)])
OrderedDict([('index', 1), ('YEAR',1701.0), ('SUNACTIVITY', 11.0)])
OrderedDict([('index', 2), ('YEAR',1702.0), ('SUNACTIVITY', 16.0)])
OrderedDict([('index', 3), ('YEAR',1703.0), ('SUNACTIVITY', 23.0)])
OrderedDict([('index', 4), ('YEAR',1704.0), ('SUNACTIVITY', 36.0)])
Table ['books', 'sunspots']
 
Process finished with exit code 0
 
6 pymongo 와 mongodb
 
데이터 저장 디 렉 터 리 지정
Mkdir h:/data/db
Mongod --dbpath h:/data/db
 
Python 에 mongodb 드라이버 설치
Python -m pip install pymongo
 
현재 드라이버 버 전 번호 보기
C:\Users\Administrator>python -m pipfreeze|grep pymongo
pymongo==3.3.1
 
mongodb 의 테스트 데이터 베 이 스 를 연결 합 니 다.
예제 코드 는 다음 과 같다.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/1/3 11:41
# @Author  : Retacn
# @Site    :   mongodb     
# @File    : mongodb_conn.py
# @Software: PyCharm
__author__ = "retacn"
__copyright__ = "property of mankind."
__license__ = "CN"
__version__ = "0.0.1"
__maintainer__ = "retacn"
__email__ = "[email protected]"
__status__ = "Development"

from pymongo import MongoClient
import statsmodels.api as sm
import json
import pandas as pd

#        
client = MongoClient()
db = client.test_database

#   json        
data_loader = sm.datasets.sunspots.load_pandas()
df = data_loader.data
rows = json.loads(df.T.to_json()).values()
db.sunspots.insert(rows)

#      
cursor = db['sunspots'].find({})
df = pd.DataFrame(list(cursor))
print(df)

db.drop_collection('sunspots')

 
실행 결 과 는 다음 과 같 습 니 다.
    SUNACTIVITY    YEAR                       _id
0          16.6  1825.0  586b24872e29db269c8854f4
1          11.0  1745.0  586b24872e29db269c8854f5
2           4.3  1856.0  586b24872e29db269c8854f6
3          26.1  1921.0  586b24872e29db269c8854f7
4          15.5  1975.0  586b24872e29db269c8854f8
5          47.8  1831.0  586b24872e29db269c8854f9
6          38.0  1955.0  586b24872e29db269c8854fa
7          14.2  1922.0  586b24872e29db269c8854fb
8          37.6  1920.0  586b24872e29db269c8854fc
9           6.4  1797.0  586b24872e29db269c8854fd
10          4.1  1798.0  586b24872e29db269c8854fe
11         28.0  1720.0  586b24872e29db269c8854ff
12        111.2  1871.0  586b24872e29db269c885500
13         83.4  1750.0  586b24872e29db269c885501
14         27.9  1963.0  586b24872e29db269c885502
15         85.9  1761.0  586b24872e29db269c885503
16         32.3  1880.0  586b24872e29db269c885504
17         70.9  1830.0  586b24872e29db269c885505
18         17.9  1985.0  586b24872e29db269c885506
19          8.6  1996.0  586b24872e29db269c885507
20         88.8  1939.0  586b24872e29db269c885508
21         16.3  1866.0  586b24872e29db269c885509
22         22.0  1746.0  586b24872e29db269c88550a
23          1.4  1913.0  586b24872e29db269c88550b
24          5.0  1812.0  586b24872e29db269c88550c
25         14.5  1800.0  586b24872e29db269c88550d
26         84.8  1780.0  586b24872e29db269c88550e
27        138.3  1837.0  586b24872e29db269c88550f
28         54.8  1858.0  586b24872e29db269c885510
29         12.2  1813.0  586b24872e29db269c885511
..          ...     ...                       ...
279       132.0  1787.0  586b24872e29db269c88560b
280         9.6  1944.0  586b24872e29db269c88560c
281        47.8  1752.0  586b24872e29db269c88560d
282       139.0  1870.0  586b24872e29db269c88560e
283         5.7  1911.0  586b24872e29db269c88560f
284        20.6  1854.0  586b24872e29db269c885610
285       121.5  1836.0  586b24872e29db269c885611
286       159.0  1959.0  586b24872e29db269c885612
287        59.1  1862.0  586b24872e29db269c885613
288        64.6  1840.0  586b24872e29db269c885614
289        66.5  1772.0  586b24872e29db269c885615
290         5.0  1902.0  586b24872e29db269c885616
291        82.9  1786.0  586b24872e29db269c885617
292        24.2  1842.0  586b24872e29db269c885618
293         4.4  1954.0  586b24872e29db269c885619
294        95.8  1860.0  586b24872e29db269c88561a
295       109.6  1938.0  586b24872e29db269c88561b
296        21.0  1724.0  586b24872e29db269c88561c
297         5.0  1700.0  586b24872e29db269c88561d
298        63.7  1883.0  586b24872e29db269c88561e
299        25.4  1886.0  586b24872e29db269c88561f
300        12.1  1899.0  586b24872e29db269c885620
301        61.5  1846.0  586b24872e29db269c885621
302        35.6  1891.0  586b24872e29db269c885622
303        79.7  1936.0  586b24872e29db269c885623
304        77.2  1861.0  586b24872e29db269c885624
305        36.3  1826.0  586b24872e29db269c885625
306         6.0  1879.0  586b24872e29db269c885626
307        26.2  1897.0  586b24872e29db269c885627
308        41.0  1794.0  586b24872e29db269c885628
 
[309 rows x 3 columns]
 
7 redis 를 이용 하여 데 이 터 를 저장 합 니 다.
in - memory 형 키 데이터 베이스 입 니 다. c 가 쓴 것 입 니 다.
예제 코드 는 다음 과 같다.

import redis
import statsmodels.api as sm
import pandas as pd

#  redis    
r = redis.StrictRedis()

#     
data_loader = sm.datasets.sunspots.load_pandas()
df = data_loader.data

#   json       
data = df.T.to_json()
r.set('sunspots', data)

#     
blob = r.get('sunspots')
print(pd.read_json(blob))

실행 결 과 는 다음 과 같 습 니 다.
            0     1     10     100   101   102    103     104     105 \
SUNACTIVITY     5   11     3    14.5   34    45    43.1   47.5    42.2  
YEAR        1700  1701  1710 1800.0  1801  1802 1803.0  1804.0  1805.0  
 
                106   ...      90      91    92     93    94      95   96   \
SUNACTIVITY    28.1  ...      89.9    66.6   60    46.9    41   21.3    16  
YEAR        1806.0   ...    1790.0 1791.0  1792  1793.0 1794  1795.0  1796  
 
                97      98     99  
SUNACTIVITY     6.4    4.1     6.8 
YEAR        1797.0  1798.0  1799.0
 
 
8 Apache Cassandra
 키 값 과 전통 관계 형 데이터베이스 특성 을 결합 한 혼합 형 데이터베이스 로 열 을 위 한 데이터베이스 입 니 다.
 
Cassandra 설치
apache - cassandra - 3.10 - bin. tar. gz 다운로드
2 cassandra. bat 수정, JAVA 추가HOME 변수
 set JAVA_HOME=C:\Java\jdk1.8.0_71
  이 컴퓨터 의 메모리 가 크 지 않 으 면 가상 컴퓨터 의 메모 리 를 줄 일 수 있 습 니 다. 기본 값 은 2G 입 니 다.
 -Xms512m^
 -Xmx512m^
3 python 설치 약
4 cqlsh. bat 를 수정 하고 python 경 로 를 설정 합 니 다.
set path =D:\Python35
5 환경 변수 추가
Path=F:\apache-cassandra-3.10\bin;
6 cmd 실행 카 산 드 라, 데이터베이스 시작
 
이 장 에서 python 3.5 를 지원 하 는 드라이버 를 찾 을 수 없 기 때문에 ptyhon 2.7 을 사용 합 니 다.
디 스 플레이 코드 는 다음 과 같 습 니 다.

from cassandra import ConsistencyLevel
from cassandra.cluster import Cluster
from cassandra.query import SimpleStatement
import statsmodels.api as sm

#        ,       
cluster = Cluster()
session = cluster.connect()

# keyspace          .
session.execute(
    "CREATE KEYSPACE IF NOT EXISTS mykeyspace WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };")
session.set_keyspace('mykeyspace')

#      
session.execute("CREATE TABLE IF NOT EXISTS sunspots (year decimal PRIMARY KEY, sunactivity decimal);")
#       
query = SimpleStatement(
    "INSERT INTO sunspots (year, sunactivity) VALUES (%s, %s)",
    consistency_level=ConsistencyLevel.QUORUM)

#     
data_loader = sm.datasets.sunspots.load_pandas()
df = data_loader.data
rows = [tuple(x) for x in df.values]

#     
for row in rows:
    session.execute(query, row)

#       
print(session.execute("SELECT COUNT(*) FROM sunspots")._current_rows[0])

session.execute('DROP KEYSPACE mykeyspace')
cluster.shutdown()

실행 결 과 는 다음 과 같 습 니 다.
Row(count=309)

좋은 웹페이지 즐겨찾기