大家好,我是Python数据分析师,希望与大家分享我在数据分析领域的经验和心得。为此,我编写了一套名为“人工智能四部曲”的教程:《15天学会Python编程》、《每天10分钟,用Python学数据分析》、《Python数据可视化实战》、《33天搞定机器学习》。欢迎订阅,每个专栏都配有相应的数据集和代码示例,请通过私信联系我获取更多信息。
SciPy是一个强大的工具,对于新手来说,可能难以掌握其所有功能。因此,本章介绍数据分析工作中常用的SciPy模块和方法,并通过一个实际案例——拟合新型肺炎全国疫情曲线,来巩固所学知识。
SciPy是一个面向Python的开源科学计算库,广泛应用于数学、科学和工程领域。它可以解决插值、积分、优化、常微分方程数值解、信号处理等问题。
SciPy包含多个功能强大的模块,如插值、积分、优化、统计等。例如,插值模块可用于填补数据中的空缺,而统计模块则包含大量概率分布和统计函数。此外,SciPy还可以用于拟合数据,例如拟合新型肺炎疫情曲线。
插值是一种重要的函数逼近方法,通过已知数据点来估算未知点的值。SciPy的scipy.interpolate
模块提供了多种插值方法,包括线性插值、二次插值和三次插值等。
下面是一个简单的例子,展示如何使用scipy.interpolate.interp1d
进行插值:
```python import numpy as np from scipy.interpolate import interp1d
x = np.linspace(0, 10 * np.pi, 20) y = np.cos(x)
fl = interp1d(x, y, kind='linear') fq = interp1d(x, y, kind='quadratic')
xint = np.linspace(x.min(), x.max(), 1000) yintl = fl(xint) yintq = fq(xint)
import matplotlib.pyplot as plt
plt.plot(xint, fl(xint), color="green", label="Linear") plt.plot(xint, fq(xint), color="yellow", label="Quadratic") plt.legend(loc="best") plt.show() ```
SciPy的scipy.stats
模块包含了100多个概率分布,包括连续分布和离散分布。它提供了丰富的统计函数,如描述性统计、相关性检验和统计检验等。
以下是一些常用函数:
describe()
:计算描述性统计信息gmean()
:计算几何平均值hmean()
:计算调和平均值kurtosis()
:计算峰度mode()
:返回众数skew()
:计算偏度f_oneway()
:执行单因素方差分析iqr()
:计算四分位距zscore()
:计算Z分数sem()
:计算标准误SciPy的scipy.optimize
模块提供了多种优化算法,包括最小二乘法和曲线拟合。这里我们关注最小二乘法和曲线拟合的应用。
例如,使用最小二乘法拟合一条直线:
```python import numpy as np from scipy import optimize
X = np.array([8.19, 2.72, 6.39, 8.71, 4.7, 2.66, 3.78]) Y = np.array([7.01, 2.78, 6.47, 6.71, 4.1, 4.23, 4.05])
def residuals(p): k, b = p return Y - (k * X + b)
r = optimize.leastsq(residuals, [1, 0]) k, b = r[0] print("k=", k, "b=", b)
import matplotlib.pyplot as plt
plt.plot(X, Y, "o", label="实际数据") plt.plot(X, k * X + b, label="拟合数据") plt.legend(loc="best") plt.show() ```
为了将所学知识应用于实际问题,我们使用《每天10分钟,用Python学数据分析》中的实际数据,拟合全国疫情趋势图。
首先,导入必要的库和数据:
```python import numpy as np import pandas as pd from scipy.optimize import curve_fit import matplotlib.pyplot as plt
data = pd.readcsv('../yiqing.csv', encoding='gbk') xdate = data['日期'] xdata = data['天数'] yConfirmed = data['确诊']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(13, 6), dpi=120) plt.scatter(xdata, yConfirmed, c='r', label='实际数据') plt.title('新型肺炎全国疫情趋势图', fontdict={'fontsize': 15}, color='r') plt.xlabel('天数') plt.ylabel('确诊人数') plt.xticks(fontsize=10) plt.yticks(fontsize=10) plt.grid(True) plt.show() ```
接下来,拟合数据并绘制拟合曲线:
```python def func(x, a, b, c): return a * np.exp(b * x) + c
popt, pcov = curvefit(func, xdata, y_Confirmed) print(popt)
plt.scatter(xdata, yConfirmed, c='r', label='实际数据') plt.plot(xdata, func(xdata, *popt), label='拟合数据') plt.legend(loc='best') plt.show() ```
通过上述拟合,可以看到数据的拟合效果一般,但这是合理的,因为真实的疫情变化并不是完全规律的。如果调整数据的起点,例如将1月20日作为起点,拟合效果会更好。
相信通过全国人民的共同努力,这个模型很快就会失去作用。希望大家继续关注和支持!
以上就是改写后的文章内容,希望对你有所帮助。