python数据分析学习笔记 part 1

  实在闲的无聊准备开始阅读学习《利用python进行数据分析》,决定把自己从书本上学到的知识记录下来,以便日后可以复习,同时可以供有需要的人参考,大家可以跟着对应书籍的章节来进行。

加载数据

  书中txt文件存储的文本形式的json格式的数据,我们这里来加载数据。

import json

def load_data(file_path:str):
	file = open(file_path, 'r')
	content = file.readlines()
	records = [ json.loads(data) for data in content]  # 将数据转化为一个完整的list
	return records

  上面的代码就简单完成了读取json格式文本文件的代码,应该是适用于所有读取所有文件json文本文件的过程。

数据处理(基础)

defaultdict

   对数据文件的内容进行了完整的读取以后,可以对数据进行处理了。这里假设所有的数据字典类型的,所有的数据都包含有: tz, agent等key。

   首先我们为了获得所有数据的 tz (timezone) 属性 并且对所有的 tz 属性进行计数。

def get_counts(records):
	time_zone_list = [ record['tz'] for record in records if 'tz' in record]  # 获取到所有的list
	count = {}
	for time in time_zone_list:
		if time in count:
			count[time] += 1
		else:
			count[time] = 1
	return count

   上面获取对所有 timezone 进行了计数,但是 python自带的数据类型可以帮助我们来进行这一步工作

   Python自带的数据类型( collections 中的 defaultdict )可以帮助我们轻松完整为数据计数的功能。

from collections import defaultdict
def get_counts(records):
	time_zone_list = [for record in records if 'tz' in record]
	count = defaultdict()  # 这里利用python 自带的数据类型创建一个 dict,所有的值被初始化为 0
	for time in time_zone_list:
		count[time] += 1
	return count

   上面利用 python自带的 defaultdict来书写我们的代码,会更加简洁一些。

Counter

  现在我们需要得出整个类型的计数中排名前10的timezone。同样的,我们有2种解决方案。
  同样的,我们可以首先实现一个自己利用字典的性质来对字典进行排序:

import operator
def top_counts(count_dict, n = 10):
    # 下面的代码我们用到了 operator 上面的内容,这个可以来帮助我们实现按照 字典的 value 来进行排序
	sort_result = sorted(count_dict.items(), key = operator.itemgetter(1), reverse = True)
	return sort_result[:n]

   上面的代码就是利用 sorted 函数来进行实现的算法,同时用到了 operator.itemgetter() 函数来实现进行计数。

   Python自带的数据类型( collections 中的 Counter )可以帮助我们获得排名前n的数据。

from collections import Counter
def top_counts(count_dict, n = 10):
	count = Counter(count_dict)
	return count.most_common(n)

   上面的我们利用了 Python自带的 Counter 类来进行总计数量排名 前n 位的元素。

利用Pandas进行处理

   前面讲到的都是利用Python语言本身的特性,现在我们需要利用第三方的pandas库来对整前面的数据进行处理(说的通俗一点,我个人理解位 pandas处理的数据 可以理解为 一张可以处理的Excel 表)。

DataFrame

   pandas最重要的数据结构就是一个 DataFrame, 这里我们来从原始的数组数据中,创建一个简单的pandas结构。

from pandas import DataFrame, Series
import pandas as pd
import numpy as np
def test_pandas(records):
	# records就是加载数据得到的 list
	frame = DataFrame(records) # 从最原始创建 DataFrame
	time_zone = frame['tz']  # 得到其中的一列
	print(time_zone[:10])  # 这里可以输出前10个

   上面的代码,我们可以看到 :

  1. DataFrame 是pandas中主要的数据结构,我们可以通过原始的数据来创建它,就可以对原数据进行操作
  2. frame[属性名] 用于得到 这个二维表中的一列,得到的结果是一个 Series对象。
  3. **time_zone(Series类型对象)**支持切片操作,可以对其进行切片,来取其中的操作
Series

  我们来对所有的之前数据中的 tz(timezone)来进行计数,查看出现频率最高的timezone

from pandas import DataFrame, Series
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt  # 数据可视化
def top_counts(records, n = 10):
	# 首先,我们还是要利用 records来创建 DataFrame
	frame = DataFrame(records)
	clean_tz = frame['tz'].fillna('Missing')  # 来补全缺失值
	clean_tz[clean_tz == ''] = 'Unknown'  # 通过这种方法来筛选值,并且对其进行赋值
	tz_counts = clean_tz.value_counts()  # 来对所有的统计进行计数
	tz_counts.plt(kind='barh', rot=0)  # 画图实现数据可视化
	plt.show()

  上面的代码让我们看到,我们可以学到:

  1. Series的fillna: 该方法能够填充 数据中的缺失值( fill not available) 将缺失值填充具体的值
  2. Series[ Series == 条件 ] 这样的语法能够筛选具体的值 直接在括号内填入筛选的条件就可以
  3. Series的value_counts 这样的方法能够让我们看到可以对Series中的数据进行计数,得到的结果是各个值和其对应的计数值。
  4. value_counts结果的plt函数 该方法能够对 得到的统计结果画图,前提是引入 matplotlib.pylab, 这里我试了下,引入 matplotlib.pyplot也没问题。

  另外,书中的另外数据涉及到将数据转移到数据集中有a字段,用来标识浏览器(User-Agent),下面是一段代码:

from pandas import DataFrame, Series
import numpy as np
import pandas as pd
def test(records):
	frame = DataFrame(records)
	records = Series([ x.split()[0] for x in frame.a.dropna()])  # 直接将构造出来的list 转化为Series
	print(records[5])
	print(records.value_counts()[:8])
	# 下面的代码区分开 Windows 和 非Windows任务
	frame = frame[frame.a.notnull()]  # 这个是对所有的数据进行筛选
	operating_system = np.where(frame.a.str.contains('Windows'), 'Windows', 'not Windows')
	print(operating_system[:5])

   上面的代码同时包含了很多知识点,我们可以看到

  1. Series构造方法 可以直接将list传入 Series的构造方法,就转换为 Series
  2. frame[frame.a.notnull()] 这个方法直接将筛选条件添加到 frame中,frame.a.notnull()函数得到的结果True和False
  3. np.where(condition, x, y) 函数得出的是一个简单的条件,如果满足条件,则选择 x, 如果不满足 选择y,所以上面得出的都是 ‘Windows’ 和 ‘not Windows’的集合。

   这里就先记录这么多吧,接下来的剩余内容,等我慢慢去发掘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值