«Это 23-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г."
Знания этого обзора заключаются в следующем:
- Логические массивы и фильтрация данных
- Построение многомерных массивов
- сохранить текстовый файл с помощью numpy
- рисование линейного графика matplotlib
- Как установить общие свойства диаграмм matplotlib
- сохранение графиков
Об источниках данных
После публикации последней статьи обнаружил, что забыл добавить ссылку на источник данных.После этого в область сообщений добавилась соленая рыба.Друзья,кому нужно потренироваться,могут подобрать сами.
Цель анализа
Глядя на последние данные, некоторые данные в данных имеют две категории пользователей: члены и не члены. На этот раз мы в основном анализируем сравнение среднего времени езды двух категорий пользователей.
Чтение данных и очистка данных
Согласно последней диаграмме процесса, мы в основном следуем следующим шагам:
Но в реальной работе обнаруживается, что фактические боевые данные очень чистые, и наш код чтения и очистки данных может быть объединен для достижения цели упрощения кода.
Код здесь можно упростить до:
# 数据读取,数据清洗
def data_collection():
clndata_arr_list = []
for data_filename in data_filenames:
file = os.path.join(data_path, data_filename)
data_arr = np.loadtxt(file, skiprows=1, delimiter=',', dtype=bytes).astype(str)
cln_data_arr = np.core.defchararray.replace(data_arr, '"', '')
clndata_arr_list.append(cln_data_arr)
return clndata_arr_list
В предыдущей статье был объяснен конкретный принцип реализации, и здесь он повторяться не будет.
анализ данных
Согласно цели анализа на этот раз, в дополнение к выносу первого столбцаDuration (ms)
Также выньте последний столбецMember type
.
Мы можем использовать логические массивы для фильтрации наших данных. Для конкретного использования, пожалуйста, обратитесь к следующей статье:
Давайте сначала посмотрим на завершенную часть кода:
# 数据分析
def mean_data(clndata_arr_list, member_type):
duration_mean_list = []
for cln_data in clndata_arr_list:
bool_arr = cln_data[:, -1] == member_type
filter_arr = cln_data[bool_arr]
duration_mean = np.mean(filter_arr[:, 0].astype('float')/ 1000 / 60)
duration_mean_list.append(duration_mean)
return duration_mean_list
Здесь мы переходим вmember_type
, с одним скаляромmember_type
и извлеченный векторcln_data[:, -1]
Делайте сравнения, чтобы отфильтровать нужные нам данные.
Математически нет возможности сравнивать скаляры и векторы, ведь размерности разные, но его механизм трансляции в numpy очень хорошо выполняет это требование для нас, numpy может превратить один скаляр в такое же измерение данных данных сравнения. , чтобы можно было выполнить взаимно однозначное сравнение для удовлетворения потребностей фильтрации данных с использованием логического массива.
Что касается остальных операций по извлечению среднего значения данных, то они были представлены в предыдущей статье, а затем вошли в часть визуализации данных.
Отображение результатов
Сгенерированный линейный график:
Сгенерированная CSV-таблица:
В прошлый раз сгенерированная диаграмма данных была сильно украшена. Для конкретной реализации вы можете увидеть следующий код. Конкретные атрибуты украшения отмечены в комментариях.
# 结果展示
def show_data(member_mean_duration_list, casual_mean_duration_list):
# 构造多维数组
# 使用fmt方式输出指定格式的数据格式,默认输出科学计数的格式
mean_duraion_arr = np.array([member_mean_duration_list, casual_mean_duration_list]).transpose()
np.savetxt('./mean_duration.csv', mean_duraion_arr, delimiter=',',
header='Member Mean Duraion, Casual Mean Duraion', fmt='%.4f',
comments='')
# 生成空白画布
plt.figure()
# color指定显示的折线颜色
# linestyle指定折线的样式
# marker指定节点样式
plt.plot(member_mean_duration_list, color='g', linestyle='-', marker='o', label='Member')
plt.plot(casual_mean_duration_list, color='r', linestyle='--', marker='*', label='Casual')
plt.title('Member vs Casual')
# rotation指定下标的倾斜角度
plt.xticks(range(0, 4), ['1st', '2nd', '3rd', '4th'], rotation=45)
# xlabel x,y轴的标题
plt.xlabel('Quarter')
plt.ylabel('Mean duration (min)')
plt.legend(loc='best')
plt.tight_layout()
plt.savefig('./duration_trend.png')
plt.show()
Знания этого обзора заключаются в следующем:
- Изменение формы Numpy и использование формы в реальном бою
- рисование круговой диаграммы в matplotlib
Цель анализа
Глядя на последние данные, некоторые данные в данных имеют две категории пользователей: члены и не члены. На этот раз мы в основном анализируем долю двух категорий пользователей в данных.
Чтение данных и очистка данных
Код здесь:
# 数据读取,数据清洗
def read_clean_data():
clndata_arr_list = []
for data_filename in data_filenames:
file = os.path.join(data_path, data_filename)
data_arr = np.loadtxt(file, skiprows=1, delimiter=',', dtype=bytes).astype(str)
cln_arr = np.core.defchararray.replace(data_arr[:, -1], '"', '')
cln_arr = cln_arr.reshape(-1,1)
clndata_arr_list.append(cln_arr)
year_cln_arr = np.concatenate(clndata_arr_list)
return year_cln_arr
Здесь следует отметить две вещи:
-
Поскольку данные большие, у нас нет определенного количества данных в файле данных, поэтому мы используем
numpy.reshape
когда мы можем использоватьnumpy.reshape(-1,1)
Таким образом, numpy может заменить конкретные числовые значения статистикой или-1
. -
Наша потребность в данных больше не в том, чтобы получить среднее значение времени, просто получить последний столбец данных и использовать
concatenate
Методы складываются вместе для дальнейшей обработки.
анализ данных
В соответствии с целью анализа этого времени выносим последний столбецMember type
.
На предыдущем шаге мы получили все значения.В этом разделе нам нужно только отфильтровать и подсчитать значения членов и не членов.
Давайте сначала посмотрим на завершенную часть кода:
# 数据分析
def mean_data(year_cln_arr):
member = year_cln_arr[year_cln_arr == 'Member'].shape[0]
casual = year_cln_arr[year_cln_arr == 'Casual'].shape[0]
users = [member,casual]
print(users)
return users
Опять же, здесь используетсяnumpy.shape
Получите конкретные данные классификации пользователей.
Отображение результатов
Получившаяся круговая диаграмма:
Вот код для создания круговой диаграммы:
# 结果展示
plt.figure()
plt.pie(users, labels=['Member', 'Casual'], autopct='%.2f%%', shadow=True, explode=(0.05, 0))
plt.axis('equal')
plt.tight_layout()
plt.savefig(os.path.join(output_path, './piechart.png'))
plt.show()