Python實現數據可視化(餅狀圖,柱狀圖)

emmm…
今天看到好友轉發的消息p1,講了一個擲骰子的遊戲p2,然後算了一下發現期望是3.1左右,好像要比每次支付的2.99元要多?
在這裏插入圖片描述
感覺這個用編程來解正好[旺柴]正好最近在看python就索性拿來當成一個練手的小項目[吃瓜]
在這裏插入圖片描述
問題:計算期望
思路:不想按照擲骰子的概率去算…所以直接用隨機數生成器進行n次獨立實驗的模擬,然後把頻率當成概率計算期望,當然關鍵還是數據可視化
p3進行n次模擬,這裏取的一千萬次1e8, 本來想取一億次模擬但是python太慢了[捂臉]將每次獲獎類型保存在prize列表裏,存入.csv文件
p4p5p6讀取文件畫餅狀圖,這裏坑了我好幾次,最後還是統計出像樣的數據和圖來了(p7

Wechar_Game.py
import random
import numpy as np
payment = 2.99 # 每次支付
prize=[] # 儲存每次獲獎情況
n=10000000 #n次實驗
lucky_num=np.random.randint(1,7,n) # 第一次擲色子,幸運數字
get_num=np.random.randint(1,7,n) # 第二次擲色子,中獎數字
for i in range(0,n): # 遍歷列表
    if lucky_num[i]==1:
        prize.append(0) # 0.88元
    elif lucky_num[i]==2 and get_num[i]!=6:
        prize.append(1) # 1.88元
    elif lucky_num[i]==3 and get_num[i]!=5 and get_num[i]!=6:
        prize.append(2) # 3.88元
    elif lucky_num[i]==4 and(get_num[i]==1 or get_num[i]==2 or get_num[i]==3):
        prize.append(3) # 8.88元
    elif lucky_num[i]==5 and (get_num[i]==1 or get_num[i]==2):
        prize.append(4) # 12.88元
    elif lucky_num[i]==6 and get_num[i]==1:
        prize.append(5) #28.88元
    else:
        prize.append(6) # 未中獎
#print("%f %f" %(prize/n,payment))
np.savetxt('prizes.csv', prize) # 存儲到csv
Graph.py
import csv
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

def read_prizes():
    # 讀取文件
    pr = pd.read_csv("prizes.csv")
    prizes=[]
    # 設置中文
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    #設置變量
    none=0 # 未中獎
    six=0 # 0.88
    five=0 # 1.88
    four=0 # 3.88
    three=0 # 8.88
    two=0 # 12.88
    one=0 # 28.88
    for num in pr.iloc[:,0]: # 遍歷第一列所有數據
        # 將str 轉化成 float
        if float(num) == 0:
            six+=1
        elif float(num)==1:
            five+=1
        elif float(num)==2:
            four+=1
        elif float(num)==3:
            three+=1
        elif float(num)==4:
            two+=1
        elif float(num)==5:
            one+=1
        elif float(num)==6:
            none+=1
    #圖標
    labels = ['謝謝惠顧','0.88安慰獎', '1.88鼓勵獎', '3.88理財獎','8.88驚爆獎','12.88特等獎','28.88感恩大回饋']
    # 對應變量
    values = [none,six,five,four,three,two,one]
    # 角度
    explode=[0,0.1,0,0,0,0]
    # 圖例顏色
    colors = ['gray','y', 'm', 'b','g','r','c']
    # 圖標題目
    plt.title("搏一搏 單車變摩托(1e8)", fontsize=25)
    # 各項屬性
    plt.pie(values, labels=labels, colors=colors, startangle=180, shadow=True, autopct='%1.6f%%')
    plt.axis('equal')
    # 保存圖片
    plt.savefig('E:\\Documents\\千萬.png')
    # 顯示圖片
    plt.show()

if __name__ =="__main__":
    read_prizes()


分析一下:千萬次獨立重複實驗後把頻率看成概率,期望計算結果p8,發現和最初3.1左右差別不大,一定比2.99大。所以真的重複那麼多次很可能賺錢[捂臉]但是單次不回本的概率可以達到0.72219269!也就是大約72%!

總結一下遇到的坑:

  1. 忘記了不中獎這一種情況……
  2. 忽略了python區間(a,b)取前不取後的特性……
  3. csv格式保存文件是科學計數法保存成字符轉的類型,想要使用還需要轉化成數字進行計算
  4. pandas裏, pr = pd.read_csv(’.csv’) ,pr是一個數據的矩陣,如何使用。
    方法歸類:
data = pd.read_csv(self.path)
print(data)
print(data.describe())
print(data.head(5))   #前5行
print(data.iloc[0,:])  #第一行所有數據
print(data.iloc[[1,3,4],:])  #第2 4 6行
print(data.iloc[:,:]) #所有航所有列
print(data.loc[:,'cid'])
for index,row in data.iterrows():
    print(row['cid'],row['name'],type(row['cid']),type(row['name']))	
  1. 畫圖
    直方圖用到的:
    https://www.cnblogs.com/Pythonmiss/p/10642589.html
    直方圖擬合正態分佈曲線:
    https://blog.csdn.net/jiangjiang_jian/article/details/80664709
發佈了57 篇原創文章 · 獲贊 3 · 訪問量 2909
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章