2016-11-20 1 views
1

Я пытаюсь сделать некоторый анализ данных на Pythonista 3 (приложение iOS для python), однако из-за библиотек C pandas он не компилируется на устройстве iOS.Как фильтровать CSV-файл без Pandas? (Лучший заменитель для Pandas в Pythonista)

Есть ли какая-либо замена для Панд? Будет ли numpy быть опцией для данных типа string?

Набор данных у меня есть на данный момент является история сообщений между моими друзьями и I.

Вся история в одном из CSV-файла. Каждая строка имеет столбцы «day_of_the_week», «date», «time_of_message», «author_of_message», «message_body»

Целью анализа является подготовка отчета о нашем чате за последний год.

Я хочу иметь возможность подсчитывать количество сообщений, отправленных каждым другом. Я хочу, чтобы иметь возможность построить гистограмму часов, в которых сообщения, отправленные каждым другом. Затем я хочу сделать подсчет слов по отдельности и в качестве группы.

В Пандах я знаю, как это сделать. Например:

df = read_csv("messages.csv") 
number_of_messages_friend1 = len(df[df.author_of_message == 'friend1'] 

Как фильтровать файл csv без Pandas?

+0

Я не знаю точных ограничений для Pythonista, но у numpy есть аналогичные требования к пандам - ​​так что это вряд ли сработает, если у панд нет. Добавление некоторых подробностей о том, что вы хотите сделать, может помочь дать более подходящие результаты –

+0

Я тоже думал о numpy и Pandas. Но это то, что предлагает pythonista.Я думаю, разработчик приложения скомпилировал numpy в python, чтобы включить этот пакет. Во всяком случае, я отредактировал вопрос, чтобы сделать мою проблему более ясной. – zeh

+0

Если numpy не работает, вы можете использовать стандартные инструменты библиотеки для чтения csv в списки «records» (namedtuple может быть вашим другом здесь), но это потребует много циклов for-loop, когда вы хотите запросить вещи. Я не знаю, может ли облегчить dbms как sqlite. –

ответ

0

Используйте модуль csv из стандартной библиотеки, чтобы читать сообщения. Вы можете сохранить его в списке collections.namedtuple для удобства доступа.

import csv 

messages = [] 
with open('messages.csv') as csvfile: 
    reader = csv.DictReader(csvfile, fieldnames=('day_of_the_week', 'date', 'time_of_message', 'author_of_message', 'message_body')) 
    for row in reader: 
     messages.append(row) 

Это дает вам все сообщения в виде списка словарей.

В качестве альтернативы вы можете использовать обычный считыватель csv в сочетании с collections.namedtuple, чтобы создать список именованных кортежей, которые немного легче получить.

import csv 
from collections import namedtuple 

Msg = namedtuple('Msg', ('day_of_the_week', 'date', 'time_of_message', 'author_of_message', 'message_body')) 

messages = [] 
with open('messages.csv') as csvfile: 
    msgreader = csv.reader(csvfile) 
    for row in msgreader: 
     messages.append(Msg(*row)) 
2

Поскольку Pythonista имеет NumPy, вы хотите посмотреть на recarrays, которые подход Numpy к такого рода проблемы. Ниже работал из коробки в Pythonista для меня:

import numpy as np 
df=np.recfromcsv('messages.csv') 
len(df[df.author_of_message==b'friend1']) 

В зависимости от формата данных, тоу может обнаружить, что recsfromcsv «просто работает», так как он пытается угадать типы данных, или вам может потребоваться настроить вещи немного. См. genfromtext для ряда параметров, таких как явное определение типов данных или использование преобразователей для преобразования строковых дат в объекты datetime. recsfromcsv просто convienece обертка genfromtext

https://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html#

Однажды в recarray, многие из простых операций индексирования работают так же, как и в панде. Обратите внимание, что вам может потребоваться выполнить сравнение строк с использованием префиксных строк (байтовых объектов), если вы не конвертируете в строки unicode, как показано выше.