Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 22, 2013 11:50:34

pmus
Зарегистрирован: 2013-04-03
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

как бы обойтись без Pandas?

Добрый день, уважаемые друзья-коллеги!

У меня возник вопрос по правильному описанию структур данных.
Пишу библиотеку для того, чтобы раз и навсегда доступаться к SQLite удобным мне способом.

В частности, в классе присутствует и функция для чтения больших массивов данных:

# -*- coding: utf-8 -*-
"""
Класс для sqlite, чтобы просто работать
"""
import sqlite3
from pandas import DataFrame
class sqlite_file ():
    """
    Создание: sql = sqlite_file('test.db'), то есть указываем только имя файла
    Запись: sql.record (table = 'Имя таблицы', Поле1 = Значение1, Поле2 = Значение2)
    ... или, например:
    sql.record (table = 'config', login = 'root', password = 'bastard', enabled = 'Nope')
    """
    def __init__ (self, filename):
        self.mybase = sqlite3.connect(filename)
        self.columns = {}
        self.debug = '0'
# <--------------- Здесь кое-что пропущено -------------->
def read (self, table, **args):
        """
        Пример использования:
        mydata = sql.read (table = 'quotes', fields = ['secid', 'time', 'date', 'close', 'volume', 'oi'])
        а на выходе - таблица:
          secid   time        date   close volume    oi
        0  RIU3  11:00  27.09.2013  144741    412  1223
        1  RIU3  11:00  27.09.2013  144813    412  1223
        ...
        7  RIU3  11:00  27.09.2013  144576    412  1223
        8  RIU3  11:00  27.09.2013  144683    412  1223
        9  RIU3  11:00  27.09.2013  144874    412  1223
        """
        request = 'SELECT'
        for f in args['fields']: # Это если все, а если нет, то дописать!!!!
            request += ' [%s],' % f
        request = request[:-1] + ' FROM [%s]' % table
        try:
            sqlres = self.mybase.execute(request)
        except:
            print 'Empty table!'
            return -1
        result = []
        if sqlres:
            for res in sqlres:
                result.append (res)
            data = DataFrame (result, columns=args['fields'])
            return data

Все это сделано, чтобы было легко и просто обращаться потом с данными как с “массивом” - по номеру записи и имени столбца:

import mylib
sql = sqlite_file('test.db')
mydata = sql.read (table = 'quotes', fields = ['secid', 'time', 'date', 'close', 'volume', 'oi'])
print (mydata [0]['volume'])

Вопрос: как мне сделать то же самое, но без Pandas?

Отредактировано pmus (Окт. 22, 2013 12:03:22)

Офлайн

#2 Окт. 22, 2013 21:39:56

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

как бы обойтись без Pandas?

pmus
то же самое, но без Pandas?
Ответ очевиден. Надо написать свой Pandas. Из вашего поста непонятно чем он вас не устраивает, следовательно неясно что вам посоветовать.
Например если вы импортируете данные в hdf5 Доступ будет выглядеть похоже
mydata=hdf_opened_file["volume"][0]
может это вам подойдет?

pmus
раз и навсегда доступаться к SQLite удобным мне способом.
В приведенном примере как мне показалось после беглого просмотра доступ организован не через SQLite.
Может я ошибся?



Офлайн

#3 Окт. 22, 2013 23:07:14

pmus
Зарегистрирован: 2013-04-03
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

как бы обойтись без Pandas?

doza_and
Из вашего поста непонятно чем он вас не устраивает

Тяжелы Панды для этой моей задачи. Я просто не допёр, как сформировать структуру из списка полей fields, чтобы доступаться к ним по имени поля и номеру записи одновременно:

print (mydata [0]['volume'])

doza_and
В приведенном примере как мне показалось после беглого просмотра доступ организован не через SQLite.

Эммм…

import sqlite3
....
self.mybase = sqlite3.connect(filename)
...
sqlres = self.mybase.execute(request)

ну, как же не SQLite?

Офлайн

#4 Окт. 23, 2013 19:47:59

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

как бы обойтись без Pandas?

По поводу SQLite да вы из нее данные черпаете, но вы их полностью в память засасываете. В этом случае вам вообще не важно какой источник, база, файл, ввод с консоли и т.п.
Базы тем и хороши что вы не обязаны все загружать в память.
Если вы готовы все держать в памяти то:

column_names=...
result={i:[] for i in column_names}
for vals in cursor:
   for k,v in zip(column_names,vals):
       result[k].append(v)

в результате получите словарь списков и будет вам без введения нового класса обращение
v=result["a"][0]

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



Офлайн

#5 Окт. 24, 2013 07:12:36

pmus
Зарегистрирован: 2013-04-03
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

как бы обойтись без Pandas?

Если вы готовы все держать в памяти то:
Готов, это для биржевых данных, они мне все нужны.

Супер, это именно то, что мне нужно! Спасибо огромное!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version