Практика анализа данных Numpy (2)

NumPy

«Это 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()