Вставьте массив Numpy в базу данных Mysql - PullRequest
3 голосов
/ 12 августа 2011

Начиная с этого:

Использование Numpy для создания таблицы цен финансов Yahoo

import numpy as np
import pylab as pl
import urllib
url = "http://ichart.yahoo.com/table.csv?a=2&c=2011&b=30&e=7&d=7&g=d&f=2011&s=msft&ignore=.csv"
f = urllib.urlopen(url)
title = f.readline().strip().split(",")
data = np.loadtxt(f, dtype=np.float, delimiter=",", converters={0: pl.datestr2num})

Я хотел бы вставить возвращаемые строки в БД. данные выглядят так:

 [[734233.0 25.98 26.31 25.86 26.15 65581400 25.98]
 [734232.0 25.82 26.18 25.74 25.78 73694500 25.61]
 [734231.0 25.45 25.66 25.41 25.55 35433700 25.38]
 [734228.0 25.53 25.53 25.31 25.48 63114200 25.31]
 [734227.0 25.60 25.68 25.34 25.39 63233700 25.22]
 [734226.0 25.60 25.72 25.50 25.61 41999300 25.44]]

Как бы я мог разобрать этот массивный массив в списке или таблице, чтобы я мог вставить его в базу данных. Обратите внимание, что все строки не разделены, а одна строка. ДБ часть работает.

data.tolist () не анализирует отдельные строки

ищет вывод как

    [[734233.0 ,25.98 ,26.31 ,25.86 ,26.15, 65581400, 25.98]  
     [734232.0, 25.82, 26.18, 25.74, 25.78, 73694500, 25.61]
     [734231.0, 25.45 ,25.66, 25.41, 25.55, 35433700, 25.38]
     [734228.0, 25.53, 25.53, 25.31, 25.48, 63114200, 25.31]
     [734227.0, 25.60 ,25.68, 25.34, 25.39, 63233700, 25.22]
     [734226.0, 25.60, 25.72, 25.50, 25.61, 41999300, 25.44]]

Заменили бы "" на "," работать "?

Ответы [ 2 ]

2 голосов
/ 13 августа 2011
>>> import sqlalchemy as sa
>>> import numpy as np
>>> import time, datetime
>>> import urllib

преобразования в и из форматов даты.

>>> datestr2timestamp = lambda d: time.mktime(time.strptime(d,"%Y-%m-%d"))
>>> def npvector_to_sadict(vector):
...     row = dict(zip(("open", "high", "low", "close", "volume", "adj_close"),
...                        vector[1:]))
...     row['date'] = datetime.date.fromtimestamp(vector[0])
...     return row
... 

Загрузка данных из сетевого ресурса:

>>> url = "http://ichart.yahoo.com/table.csv?a=2&c=2011&b=30&e=7&d=7&g=d&f=2011&s=msft&ignore=.csv"
>>> f = urllib.urlopen(url)
>>> title = f.readline().strip().split(",")
>>> data = np.loadtxt(f, dtype=np.float, delimiter=",", converters={0: datestr2timestamp})

определяет, как выглядит таблица базы данных

>>> metadata = sa.MetaData()
>>> stockdata = sa.Table('stockdata', metadata,
...                      sa.Column('date', sa.Date),
...                      sa.Column('open', sa.Float),
...                      sa.Column('high', sa.Float),
...                      sa.Column('low', sa.Float),
...                      sa.Column('close', sa.Float),
...                      sa.Column('volume', sa.Float),
...                      sa.Column('adj_close', sa.Float))

подключиться к базе данных.Вы можете изменить это значение на mysql://user:password@host/ для баз данных mysql

>>> engine = sa.create_engine("sqlite:///:memory:")

только для демонстрации, пропустите это, если у вас уже есть созданная таблица.

>>> metadata.create_all(engine)

вставьте данные в базу данных:

>>> engine.execute(stockdata.insert(), [npvector_to_sadict(datum) for datum in data])
<sqlalchemy.engine.base.ResultProxy object at 0x23ea150>

убедитесь, что он был вставлен

>>> print data.shape[0], engine.execute(sa.select([sa.func.count(stockdata.c.close)])).scalar()
90 90
>>> 
1 голос
/ 12 августа 2011

Итак, у вас есть строка, которая выглядит как "[734226.0 25.60 25.72 25.50 25.61 41999300 25.44]", и вы хотите преобразовать ее в список с отдельными значениями? Нечто подобное должно сработать:

my_string = "[734226.0 25.60 25.72 25.50 25.61 41999300 25.44]"
my_list = [float(s) for s in my_string[1:-1].split(' ')]

Почему ты не можешь просто сделать:

for row in data:
    print row #do whatever you want with row here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...