Для ввода и хранения данных я бы использовал реляционную базу данных (например, sqlite, MySQL или Postgresql).Если вы делаете это таким образом, вы можете легко написать несколько программ, которые анализируют данные по-разному.Доступ к самой базе данных sqlite возможен из различных языков программирования, интерфейсов GUI / CLI.Ваши данные останутся независимыми от языка (в отличие от хранения пустых массивов).
Python имеет встроенную поддержку sqlite .
SQL предоставляет удобный, читаемый язык для нарезки и нарезания кубиков ваших данных (например, «Каковы все оценки за назначение 1 из класса 1? Дайте список из 10 самых высоких оценок. У кого были эти оценки?выше среднего, чем для class2?) Таблицы базы данных могут вместить несколько классов, несколько семестров.
Для ввода данных может быть наиболее удобным графический интерфейс. Для sqlite есть sqlitebrowser (у меня не так многоХотя здесь есть опыт; могут быть даже лучшие варианты.). Для MySQL мне нравится phpmyadmin, а для Postgresql - phppgadmin.
После ввода данных вы можете использовать модуль Python (например, sqlite3, MySQLdb,pyscopg2) для доступа к базе данных и выдачи SQL-запросов. Затем данные могут быть переданы в список или массив numpy. Затем можно использовать numpy для вычисления статистики.
PS. Для небольших наборов данных действительно нет проблемотносительно скорости или объема памяти. Вам не нужно хранить данные в массиве Numpy только для вызова NUMPСтатистические функции y / scipy.
Вы можете, например, вытянуть данные из базы данных в список Python и передать список Python в функцию numpy:
sql='SELECT * FROM grades WHERE assignment=%s'
args=['assign1']
data=cursor.fetchall(sql,args)
scores=zip(*data)[0]
ave_score=np.mean(scores)
Если оценки - это простой структурный массив, вы никогда не сможете получить доступ к значениям следующим образом:
grades['123456']['assign 2']
, поскольку столбцы доступны по имени, а строки - целые числа.
Я не думаю, что это создает большие препятствия.И вот почему: все, что вы хотите сделать для одного студента (например, найти сумму всех баллов назначения), вы, вероятно, захотите сделать для каждого студента.
Так что трюк с numpy- способ использовать его мощность - это писать векторизованные уравнения или использовать простые функции, которые применяются ко всем строкам одновременно, вместо того, чтобы циклически проходить по строкам по отдельности.Вместо того, чтобы думать в индивидуальном масштабе (например, отдельные студенты, индивидуальные задания), NumPy побуждает вас думать в более широком масштабе (например, все студенты, все задания) и выполнять вычисления, которыепримените ко всем из них одновременно.
Как вы уже видели, когда вы спорили с представлениями, на самом деле вам лучше не использовать структурированный массив, а вместо этого выбрать простой 2-осевой массив Numpy:
Давайте представим, что столбцы представляют (2) задания, а строки представляют (4) учащихся.
In [36]: grades=np.random.random((4,2))
In [37]: grades
Out[37]:
array([[ 0.42951657, 0.81696305],
[ 0.2298493 , 0.05389136],
[ 0.12036423, 0.78142328],
[ 0.5029192 , 0.75186565]])
Вот некоторые статистические данные:
In [38]: sum_of_all_assignments = grades.sum(axis=1)
In [39]: sum_of_all_assignments
Out[39]: array([ 1.24647962, 0.28374066, 0.90178752, 1.25478485])
In [40]: average_of_all_assignments = grades.mean(axis=1)
In [41]: average_of_all_assignments
Out[41]: array([ 0.62323981, 0.14187033, 0.45089376, 0.62739242])
In [42]: average_assignment_score = grades.mean(axis=0)
In [43]: average_assignment_score
Out[43]: array([ 0.32066233, 0.60103583])
Теперь предположим, что это именаучеников:
In [44]: student_names=['harold','harry','herb','humphrey']
Чтобы сопоставить имена учеников с их средним баллом, вы можете создать dict
In [45]: dict(zip(student_names,average_of_all_assignments))
Out[45]:
{'harold': 0.62323981076528523,
'harry': 0.14187032892653173,
'herb': 0.45089375919011698,
'humphrey': 0.62739242488169067}
И аналогично для заданий:
In [46]: assignment_names=['assign 1','assign 2']
In [47]: dict(zip(assignment_names,average_assignment_score))
Out[47]: {'assign 1': 0.32066232713749887, 'assign 2': 0.60103583474431344}