大数据时代,对数据的采集,处理,需要效率和成本。解决方案从来都不是唯一的,只有是否合适的。目前在学python,就记录一些python相关的知识吧。大数据的状况,可以看阿里云栖社区 https://yq.aliyun.com/

在统计数据的时候,要对数据进行分析。在不破话原始数据以及对原始服务器的多次请求。可以将原始数据保存一份到其他数据库或文件中。这个中间你可以做处理以及优化,比如排重,去掉某些自己认为定义的无效数据等。然后,对这些数据,你可以进行多次的操作分析处理。

于是,操作数据库就很必要了。SQLAlchemy是python的一个框架,利用它可以将相对应的数据库(mysql等)中的数据读取出来,还可以将数据写入数据库。中间经常用到的有.csv文件或DataFrame数据。

在干干净净的电脑上,你调用的时候,可能缺少相应的库,这个时候你需要先装好。

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0014021031294178f993c85204e4d1b81ab032070641ce5000

先说下将mysql中的数据保存为本地csv文件。

1,导入SQLAlchemy,创建engine。

from sqlalchemy import Column, String, create_engine

# 初始化数据库连接:
engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')

只需要将拼凑好的字符串丢过去就行。字符串每一段分别对应着:数据库用户名,数据库密码,数据库host,数据库port,数据库名。你还可以传其他参数,比如编码方式。

2,编写sql语句。

sql = "s-e-l-e-c-t uid, nickname, age, city, pay from accounts where date >= '2016-10-10 00:00:00' and date <'2016-10-11 00:00:00'"

3,通过pandas的read_sql方法调用sql和engine,将数据库中的数据转换成DataFrame。然后,调用DataFrame的to_csv方法,将DataFrame写入到本地的csv文件中。

name = 'test.csv'
sql = "s-e-l-e-c-t uid, nickname, age, city, pay from accounts where date >= '2016-10-10 00:00:00' and date <'2016-10-11 00:00:00'"
df = pd.read_sql(sql, engine)
df.to_csv(name, index=False, encoding='utf-8')

这样,mysql保存到csv的流程已经走完。

下边,再说下,将本地csv文件保存到mysql中。
1,导入SQLAlchemy,创建engine。使用同上。

2,创建SQLAlchemy的declarative_base对象。declarative_base作为父类,建立一个子类继承它,然后在子类中,填充需要定义的字段名。这些字段,可以手动在mysql中创建。因为刚接触,也许,可以自动创建。code如下。

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import PrimaryKeyConstraint, Column, Integer, Date, SmallInteger

Base = declarative_base()

class UserEnterChannelTime(Base):
    __tablename__ = "cq_accounts"
    day = Column(Date, primary_key=True)
    uid = Column(Integer, nullable=False)
    channel_id = Column(Integer, nullable=False)
    in_channel_time = Column(Integer, nullable=False)

2,调用engin的begin方法,获取到conn,然后调用conn的excute方法。这种方式和websql操作数据库的方式很相像。

engine = 'xxxxx'
conn = engine.begin()
conn.execute(UserEnterChannelTime.__table__.insert, day = '2016-10-18 19:45:00', 
             uid = 2331024, channel_id = 882, in_channel_time = 2.4)

这里,你也可以填入list。python就是那么自由。

除了上边的方法写入本地csv文件,还有一种方法。用csv库。就是写入数据,写入一行,writerow,写入多行writerows。一行就是个一维集合,多行可以是二维集合。

# coding: UTF-8
import pandas as pd
import numpy as py
import csv

dates = pd.date_range('20161018', periods=100)
df = pd.DataFrame(py.random.randn(100, 3), index=dates, columns=list('ABC'))

with open('test.csv', 'wb') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(df.columns) #写入字段
    spamwriter.writerows(df.values) #写入多行

突然想到一个无关这个的问题。为了效率,相同类型数据可以存在numpy的array中。numpy的array有这样的特性,里边存的是相同类型的数据,这样方便处理以及速度。因为同一类型数据,有着同样的方法和属性。