python編程經典例子:
1、畫愛心表白、圖形都是由一系列的點(X,Y)構成的曲線,由於X,Y滿足一定的關系,所以就可以建立模型,建立表達式expression,當滿足時,兩個for循環(for X in range;for Y in range)就會每行每列的列印。
(1)上百個python經典案例分享擴展閱讀:
Python的設計目標之一是讓代碼具備高度的可閱讀性。它設計時盡量使用其它語言經常使用的標點符號和英文單字,讓代碼看起來整潔美觀。它不像其他的靜態語言如C、Pascal那樣需要重復書寫聲明語句,也不像它們的語法那樣經常有特殊情況和意外。
Python開發者有意讓違反了縮進規則的程序不能通過編譯,以此來強制程序員養成良好的編程習慣。並且Python語言利用縮進表示語句塊的開始和退出,而非使用花括弧或者某種關鍵字。增加縮進表示語句塊的開始,而減少縮進則表示語句塊的退出,縮進成為了語法的一部分。
⑵ 114 11 個案例掌握 Python 數據可視化--美國氣候研究
自哥本哈根氣候會議之後,全球日益關注氣候變化和溫室效應等問題,並於會後建立了全球碳交易市場,分階段分批次減碳。本實驗獲取了美國 1979 - 2011 年間 NASA 等機構對美國各地日均最高氣溫、降雨量等數據,研究及可視化了氣候相關指標的變化規律及相互關系。
輸入並執行魔法命令 %matplotlib inline, 並去除圖例邊框。
數據集介紹:
本數據集特徵包括美國 49 個州(State),各州所在的地區(Region),統計年(Year),統計月(Month),平均光照(Avg Daily Sunlight),日均最大空氣溫度(Avg Daily Max Air Temperature ),日均最大熱指數(Avg Daily Max Heat Index ),日均降雨量(Avg Daily Precipitation ),日均地表溫度(Avg Day Land Surface Temperature)。
各特徵的年度區間為:
導入數據並查看前 5 行。
篩選美國各大區域的主要氣候指數,通過 sns.distplot 介面繪制指數的分布圖。
從運行結果可知:
光照能量密度(Sunlight),美國全境各地區分布趨勢大致相同,均存在較為明顯的兩個峰(強光照和弱光照)。這是因為非赤道國家受地球公轉影響,四季光照強度會呈現出一定的周期變化規律;
從地理區位能看出,東北部光照低谷明顯低於其他三個區域;
日均最高空氣溫度(Max Air Temperature),美國全境各地區表現出較大差異,東北部和中西部趨勢大致相同,氣溫平緩期較長,且包含一個顯著的尖峰;西部地區平緩期最長,全年最高溫均相對穩定;南部分布則相對更為集中;
日均地表溫度(Land Surface Temperature),與最高空氣溫度類似,不同之處在於其低溫區分布更少;
最大熱指數(Max Heat Index),西部與中西部分布較為一致,偏溫和性溫度,東北部熱指數偏高,南部偏低;
降雨量(Precipitation),西部明顯偏小,南部與東北部大致相同,中西部相對較多。
結合地理知識做一個總結:
東北部及大多數中西部地區,屬於溫帶大陸性氣候,四季分明,夏季悶熱,降雨較多。
西部屬於溫帶地中海氣候,全年氣候溫和,並且乾燥少雨,夏季氣候溫和,最高溫度相對穩定。
南部沿海一帶,終年氣候溫暖,夏季炎熱,雨水充沛。
按月計算美國各地區降雨量均值及標准偏差,以均值 ± 一倍標准偏差繪制各地區降雨量誤差線圖。
從運行結果可知:
在大多數夏季月份,西部地區降雨量遠小於其他地區;
西部地區冬季月降雨量高於夏季月;
中西部地區是較為典型的溫帶大陸性氣候,秋冬降雨逐漸減少,春夏降雨逐漸升高;
南部地區偏向海洋性氣候,全年降雨量相對平均。
需要安裝joypy包。
日均最高氣溫變化趨勢
通過 joypy 包的 joyplot 介面,可以繪制帶堆積效應的直方分布曲線,將 1980 年 - 2008 年的日均最高溫度按每隔 4 年的方式繪制其分布圖,並標注 25%、75% 分位數。
從運行結果可知:
1980 - 2008 年區間,美國全境日均最高溫度分布的低溫區正逐漸升高,同時高溫區正逐漸降低,分布更趨向於集中;
1980 - 2008 年區間,美國全境日均最高溫度的 25% 分位數和 75% 分位數有少量偏離但並不明顯。
日均降雨量變化趨勢
同樣的方式對降雨量數據進行處理並查看輸出結果。
篩選出加州和紐約州的日均降雨量數據,通過 plt.hist 介面繪制降雨量各月的分布圖。
從運行結果可知:
加州地區降雨量多集中在 0 - 1 mm 區間,很少出現大雨,相比而言,紐約州則顯得雨量充沛,日均降雨量分布在 2 - 4 mm 區間。
直方圖在堆積效應下會被覆蓋大多數細節,同時表達聚合、離散效應的箱線圖在此類問題上或許是更好的選擇。
通過 sns.boxplot 介面繪制加州和紐約州全年各月降雨量分布箱線圖.
從箱線圖上,我們可以清晰地對比每個月兩個州的降雨量分布,既可以看到集中程度,例如七月的加州降雨量集中在 0.1 - 0.5 mm 的窄區間,說明此時很少會有大雨;又可以看到離散情況,例如一月的加州,箱線圖箱子(box)部分分布較寬,且上方 10 mm 左右存在一個離散點,說明此時的加州可能偶爾地會出現大到暴雨。
視覺上更為美觀且簡約的是擺動的誤差線圖,實驗 「美國全境降雨量月度分布」 將所有類別標簽的 x 位置均放於同一處,導致誤差線高度重合。可通過調節 x 坐標位置將需要對比的序列緊湊排布。
從輸出結果可以看出,加州冬季的降雨量不確定更強,每年的的十一月至次年的三月,存在降雨量大,且降雨量存在忽多忽少的現象(誤差線長)。
上面的實驗均在研究單變數的分布,但經常性地,我們希望知道任意兩個變數的聯合分布有怎樣的特徵。
核密度估計 , 是研究此類問題的主要方式之一, sns.kdeplot 介面通過高斯核函數計算兩變數的核密度函數並以等高線的形式繪制核密度。
從運行結果可知:
加州在高溫區和低降雨期存在一個較為明顯的高密度分布區(高溫少雨的夏季);
紐約州在高溫及低溫區均存在一個高密度的分布區,且在不同溫區降雨量分布都較為均勻。
將美國全境的降雨量與空氣溫度通過 plt.hist2d 介面可視化。
從運行結果可知:
美國全境最高密度的日均高溫溫度區域和降雨量區間分別為,78 F (約等於 25 C)和 2.2 mm 左右,屬於相對舒適的生活氣候區間。
美國全境降雨量與空氣溫度的關系-核密度估計
在上面實驗基礎上,在 x, y 軸上分別通過 sns.rugplot 介面繪制核密度估計的一維分布圖,可在一張繪圖平面上同時獲取聯合分布和單變數分布的特徵。
美國全境降雨量與空氣溫度的關系-散點分布和直方分布
sns.jointplot 介面通過柵格的形式,將單變數分布用子圖的形式進行分別繪制,同時通過散點圖進行雙變數關系的展示,也是一種較好的展現數據分布的方式。
上面兩個實驗研究了雙變數分布的可視化,以下研究 3 變數聚合結果的可視化。
通過 sns.heatmap 介面可實現對透視數據的可視化,其原理是對透視結果的值賦予不同的顏色塊,以可視化其值的大小,並通過顏色條工具量化其值大小。
上面的兩個實驗可視化了各州隨年份日均最高溫度的中位數變化趨勢,從圖中並未看出有較為顯著地變化。
以下通過 t 檢驗的方式查看統計量是否有顯著性差異。stats.ttest_ind 介面可以輸出 1980 年 與 2010 年主要氣候指數的顯著性檢驗統計量及 p 值。
從運行結果可以看出:
檢驗結果拒絕了降雨量相等的原假設,即 1980 年 與 2010 年兩年間,美國降雨量是不同的,同時沒有拒絕日均日照、日均最大氣溫兩個變數相等的原假設,說明氣溫未發生顯著性變化。
⑶ 求一個PYTHON案例
# 以下程序可能要安裝OpenCV2.0(並編譯好並配置好環境)以及Xvid解碼器才能運行
# _*_coding: cp936_*_
import cv
capture = cv.CreateFileCapture("tmp.avi")
#請確保當前目錄下有tmp.avi文件
fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS)
totalFrameNumber =cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_COUNT)
frameWidth = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH)
frameHeight = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT)
print fps, totalFrameNumber, frameWidth, frameHeight
frame = cv.QueryFrame(capture)
while frame:
cv.ShowImage('Title', frame)
frame = cv.QueryFrame(capture)
if cv.WaitKey(1000 / fps) == 27:# ESC鍵退出視頻播放
cv.DestroyWindow('Title')
break
一個文件夾整理工具wxPython版本(不清楚軟體用法情況下可以打開該軟體看看界面但請不要使用裡面的功能,後果自負。)
# -*- coding: cp936 -*-
# file:aa.py
import os, shutil, sys
import wx
sourceDir = ''
sourceFiles = ''
preWord = 0
def browse(event):
global sourceDir, textPreWord, textDirName
dialog = wx.DirDialog(None, u'選擇待處理文件夾', style = wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
sourceDir = dialog.GetPath().strip('\"')
textDirName.SetLabel(sourceDir)
dialog.Destroy()
textPreWord.SetFocus()
def okRun(event):
global preWord, sourceDir, sourceFiles, textPreWord
preWord = int(textPreWord.GetValue())
if preWord <= 0:
wx.MessageBox(u'請正確輸入前綴字元個數!', u'出錯啦', style = wx.ICON_ERROR | wx.OK)
textPreWord.SetFocus()
return
sourceDir = textDirName.GetValue()
sourceFiles = os.listdir(sourceDir)
for currentFile in sourceFiles:
tmp = currentFile
currentFile = sourceDir + '\\' + currentFile
currentFile = currentFile.strip('\"')
if os.path.isdir(currentFile):
continue
targetDir = '%s\\%s'%(sourceDir, tmp[:preWord])
if not os.path.exists(targetDir):
os.mkdir(targetDir)
shutil.move(currentFile, targetDir)
wx.MessageBox(u'任務完成!', u'好消息', style = wx.ICON_ERROR | wx.OK)
def onChange(event):
global dir1, textDirName
p = dir1.GetPath()
textDirName.SetLabel(p)
app = wx.App(0)
win = wx.Frame(None, title = u'文件整理', size = (400, 450))
bg = wx.Panel(win)
btnBrowse = wx.Button(bg, label = u'瀏覽')
btnBrowse.Bind(wx.EVT_BUTTON, browse)
btnRun = wx.Button(bg, label = u'整理')
btnRun.Bind(wx.EVT_BUTTON, okRun)
dir1 = wx.GenericDirCtrl(bg, -1, dir='', style=wx.DIRCTRL_DIR_ONLY)
tree = dir1.GetTreeCtrl()
dir1.Bind(wx.wx.EVT_TREE_SEL_CHANGED, onChange, id = tree.GetId())
textPreWord = wx.TextCtrl(bg)
textDirName = wx.TextCtrl(bg)
textPreWord.SetFocus()
class MyFileDropTarget(wx.FileDropTarget):#聲明釋放到的目標
def __init__(self, window):
wx.FileDropTarget.__init__(self)
self.window = window
def OnDropFiles(self, x, y, filenames):#釋放文件處理函數數據
for name in filenames:
if not os.path.isdir(name):
wx.MessageBox(u'只能選擇文件夾!', '出錯啦', style = wx.ICON_ERROR | wx.OK)
return
self.window.SetValue(name)
dt = MyFileDropTarget(textDirName)
textDirName.SetDropTarget(dt)
hbox0 = wx.BoxSizer()
hbox0.Add(dir1, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
hbox1 = wx.BoxSizer()
hbox1.Add(textDirName, proportion = 1, flag = wx.EXPAND, border = 5)
hbox1.Add(btnBrowse, proportion = 0, flag = wx.LEFT, border = 5)
hbox2 = wx.BoxSizer()
hbox2.Add(textPreWord, proportion = 1, flag = wx.EXPAND, border = 5)
hbox2.Add(btnRun, proportion = 0, flag = wx.LEFT, border = 5)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(hbox0, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
vbox.Add(wx.StaticText(bg, -1, u'\n 選擇待處理文件夾路徑:'))
vbox.Add(hbox1, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 5)
vbox.Add(wx.StaticText(bg, -1, u'\n\n 前綴字元個數:'))
vbox.Add(hbox2, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 5)
vbox.Add(wx.StaticText(bg, -1, u'\n'))
bg.SetSizer(vbox)
win.Center()
win.Show()
app.MainLoop()
#py2exe打包代碼如下:
from distutils.core import setup
import py2exe
setup(windows=["aa.py"])
打包好了之後有18Mb。
一個文件內容批量替換摸查器(wxPython版本):
# _*_ coding:cp936 _*_
from string import join, split
import os
import wx
def getAllFiles(adir):
tmp = []
for parent, dirs, files in os.walk(adir):
for afile in files:
tmp.append(os.path.join(parent, afile))
return tmp
def browse(event):
dialog = wx.DirDialog(None, '選擇待處理文件夾', style=wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
aDir = dialog.GetPath()
textDir.SetLabel(aDir)
dialog.Destroy()
def check():
promp.SetForegroundColour('#FF0000')
promp.SetLabel(' 搜索中...')
listFound.ClearAll()
tmp = []
files = getAllFiles(textDir.GetValue())
for filename in files:
try:
afile = open(filename, 'r')
except IOError:
print '打開文件錯誤。'
continue
try:
content = afile.read().decode('utf-8')
afile.close()
except:
try:
afile = open(filename, 'r')
content = afile.read().decode('cp936')
afile.close()
except:
continue
if textNeedChar.GetValue() in content:
tmp.append(filename)
listFound.InsertStringItem(0, filename)
parentDir.SetForegroundColour('#FF0000')
# parentDir.SetLabel(' 正在搜索:'+filename)
return tmp
def onFind(event):
check()
parentDir.SetLabel(' 搜索結果:')
promp.SetLabel(' 任務完成。')
wx.MessageBox(listFound.GetItemCount() and '任務完成,找到%d個文件。' % listFound.GetItemCount()
or '未找到包含"%s"的文件!' % textNeedChar.GetValue().encode('cp936'), '查找結束',
style=wx.ICON_INFORMATION | wx.OK)
def onReplace(event):
dg = wx.TextEntryDialog(bg, '替換成:', '提示', style=wx.OK | wx.CANCEL)
if dg.ShowModal() != wx.ID_OK:
return
files = check()
userWord = dg.GetValue()
#if not userWord:
#wx.MessageBox('請輸入要替換為何字!', style=wx.ICON_ERROR | wx.OK)
#onReplace(event)
#return
for filename in files:
try:
afile = open(filename, 'r')
except IOError:
print '打開文件錯誤。'
continue
try:
content = afile.read().decode('utf-8')
afile.close()
except:
try:
afile = open(filename, 'r')
content = afile.read().decode('cp936')
afile.close()
except IOError:
print '打開文件錯誤。'
continue
content = content.replace(textNeedChar.GetValue(), userWord)
try:
content = content.encode('utf-8')
except:
pass
open(filename, 'w').write(content)
parentDir.SetLabel(' 替換的文件:')
promp.SetLabel(' 任務完成。')
wx.MessageBox(listFound.GetItemCount() and '任務完成,替換了%d個文件。' % listFound.GetItemCount()
or '未找到包含"%s"的文件!' % textNeedChar.GetValue().encode('cp936'), '替換結束', style=wx.ICON_INFORMATION | wx.OK)
app = wx.App(0)
win = wx.Frame(None, title='文件整理', size=(400, 450))
bg = wx.Panel(win)
btnBrowse = wx.Button(bg, label='瀏覽')
btnBrowse.Bind(wx.EVT_BUTTON, browse)
btnFind = wx.Button(bg, label='查找')
btnFind.Bind(wx.EVT_BUTTON, onFind)
btnFind.SetDefault()
btnReplace = wx.Button(bg, label='替換')
btnReplace.Bind(wx.EVT_BUTTON, onReplace)
textNeedChar = wx.TextCtrl(bg, value='你好')
textDir = wx.TextCtrl(bg, value='E:\Workspace\Python\Python\e')
parentDir = wx.StaticText(bg)
promp = wx.StaticText(bg)
listFound = wx.ListCtrl(bg, style=wx.VERTICAL)
class MyFileDropTarget(wx.FileDropTarget):#聲明釋放到的目標
def __init__(self, window):
wx.FileDropTarget.__init__(self)
self.window = window
def OnDropFiles(self, x, y, filenames):#釋放文件處理函數數據
for name in filenames:
'''if not os.path.isdir(name):
wx.MessageBox('只能選擇文件夾!', '出錯啦', style=wx.ICON_ERROR | wx.OK)
return '''
self.window.SetValue(name)
dt = MyFileDropTarget(textDir)
textDir.SetDropTarget(dt)
hbox1 = wx.BoxSizer()
hbox1.Add(textDir, proportion=1, flag=wx.EXPAND, border=5)
hbox1.Add(btnBrowse, proportion=0, flag=wx.LEFT, border=5)
hbox2 = wx.BoxSizer()
hbox2.Add(textNeedChar, proportion=1, flag=wx.EXPAND, border=5)
hbox2.Add(btnFind, proportion=0, flag=wx.LEFT, border=5)
hbox2.Add(btnReplace, proportion=0, flag=wx.LEFT, border=5)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(wx.StaticText(bg, -1, '\n 選擇待處理文件夾(可拖動文件夾到下面區域中):'))
vbox.Add(hbox1, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(wx.StaticText(bg, -1, '\n\n 要替換 / 查找的文字:'))
vbox.Add(hbox2, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(promp, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(parentDir, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vbox.Add(listFound, proportion=1,
flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT, border=5)
bg.SetSizer(vbox)
win.Center()
win.Show()
app.MainLoop()
⑷ 《利用Python進行數據分析》——案例1從Bitly獲取數據
這個案例主要目的是轉換json類型的數據,利用python和pandas方法進行計數。
step1:獲取數據
將json格式數據轉化成python對象
step2純python時區計數
1.獲取時區+計數
2.對以上字典形式進行計數
3.更更簡單的方法,直接用python標准庫的collections.Counters類
從僅獲取時區後開始
step3 使用pandas計數
step4 可視化 seaborn
5.補充一些語句
⑸ python軟體開發的案例有哪些,可用於哪些開發
列舉一些比較有名的網站或應用。這其中有一些是用python進行開發,有一些在部分業務或功能上使用到了python,還有的是支持python作為擴展腳本語言。數據大部分來自Wikepedia和Quora。
Reddit - 社交分享網站,最早用Lisp開發,在2005年轉為python
Dropbox - 文件分享服務
豆瓣網 - 圖書、唱片、電影等文化產品的資料資料庫網站
Django - 鼓勵快速開發的Web應用框架
Fabric - 用於管理成百上千台Linux主機的程序庫
EVE - 網路游戲EVE大量使用Python進行開發
Blender - 以C與Python開發的開源3D繪圖軟體
BitTorrent - bt下載軟體客戶端
Ubuntu Software Center - Ubuntu 9.10版本後自帶的圖形化包管理器
YUM - 用於RPM兼容的Linux系統上的包管理器
Civilization IV - 游戲《文明4》
Battlefield 2 - 游戲《戰地2》
Google - 谷歌在很多項目中用python作為網路應用的後端,如Google Groups、Gmail、Google Maps等,Google App Engine支持python作為開發語言
NASA - 美國宇航局,從1994年起把python作為主要開發語言
Instrial Light & Magic - 工業光魔,喬治·盧卡斯創立的電影特效公司
Yahoo! Groups - 雅虎推出的群組交流平台
YouTube - 視頻分享網站,在某些功能上使用到python
Cinema 4D - 一套整合3D模型、動畫與繪圖的高級三維繪圖軟體,以其高速的運算和強大的渲染插件著稱
Autodesk Maya - 3D建模軟體,支持python作為腳本語言
gedit - Linux平台的文本編輯器
GIMP - Linux平台的圖像處理軟體
Minecraft: Pi Edition - 游戲《Minecraft》的樹莓派版本
MySQL Workbench - 可視化資料庫管理工具
Digg - 社交新聞分享網站
Mozilla - 為支持和領導開源的Mozilla項目而設立的一個非營利組織
Quora - 社交問答網站
Path - 私密社交應用
Pinterest - 圖片社交分享網站
SlideShare - 幻燈片存儲、展示、分享的網站
Yelp - 美國商戶點評網站
Slide - 社交遊戲/應用開發公司,被谷歌收購
⑹ 標普100案例分析 —— 帶著Python玩金融(5)
本文將帶著你使用Python對標普100數據進行簡單的分析,你會學到:
標准普爾100指數 用來衡量大公司的股票表現,它由多個行業的100家主要公司構成。2017年標普100在各行業的比例如下圖所示。
本文將要分析的數據如下表所示,它由四列數據構成,分別是公司名(Name),行業(Sector),股價(Price)和每股盈餘(EPS)。
我們將這四列數據分別存儲在四個Python列表中。
先來用切片的方法觀察下數據。比如查看前四家公司的名稱。
或者輸出最後一家公司的所有信息。
市盈率 (Price to Earnings ratio),也稱股價收益比率,由股價除以每年度每股盈餘(EPS)得到,它是用來衡量股價水平是否合理的指標之一。
為了方便計算市盈率,我們首先將數據從Python列表類型轉換為NumPy數組。
NumPy數組的優勢是它可以直接對數組進行運算,而這一點Python列表是做不到的。比如計算市盈率 pe ,我們可以直接將數組 prices 除以數組 earnings 。
接下來我們就具體行業來進行分析,比如對於IT行業,我們首先需要篩選出哪些公司屬於這一行業。
用同樣的方法,篩選出必需消費品行業的公司和市盈率。
篩選出IT和必需消費品行業的數據後,我們來計算這兩個行業市盈率的均值和標准差。
首先用散點圖來觀察這兩個行業中每一家公司的市盈率。這里使用Python中常用的繪圖工具包 matplotlib 。
我們注意到,上圖的右上角有一IT公司的市盈率特別高。若某股票的市盈率高於同類股票,往往意味著該股有較高的增長預期。所以讓我們進一步來觀察IT行業的市盈率分布,在這里直方圖可以用來查看數據的分布情況。
現在可以更直觀的看到在直方圖的右側有一離群值,它具有很高的市盈率。我們可以使用布爾索引找到這家市盈率很高的公司。
註:本文是 DataCamp 課程 Intro to Python for Finance 的學習筆記。
⑺ 121 11 個案例掌握 Python 數據可視化--星際探索
星空是無數人夢寐以求想了解的一個領域,遠古的人們通過肉眼觀察星空,並制定了太陰歷,指導農業發展。隨著現代科技發展,有了更先進的設備進行星空的探索。本實驗獲取了美國國家航空航天局(NASA)官網發布的地外行星數據,研究及可視化了地外行星各參數、尋找到了一顆類地行星並研究了天體參數的相關關系。
輸入並執行魔法命令 %matplotlib inline, 設置全局字型大小,去除圖例邊框,去除右側和頂部坐標軸。
本數據集來自 NASA,行星發現是 NASA 的重要工作之一,本數據集搜集了 NASA 官網發布的 4296 顆行星的數據,本數據集欄位包括:
導入數據並查看前 5 行。
截至 2020 年 10 月 22 日 全球共發現 4296 顆行星,按年聚合並繪制年度行星發現數,並在左上角繪制 NASA 的官方 LOGO 。
從運行結果可以看出,2005 年以前全球行星發現數是非常少的,經計算總計 173 顆,2014 和 2016 是行星發現成果最多的年份,2016 年度發現行星 1505 顆。
對不同機構/項目/計劃進行聚合並降序排列,繪制發現行星數目的前 20 。
2009 年至 2013 年,開普勒太空望遠鏡成為有史以來最成功的系外行星發現者。在一片天空中至少找到了 1030 顆系外行星以及超過 4600 顆疑似行星。當機械故障剝奪了該探測器對於恆星的精確定位功能後,地球上的工程師們於 2014 年對其進行了徹底改造,並以 K2 計劃命名,後者將在更短的時間內搜尋宇宙的另一片區域。
對發現行星的方式進行聚合並降序排列,繪制各種方法發現行星的比例,由於排名靠後的幾種方式發現行星數較少,因此不顯示其標簽。
行星在宇宙中並不會發光,因此無法直接觀察,行星發現的方式多為間接方式。從輸出結果可以看出,發現行星主要有以下 3 種方式,其原理如下:
針對不同的行星質量,繪制比其質量大(或者小)的行星比例,由於行星質量量綱分布跨度較大,因此採用對數坐標。
從輸出結果可以看出,在已發現的行星中,96.25% 行星的質量大於地球。(圖中橫坐標小於 e 的紅色面積非常小)
通過 sns.distplot 介面繪制全部行星的質量分布圖。
從輸出結果可以看出,所有行星質量分布呈雙峰分布,第一個峰在 1.8 左右(此處用了對數單位,表示大約 6 個地球質量),第二個峰在 6.2 左右(大概 493 個地球質量)。
針對不同發現方式發現的行星,繪制各行星的公轉周期和質量的關系。
從輸出結果可以看出:徑向速度(Radial Velocity)方法發現的行星在公轉周期和質量上分布更寬,而凌日(Transit)似乎只能發現公轉周期相對較短的行星,這是因為兩種方法的原理差異造成的。對於公轉周期很長的行星,其運行到恆星和觀察者之間的時間也較長,因此凌日發現此類行星會相對較少。而徑向速度與其說是在發現行星,不如說是在觀察恆星,由於恆星自身發光,因此其觀察機會更多,發現各類行星的可能性更大。
針對不同發現方式發現的行星,繪制各行星的距離和質量的關系。
從輸出結果可以看出,凌日和徑向速度對距離較為敏感,遠距離的行星大多是通過凌日發現的,而近距離的行星大多數通過徑向速度發現的。原因是:近距離的行星其引力對恆星造成的擺動更為明顯,因此更容易觀察;當距離較遠時,引力作用變弱,擺動效應減弱,因此很難藉助此方法觀察到行星。同時,可以觀察到當行星質量更大時,其距離分布相對較寬,這是因為雖然相對恆星的距離變長了,但是由於行星質量的增加,相對引力也同步增加,恆星擺動效應會變得明顯。
將所有行星的質量和半徑對數化處理,繪制其分布並擬合其分布。
由於:
因此,從原理上質量對數與半徑對數應該是線性關系,且斜率為定值 3 ,截距的大小與密度相關。
從輸出結果可以看出:行星質量和行星半徑在對數變換下,具有較好的線性關系。輸出 fix_xy 數值可知,其關系可以擬合出如下公式:
擬合出曲線對應的行星平均密度為:
同樣的方式繪制恆星質量與半徑的關系。
從輸出結果可以看出,恆星與行星的規律不同,其質量與半徑在對數下呈二次曲線關系,其關系符合以下公式:
同樣的方式研究恆星表面重力加速度與半徑的關系。
從輸出結果可以看出,恆星表面對數重力加速度與其對數半徑呈現較好的線性關系:
以上我們分別探索了各變數的分布和部分變數的相關關系,當數據較多時,可以通過 pd.plotting.scatter_matrix 介面,直接繪制各變數的分布和任意兩個變數的散點圖分布,對於數據的初步探索,該介面可以讓我們迅速對數據全貌有較為清晰的認識。
通過行星的半徑和質量,恆星的半徑和質量,以及行星的公轉周期等指標與地球的相似性,尋找諸多行星中最類似地球的行星。
從輸出結果可以看出,在 0.6 附近的位置出現了一個最大的圓圈,那就是我們找到的類地行星 Kepler - 452 b ,讓我們了解一下這顆行星:
數據顯示,Kepler - 452 b 行星公轉周期為 384.84 天,半徑為 1.63 地球半徑,質量為 3.29 地球質量;它的恆星為 Kepler - 452 半徑為太陽的 1.11 倍,質量為 1.04 倍,恆星方面數據與太陽相似度極高。
以下內容來自網路。 開普勒452b(Kepler 452b) ,是美國國家航空航天局(NASA)發現的外行星, 直徑是地球的 1.6 倍,地球相似指數( ESI )為 0.83,距離地球1400光年,位於為天鵝座。
2015 年 7 月 24 日 0:00,美國國家航空航天局 NASA 舉辦媒體電話會議宣稱,他們在天鵝座發現了一顆與地球相似指數達到 0.98 的類地行星開普勒 - 452 b。這個類地行星距離地球 1400 光年,繞著一顆與太陽非常相似的恆星運行。開普勒 452 b 到恆星的距離,跟地球到太陽的距離相同。NASA 稱,由於缺乏關鍵數據,現在不能說 Kepler - 452 b 究竟是不是「另外一個地球」,只能說它是「迄今最接近另外一個地球」的系外行星。
在銀河系經緯度坐標下繪制所有行星,並標記地球和 Kepler - 452 b 行星的位置。
類地行星,是人類寄希望移民的第二故鄉,但即使最近的 Kepler-452 b ,也與地球相聚 1400 光年。
以下通過行星的公轉周期和質量兩個特徵將所有行星聚為兩類,即通過訓練獲得兩個簇心。
定義函數-計算距離
聚類距離採用歐式距離:
定義函數-訓練簇心
訓練簇心的原理是:根據上一次的簇心計算所有點與所有簇心的距離,任一點的分類以其距離最近的簇心確定。依此原理計算出所有點的分類後,對每個分類計算新的簇心。
定義函數預測分類
根據訓練得到的簇心,預測輸入新的數據特徵的分類。
開始訓練
隨機生成一個簇心,並訓練 15 次。
繪制聚類結果
以最後一次訓練得到的簇心為基礎,進行行星的分類,並以等高面的形式繪制各類的邊界。
從運行結果可以看出,所有行星被分成了兩類。並通過上三角和下三角標注了每個類別的簇心位置。
聚類前
以下輸出了聚類前原始數據繪制的圖像。
⑻ python適合做哪些營銷類案例
案例場景:每個銷售型公司都有一定的促銷費用,促銷費用可以帶來銷售量的顯著提升;當給出一定的促銷費用時,預計會帶來多大的商品銷售量?
在「附件-chapter1」中data.txt存儲了建模所需的原始數據,get_started_example.py是案例完整代碼。以下是原始數據概況:
來源:生成的模擬數據,非真實數據
用途:用來做第一個銷售預測案例
維度數量:1
記錄數:100
欄位變數:第一列是促銷費用,第二列是商品銷售量
數據類型:全部是浮點數值型
是否有缺失值:否
*回答來源鏈接:https://zhuanlan.hu.com/p/33618571
以上就是《python適合做哪些營銷類案例》的全部內容,感謝閱讀,希望對你有幫助!
⑼ #抬抬小手學Python# Python 之作用域下的 global 和 nonlocal 關鍵字
該部分內容涉及 Python 變數作用域相關知識,變數作用域指的是變數的有效作用范圍,直接理解就是 Python 中的變數不是任意位置都可以訪問的,有限制條件。
一般情況下變數的作用域變化范圍是 塊級、函數、類、模塊、包等,級別是從小到達。Python 中是沒有塊級作用域的,所以我們在寫代碼的時候,下面的代碼是正確的。
在 Python 中常見的塊級作用域有 if 語句、for 語句、while 語句、with 上下文語句。
上文已經提及了作用域是 Python 程序可以直接訪問一個變數的作用范圍,Python 的作用域一共有 4 種,分別如下:
一個比較經典的案例如下:
在 Python 中變數尋找的順序是從內到外,先局部,然後外部,在全局,在內建,這種規則叫做 LEGB 規則 。
增加以下學習的趣味性,你可以研究下述代碼中變數是如何變化的。
定義在 函數內部 的變數擁有一個局部作用域,定義在 函數外部 的變數擁有全局作用域。
輸出結果,函數內部是 123 ,函數外部依舊是 0 。
如果希望函數內部(內部作用域)可以修改外部作用域的變數,需要使用 global 關鍵字。
此時輸出的就都是 123 了,還有一點需要注意,在函數內容如果希望修改全局變數的值, global 關鍵字一定要寫在變數操作前。
該代碼會出現語法錯誤:
全局變數還存在一個面試真題,經常出現,請問下述代碼運行結果。
如果要修改嵌套作用域(Enclosing 作用域)中的變數,需要 nonlocal 關鍵字,測試代碼如下:
輸出結果自行測試,注意 nonlocal 關鍵字必須是 Python3.X+版本,Python 2.X 版本會出現語法錯誤:
在多重嵌套中, nonlocal 只會上溯一層,如果上一層沒有,則會繼續上溯,下述代碼你可以分別注釋查看結果。
局部變數和全局變數具體有哪些,可以通過 locals() 和 globals() 兩個內置函數獲取。
本篇博客為大家說明了 Python 的作用域,並且對 global 和 nonlocal 關鍵字進行了學習,希望對你有所幫助。