大家好,今天又来更新python学习篇了。本次的内容比较简单,时描述性统计代码,直接给出所有代码,如下:
import pandas as pd
from scipy.stats import fisher_exact
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
import re
base_info = pd.read_excel("./data/附件1.xlsx", index_col=0)
sale_info = pd.read_excel("./data/附件2.xlsx")
sale_info['销售日期']=pd.to_datetime(sale_info['销售日期'])data=sale_info.join(base_info,on="单品编码")
data["销售额(元)"]=data["销量(千克)"]*data["销售单价(元/千克)"]print("--------------------------------------------")
print("统计打折销售情况")
print(data["是否打折销售"].groupby([data["是否打折销售"],data["分类名称"]]).count())print("--------------------------------------------")
print("统计退货情况")
print(data["销售类型"].groupby([data["销售类型"],data["分类名称"]]).count())print("--------------------------------------------")
print("执行Fisher 精确性检验")
print(data["销售类型"].groupby([data["销售类型"],data["是否打折销售"]]).count())
table=[[457,4],[830680,47362]]
result=fisher_exact(table,alternative='two-sided')
print("Fisher 精确性检验结果: ")
print("p-value:",result.pvalue)
print("statistic:",result.statistic)print("--------------------------------------------")
print("执行Fisher 精确性检验")
names=base_info["单品名称"].tolist()
print(names)print("--------------------------------------------")
print("执行字符串匹配")
strings=names
threshold=80
similar_strings={}
for string in strings:best_match=process.extractOne(string,[s for s in strings if s not in [string]],scorer=fuzz .ratio)if best_match[1]>=threshold and best_match[0]!=string and best_match[0][:2]==string[:2]:if re.search(r'\(\d+\)',best_match[0]) and re.search(r'\(\d+\)',string):similar_strings[string]=best_match[0]for original,similar in similar_strings.items():print(f"'{original}'和'{similar}'")
输出结果如下:
对于其中的一些代码,在此解释:
代码1
第十五行
print(data["是否打折销售"].groupby([data["是否打折销售"],data["分类名称"]]).count())
这行代码使用 pandas 的 groupby()
方法和 count()
方法对 data
数据中的 "是否打折销售"
和 "分类名称"
列进行分组,并对每个分组计数。
groupby()
方法将 DataFrame 根据指定的列名进行分组,返回一个 GroupBy 对象。在这里,我们通过传递表示 "是否打折销售"
和 "分类名称"
的两个列名来分组 data
DataFrame。
count()
方法用于计算每组中唯一值的数量。在这里,它返回唯一组合的数量,即 (是否打折销售, 分类名称)
组合的数量。
通过在 groupby()
方法中传递多个列名,我们可以获取多个类别之间的交叉计数。
代码2
table=[[457,4],[830680,47362]]
result=fisher_exact(table,alternative='two-sided')
这段代码是使用 `fisher_exact()` 函数对给定的二维表格 `table` 进行 Fisher 精确性检验,并计算 p-value 和统计量,结果将存储在变量 `result` 中。
- `table=[[457,4],[830680,47362]]` 表示给出一个二维表格,其中第一行包含两个元素 `[457,4]`,第二行包含两个元素 `[830680,47362]`;
- `fisher_exact(table, alternative='two-sided')` 表示使用 Fisher 精确性检验对给定的二维表格 `table` 进行检验。`alternative='two-sided'` 表示使用双侧检验。
执行这段代码将会得到 Fisher 精确性检验的结果,包括 p-value 和统计量。具体而言,`result` 变量中将包含一个二元组,第一个元素表示 p-value,第二个元素表示统计量。
代码3
for string in strings:best_match=process.extractOne(string,[s for s in strings if s not in [string]],scorer=fuzz .ratio)if best_match[1]>=threshold and best_match[0]!=string and best_match[0][:2]==string[:2]:if re.search(r'\(\d+\)',best_match[0]) and re.search(r'\(\d+\)',string):similar_strings[string]=best_match[0]for original,similar in similar_strings.items():print(f"'{original}'和'{similar}'")
这段代码是一个字符串匹配的算法,它会找出与给定字符串相似的其他字符串,并将结果打印出来。
代码的执行过程如下:
1. 对于 `strings` 列表中的每个字符串,依次执行以下步骤:
2. 使用 `process.extractOne()` 函数找到与当前字符串 `string` 最相似的字符串。该函数会在剩余的字符串列表中进行搜索,返回一个二元组,其中第一个元素是最佳匹配的字符串,第二个元素是匹配的分数。
3. 判断最佳匹配的分数是否大于等于设定的阈值 `threshold`,并且最佳匹配的字符串不等于当前字符串 `string`,且最佳匹配的字符串和当前字符串的前两个字符相同。
4. 若上述条件满足,则继续执行下一步。
5. 判断最佳匹配的字符串和当前字符串都是否包含形如 `(数字)` 的字符串。
6. 若上述条件满足,则将原始字符串和相似字符串的对应关系添加到 `similar_strings` 字典中。
7. 遍历 `similar_strings` 字典中的每一项,将原始字符串和相似字符串的对应关系打印出来。
总结来说,该代码的目的是找出在给定阈值和条件下,符合相似性要求的字符串对,并将它们打印出来。这样可以帮助找出在字符串中存在相似内容的情况,并进一步进行处理或分析。