python学习3

大家好,今天又来更新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}'")

输出结果如下: 

python学习3_第1张图片

python学习3_第2张图片

 对于其中的一些代码,在此解释:

代码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` 字典中的每一项,将原始字符串和相似字符串的对应关系打印出来。

总结来说,该代码的目的是找出在给定阈值和条件下,符合相似性要求的字符串对,并将它们打印出来。这样可以帮助找出在字符串中存在相似内容的情况,并进一步进行处理或分析。

你可能感兴趣的:(python,python,学习,开发语言)