数据分析案例

1、json型数据分析

import json
import pandas as pd
import numpy as np
import seaborn as sns
path=r'd:\example.txt'
with open(path) as f:
    #读取数据,并用列表推导式生成新列表
    records=[json.loads(line) for line in f]
records[0]

#过滤含有tz字段的时区数据
time_zones = [rec['tz'] for rec in records if 'tz' in rec]
time_zones[:10]

frame=pd.DataFrame(records)
#frame.info()
#统计tz字段的计数
tz_counts=frame['tz'].value_counts()
tz_counts[:10]
#fillna()替换缺失值
clean_tz=frame['tz'].fillna('Missing')
#空字符串用Unknown替换
clean_tz[clean_tz=='']='Unknown'
tz_counts=clean_tz.value_counts()
subset=tz_counts[:10]
#用seaborn创建水平柱状图
#sns.barplot(y=subset.index,x=subset.values)

#dropna()去除数据结构中值为空的数据行
results=pd.Series([x.split()[0] for x in frame.a.dropna()])

results.value_counts()
#移除没有a的数据
cframe=frame[frame.a.notnull()]
#新增1列os,np.where(condition, x, y)满足条件(condition),输出x,不满足输出y。
cframe['os']=np.where(cframe['a'].str.contains('Windows'),'Windows','Not Windows')
cframe['os'][:5]
#先按tz分组,在按os分组
by_tz_os=cframe.groupby(['tz','os'])

#size计数时包含NaN值,unpack把列变成行
agg_counts=by_tz_os.size().unstack().fillna(0)
agg_counts[:10]

#sum(1)按行求和,argsort()返回从小到大排序的索引
indexer=agg_counts.sum(1).argsort()
indexer[:10]

#截取最后10行最大值。
count_subset=agg_counts.take(indexer[-10:])
#stack把行变成列
count_subset=count_subset.stack()
count_subset.name='total'
count_subset=count_subset.reset_index()

#hue按os分类
#sns.barplot(x='total',y='tz',hue='os',data=count_subset)

#计算百分比占比
def norm_total(group):
    group['normed_total']=group.total/group.total.sum()
    return group
results=count_subset.groupby('tz').apply(norm_total)
sns.barplot(x='normed_total',y='tz',hue='os',data=results)

 

2、固定分隔符的数据分析

import pandas as pd

#设置白色表格的样式
pd.options.display.max_rows=10
unames=['user_id','gender','age','occupation','zip']
users=pd.read_table(r'D:\学习文档\利用python数据分析第二版代码\datasets\movielens\users.dat',sep='::',header=None,names=unames)
rnames=['user_id','movie_id','rating','timestamp']
ratings=pd.read_table(r'D:\学习文档\利用python数据分析第二版代码\datasets\movielens\ratings.dat',sep='::',header=None,names=rnames)
mnames=['movie_id','title','genres']
movies=pd.read_table(r'D:\学习文档\利用python数据分析第二版代码\datasets\movielens\movies.dat',sep='::',header=None,names=mnames)
#将ratings跟users和movies合并
data=pd.merge(pd.merge(ratings,users),movies)
data.iloc[0]
#按性别计算每部电影的平均分,电影title是索引,gender是列
mean_ratings=data.pivot_table('rating',index='title',columns='gender',aggfunc='mean')
mean_ratings[:5]
ratings_by_title=data.groupby('title').size()
#标题索引中含有评分数据大于250条的电影名称
active_titles=ratings_by_title.index[ratings_by_title>=250]
mean_ratings=mean_ratings.loc[active_titles]
#获取女性观众最喜欢的电影,对F列降序排列
top_female_ratings=mean_ratings.sort_values(by='F',ascending=False)
top_female_ratings[:10]
#计算评分分歧,考虑性别
mean_ratings['diff']=mean_ratings['M']-mean_ratings['F']
sorted_by_diff=mean_ratings.sort_values(by='diff')
sorted_by_diff[:10]
sorted_by_diff[::-1][:10]
#找出分歧最大的电影,不考虑性别因素
rating_std_by_title=data.groupby('title')['rating'].std()
rating_std_by_title=rating_std_by_title.loc[active_titles]
rating_std_by_title.sort_values(ascending=False)[:10]

 

posted @ 2019-12-17 14:26  最萌小胡胡  阅读(268)  评论(0编辑  收藏  举报