jupyter(python课)
目录
实例-bitly_usagov(第15周)
# 获取数据集,读取第一行数据
path= "bitly_usagov/example.txt"
open(path).readline()
.readline()
readline() 只读取文件中的一行
read() 读取整个文件,将文件放入一个字符串变量中
readlines() 读取整个文件,将文件内容自动分析成列表
# 利用JSON第三方库读取该数据集,并将JSON格式数据存入数组
import json
path= "bitly_usagov/example.txt"
# 列表推导式
records= [json.loads(line) for line in open(path)]
records[1]
json.loads()
json.dumps()和json.loads()是json格式处理函数
json.dumps()是将python数据类型列表进行接送格式的转换(相当于把列表转化成字符串)
json.loads()是将json格式转化为python数据类型列表(相当于把字符串转化为列表)
这两个函数用于json文件的读或者写
# 用列表推导式取出一组时区,注意并非所有记录都有时区字段
time_zones = [rec["tz"] for rec in records if "tz" in rec]
time_zones[:10]
从records中一行一行读取数据,判断数据是否有“tz”参数。若有就读取“tz”内容,没有就为空
# 对时区进行计数,利用基本PYTHON方法
def get_counts(sequence):
counts={}
for x in sequence:
if x in counts:
counts[x] += 1
else:
counts[x] = 1
return counts
一个计数函数,counts为字典,建议改成
counts[x]=counts.get(x,0)+1
.get(x,0)
0 为初始化是新增字符的对应数
# 利用自带基础库进行计算
from collections import defaultdict
def get_counts2(sequence):
# 所有的值均会被初始化为0
counts = defaultdict(int)
for x in sequence:
counts[x] += 1
return counts
defaultdict的用法:
https://www.jianshu.com/p/bbd258f99fd3
defaultdict 是用于当key在字典里找不到时,会赋给这个key一个均值
counts = get_counts(time_zones)
print(counts["America/New_York"])
counts = get_counts2(time_zones)
print(counts["America/New_York"])
print(len(time_zones))
使用函数获得时区计数的字典
总共有3440条数据,时区在美国、纽约的有1251条
# 得到前10位的时区和计数值
def top_counts(count_dict, n=10):
value_key_pairs = [(count, tz) for tz, count in count_dict.items()]
value_key_pairs.sort()
return value_key_pairs[-n:]
top_counts(counts)
.items()
以列表方式获得字典的(键,值)
.sort() 和 .sorted()
.sort 直接对列表内容进行排序
.sorted 返回一个新的排序后的列表(之前的列表内容不变)
详细内容 https://mp.csdn.net/mp_blog/creation/editor/118118533
# Python标准库的使用
from collections import Counter
counts = Counter(time_zones)
counts.most_common(10)
计数器类Counter
根据列表内容进行计数,获得一个类似于字典的计数器
most_common(n)函数
n为可选参数,表示数量最多的前n个元素;若n为空,则返回全部元素
返回一个列表(元素是元组)
若元素数量相同,则元素计数值,则按字母序列排序
# 利用Pandas对时区进行计数
from pandas import DataFrame, Series
import pandas as pd
import numpy as np
frame = DataFrame(records)
frame.head(5)
将records列表转化为DataFrame表格
DataFrame表格可以使用Series的value_counts来计数
# 利用Series的value_counts方法计数
tz_counts = frame["tz"].value_counts()
tz_counts[:10]
.value_counts()
.value_counts()函数通常在数据表的计数和排序中使用,它可以用来查看数据表中,指定列里有多少个不同的数据值,并计算每个不同值有在该列中的个数,同时还能根据需要进行排序。
value_counts(values,sort=True, ascending=False, normalize=False,bins=None,dropna=True)
以下均为默认
sort=True 表示进行排序
ascending=False 表示降序
normalize=False 表示不进行标准化(以比例呈现)
bins 表示分组区间
dropna=True 表示删除缺失值Nan
# 缺失数据的处理
clean_tz = frame["tz"].fillna("Missing")
clean_tz[clean_tz == ""] = "Unknown"
tz_counts = clean_tz.value_counts()
tz_counts[:10]
.fillna() 函数
.fillna()是填充函数,可以填充数据表中缺失的内容。
详细内容:https://blog.csdn.net/weixin_39549734/article/details/81221276
将数据表中为空的数据填上“Missing”,再将为空的数据填上“Unknow”,再计数
%matplotlib inline
tz_counts[:10].plot(kind='barh', rot=0)
.plot()
将数据表可视化
kind = 'line','bar','barh','kde'
分别为折线图,垂直直方图📊,水平直方图,密度图
# 浏览器类型统计
results= Series([x.split()[0] for x in frame.a.dropna()])
results[:5]
Series类型
Series可以由 Python列表、标量值、Python字典、nbarray、其他函数(range函数)构成
详细:https://blog.csdn.net/brucewong0516/article/details/79196902
.dropna()函数
清除带缺失值的行或列
axis: default 0指行,1为列
how: {‘any’, ‘all’}, default ‘any’指带缺失值的所有行;'all’指清除全是缺失值的
thresh: int,保留含有int个非空值的行
subset: 对特定的列进行缺失值删除处理
inplace: 这个很常见,True表示直接在原数据上更改
.split(str,num)函数
分隔函数
str 为分隔符(默认为所有的空字符)
num 为分割次数
# Windows用户统计,先删除无效数据
cframe = frame[frame.a.notnull()]
operating_system = np.where(cframe["a"].str.contains("Windows"),"Windows", "Not Windows")
operating_system[:5]
np.where()
https://blog.csdn.net/zs15321583801/article/details/79645685
.str.contains()
字符串的模糊筛选
# 按照时区分组,统计不用类型的用户
by_tz_os = cframe.groupby(["tz",operating_system])
agg_counts = by_tz_os.size().unstack().fillna(0)
agg_counts[:10]
.groupby()函数
分组函数
根据“tz”和“windous”分组
.size()
统计矩阵元素个数,或矩阵某一维上的元素个数的函数。
numpy.size(a, axis=None)
a:输入的矩阵
axis:int型的可选参数,指定返回哪一维的元素个数。当没有指定时,返回整个矩阵的元素个数。
.unstack()
类似于将两层行索引的第二层变成列索引
# 最常出现的时区
indexer = agg_counts.sum(1).argsort()
indexer[:10]
.sum()
相加函数
x.argsort() [n]
将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y
n默认为大于0
当n小于0,将x中的元素从大到小排列,提取其对应的index(索引),然后输出到y
# 截取最后10行
count_subset = agg_counts.take(indexer)[-10:]
count_subset
.take()
numpy.
take
(a,indices,axis = None,out = None,mode ='raise' )
沿轴取数组中的元素
如果a是一个numpy array,a.take(m,1)表示取每一行的第m个值;a.take(m,0)表示取第m行
count_subset.plot(kind='barh', stacked=True)
stacked
把直方图变成堆积直方图
默认为False
normed_subset = count_subset.div(count_subset.sum(1), axis=0)
normed_subset.plot(kind='barh',stacked=True)
.div(other,axis)
进行规格化,使各行的数和为1
other 为DataFrame或者面板
axis 决定规格化行或者列
知识点总结
数据类型
#tup为元组,元组的元素不能修改
tup = 4, 5, 6
print(tup)
#lst为列表
lst = [2, 3, 7, None]
print(lst)
#把元组列表化
lst_tup = list(tup)
print(lst_tup)
print(lst_tup[2])
#d1、empty_dict为字典
empty_dict = {}
d1 = {'a' : 'some value', 'b' : [1, 2, 3, 4]}
print(d1)
#a、b为set(不重复且无序的集合)
a = {1, 2, 3, 4, 5}
b = {3, 4, 5, 6, 7, 8}
print(a & b)
print(a | b)
#mapping为字典
some_list = ['foo', 'bar', 'baz']
mapping = {}
for i, v in enumerate(some_list):
mapping[v] = i
mapping
strings = ['a', 'as', 'bat', 'car', 'dove', 'python']
[x.upper() for x in strings if len(x) > 2]
#return 返回的多个值会成为元组
a = 2
b = 1
def add(m, n):
return m + n, m - n
print(add(a,b))
a = 2
b = 1
add=lambda x,y: x+y
print(add(a,b))
元组
https://www.runoob.com/python/python-tuples.html
列表
https://www.runoob.com/python/python-lists.html
字典
https://www.runoob.com/python/python-dictionary.html
set
https://blog.csdn.net/sinat_38682860/article/details/105223472
enumerate() 函数
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
https://www.runoob.com/python/python-func-enumerate.html
Numpy
import numpy as np
np.random.seed(100)
my_arr = np.arange(100)
print(my_arr)
data = np.random.randn(2, 3)
print(data)
print(data * 10)
print(data + data)
print(data.shape)
print(data.dtype)
#将list转化为array
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data2)
print(arr2)
arr = np.arange(10)
print(arr)
print(arr[5])
print(arr[5:8])
print(arr[-10:-1])
arr = np.empty((3, 3))
print(arr)
arr = np.zeros((4, 4))
print(arr)
arr = np.ones((2, 2))
print(arr)
np.arange(a,b,c)
返回一个排列
a 为起点,默认为0
b 为终点,必须存在
c 为步长,默认为1
np.random.randn(a,b)
https://blog.csdn.net/u012149181/article/details/78913167
np.empty()
生成一个不为空的数组,数组内容是随机的
np.zeros()
生成值为0的数组
np.ones()
生成值为1的数组
数组拼接
a=np.array([[1,2,3],[4,5,6]])
b=np.array([[11,21,31],[7,8,9]])
np.concatenate((a,b),axis=0)
np.concatenate((a,b),axis=0)
当axis=0时,将列数相同的a、b数上下组合成为一个新的数组
当axis=1时,将行数相同的a、b数左右组合成为一个新的数组
Pandas 基础
import numpy as np
import pandas as pd
#用列表生成Series
obj1 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
print(obj1)
#用字典生成Series
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
print(frame)
#用字典生成Series,并改变行列索引
frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
index=['one', 'two', 'three', 'four',
'five', 'six'])
print(frame2)
print(frame2['state'])
print(frame2.year)
print(frame2.loc['three','state'])
print(frame2.iloc[2, [2, 3]])
#使用json.loads来将json格式转化为字典格式
#df = pd.read_csv('/examples/ex1.csv', encoding='utf-8')
obj = """
{"name": "Wes",
"places_lived": ["United States", "Spain", "Germany"],
"pet": null,
"siblings": [{"name": "Scott", "age": 30, "pets": ["Zeus", "Zuko"]},
{"name": "Katie", "age": 38,
"pets": ["Sixes", "Stache", "Cisco"]}]
}
"""
import json
result = json.loads(obj)
result
Pandas 数据处理
from numpy import nan as NA
data = pd.Series([1, NA, 3.5, NA, 7])
print(data)
print(data.dropna(how='all'))
print(data.fillna(0))
Pandas 数据合并
left = pd.DataFrame([[1., 2.], [3., 4.], [5., 6.]],
index=['a', 'c', 'e'],
columns=['Ohio', 'Nevada'])
right = pd.DataFrame([[7., 8.], [9., 10.], [11., 12.], [5, 6]],
index=['b', 'c', 'd', 'e'],
columns=['Missouri', 'Alabama'])
print(left)
print(right)
pd.merge(left, right, left_on='Ohio', right_on='Missouri', how='left')
print(left.join(right))
print(pd.concat([left,right], axis=1, sort=True))
print(pd.concat([left,right], axis=0, sort=True))
.merge()
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,left_index=False, right_index=False, sort=True,suffixes=('_x', '_y'), copy=True, indicator=False,validate=None)
https://blog.csdn.net/brucewong0516/article/details/82707492
.concat()
对两个数据表进行纵向(横向)连接
axis=1 纵向
axis=0 横向
https://blog.csdn.net/weixin_39827585/article/details/111458249
Pandas 处理
import numpy as np
import pandas as pd
df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],
'key2' : ['one', 'two', 'one', 'two', 'one'],
'data1' : np.random.randn(5),
'data2' : np.random.randn(5)})
print(df)
print(df.key2.value_counts())
print(df.groupby(['key1', 'key2']).mean())
by_occupation = df.pivot_table(('data1','data2'),
index='key1',
columns='key2', aggfunc='mean')
print(by_occupation.stack(1))
aggfunc='mean'. 计算均值
.stack()
类似于将两层列索引的第二层变成行索引
plt.rcParams['font.sans-serif']=['SimHei'] #指定默认字体 SimHei为黑体
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.plot(df['data1'])
plt.plot(df['data2'])
plt.legend(loc='best')
plt.title(u'中文乱码')
plt.rcParams[""]=
https://www.cnblogs.com/shuaishuaidefeizhu/p/14035247.html
plt.legend()
建立图例
https://blog.csdn.net/weixin_41950276/article/details/84259546
plt.title()
图形标题