数据分析-练习

练习一:

数据说明:
数据是1个冷库的温度数据,1-7对应7个温度采集设备,1分钟采集一次。

数据处理目标:
用1-4对应的4个必须设备,通过建立冷库的温度场关系模型,预估出5-7对应的数据。
最后每个冷库中仅需放置4个设备,取代放置7个设备。
f(1-4) --> y(5-7)

数据处理过程:
1、原始数据中有丢帧现象,需要做预处理;
2、matplotlib 绘图;
3、建立逻辑回归模型。

无标准答案,按个人理解操作即可,请把自己的操作过程以文字形式简单描述一下,谢谢配合。

 

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

df = pd.read_excel('./测试数据.xlsx')
df.drop(labels=['none','none1'],axis=1,inplace=True)

#删除空所对应的行
df.loc[df.notnull().all(axis=1)] #or df.dropna(axis=0)

#覆盖空值
df = df.fillna(method='ffill',axis=0).fillna(method='bfill',axis=0)

#检测df的列中是否还存在空值
df.isnull().any(axis=0)
df.notnull().all(axis=0)


time    True
1       True
2       True
3       True
4       True
5       True
6       True
7       True
dtype: bool
View Code

 

练习二:

需求:

  • 导入文件,查看原始数据
  • 将人口数据和各州简称数据进行合并
  • 将合并的数据中重复的abbreviation列进行删除
  • 查看存在缺失数据的列
  • 找到有哪些state/region使得state的值为NaN,进行去重操作
  • 为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
  • 合并各州面积数据areas
  • 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行
  • 去除含有缺失数据的行
  • 找出2010年的全民人口数据
  • 计算各州的人口密度
  • 排序,并找出人口密度最高的五个州 df.sort_values()
import numpy as np
from pandas import DataFrame,Series
import pandas as pd

#导入文件,查看原始数据
abb = pd.read_csv('./data/state-abbrevs.csv')
pop = pd.read_csv('./data/state-population.csv')
area = pd.read_csv('./data/state-areas.csv')

abb.head(1)
pop.head(1)

#将人口数据和各州简称数据进行合并
abb_pop = pd.merge(abb,pop,left_on='abbreviation',right_on='state/region',how='outer')#how一定要用outer,保证数据的完整性
abb_pop.head(5)

#将合并的数据中重复的abbreviation列进行删除
abb_pop.drop(labels='abbreviation',axis=1,inplace=True)
abb_pop.head()

#查看存在缺失数据的列
abb_pop.isnull().any(axis=0)

#找到有哪些state/region使得state的值为NaN,进行去重操作
    #1.找出state列中的空值
    #2.找出空值对应的简称的值
    #3.对简称值进行去重
#1.找出state列中的空值
abb_pop['state'].isnull()
abb_pop.loc[abb_pop['state'].isnull()] #就是得到了state列中空值对应的行数据

#2.找出空值对应的简称的值
abb_pop.loc[abb_pop['state'].isnull()]['state/region']

#3.对简称值进行去重
abb_pop.loc[abb_pop['state'].isnull()]['state/region'].unique()

#为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
    #结论:只有PR和USA这两种类型的简称对应的全称为空   PUERTO RICO
            #state这一列中所有的空值可以分类两种分类,一种分类是PR简称对应的空,一种分类USA简称对应的空

#1.先将两种不同分类的空定位到
#2.给每一种分类的空进行指定形式的赋值

#1.先将两种不同分类的空定位到(定位的条件应该是PR或者USA)
#将PR所对应的行数据找出
abb_pop['state/region'] == 'PR'
abb_pop.loc[abb_pop['state/region'] == 'PR']
#PR分类的空对应的行索引
indexs = abb_pop.loc[abb_pop['state/region'] == 'PR'].index
#2.给每一种分类的空进行指定形式的赋值
abb_pop.loc[indexs,'state'] = 'PUERTO RICO'

#将USA对应的空进行覆盖
abb_pop['state/region'] == 'USA'
abb_pop.loc[abb_pop['state/region'] == 'USA']
indexs = abb_pop.loc[abb_pop['state/region'] == 'USA'].index

abb_pop.loc[indexs,'state'] = 'United States'

area.head(2)

abb_pop_area = pd.merge(abb_pop,area,how='outer')
abb_pop_area.head(2)

#我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行
abb_pop_area['area (sq. mi)'].isnull()
abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()]
abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()]
indexs = abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()].index

#去除含有缺失数据的行
abb_pop_area.drop(labels=indexs,axis=0,inplace=True)

#找出2010年的全民人口数据
df_2010 = abb_pop_area.query('year==2010 & ages=="total"')
df_2010.head()

#计算各州的人口密度
abb_pop_area['midu'] = abb_pop_area['population']/abb_pop_area['area (sq. mi)']
abb_pop_area.head()

#排序,并找出人口密度最高的五个州 df.sort_values()
abb_pop_area.sort_values(by='midu',axis=0,ascending=False)
View Code

 

练习三:美国2012年总统候选人政治献金分析

cand_nm(候选人姓名),contbr_nm(捐赠者姓名),contbr_city,contbr_st,contbr_zip,contbr_employer,contbr_occupation(捐赠者的职业),contb_receipt_amt(捐赠金额),contb_receipt_dt(捐赠日期)


方便大家操作,将月份和参选人以及所在政党进行定义:
months = {'JAN' : 1, 'FEB' : 2, 'MAR' : 3, 'APR' : 4, 'MAY' : 5, 'JUN' : 6,
'JUL' : 7, 'AUG' : 8, 'SEP' : 9, 'OCT': 10, 'NOV': 11, 'DEC' : 12}
of_interest = ['Obama, Barack', 'Romney, Mitt', 'Santorum, Rick',
'Paul, Ron', 'Gingrich, Newt']
parties = {
'Bachmann, Michelle': 'Republican',
'Romney, Mitt': 'Republican',
'Obama, Barack': 'Democrat',
"Roemer, Charles E. 'Buddy' III": 'Reform',
'Pawlenty, Timothy': 'Republican',
'Johnson, Gary Earl': 'Libertarian',
'Paul, Ron': 'Republican',
'Santorum, Rick': 'Republican',
'Cain, Herman': 'Republican',
'Gingrich, Newt': 'Republican',
'McCotter, Thaddeus G': 'Republican',
'Huntsman, Jon': 'Republican',
'Perry, Rick': 'Republican'
}
1.读取文件usa_election.txt
2.查看文件样式及基本信息
3.【知识点】使用map函数+字典,新建一列各个候选人所在党派party
4.使用np.unique()函数查看colums:party这一列中有哪些元素
5.使用value_counts()函数,统计party列中各个元素出现次数,value_counts()是Series中的,无参,返回一个带有每个元素出现次数的Series
6.【知识点】使用groupby()函数,查看各个党派收到的政治献金总数contb_receipt_amt
7.查看具体每天各个党派收到的政治献金总数contb_receipt_amt 。使用groupby([多个分组参数])
8. 将表中日期格式转换为'yyyy-mm-dd'。日期格式,通过函数加map方式进行转换
9.得到每天各政党所收政治献金数目。 考察知识点:groupby(多个字段)
11.查看老兵(捐献者职业)DISABLED VETERAN主要支持谁 :查看老兵们捐赠给谁的钱最多
13.找出各个候选人的捐赠者中,捐赠金额最大的人的职业以及捐献额 .通过query("查询条件来查找捐献人职业")

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

months = {'JAN' : 1, 'FEB' : 2, 'MAR' : 3, 'APR' : 4, 'MAY' : 5, 'JUN' : 6,
          'JUL' : 7, 'AUG' : 8, 'SEP' : 9, 'OCT': 10, 'NOV': 11, 'DEC' : 12}
of_interest = ['Obama, Barack', 'Romney, Mitt', 'Santorum, Rick', 
               'Paul, Ron', 'Gingrich, Newt']
parties = {
  'Bachmann, Michelle': 'Republican',
  'Romney, Mitt': 'Republican',
  'Obama, Barack': 'Democrat',
  "Roemer, Charles E. 'Buddy' III": 'Reform',
  'Pawlenty, Timothy': 'Republican',
  'Johnson, Gary Earl': 'Libertarian',
  'Paul, Ron': 'Republican',
  'Santorum, Rick': 'Republican',
  'Cain, Herman': 'Republican',
  'Gingrich, Newt': 'Republican',
  'McCotter, Thaddeus G': 'Republican',
  'Huntsman, Jon': 'Republican',
  'Perry, Rick': 'Republican'           
 }

df = pd.read_csv('./data/usa_election.txt')
df.head()

#【知识点】使用map函数+字典,新建一列各个候选人所在党派party
df['party'] = df['cand_nm'].map(parties)
df.head()

# 查看单独一行,是否加上了'party'一列
# 使用np.unique()函数查看colums:party这一列中有哪些元素
df['party'].unique()

# 使用value_counts()函数,统计party列中各个元素出现次数
df['party'].value_counts()

# 【知识点】使用groupby()函数,查看各个党派收到的政治献金总数contb_receipt_amt

df.groupby(by='party')['contb_receipt_amt'].sum()

# 查看具体每天各个党派收到的政治献金总数contb_receipt_amt
使用groupby([多个分组参数])

df.groupby(by=['contb_receipt_dt','party'])['contb_receipt_amt'].sum()

# 查看日期格式,并将其转换为'yyyy-mm-dd'日期格式,通过函数加map方式进行转换:months['月份简写']==》mm形式的月份
def transformDate(d):
    day,month,year = d.split('-')
    month = months[month]
    return '20'+year+'-'+str(month)+'-'+day
df['contb_receipt_dt'] = df['contb_receipt_dt'].map(transformDate)
df.head(5)

# 查看是否转换成功
# 查看老兵(捐献者职业)DISABLED VETERAN主要支持谁 :查看老兵们捐赠给谁的钱最多 考察Series索引

#将老兵对应的行数据取出
df['contbr_occupation'] == 'DISABLED VETERAN'
oldBing_df = df.loc[df['contbr_occupation'] == 'DISABLED VETERAN']

oldBing_df.groupby(by='cand_nm')['contb_receipt_amt'].sum()

#找出各个候选人的捐赠者中,捐赠金额最大的人的职业以及捐献额通过query("查询条件来查找捐献人职业")
df['contb_receipt_amt'].max()
df.query('contb_receipt_amt == 1944042.43')
max_amt = df.groupby(by='cand_nm')['contb_receipt_amt'].max()
for i in range(max_amt.size):
    max_money = max_amt[i]
    display(df.query('contb_receipt_amt == '+str(max_money)))
View Code

 

posted @ 2021-01-04 17:07  kingdoms  阅读(215)  评论(0)    收藏  举报