spark+matplotlib 数据可视化2018-05-25

from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[*]").appName("shuangyu").getOrCreate()
#读取数据,并查看前5行
sc = spark.sparkContext
f = sc.textFile("/home/shuangyu/Downloads/ccFraud.csv")
f.take(5)

['"custID","gender","state","cardholder","balance","numTrans","numIntlTrans","creditLine","fraudRisk"',
'1,1,35,1,3000,4,14,2,0',
'2,2,2,1,0,9,0,18,0',
'3,2,2,1,0,27,9,16,0',
'4,1,15,1,0,12,0,5,0']

#准备创建DataFrame
import pyspark.sql.types as typ
#获取第一行,(第一行为列名)
header = f.first()
#数据去掉头部,并转换成int
f = f.filter(lambda line:line != header).map(lambda line:[int(e) for e in  line.split(",")])
#创建schema
cols = [*[typ.StructField(h[1:-1],typ.IntegerType(),True) for h in header.split(",")]]
schema = typ.StructType(cols)
#创建dataframe
df = spark.createDataFrame(f,schema)
df.cache()
df.printSchema()

root
|-- custID: integer (nullable = true)
|-- gender: integer (nullable = true)
|-- state: integer (nullable = true)
|-- cardholder: integer (nullable = true)
|-- balance: integer (nullable = true)
|-- numTrans: integer (nullable = true)
|-- numIntlTrans: integer (nullable = true)
|-- creditLine: integer (nullable = true)
|-- fraudRisk: integer (nullable = true)

#查看数据中性别比例
df.groupBy("gender").count().show()

+------+-------+
|gender| count|
+------+-------+
| 1|6178231|
| 2|3821769|
+------+-------+

#获取指定字段的一些统计信息
df.describe("balance","numTrans","numIntlTrans").show()

+-------+-----------------+------------------+-----------------+
|summary| balance| numTrans| numIntlTrans|
+-------+-----------------+------------------+-----------------+
| count| 10000000| 10000000| 10000000|
| mean| 4109.9199193| 28.9351871| 4.0471899|
| stddev|3996.847309737258|26.553781024523122|8.602970115863904|
| min| 0| 0| 0|
| max| 41485| 100| 60|
+-------+-----------------+------------------+-----------------+

#相关性.
df.corr("balance","numTrans")

0.0004452314017265386

可视化

%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('ggplot')#样式美化
# %matplotlib inline是用来使输出图像在notebook中输出而不是单独打开一个窗口
#histogram 分桶,也就是画直方图中有多少个柱子
#返回的是一个tuple(List,List),第一个list中是x,第二个是对应的y
hist = df.select("balance").rdd.flatMap(lambda x: x).histogram(20)
print(type(hist))
hist

<class 'tuple'>

([0.0,
2074.25,
4148.5,
6222.75,
8297.0,
10371.25,
12445.5,
14519.75,
16594.0,
18668.25,
20742.5,
22816.75,
24891.0,
26965.25,
29039.5,
31113.75,
33188.0,
35262.25,
37336.5,
39410.75,
41485],
[3640021,
2258778,
1718633,
1035019,
601524,
343461,
192766,
104486,
54517,
27570,
13117,
5805,
2650,
1103,
358,
127,
45,
15,
1,
4])

#x里面有21个值,y有20个,所以x的最后一个要去掉(x轴最后是无穷区间)
data = {"bins":hist[0][:-1],"freq":hist[1]}
#width 柱子的x轴方向上的宽度,一般近似为x1-x0
plt.bar(data["bins"],data["freq"],width=2000)
plt.xlabel("X")
plt.ylabel("Y")
plt.title("Just For Test")

<matplotlib.text.Text at 0x7f48b3d6fc18>

output_10_1.png
#sampleBy根据指定字段分层抽样
sample_data = df.sampleBy('gender',{1:0.0002,2:0.0002}).select("balance","numTrans","numIntlTrans")
sample_data.take(5)

[Row(balance=4000, numTrans=71, numIntlTrans=2),
Row(balance=0, numTrans=12, numIntlTrans=0),
Row(balance=3000, numTrans=44, numIntlTrans=0),
Row(balance=6000, numTrans=20, numIntlTrans=0),
Row(balance=3000, numTrans=3, numIntlTrans=13)]

#按字段将值分开
data_multi ={elem:sample_data.select(elem).rdd.flatMap(lambda x:x).collect()\
             for elem in ["balance","numTrans","numIntlTrans"]}
#画散点图,plt.scatter(x,y)
plt.scatter(data_multi["numTrans"],data_multi["balance"],c ='r',marker='o',label="numTrans-balance")
plt.scatter(data_multi["numIntlTrans"],data_multi["balance"],c ='b',marker="x",label="numInt-balance")
plt.grid(True)#网格
plt.xlabel("x value")
plt.ylabel("y value")
plt.legend(loc='upper right')#图例的位置
plt.title("scatter view")

<matplotlib.text.Text at 0x7f48b3cdbf28>

output_12_1.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容